X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FRaw%2FMACAddress.hh;h=cc4a6bad361a95fbd6d0fcd7f50f1f954f0c1995;hb=5443435c4c2b6e4386c5334b5b8358273f2bae93;hp=0e269602cc3f079298f46b7e6622a0851bddbc9e;hpb=6bb3fa3caaa41dab4d5b451ca27e70f9e55e49d6;p=senf.git diff --git a/Socket/Protocols/Raw/MACAddress.hh b/Socket/Protocols/Raw/MACAddress.hh index 0e26960..cc4a6ba 100644 --- a/Socket/Protocols/Raw/MACAddress.hh +++ b/Socket/Protocols/Raw/MACAddress.hh @@ -1,6 +1,8 @@ -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) +// $Id$ +// +// Copyright (C) 2007 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -21,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 @@ -30,68 +32,111 @@ #include #include #include -#include "Utils/SafeBool.hh" +#include "../../../Utils/safe_bool.hh" +#include "../../../Utils/Tags.hh" +#include "../AddressExceptions.hh" //#include "MACAddress.mpp" ///////////////////////////////hh.p//////////////////////////////////////// namespace senf { + class EUI64; + /** \brief Ethernet MAC address - - The Ethernet MAC is modelled as a fixed-size container/sequence of 6 bytes. + + The Ethernet MAC is modelled as a fixed-size container/sequence of 6 bytes. A MACAddress can + be converted from/to the following representations + + + + + + + + + + +
boost::uint64_tsenf::MACAddress(0x112233445566ull)
+ mac.uint64()
std::stringsenf::MACAddress::from_string("11:22:33:44:55:66")
+ senf::str(mac)
raw data
    (6 bytes)
senf::MACAddress::from_data(iterator)
+ mac.begin()
senf::EUI64senf::MACAddress::from_eui64(eui64)
+ senf::EUI64::from_mac(mac)
+ + 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 + senf::MACAddress mac (...); + std::vector data; + data.resize(6); + std::copy(mac.begin(), mac.end(), data.begin()); // Copy 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 + therefore not be distinguished from initialization with a string literal. Therefore we + need to disambiguate using the named constructors. + + \ingroup addr_group */ struct MACAddress - : public boost::array, - public ComparableSafeBool + : public boost::array, + public comparable_safe_bool { - enum NoInit_t { noinit }; - + static MACAddress const Broadcast; ///< The broadcast address + static MACAddress const None; ///< The empty (0) address + MACAddress(); ///< Construct zero-initialized address - MACAddress(NoInit_t); ///< Construct uninitialized (!) address + MACAddress(senf::NoInit_t); ///< Construct uninitialized (!) address + explicit MACAddress(boost::uint64_t v); ///< Construct MACAddress constants static MACAddress from_string(std::string const & s); ///< Construct address from string representation /**< 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 + template static MACAddress from_data(InputIterator i); ///< Construct address from raw data /**< Copies the data from \a i into the MAC address. \pre The input range at \a i must have a size of at least 6 elements. */ - static MACAddress from_eui64(boost::uint64_t v); + static MACAddress from_eui64(senf::EUI64 const & eui); ///< Construct address from EUI-64 /**< This constructor takes an EUI-64 value and converts it 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 group() const; ///< \c true, if address is a group/multicast address + 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 - /** \brief Bad MAC address syntax or conversion */ - struct SyntaxException : public std::exception - { virtual char const * what() const throw() { return "invalid MAC address syntax"; } }; + 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); } @@ -101,7 +146,7 @@ namespace senf { //#include "MACAddress.cti" #endif - + // Local Variables: // mode: c++ // fill-column: 100