class DHCP::OptRouteList
Class for DHCP options containing lists of IPv4 CIDR routes (like option 121 or MS's 249) See RFC 3442 “compact encoding” of destination
Public Instance Methods
bin_to_data(data)
click to toggle source
# File lib/dhcp/options.rb, line 384 def bin_to_data(data) raise "Invalid binary classless route data" unless data.size > 4 || data[0,1].ord > 32 maskbits = data[0,1].ord octets = (maskbits+7)/8 raise "Invalid binary classless route data" unless data.size == octets + 5 dest = IPAddress::IPv4.parse_data(data[1,octets] + 0.chr * (4 - octets)) dest.prefix = maskbits gateway = IPAddress::IPv4.parse_data(data[octets+1,4]) gateway.prefix = maskbits ## Unnecessary... [dest.to_string, gateway.to_s] end
data_to_bin(data)
click to toggle source
# File lib/dhcp/options.rb, line 373 def data_to_bin(data) raise "Invalid classless static route" unless data.is_a?(Array) && data.size == 2 net, gateway = *data raise "Invalid classless static route network" if net.index('/').nil? net = IPAddress::IPv4.new(net) raise "Invalid classless static route network" unless net.network? gateway = IPAddress::IPv4.new("#{gateway}/#{net.prefix}") raise "Invalid classless static route gateway" unless gateway.member?(net) net.prefix.to_i.chr + net.data[0,(net.prefix+7)/8] + gateway.data end
split_data(data)
click to toggle source
# File lib/dhcp/options.rb, line 361 def split_data(data) data = data.dup list = [] while data.size > 0 raise "Invalid binary data" unless data.size > 4 || data[0,1].ord > 32 octets = (data[0,1].ord + 7)/8 raise "Invalid binary data" unless data.size >= octets + 5 list << bin_to_data(data.slice!(0,octets+5)) end list end