Class: NetAddr::CIDRv6

Inherits:
CIDR
  • Object
show all
Defined in:
lib/cidr.rb

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

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