X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FRaw%2FMACAddress.hh;h=c62c1df14b6e98d89bcad506001cee21f02bd78d;hb=410c2ef7f40307909299f574b6cbb9f11bd9773e;hp=f73e745a35429092dc83edadfec899f9084da83b;hpb=a1a6c76a214ad1935032826713cabaf9ac57bf07;p=senf.git diff --git a/Socket/Protocols/Raw/MACAddress.hh b/Socket/Protocols/Raw/MACAddress.hh index f73e745..c62c1df 100644 --- a/Socket/Protocols/Raw/MACAddress.hh +++ b/Socket/Protocols/Raw/MACAddress.hh @@ -23,8 +23,8 @@ /** \file \brief MACAddress public header */ -#ifndef HH_MACAddress_ -#define HH_MACAddress_ 1 +#ifndef HH_SENF_Socket_Protocols_Raw_MACAddress_ +#define HH_SENF_Socket_Protocols_Raw_MACAddress_ 1 // Custom includes #include @@ -34,6 +34,7 @@ #include #include "../../../Utils/safe_bool.hh" #include "../../../Utils/Tags.hh" +#include "../AddressExceptions.hh" //#include "MACAddress.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -44,6 +45,37 @@ namespace senf { The Ethernet MAC is modelled as a fixed-size container/sequence of 6 bytes. + The following statements all create the same MAC address 00:1A:2B:3C:4D:5F + \code + // Used to construct constant MAC addresses + MACAddress(0x001A2B3C4D5Full) + + // Construct a MAC address from it's string representation: + MACAddress::from_string("00:1a:2b:3c:4d:5f") // case is ignored + MACAddress::from_string("00-1A-2B-3C-4D-5F") // '-' as separator is allowed too + + // Construct a MAC address from raw data. 'from_data' takes an arbitrary iterator (e.g. a + // pointer) as argument. Here we use a fixed array but normally you will need this to build + // a MAC address in a packet parser + char rawBytes[] = { 0x00, 0x1A, 0x2B, 0x3C, 0x4D, 0x5F }; + MACAddress::from_data(rawBytes) + + // Construct a MAC from the EUID64 as used by INet6 interfaces. The eui64 will come from an + // INet6 address: + MACAddress::from_eui64(0x001A2BFFFE3C4D5Full) + MACAddress::from_eui64( + INet6Address(0x2001u,0xDB8u,0x1u,0x0u,0x001Au,0x2BFFu,0xFE3Cu,0x3D5Fu).id()) + \endcode + + Since MACAddress is based on \c boost::array, you can access the raw data bytes of the + address using \c begin(), \c end() or \c operator[]: + \code + MACAddress mac = ...; + Packet::iterator i = ...; + + std::copy(mac.begin(), mac.end(), i); // Copies 6 bytes + \endcode + \implementation We awkwardly need to use static named constructors (from_ members) instead of ordinarily overloaded constructors for one simple reason: char * doubles as string literal and as arbitrary data iterator. The iterator constructor can @@ -68,7 +100,8 @@ namespace senf { /**< The string representation must exactly match the form dd:dd:dd:dd:dd:dd where d is any hexadecimal digit. In place of ':', '-' is also - accepted as a delimiter. */ + accepted as a delimiter. + \throws AddressSyntaxException */ template static MACAddress from_data(InputIterator i); @@ -83,22 +116,22 @@ namespace senf { to a MAC address. This conversion is only possible, if the EUI-64 is MAC compatible: the 4th/5th byte (in transmission order) must be 0xFFFE. - \throws SyntaxException if \a v is not a MAC compatible - EUI-64. */ + \throws AddressSyntaxException if \a v is not a MAC + compatible EUI-64. */ bool local() const; ///< \c true, if address is locally administered bool multicast() const; ///< \c true, if address is a group/multicast address bool broadcast() const; ///< \c true, if address is the broadcast address - bool boolean_test() const; ///< \c true, if address is the zero address + bool boolean_test() const; ///< \c true, if address is not the zero address boost::uint32_t oui() const; ///< Return first 3 bytes of the address boost::uint32_t nic() const; ///< Return last 3 bytes of the address boost::uint64_t eui64() const; ///< Build EUI-64 from the MAC address + boost::uint64_t uint64() const; ///< Return MAC address as uint64 value + + std::string toString() const; ///< Return string representation of MAC address like 12:34:56:78:90:ab - /** \brief Bad MAC address syntax or conversion */ - struct SyntaxException : public std::exception - { virtual char const * what() const throw() { return "invalid MAC address syntax"; } }; }; /** \brief Write MAC address