// $Id$ // // Copyright (C) 2007 // Fraunhofer Institute for Open Communication Systems (FOKUS) // // The contents of this file are subject to the Fraunhofer FOKUS Public License // Version 1.0 (the "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // http://senf.berlios.de/license.html // // The Fraunhofer FOKUS Public License Version 1.0 is based on, // but modifies the Mozilla Public License Version 1.1. // See the full license text for the amendments. // // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License // for the specific language governing rights and limitations under the License. // // The Original Code is Fraunhofer FOKUS code. // // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. // (registered association), Hansastraße 27 c, 80686 Munich, Germany. // All Rights Reserved. // // Contributor(s): // Stefan Bund /** \file \brief MACAddress inline non-template implementation */ // Custom includes #include #include #include "EUI64.hh" #define prefix_ inline //-///////////////////////////////////////////////////////////////////////////////////////////////// //-///////////////////////////////////////////////////////////////////////////////////////////////// // 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] ) ); } prefix_ bool senf::operator==(MACAddress const & mac, EUI64 const & eui64) { return eui64.isMACCompatible() && std::equal(eui64.begin(), eui64.begin()+3, mac.begin()) && std::equal(eui64.begin()+5, eui64.end(), mac.begin()+3); } prefix_ bool senf::operator==(EUI64 const & eui64, MACAddress const & mac) { return mac == eui64; } //-///////////////////////////////////////////////////////////////////////////////////////////////// #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: