class NetAddr::CIDRv6

IPv6 CIDR address - Inherits all methods from NetAddr::CIDR. Addresses of this class are composed of a 128-bit address space.

Public Class Methods

new(ip, netmask=nil, tag={}, wildcard_mask=nil, wildcard_mask_bit_flipped=false) click to toggle source
This method performs absolutely no error checking, and is meant to be used only by
other internal methods for the sake of the speedier creation of CIDR objects.
Please consider using #create unless you know what you are doing with 100% certainty.

Arguments:

  • ip - Integer representing an ip address

  • netmask - Integer representing a binary netmask

  • tag - Hash used to append custom tags to CIDR

  • wildcard_mask - Integer representing a binary mask

  • wildcard_mask_bit_flipped - indicates whether or not the wildcard_mask is bit-flipped or not

# File lib/cidr.rb, line 239
def initialize(ip, netmask=nil, tag={}, wildcard_mask=nil, wildcard_mask_bit_flipped=false)
    @ip = ip

    if ( self.kind_of?(NetAddr::CIDRv4) )
        @version = 4
        @address_len = 32
    else
        @version = 6
        @address_len = 128
    end
    @all_f = 2**@address_len - 1

    if (netmask)
        @netmask = netmask
    else
        @netmask = 2**@address_len - 1
    end

    @network = (@ip & @netmask)
    @hostmask = @netmask ^ @all_f
    @tag = tag

    if (!wildcard_mask)
        @wildcard_mask = @netmask
    else
        @wildcard_mask = wildcard_mask
        @wildcard_mask = ~@wildcard_mask if (wildcard_mask_bit_flipped)
    end

end
unique_local(eui) click to toggle source

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:

Returns:

# 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