class NetAddr::EUI64

EUI64 (Extended Unique Identifier 64-bit, or EUI-64) represents a 64-bit hardware address.

Attributes

addr[R]

addr is the Integer representation of this EUI

Public Class Methods

new(i) click to toggle source

Create an EUI64 from an Integer. Must be between 0 and 2**64-1. Throws ValidationError on error.

# File lib/eui64.rb, line 11
def initialize(i)
        if (!i.kind_of?(Integer))
                raise ValidationError, "Expected an Integer for 'i' but got a #{i.class}."
        elsif ( (i < 0) || (i > 2**64-1) )
                raise ValidationError, "#{i} is out of bounds for EUI64."
        end
        @addr = i
end
parse(addr) click to toggle source

Parse an EUI-64 string into an EUI64 type. This will successfully parse most of the typically used formats such as:

  • aa-bb-cc-dd-ee-ff-00-11

  • aa:bb:cc:dd:ee:ff:00:11

  • aabb.ccdd.eeff.0011

  • aabbccddeeff0011

Although, in truth, its not picky about the exact format as long as it contains exactly 16 hex characters with the optional delimiting characters ‘-’, ‘:’, or ‘.’.

# File lib/eui64.rb, line 30
def EUI64.parse(addr)
        addr = addr.strip.gsub(/[\-\:\.]/,"")
        if (addr.length != 16)
                raise ValidationError, "Must contain exactly 16 hex characters with optional delimiters."
        elsif (addr =~ /[^0-9a-fA-F\:]/)
                raise ValidationError, "#{addr} contains invalid characters."
        end
        return EUI64.new(addr.to_i(16))
end

Public Instance Methods

bytes() click to toggle source

bytes returns a list containing each byte of the EUI64 as a String.

# File lib/eui64.rb, line 41
def bytes()
        return [
                (@addr >> 56 & 0xff).to_s(16).rjust(2, "0"),
                (@addr >> 48 & 0xff).to_s(16).rjust(2, "0"),
                (@addr >> 40 & 0xff).to_s(16).rjust(2, "0"),
                (@addr >> 32 & 0xff).to_s(16).rjust(2, "0"),
                (@addr >> 24 & 0xff).to_s(16).rjust(2, "0"),
                (@addr >> 16 & 0xff).to_s(16).rjust(2, "0"),
                (@addr >> 8 & 0xff).to_s(16).rjust(2, "0"),
                (@addr & 0xff).to_s(16).rjust(2, "0"),
                ]
end
to_ipv6(net) click to toggle source

to_ipv6 generates an IPv6 address from this EUI64 address and the provided IPv6Net. Nil will be returned if net is not a /64.

# File lib/eui64.rb, line 56
def to_ipv6(net)
        if (!net.kind_of?(IPv6Net))
                raise ArgumentError, "Expected an IPv6Net object for 'net' but got a #{net.class}."
        end
        
        if (net.netmask.prefix_len != 64)
                return nil
        end
        
        # set u/l bit to 0
        hostId = @addr ^ 0x0200000000000000
        ipAddr = net.network.addr | hostId
        return IPv6.new(ipAddr)
end
to_s() click to toggle source
# File lib/eui64.rb, line 71
def to_s()
        return self.bytes.join("-")
end