X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FINet%2FINet4Address.cci;h=b85ddafdb6f303010be960a68c403e674da5cac4;hb=10985d71f77b627bc4da543d7114feb7c4529329;hp=bf593e05a353b2198f9f938c6ca5b268e957b8ae;hpb=9c67039f2a8d9c445ce21912ed814743f61b104c;p=senf.git diff --git a/Socket/Protocols/INet/INet4Address.cci b/Socket/Protocols/INet/INet4Address.cci index bf593e0..b85ddaf 100644 --- a/Socket/Protocols/INet/INet4Address.cci +++ b/Socket/Protocols/INet/INet4Address.cci @@ -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 @@ -30,32 +32,129 @@ // senf::INet4Address prefix_ senf::INet4Address::INet4Address() - : addr_() +{ + std::fill(begin(), end(), 0u); +} + +prefix_ senf::INet4Address::INet4Address(senf::NoInit_t) {} -prefix_ senf::INet4Address senf::INet4Address::from_inaddr(unsigned long v) +prefix_ senf::INet4Address senf::INet4Address::from_inaddr(inaddr_type v) +{ + return INet4Address(v,IsInAddr); +} + +prefix_ senf::INet4Address::inaddr_type & senf::INet4Address::iref() +{ + return *reinterpret_cast(&(*this)[0]); +} + +prefix_ senf::INet4Address::inaddr_type senf::INet4Address::iref() + const +{ + return *reinterpret_cast(&(*this)[0]); +} + +prefix_ senf::INet4Address::inaddr_type senf::INet4Address::inaddr() + const { - INet4Address addr; - addr.addr_ = v; - return addr; + return iref(); +} + +prefix_ senf::INet4Address::INet4Address(inaddr_type addr, InAddr_t) +{ + iref() = addr; } prefix_ bool senf::INet4Address::broadcast() const { - return addr_ == 0xFFFFFFFFu; + return inaddr() == 0xFFFFFFFFu; } prefix_ bool senf::INet4Address::boolean_test() const { - return addr_; + return inaddr(); } -prefix_ unsigned long senf::INet4Address::raw() +/////////////////////////////////////////////////////////////////////////// +// senf::INet4Network + +prefix_ unsigned senf::INet4Network::prefix_len() const { - return addr_; + return prefix_len_; +} + +//////////////////////////////////////// +// private members + +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; +} + +//////////////////////////////////////// +// public members + +prefix_ senf::INet4Network::INet4Network() + : prefix_len_(), address_() +{} + +prefix_ senf::INet4Network::INet4Network(INet4Address address, unsigned prefix_len) + : prefix_len_(prefix_len), address_(INet4Address(address.address() & mask())) +{} + +prefix_ senf::INet4Address const & senf::INet4Network::address() + const +{ + return address_; +} + +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 addr) + const +{ + return (addr.address() & mask()) == address_.address(); +} + +prefix_ bool senf::INet4Network::match(INet4Network 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); +} + +/////////////////////////////////////////////////////////////////////////// +// namespace members + +prefix_ std::ostream & senf::operator<<(std::ostream & os, INet4Network const & addr) +{ + os << addr.address() << '/' << addr.prefix_len(); + return os; } ///////////////////////////////cci.e///////////////////////////////////////