X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FRaw%2FMACAddress.cc;h=e8fb19bf2cd3f2476bc93704f55e2d3ca2b3f289;hb=a1fdb7bb122f0b05be809a922d4b7ef5e125fa67;hp=4d00c8ae5ec05b70c5baf5c3f1b462d60ade654b;hpb=6bb3fa3caaa41dab4d5b451ca27e70f9e55e49d6;p=senf.git diff --git a/Socket/Protocols/Raw/MACAddress.cc b/Socket/Protocols/Raw/MACAddress.cc index 4d00c8a..e8fb19b 100644 --- a/Socket/Protocols/Raw/MACAddress.cc +++ b/Socket/Protocols/Raw/MACAddress.cc @@ -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 @@ -26,6 +28,8 @@ // Custom includes #include +#include +#include #include #include #include @@ -39,26 +43,26 @@ namespace { boost::uint8_t hexToNibble(char c) { if (c<'0') - throw senf::MACAddress::SyntaxException(); + throw senf::AddressSyntaxException(); else if (c<='9') return c-'0'; else if (c<'A') - throw senf::MACAddress::SyntaxException(); + throw senf::AddressSyntaxException(); else if (c<='F') return c-'A'+10; else if (c<'a') - throw senf::MACAddress::SyntaxException(); + throw senf::AddressSyntaxException(); else if (c<='f') return c-'a'+10; else - throw senf::MACAddress::SyntaxException(); + throw senf::AddressSyntaxException(); } - + template boost::uint8_t hexToByte(Range const & range) { if (boost::size(range) != 2) - throw senf::MACAddress::SyntaxException(); + throw senf::AddressSyntaxException(); typename boost::range_const_iterator::type i (boost::begin(range)); return hexToNibble(i[0])*16+hexToNibble(i[1]); } @@ -70,7 +74,7 @@ namespace { prefix_ senf::MACAddress::MACAddress senf::MACAddress::from_string(std::string const & s) { - MACAddress mac (MACAddress::noinit); + MACAddress mac (senf::noinit); typedef boost::char_separator separator; typedef boost::tokenizer tokenizer; separator sep (":-"); @@ -82,15 +86,15 @@ prefix_ senf::MACAddress::MACAddress senf::MACAddress::from_string(std::string c for (; i!=i_end && j!=j_end; ++i, ++j) *j = hexToByte(*i); if (i!=i_end || j!=j_end) - throw SyntaxException(); + throw AddressSyntaxException(); return mac; } prefix_ senf::MACAddress senf::MACAddress::from_eui64(boost::uint64_t v) { if ( boost::uint16_t(v>>24) != 0xfffe ) - throw SyntaxException(); - MACAddress mac (MACAddress::noinit); + throw AddressSyntaxException(); + MACAddress mac (senf::noinit); mac[0] = boost::uint8_t( v>>56 ); mac[1] = boost::uint8_t( v>>48 ); mac[2] = boost::uint8_t( v>>40 ); @@ -100,6 +104,10 @@ prefix_ senf::MACAddress senf::MACAddress::from_eui64(boost::uint64_t v) return mac; } +senf::MACAddress const senf::MACAddress::Broadcast = senf::MACAddress(0xFFFFFFFFFFFFull); +senf::MACAddress const senf::MACAddress::None; + + /////////////////////////////////////////////////////////////////////////// // namespace members @@ -115,11 +123,25 @@ prefix_ std::ostream & senf::operator<<(std::ostream & os, MACAddress const & ma return os; } +prefix_ std::istream & senf::operator>>(std::istream & is, MACAddress & mac) +{ + std::string s; + if (!(is >> s)) + return is; + try { + mac = MACAddress::from_string(s); + } + catch (AddressException &) { + is.setstate(std::ios::failbit); + } + return is; +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "MACAddress.mpp" - + // Local Variables: // mode: c++ // fill-column: 100