def find_space(options)
known_args = [:Subnet, :IPCount, :Version]
version = nil
if (options.kind_of? Integer)
bits4 = options
bits6 = options
elsif (options.kind_of? Hash)
NetAddr.validate_args(options.keys,known_args)
if (options.has_key?(:Version))
version = options[:Version]
raise "IP version should be 4 or 6, but was #{version}." if (version != 4 && version !=6)
end
if (options.has_key?(:Subnet))
bits4 = options[:Subnet]
bits6 = options[:Subnet]
elsif(options.has_key?(:IPCount))
bits4 = NetAddr.minimum_size(options[:IPCount], :Version => 4)
bits6 = NetAddr.minimum_size(options[:IPCount], :Version => 6)
else
raise "Missing arguments: :Subnet/:IPCount"
end
else
raise "Integer or Hash expected, but #{options.class} provided."
end
list = []
if (!version || version == 4)
dump_children(@v4_root).each do |entry|
cidr = entry[:CIDR]
if ( (cidr.tag[:Subnets].length == 0) && (cidr.bits <= bits4) )
list.push(cidr)
end
end
end
if (!version || version == 6)
dump_children(@v6_root).each do |entry|
cidr = entry[:CIDR]
if ( (cidr.tag[:Subnets].length == 0) && (cidr.bits <= bits6) )
list.push(cidr)
end
end
end
new_list = []
list.each {|x| new_list.push( NetAddr.cidr_build(x.version, x.to_i(:network), x.to_i(:netmask)) )}
return(new_list)
end