Class: NetAddr::EUI

### Home Classes Methods

### In Files

- lib/eui.rb

### Parent

Object

### Methods

- ::create
- ::new
- #address
- #ei
- #link_local
- #oui
- #to_i
- #to_ipv6
- #to_s

### Files

- Errors
- README
- changelog

### Class/Module Index

Quicksearch

- NetAddr
- NetAddr::CIDR
- NetAddr::CIDRv4
- NetAddr::CIDRv6
- NetAddr::EUI
- NetAddr::EUI48
- NetAddr::EUI64
- NetAddr::Tree

No matching classes.

# NetAddr::EUI

# EUI - Extended Unique Identifier

A class & series of methods for creating and manipulating Extended Unique Identifier (EUI) addresses. Two types of address formats are supported EUI-48 and EUI-64. The most common use for this class will be to manipulate MAC addresses (which are essentially a type of EUI-48 address).

EUI addresses are separated into two parts, the Organizationally Unique Identifier (OUI) and the Extended Identifier (EI). The OUI is assigned by the IEEE and is used to identify a particular hardware manufacturer. The EI is assigned by the hardware manufacturer as a per device unique address.

Probably the most useful feature of this class, and thus the reason it was created, is to help automate certain address assignments within IP. For example, IPv6 Link Local addresses use MAC addresses for IP auto-assignment and multicast MAC addresses are determined based on the multicast IP address.

### Public Class Methods

create(eui) click to toggle source

### Synopsis

Create a new EUI48 or EUI64 object.

    Example:
    addr = NetAddr::EUI.create('aa-bb-cc-dd-ee-ff')
    addr = NetAddr::EUI.create('aa:bb:cc:dd:ee:ff')
    addr = NetAddr::EUI.create('aabb.ccdd.eeff')
    addr = NetAddr::EUI.create('aa-bb-cc-dd-ee-ff-00-01')

### Arguments

- eui = EUI as a String

### Returns

- EUI48 or EUI64 object

    # File lib/eui.rb, line 93
    def EUI.create(eui)
        if (!eui.kind_of? String)
            raise ArgumentError, "Expected String, but #{eui.class} provided."
        end

        # validate
        NetAddr.validate_eui(eui)

        # remove formatting characters
        eui.gsub!(/[\.\:\-]/, '')

        if (eui.length == 12)
            eui = NetAddr::EUI48.new(eui)
        else
            eui = NetAddr::EUI64.new(eui)
        end

        return(eui)
    end

new(eui) click to toggle source

### Synopsis

    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 EUI objects.
    Please consider using #create unless you know what you are doing with 100% certainty.

    Example:
    NetAddr::EUI48.new('aabbccddeeff')

### Arguments:

- EUI as a String or Integer. Strings should contain no formatting characters.

    # File lib/eui.rb, line 45
    def initialize(eui)

        if (eui.kind_of?(Integer))
            @eui_i = eui
            @eui = eui.to_s(16)
            if ( self.kind_of?(NetAddr::EUI48) )
                @eui = '0' * (12 - @eui.length) << @eui if (@eui.length < 12)
            else
                @eui = '0' * (16 - @eui.length) << @eui if (@eui.length < 16)
            end

        elsif(eui.kind_of?(String))
            @eui = eui
            @eui_i = eui.to_i(16)
        else
            raise ArgumentError, "Expected String or Integer, but #{eui.class} provided."
        end

        # set ei & oui
        if ( self.kind_of?(NetAddr::EUI48) )
            @ei = @eui.slice(6..11)
        else
            @ei = @eui.slice(6..15)
        end

        @oui = @eui.slice(0..5)

    end

### Public Instance Methods

address(options=nil) click to toggle source

### Synopsis

    Returns EUI address. The default address format is xxxx.xxxx.xxxx

    Example:
    addr = NetAddr::EUI.create('aabb.ccdd.eeff')
    addr.address(:Delimiter => '-') => "aa-bb-cc-dd-ee-ff"
    addr.address(:Delimiter => ':') => "aa:bb:cc:dd:ee:ff"

### Arguments:

- options = Hash with the following fields:

      :Delimiter -- delimitation character. valid values are (- : .)

### Returns:

- String

    # File lib/eui.rb, line 132
    def address(options=nil)
        known_args = [:Delimiter]
        delimiter = '-'

        if (options)
            if (!options.kind_of? Hash)
                raise ArgumentError, "Expected Hash, but #{options.class} provided."
            end
            NetAddr.validate_args(options.keys,known_args)

            if (options.has_key?(:Delimiter))
                delimiter = options[:Delimiter]
                delimiter = '-' if (delimiter != ':' && delimiter != '.')
            end
        end

        if (delimiter == '-' || delimiter == ':')
            addr = octets.join(delimiter)
        elsif (delimiter == '.')
                toggle = 0
                octets.each do |x|
                    if (!addr)
                        addr = x
                        toggle = 1
                    elsif (toggle == 0)
                        addr = addr  << '.' << x
                        toggle = 1
                    else
                        addr = addr << x
                        toggle = 0
                    end
                end
        end

        return(addr)
    end

ei(options=nil) click to toggle source

### Synopsis

Returns Extended Identifier portion of an EUI address (the vendor assigned ID). The default address format is xx-xx-xx

    Example:
    addr = NetAddr::EUI.create('aabb.ccdd.eeff')
    addr.ei(:Delimiter => '-') => "dd-ee-ff"

### Arguments:

- options = Hash with the following fields:

      :Delimiter -- delimitation character. valid values are (-, and :)

