The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

NetAddr::MAC - Handles hardware MAC Addresses (EUI-48 and EUI-64)

SYNOPSIS

    use NetAddr::MAC;

    my $mac = NetAddr::MAC->new( '00:11:22:aa:bb:cc' );
    my $mac = NetAddr::MAC->new( mac => '0011.22AA.BBCC' );

    print "MAC provided at object creation was: ", $mac->original;

    print "EUI48\n" if $mac->is_eui48;
    print "EUI64\n" if $mac->is_eui64;

    print "Unicast\n" if $mac->is_unicast;
    print "Multicast\n" if $mac->is_multicast;

    print "Locally Administerd\n" if $mac->is_local;
    print "Universally Administered\n" if $mac->is_universal;

    print 'Basic Format: ',$mac->as_basic,"\n";
    print 'Bpr Format: ',  $mac->as_bpr,"\n";
    print 'Cisco Format: ',$mac->as_cisco,"\n";
    print 'IEEE Format: ', $mac->as_ieee,"\n";
    print 'IPv6 Address: ',$mac->as_ipv6_suffix,"\n";
    print 'Microsoft Format: ',$mac->as_microsoft,"\n";
    print 'Single Dash Format: ',$mac->as_singledash,"\n";
    print 'Sun Format: ',  $mac->as_sun,"\n";
    print 'Token Ring Format: ', $mac->as_tokenring,"\n";


    use NetAddr::MAC qw( :all );

    my $mac = q/00.11.22.33.44.55/;

    print "EUI48\n" if mac_is_eui48($mac);
    print "EUI64\n" if mac_is_eui64($mac);

    print "Unicast\n" if mac_is_unicast($mac);
    print "Multicast\n" if mac_is_multicast($mac);

    print "Locally Administerd\n" if mac_is_local($mac);
    print "Universally Administered\n" if mac_is_universal($mac);

    print 'Basic Format: ',mac_as_basic($mac),"\n";
    print 'Bpr Format: ',  mac_as_bpr($mac),"\n";
    print 'Cisco Format: ',mac_as_cisco($mac),"\n";
    print 'IEEE Format: ', mac_as_ieee($mac),"\n";
    print 'IPv6 Address: ',mac_as_ipv6_suffix($mac),"\n";
    print 'Microsoft Format: ',mac_as_microsoft($mac),"\n";
    print 'Single Dash Format: ', mac_as_singledash($mac),"\n";
    print 'Sun Format: ',  mac_as_sun($mac),"\n";
    print 'Token Ring Format: ',mac_as_tokenring($mac),"\n";

DESCRIPTION

This module provides an interface to deal with Media Access Control (or MAC) addresses. These are the addresses that uniquely identify a device on a layer 2 network. Although the common case is hardware addresses on Ethernet network cards, there are a variety of devices that use this system. This module supports both EUI-48 and EUI-64 addresses and implements an OO and a functional interface.

Some devices that use EUI-48 (or MAC-48) addresses include:

    Ethernet
    802.11 wireless networks
    Bluetooth
    IEEE 802.5 token ring
    FDDI
    ATM

Some devices that use EUI-64 addresses include:

    Firewire
    IPv6
    ZigBee / 802.15.4 wireless personal-area networks

MOTIVATION

We have lots of systems in my work which handle MAC addresses. There was lots of code independantly validating and normalising them. So I set about creating a reusable module to add to our SOE install so that MAC address handling becomes both powerful and trivial at the same time.

There are several other MAC address modules on CPAN. I didnt like one of them and the one I did like dragged Moose in. So I created this module, taking the ideas I liked from the other modules and adding in extra things that I needed (and a few features just for completeness) whilst avoiding dependancies and avoiding anything that doesnt work on perl 5.6

I hope the result is useful to others, the concept is to be able to create an object representing a MAC address based on a string that only very vaguely resembles a MAC address. From there to be able to output normalised string representations in many common formats.

A templating function is deliberately omitted, as very niche outputs can easily be derived from the 'basic' format.

Feel free to send patches for features you add.

OO METHODS

NetAddr::MAC->new( mac => $mac )

Creates and returns a new NetAddr::MAC object. The MAC value is required.

NetAddr::MAC->new( $mac )

Simplified creation method

OO METHODS

original

returns the original mac string as used when creating the MAC object

OO PROPERTY METHODS

is_eui48

returns true if mac address is determined to be of the EUI48 standard

is_eui64

returns true if mac address is determined to be of the EUI64 standard

is_multicast

returns true if mac address is determined to be a multicast address

is_unicast

returns true if mac address is determined to be a unicast address

is_local

returns true if mac address is determined to be locally administered

