// $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 INet4Address inline non-template implementation */ // Custom includes #include #define prefix_ inline //-///////////////////////////////////////////////////////////////////////////////////////////////// //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::INet4Address prefix_ senf::INet4Address::INet4Address() { std::fill(begin(), end(), 0u); } prefix_ senf::INet4Address::INet4Address(senf::NoInit_t) {} prefix_ senf::INet4Address senf::INet4Address::from_inaddr(inaddr_type v) { return INet4Address(v,IsInAddr); } prefix_ senf::INet4Address::inaddr_type & senf::INet4Address::iref() { return *static_cast(static_cast((&(*this)[0]))); } prefix_ senf::INet4Address::inaddr_type senf::INet4Address::iref() const { return *static_cast(static_cast(&(*this)[0])); } prefix_ senf::INet4Address::inaddr_type senf::INet4Address::inaddr() const { return iref(); } prefix_ senf::INet4Address::INet4Address(inaddr_type addr, InAddr_t) { iref() = addr; } prefix_ bool senf::INet4Address::broadcast() const { return inaddr() == 0xFFFFFFFFu; } prefix_ bool senf::INet4Address::boolean_test() const { return inaddr(); } //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::INet4Network //-///////////////////////////////////////////////////////////////////////////////////////////////// // public members prefix_ senf::INet4Network::INet4Network() : prefix_len_(), address_() {} prefix_ senf::INet4Network::INet4Network(INet4Address const & address, unsigned prefix_len) : prefix_len_( prefix_len_checked(prefix_len)), address_(INet4Address(address.address() & mask())) {} prefix_ senf::INet4Address const & senf::INet4Network::address() const { return address_; } prefix_ unsigned senf::INet4Network::prefix_len() const { return prefix_len_; } prefix_ bool senf::INet4Network::boolean_test() const { return address() || prefix_len(); } prefix_ bool senf::INet4Network::operator==(INet4Network const & other) const { return address() == other.address() && prefix_len() == other.prefix_len(); } prefix_ bool senf::INet4Network::match(INet4Address const & addr) const { return (addr.address() & mask()) == address_.address(); } prefix_ bool senf::INet4Network::match(INet4Network const & net) const { return net.prefix_len() >= prefix_len() && match(net.address()); } prefix_ senf::INet4Address senf::INet4Network::host(boost::uint32_t number) { return INet4Address(address_.address() | (number & ~mask())); } prefix_ senf::INet4Network senf::INet4Network::subnet(boost::uint32_t net, unsigned prefix_len) { return INet4Network(host(net << (32-prefix_len)),prefix_len); } //-///////////////////////////////////////////////////////////////////////////////////////////////// // private members prefix_ unsigned senf::INet4Network::prefix_len_checked(unsigned prefix_len) const { if (prefix_len > 32) throw AddressSyntaxException("invalid INet4 prefix length: " + boost::lexical_cast(prefix_len)); return prefix_len; } prefix_ boost::uint32_t senf::INet4Network::mask() const { // This is correct as long as the system is using 2-complement arithmetic ... return (~((boost::uint32_t(1u)<<(32u-prefix_len()))-1u)) & 0xFFFFFFFFu; } //-///////////////////////////////////////////////////////////////////////////////////////////////// // namespace members prefix_ std::ostream & senf::operator<<(std::ostream & os, INet4Network const & addr) { os << addr.address() << '/' << addr.prefix_len(); return os; } //-///////////////////////////////////////////////////////////////////////////////////////////////// #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: