X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FSocket%2FProtocols%2FRaw%2FMACAddress.cci;fp=senf%2FSocket%2FProtocols%2FRaw%2FMACAddress.cci;h=a2ec2747e5f631a9b44d9b451e4d68aecde4e251;hb=601d1f509f5bb24df167a4dd5a20da67a0af9af8;hp=0000000000000000000000000000000000000000;hpb=164fe477094d42463722584e527a02379ab5d985;p=senf.git diff --git a/senf/Socket/Protocols/Raw/MACAddress.cci b/senf/Socket/Protocols/Raw/MACAddress.cci new file mode 100644 index 0000000..a2ec274 --- /dev/null +++ b/senf/Socket/Protocols/Raw/MACAddress.cci @@ -0,0 +1,135 @@ +// $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 +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +/** \file + \brief MACAddress inline non-template implementation */ + +// Custom includes +#include +#include + +#define prefix_ inline +///////////////////////////////cci.p/////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////// +// senf::MACAddress + +prefix_ senf::MACAddress::MACAddress() +{ + std::fill(begin(),end(),0u); +} + +prefix_ senf::MACAddress::MACAddress(senf::NoInit_t) +{} + +prefix_ senf::MACAddress::MACAddress(boost::uint64_t v) +{ + (*this)[0] = boost::uint8_t( v>>40 ); + (*this)[1] = boost::uint8_t( v>>32 ); + (*this)[2] = boost::uint8_t( v>>24 ); + (*this)[3] = boost::uint8_t( v>>16 ); + (*this)[4] = boost::uint8_t( v>> 8 ); + (*this)[5] = boost::uint8_t( v ); +} + +prefix_ bool senf::MACAddress::local() + const +{ + return (*this)[0] & 0x02; +} + +prefix_ bool senf::MACAddress::multicast() + const +{ + return (*this)[0] & 0x01; +} + +prefix_ bool senf::MACAddress::broadcast() + const +{ + using boost::lambda::_1; + return std::find_if(begin(),end(), _1 != 0xffu) == end(); +} + +prefix_ bool senf::MACAddress::boolean_test() + const +{ + using boost::lambda::_1; + return std::find_if(begin(),end(), _1 != 0x00u) != end(); +} + +prefix_ boost::uint32_t senf::MACAddress::oui() + const +{ + return + (boost::uint32_t((*this)[0])<<16) | + (boost::uint32_t((*this)[1])<<8) | + (*this)[2]; +} + +prefix_ boost::uint32_t senf::MACAddress::nic() + const +{ + return + (boost::uint32_t((*this)[3])<<16) | + (boost::uint32_t((*this)[4])<<8) | + (*this)[5]; +} + +prefix_ boost::uint64_t senf::MACAddress::eui64() + const +{ + return + (boost::uint64_t( (*this)[0] ) << 56) | + (boost::uint64_t( (*this)[1] ) << 48) | + (boost::uint64_t( (*this)[2] ) << 40) | + (boost::uint64_t( 0xfffe ) << 24) | + (boost::uint64_t( (*this)[3] ) << 16) | + (boost::uint64_t( (*this)[4] ) << 8) | + (boost::uint64_t( (*this)[5] ) ); +} + +prefix_ boost::uint64_t senf::MACAddress::uint64() + const +{ + return + (boost::uint64_t( (*this)[0] ) << 40) | + (boost::uint64_t( (*this)[1] ) << 32) | + (boost::uint64_t( (*this)[2] ) << 24) | + (boost::uint64_t( (*this)[3] ) << 16) | + (boost::uint64_t( (*this)[4] ) << 8) | + (boost::uint64_t( (*this)[5] ) ); +} + +///////////////////////////////cci.e/////////////////////////////////////// +#undef prefix_ + + +// Local Variables: +// mode: c++ +// fill-column: 100 +// comment-column: 40 +// c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// End: