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