X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FRaw%2FMACAddress.hh;h=64049dd6b6a230ba17a062b158625f88c95fe39c;hb=3863d46dd898b7bc35ea8c6ccd8563b18762a6b6;hp=f8739befaa5f2efc9a0c63c29de217c1e1ded3f6;hpb=25fe79f266e7583750d8e761abec4022d87972b8;p=senf.git diff --git a/Socket/Protocols/Raw/MACAddress.hh b/Socket/Protocols/Raw/MACAddress.hh index f8739be..64049dd 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 @@ -42,9 +42,40 @@ namespace senf { /** \brief Ethernet MAC address - + 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 @@ -54,7 +85,7 @@ namespace senf { \ingroup addr_group */ struct MACAddress - : public boost::array, + : public boost::array, public comparable_safe_bool { static MACAddress const Broadcast; ///< The broadcast address @@ -72,7 +103,7 @@ namespace senf { accepted as a delimiter. \throws AddressSyntaxException */ - template + template static MACAddress from_data(InputIterator i); ///< Construct address from raw data /**< Copies the data from \a i into the MAC address. @@ -91,19 +122,25 @@ namespace senf { 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 eui64() const; ///< Build EUI-64 from the MAC address + boost::uint64_t uint64() const; ///< Return MAC address as uint64 value }; - /** \brief Write MAC address + /** \brief Output MAC instance as it's string representation \related MACAddress */ std::ostream & operator<<(std::ostream & os, MACAddress const & mac); + /** \brief Try to initialize MACAddress instance from a string representation + sets std::ios::failbit on the stream if an error occurred + \see MACAddress from_string() + \related MACAddress + */ + std::istream & operator>>(std::istream & os, MACAddress & mac); } @@ -113,7 +150,7 @@ namespace senf { //#include "MACAddress.cti" #endif - + // Local Variables: // mode: c++ // fill-column: 100