is_universal

returns true if mac address is determined to be universally administered

OO NORMALIZATION METHODS

as_basic

returns the mac address normalized as a hexidecimal string that is 0 padded and without delimiters

 001122aabbcc

as_bpr

returns the mac address normalized as a hexidecimal string that is 0 padded with : delimiters and with 1,length leading where length is the number of hex pairs (ie 6 for EUI48)

 1,6,00:11:22:aa:bb:cc

as_cisco

returns the mac address normalized as a hexidecimal string that is 0 padded and with . delimiting every 2nd octet (ie after every 4th character)

 0011.22aa.bbcc

as_ieee

returns the mac address normalized as a hexidecimal string that is 0 padded and with - delimiting every octet (ie after every 2nd character)

 00-34-56-78-9a-bc

as_ipv6_suffix

returns the EUI-64 address in the format used for an IPv6 autoconf address suffix

as_microsoft

returns the mac address normalized as a hexidecimal string that is 0 padded and with : delimiting every octet (ie after every 2nd character)

 00:34:56:78:9a:bc

as_singledash

returns the mac address normalized as a hexidecimal string that is 0 padded and has a dash in the middle of the hex string.

 001122-334455

as_sun

returns the mac address normalized as a hexidecimal string that is not padded and with - delimiting every octet (ie after every 2nd character)

 0-34-56-78-9a-bc

as_tokenring

returns the mac address normalized as a hexidecimal string that is 0 padded and with - delimiting every octet (ie after every 2nd character) and each octect is bit-reversed order. So 10 00 5A 4D BC 96 becomes 08 00 5A B2 3D 69.

 00-2d-6a-1e-59-3d

to_eui48

converts to EUI-48 (if the eui-64 was derived from eui-48)

to_eui64

converts to EUI-64

STAND ALONE PROPERTY FUNCTIONS

mac_is_eui48($mac)

returns true if mac address in $mac is determined to be of the EUI48 standard

mac_is_eui64($mac)

returns true if mac address in $mac is determined to be of the EUI64 standard

mac_is_multicast($mac)

returns true if mac address in $mac is determined to be a multicast address

mac_is_unicast($mac)

returns true if mac address in $mac is determined to be a unicast address

mac_is_local($mac)

returns true if mac address in $mac is determined to be locally administered

mac_is_universal($mac)

returns true if mac address in $mac is determined to be universally administered

STAND ALONE NORMALIZATION METHODS

mac_as_basic($mac)

returns the mac address in $mac normalized as a hexidecimal string that is 0 padded and without delimiters

 001122aabbcc

mac_as_bpr($mac)

returns the mac address in $mac normalized as a hexidecimal string that is 0 padded, with : delimiting and 1,length leading. length is the number of hex pairs (6 for EUI48)

 1,6,00:11:22:aa:bb:cc

mac_as_cisco($mac)

returns the mac address in $mac normalized as a hexidecimal string that is 0 padded and with . delimiting every 2nd octet (ie after every 4th character)

 0011.22aa.bbcc

mac_as_ieee($mac)

returns the mac address in $mac normalized as a hexidecimal string that is 0 padded and with - delimiting every octet (ie after every 2nd character)

 00-34-56-78-9a-bc

mac_as_ipv6_suffix($mac)

returns the mac address in $mac in the format used for an IPv6 autoconf address suffix

will convert from eui48 or eui64 if needed

mac_as_microsoft($mac)

returns the mac address in $mac normalized as a hexidecimal string that is 0 padded and with : delimiting every octet (ie after every 2nd character)

 00:34:56:78:9a:bc

mac_as_singledash($mac)

returns the mac address in $mac normalized as a hexidecimal string that is 0 padded and has a dash in the middle of the hex string.

 001122-334455

mac_as_sun($mac)

returns the mac address in $mac normalized as a hexidecimal string that is not padded and with - delimiting every octet (ie after every 2nd character)

 0-34-56-78-9a-bc

mac_as_tokenring($mac)

returns the mac address in $mac normalized as a hexidecimal string that is 0 padded and with - delimiting every octet (ie after every 2nd character) and each octect is bit-reversed order. So 10 00 5A 4D BC 96 becomes 08 00 5A B2 3D 69.

 00-2d-6a-1e-59-3d

CREDITS

Stolen lots of ideas and some pod content from Device::MAC and Net::MAC

TODO

 - moare tests!

SUPPORT

Please use the RT system on CPAN, also many young people like to use Github

  https://github.com/djzort/NetAddr-MAC

AUTHOR

Dean Hamstead <dean.hamstead@optusnet.com.au>

LICENSE

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.