X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FDefaultBundle%2FIPv6ExtOptionType.ct;h=fef4b76d2929d26c9ef953517492ac3ff7679afb;hb=ec7f715d7eef5bb915c7ca39587a99fb41d8d3be;hp=3aa4f2a89828509789868e06a72ea80998598060;hpb=25976ed67c66d30811fa0a01043e50347e9d1e69;p=senf.git diff --git a/senf/Packets/DefaultBundle/IPv6ExtOptionType.ct b/senf/Packets/DefaultBundle/IPv6ExtOptionType.ct index 3aa4f2a..fef4b76 100644 --- a/senf/Packets/DefaultBundle/IPv6ExtOptionType.ct +++ b/senf/Packets/DefaultBundle/IPv6ExtOptionType.ct @@ -1,6 +1,6 @@ // $Id: IPv6ExtOptionType.ct 869 2008-06-09 13:57:27Z pug $ // -// Copyright (C) 2007 +// Copyright (C) 2009 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY // Philipp.Batroff@fokus.fraunhofer.de @@ -20,20 +20,68 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -//#include "IPv6ExtOptionType.hh" +/** \file + \brief IPv6Extension-Options non-inline template implementation */ + +//#include "IPv6ExtOptionType.ih" // Custom includes +#include #define prefix_ ///////////////////////////////ct.p//////////////////////////////////////// template -prefix_ void senf::GenericOptTypeTLVPacketParser::value(ForwardReadableRange const &range) +prefix_ void senf::IPv6GenericOptionTLVParser::value(ForwardReadableRange const &range) +{ + unsigned int rangeSize = boost::size(range); + + if ( (rangeSize-2) != optionLength() ) + resize(optionLength()+2, rangeSize); + std::copy(boost::next(boost::begin(range), 2), boost::next(boost::end(range)), boost::next(i(), 2 + optionLength() )); + unsigned int val = *(boost::begin(range)); + unsigned int mask = 192u; + altAction() = (val & mask) >> 6; + mask = 32u; + changeFlag() = (val & mask) >> 5; + mask = 31u; + optionType() = (val & mask); + optionLength() = *(boost::next( boost::begin(range), 1)); +} + +template +prefix_ void senf::IPv6GenericOptionTLVParser::setPayload(ForwardReadableRange const &range) { - safe_data_iterator si = resizeValueField( boost::size(range) ); - std::copy( boost::begin(range), boost::end(range), si); + unsigned int rangeSize = boost::size(range); + if ( rangeSize != optionLength() ) + resize( (optionLength() + 2), (rangeSize + 2) ); + std::copy( boost::begin(range), boost::end(range), boost::next( i(), 2)); + optionLength() = rangeSize; } + +template +prefix_ Parser senf::IPv6GenericOptionTLVParser::init() +{ + size_type oldSize (bytes() ); + size_type newParserSize ( senf::init_bytes::value ); + resize( oldSize, newParserSize); + std::fill(i(),boost::next(i(), newParserSize), 0u); + Parser concreteParser = Parser(i(), state() ); + concreteParser.init(); + concreteParser.optionLength() = (newParserSize-2); + return concreteParser; +} + + +// template +// prefix_ Parser& senf::GenericOptTypeTLVParser::get() +// { +// SENF_ASSERT (optionType() == typeCode); +// return *(this); +// } + + ///////////////////////////////ct.e//////////////////////////////////////// #undef prefix_