X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FSocket%2FProtocols%2FINet%2FINet6Address.cc;h=487a9523b1bccc8c9ce3dac3721854f536590ced;hb=HEAD;hp=f2c0204cba6b686b2d4f70365749829865369486;hpb=0fb5ed1adf2f67dbf47fdfed3f3c8be989cf3618;p=senf.git diff --git a/senf/Socket/Protocols/INet/INet6Address.cc b/senf/Socket/Protocols/INet/INet6Address.cc index f2c0204..487a952 100644 --- a/senf/Socket/Protocols/INet/INet6Address.cc +++ b/senf/Socket/Protocols/INet/INet6Address.cc @@ -2,23 +2,28 @@ // // 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. +// 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 // -// 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. +// 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. // -// 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. +// 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 INet6Address non-inline non-template implementation */ @@ -34,12 +39,14 @@ #include #include #include +#include +#include //#include "INet6Address.mpp" #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::INet6Address prefix_ senf::INet6Address senf::INet6Address::from_string(std::string const & s, @@ -47,10 +54,10 @@ prefix_ senf::INet6Address senf::INet6Address::from_string(std::string const & s { struct in6_addr ina; if (::inet_pton(AF_INET6,s.c_str(),&ina) > 0) - return senf::INet6Address::from_data(&ina.s6_addr[0]); + return INet6Address::from_data(&ina.s6_addr[0]); if (s.empty()) - throw AddressSyntaxException(); + throw AddressSyntaxException() << ": empty string"; int herr (0); @@ -77,7 +84,7 @@ prefix_ senf::INet6Address senf::INet6Address::from_string(std::string const & s if (ent && ent->h_addrtype == AF_INET6) // We are only interested in the first address ... - return senf::INet6Address::from_data( + return INet6Address::from_data( &reinterpret_cast(*(ent->h_addr_list))->s6_addr[0]); if (resolve == ResolveINet4) @@ -92,6 +99,38 @@ prefix_ in6_addr senf:: INet6Address::toin6_addr() const { return ina; } +prefix_ senf::INet6Address senf::INet6Address::from_mac(MACAddress const & mac) +{ + INet6Address addr; + addr[0] = 0xfe; + addr[1] = 0x80; + addr[8] = mac[0] ^ 0x2; // invert the "u" (universal/local) bit; see RFC 4291 Appx. A + addr[9] = mac[1]; + addr[10] = mac[2]; + addr[11] = 0xff; + addr[12] = 0xfe; + addr[13] = mac[3]; + addr[14] = mac[4]; + addr[15] = mac[5]; + return addr; +} + +prefix_ senf::INet6Address senf::INet6Address::from_eui64(EUI64 const & eui) +{ + INet6Address addr; + addr[0] = 0xfe; + addr[1] = 0x80; + addr[8] = eui[0] ^ 0x2; // invert the "u" (universal/local) bit; see RFC 4291 Appx. A + std::copy(eui.begin()+1, eui.end(), addr.begin()+9); + return addr; +} + +prefix_ senf::EUI64 senf::INet6Address::id() + const +{ + return EUI64::from_data(begin()+8); +} + prefix_ std::ostream & senf::operator<<(std::ostream & os, INet6Address const & addr) { ::in6_addr ina; @@ -122,7 +161,7 @@ senf::INet6Address const senf::INet6Address::Loopback (0u,0u,0u,0u,0u,0u,0u,1u senf::INet6Address const senf::INet6Address::AllNodes (0xFF02u,0u,0u,0u,0u,0u,0u,1u); senf::INet6Address const senf::INet6Address::AllRouters (0xFF02u,0u,0u,0u,0u,0u,0u,2u); -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::INet6Network prefix_ senf::INet6Network::INet6Network(std::string const & s) @@ -131,21 +170,35 @@ prefix_ senf::INet6Network::INet6Network(std::string const & s) using boost::lambda::_2; std::string::size_type i (s.find('/')); if (i == std::string::npos) - throw AddressSyntaxException(); + throw AddressSyntaxException(s); try { - prefix_len_ = boost::lexical_cast(std::string(s,i+1)); + prefix_len_ = prefix_len_checked( boost::lexical_cast(std::string(s,i+1))); } catch (boost::bad_lexical_cast const &) { - throw AddressSyntaxException(); + throw AddressSyntaxException(s); } address_ = INet6Address::from_string(std::string(s, 0, i)); detail::apply_mask(prefix_len_, address_.begin(), address_.end(), _1 &= _2); } -///////////////////////////////cc.e//////////////////////////////////////// +prefix_ std::istream & senf::operator>>(std::istream & is, INet6Network & addr) +{ + std::string s; + if (!(is >> s)) + return is; + try { + addr = INet6Network(s); + } + catch (AddressException &) { + is.setstate(std::ios::failbit); + } + return is; +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ //#include "INet6Address.mpp" - + // Local Variables: // mode: c++ // fill-column: 100