Class: NetAddr::CIDRv6
Overview
IPv6 CIDR address - Inherits all methods from NetAddr::CIDR. Addresses of this class are composed of a 128-bit address space.
Instance Attribute Summary
Attributes inherited from CIDR
#address_len, #all_f, #tag, #version
Class Method Summary collapse
-
.unique_local(eui) ⇒ Object
Synopsis Generate an IPv6 Unique Local CIDR address based on the algorithm described in RFC 4193.
Methods inherited from CIDR
#<, #<=>, #==, #>, #[], #allocate_rfc3531, #arpa, #bits, #cmp, #contains?, create, #desc, #enumerate, #fill_in, #initialize, #ip, #is_contained?, #last, #matches?, #multicast_mac, #netmask, #network, #next_ip, #next_subnet, #nth, #range, #remainder, #resize, #resize!, #set_wildcard_mask, #size, #subnet, #succ, #to_i, #to_s, #wildcard_mask
Constructor Details
This class inherits a constructor from NetAddr::CIDR
Class Method Details
.unique_local(eui) ⇒ Object
Synopsis
Generate an IPv6 Unique Local CIDR address based on the algorithm described in RFC 4193.
From the RFC:
1) Obtain the current time of day in 64-bit NTP format [NTP].
2) Obtain an EUI-64 identifier from the system running this
algorithm. If an EUI-64 does not exist, one can be created from
a 48-bit MAC address as specified in [ADDARCH]. If an EUI-64
cannot be obtained or created, a suitably unique identifier,
local to the node, should be used (e.g., system serial number).
3) Concatenate the time of day with the system-specific identifier
in order to create a key.
4) Compute an SHA-1 digest on the key as specified in [FIPS, SHA1];
the resulting value is 160 bits.
5) Use the least significant 40 bits as the Global ID.
6) Concatenate FC00::/7, the L bit set to 1, and the 40-bit Global
ID to create a Local IPv6 address prefix.
Example: eui = NetAddr::EUI.create(‘aabb.ccdd.eeff’) NetAddr::CIDRv6.unique_local(eui) => fdb4:3014:e277:0000:0000:0000:0000:0000/48
Arguments:
-
NetAddr::EUI object
Returns:
-
CIDRv6 object
2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 |
# File 'lib/cidr.rb', line 2152 def CIDRv6.unique_local(eui) if (eui.kind_of?(NetAddr::EUI48) ) eui = eui.to_eui64.to_s elsif (eui.kind_of?(NetAddr::EUI64) ) eui = eui.to_s else raise ArgumentError, "Expected NetAddr::EUI object but #{eui.class} received." end ntp_time = '' # get current time (32-bits), convert to 4-byte string, and append to ntp_time time = Time.now.to_i 4.times do ntp_time.insert(0, (time & 0xff).chr ) time = time >> 8 end # create 32-bit fractional, convert to 4-byte string, and append to ntp_time fract = rand(2**32-1) 4.times do ntp_time.insert(0, (fract & 0xff).chr ) fract = fract >> 8 end # create sha1 hash pre_hash = ntp_time << eui gid = Digest::SHA1.hexdigest(pre_hash).slice!(30..39) addr = 'fd' << gid << '00000000000000000000' return( NetAddr::CIDRv6.new(addr.to_i(16), 0xffffffffffff00000000000000000000 ) ) end |