-// 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 <g0dil@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
// 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<inaddr_type *>(&(*this)[0]);
+}
+
+prefix_ senf::INet4Address::inaddr_type senf::INet4Address::iref()
+ const
+{
+ return *reinterpret_cast<inaddr_type const *>(&(*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///////////////////////////////////////