### Returns:

- String

    # File lib/eui.rb, line 188
    def ei(options=nil)
        known_args = [:Delimiter]
        delimiter = '-'

        if (options)
            if (!options.kind_of? Hash)
                raise ArgumentError, "Expected Hash, but #{options.class} provided."
            end
            NetAddr.validate_args(options.keys,known_args)

            if (options.has_key?(:Delimiter))
                if (options[:Delimiter] == ':')
                    delimiter = options[:Delimiter]
                end
            end
        end

        if ( self.kind_of?(NetAddr::EUI48) )
            ei = octets[3..5].join(delimiter)
        else
            ei = octets[3..7].join(delimiter)
        end

        return(ei)
    end

link_local(options=nil) click to toggle source

### Synopsis

    Provide an IPv6 Link Local address based on the current EUI address.

    Example:
    addr = NetAddr::EUI.create('aabb.ccdd.eeff')
    addr.link_local() => "fe80:0000:0000:0000:aabb:ccff:fedd:eeff"

### Arguments:

- options = Hash with the following fields:

      :Short -- if true, return IPv6 addresses in short-hand notation
      :Objectify -- if true, return CIDR objects

### Returns:

- CIDR address String or an NetAddr::CIDR object

    # File lib/eui.rb, line 233
    def link_local(options=nil)
        return( self.to_ipv6('fe80::/64', options) )
    end

oui(options=nil) click to toggle source

### Synopsis

Returns Organizationally Unique Identifier portion of an EUI address (the vendor ID). The default address format is xx-xx-xx.

    Example:
    addr = NetAddr::EUI.create('aabb.ccdd.eeff')
    addr.oui(:Delimiter => '-') => "aa-bb-cc"

### Arguments:

- options = Hash with the following fields:

      :Delimiter -- delimitation character. valid values are (-, and :)

### Returns:

- String

    # File lib/eui.rb, line 256
    def oui(options=nil)
        known_args = [:Delimiter]
        delimiter = '-'

        if (options)
            if (!options.kind_of? Hash)
                raise ArgumentError, "Expected Hash, but #{options.class} provided."
            end
            NetAddr.validate_args(options.keys,known_args)

            if (options.has_key?(:Delimiter))
                if (options[:Delimiter] == ':')
                    delimiter = options[:Delimiter]
                end
            end
        end
        oui = octets[0..2].join(delimiter)

        return(oui)
    end

to_i() click to toggle source

### Synopsis

Returns the EUI as an Integer.

    Example:
    addr = NetAddr::EUI.create('aabb.ccdd.eeff')
    addr.to_i => 187723572702975

### Arguments:

- none

### Returns:

- Integer

    # File lib/eui.rb, line 294
    def to_i()
        return(@eui_i)
    end

to_ipv6(cidr, options=nil) click to toggle source

### Synopsis

    Given a valid IPv6 subnet, return an IPv6 address based on the current EUI.

    Example:
    addr = NetAddr::EUI.create('aabb.ccdd.eeff')
    addr.to_ipv6('3ffe::/64') => "3ffe:0000:0000:0000:a8bb:ccff:fedd:eeff"

### Arguments:

- options = Hash with the following fields:

      :Short -- if true, return IPv6 addresses in short-hand notation
      :Objectify -- if true, return CIDR objects

### Returns:

- IPv6 address String or an NetAddr::CIDRv6 object

    # File lib/eui.rb, line 317
    def to_ipv6(cidr, options=nil)
        known_args = [:Short, :Objectify]
        objectify = false
        short = false

        if ( !cidr.kind_of?(NetAddr::CIDR) )
            begin
                cidr = NetAddr::CIDR.create(cidr)
            rescue Exception => error
                raise ArgumentError, "CIDR raised the following errors: #{error}"
            end
        elsif (cidr.kind_of?(NetAddr::CIDRv4)  )
            raise ArgumentError, "Expected CIDRv6, but #{cidr.class} provided."
        end

        if (cidr.bits > 64)
            raise ValidationError, "Prefix length of provided CIDR must be /64 or less but was #{cidr.netmask}."
        end

        if (options)
            if (!options.kind_of? Hash)
                raise ArgumentError, "Expected Hash, but #{options.class} provided."
            end
            NetAddr.validate_args(options.keys,known_args)

            if (options.has_key?(:Objectify) && options[:Objectify] == true)
                objectify = true
            end

            if (options.has_key?(:Short) && options[:Short] == true)
                short = true
            end
        end

        # get integer equiv of addr. conver eui48 to eui64 if needed
        if ( self.kind_of?(NetAddr::EUI48) )
            eui_i = self.to_eui64.to_i
        else
            eui_i = self.to_i
        end

        # toggle u/l bit
        eui_i = eui_i ^ 0x0200000000000000

        # create ipv6 address
        ipv6 = cidr.to_i | eui_i

        if (!objectify)
            ipv6 = NetAddr.i_to_ip(ipv6, :Version => 6)
            ipv6 = NetAddr.shorten(ipv6) if (short)
        else
            ipv6 = NetAddr::CIDRv6.new(ipv6)
        end

        return(ipv6)
    end

to_s() click to toggle source

### Synopsis

Returns the EUI as an unformatted String.

    Example:
    addr = NetAddr::EUI.create('aabb.ccdd.eeff')
    addr.to_s => "aabbccddeeff"

### Arguments:

- none

### Returns:

- String

    # File lib/eui.rb, line 391
    def to_s()
        return(@eui)
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.