X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FDefaultBundle%2FIPv6Extensions.hh;h=c38fda46276e9d610f7adc68fe5213fcc0454d47;hb=ab7ff164ab5ae711ec09ce2b24228510f1ffdcff;hp=197f5c9264323d5c25a58fbd1ffabfa65980fe19;hpb=601d1f509f5bb24df167a4dd5a20da67a0af9af8;p=senf.git diff --git a/senf/Packets/DefaultBundle/IPv6Extensions.hh b/senf/Packets/DefaultBundle/IPv6Extensions.hh index 197f5c9..c38fda4 100644 --- a/senf/Packets/DefaultBundle/IPv6Extensions.hh +++ b/senf/Packets/DefaultBundle/IPv6Extensions.hh @@ -2,24 +2,29 @@ // // Copyright (C) 2007 // Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY -// Stefan Bund -// Philipp Batroff -// 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. // -// 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 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 // -// 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. - +// 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 +// Philipp Batroff /** \file \brief IPv6Extensions public header */ @@ -27,330 +32,341 @@ #define HH_SENF_Packets_DefaultBundle_IPv6Extensions_ 1 // Custom includes +#include "IPv6ExtOptions.hh" +#include "ListOptionTypeParser.hh" #include "IPv6Packet.hh" //#include "IPv6Extensions.mpp" -///////////////////////////////hh.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// namespace senf { /** \brief Parse in IPv6 fragment extension header - + Parser implementing the IPv6 fragment extension. The fields implemented are: - \image html IPv6Extensions_Fragment.png + \image html IPv6FragmentPacket.png \see IPv6ExtensionType_Fragment \n RFC 2460 */ - struct IPv6PacketParserExtension_Fragment : public PacketParserBase + struct IPv6FragmentPacketParser : public PacketParserBase { # include SENF_FIXED_PARSER() SENF_PARSER_FIELD ( nextHeader , UInt8Parser ); SENF_PARSER_PRIVATE_FIELD ( reserved1 , UInt8Parser ); - SENF_PARSER_BITFIELD ( fragmentOffset , 13, unsigned ); SENF_PARSER_PRIVATE_BITFIELD ( reserved2 , 2, unsigned ); SENF_PARSER_BITFIELD ( moreFragments , 1, bool ); - SENF_PARSER_FIELD ( id , UInt32Parser ); - SENF_PARSER_FINALIZE(IPv6PacketParserExtension_Fragment); + SENF_PARSER_FINALIZE(IPv6FragmentPacketParser); }; /** \brief IPv6 fragment extension \par Packet type (typedef): - \ref IPv6Extension_Fragment + \ref IPv6FragmentPacket \par Fields: - \ref IPv6PacketParserExtension_Fragment - + \ref IPv6FragmentPacketParser + \par Associated registries: \ref IpTypes - + \par Finalize action: Set \a nextHeader from type of next packet if found in \ref IpTypes \ingroup protocolbundle_default */ - struct IPv6ExtensionType_Fragment + struct IPv6FragmentPacketType : public PacketTypeBase, - public PacketTypeMixin + public PacketTypeMixin { #ifndef DOXYGEN - typedef PacketTypeMixin mixin; + typedef PacketTypeMixin mixin; #endif /** \brief IPv6 fragment extension packet typedef */ - typedef ConcretePacket packet; + typedef ConcretePacket packet; /** \brief typedef to the parser of IPv6 fragment extension packet */ - typedef IPv6PacketParserExtension_Fragment parser; + typedef IPv6FragmentPacketParser parser; using mixin::nextPacketRange; using mixin::nextPacketType; using mixin::initSize; using mixin::init; - static key_t nextPacketKey(packet p) + static key_t nextPacketKey(packet p) { return p->nextHeader(); } - - /** \brief Dump given IPv6Extension_Fragment in readable form to given output stream */ - static void dump(packet p, std::ostream & os); - static void finalize(packet p) { - p->nextHeader() << key(p.next(nothrow)); } + /** \brief Dump given IPv6FragmentPacket in readable form to given output stream */ + static void dump(packet p, std::ostream & os); + + static void finalize(packet p); }; - /** \brief IPv6 fragment extension packet typedef */ - typedef ConcretePacket IPv6Extension_Fragment; + /** \brief IPv6 fragment extension packet typedef + \ingroup protocolbundle_default + */ + typedef ConcretePacket IPv6FragmentPacket; // ===================================================================================================== /** \brief Parse in IPv6 routing extension header - Parser implementing the IPv6 routing Header extension. The fields implemented are: - \image html IPv6Extensions_Routing.png + Parser implementing the IPv6 routing Header extension (type 0 only). + The fields implemented are: + \image html IPv6RoutingPacket.png - \see IPv6ExtensionType_Routing \n - RFC 2460 + \see IPv6ExtensionType_Routing \n + RFC 2460 */ - -//Routing Header Extension (type 0 only) - struct IPv6PacketParserExtension_Routing : public PacketParserBase + struct IPv6RoutingPacketParser : public PacketParserBase { -/* -The Type 0 Routing header has the following format: (RFC 2460) - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Next Header | Hdr Ext Len | Routing Type=0| Segments Left | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Reserved | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - + + - | | - + Address[1] + - | | - + + - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - . . . - . . . - . . . - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - + + - | | - + Address[n] + - | | - + + - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - -*/ + /* + The Type 0 Routing header has the following format: (RFC 2460) + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next Header | Hdr Ext Len | Routing Type=0| Segments Left | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Reserved | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + + + | | + + Address[1] + | | + + + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + . . . + . . . + . . . + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + + + | | + + Address[n] + | | + + + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ # include SENF_PARSER() - + SENF_PARSER_FIELD ( nextHeader, UInt8Parser ); SENF_PARSER_FIELD ( headerLength, UInt8Parser ); SENF_PARSER_FIELD ( routingType, UInt8Parser ); //set to Zero for minimal implementation SENF_PARSER_FIELD_RO ( segmentsLeft, UInt8Parser ); SENF_PARSER_FIELD ( reserved, UInt32Parser ); //set to zero by RFC SENF_PARSER_VECTOR ( hopAddresses, segmentsLeft, INet6AddressParser ); - - SENF_PARSER_FINALIZE ( IPv6PacketParserExtension_Routing ); - + + SENF_PARSER_FINALIZE ( IPv6RoutingPacketParser ); + //provisionary, since only type 0 is implemented - SENF_PARSER_INIT() { + SENF_PARSER_INIT() { routingType() = 0u; - reserved() = 0u; + reserved() = 0u; } }; - + /** \brief IPv6 routing extension \par Packet type (typedef): - \ref IPv6Extension_Routing + \ref IPv6RoutingPacket \par Fields: - \ref IPv6PacketParserExtension_Routing - + \ref IPv6RoutingPacketParser + \par Associated registries: - \ref IpTypes - + \ref IpTypes + \par Finalize action: - Set \a nextHeader from type of next packet if found in \ref IpTypes + Set \a nextHeader from type of next packet if found in \ref IpTypes - \ingroup protocolbundle_default - */ - - struct IPv6ExtensionType_Routing + \ingroup protocolbundle_default + */ + struct IPv6RoutingPacketType : public PacketTypeBase, - public PacketTypeMixin - + public PacketTypeMixin { #ifndef DOXYGEN - typedef PacketTypeMixin mixin; + typedef PacketTypeMixin mixin; #endif /** \brief IPv6 routing extension packet typedef */ - typedef ConcretePacket packet; + typedef ConcretePacket packet; /** \brief typedef to the parser of IPv6 routing extension packet */ - typedef IPv6PacketParserExtension_Routing parser; - + typedef IPv6RoutingPacketParser parser; + using mixin::nextPacketRange; using mixin::nextPacketType; using mixin::init; using mixin::initSize; - - static key_t nextPacketKey(packet p) + + static key_t nextPacketKey(packet p) { return p->nextHeader(); } - /** \brief Dump given IPv6Extension_Routing in readable form to given output stream */ - static void dump(packet p, std::ostream & os); - - static void finalize(packet p) { - p->nextHeader() << key(p.next(nothrow)); } + + /** \brief Dump given IPv6RoutingPacket in readable form to given output stream */ + static void dump(packet p, std::ostream & os); + + static void finalize(packet p); }; - - /** \brief IPv6 routing extension packet typedef */ - typedef ConcretePacket IPv6Extension_Routing; - + /** \brief IPv6 routing extension packet typedef + \ingroup protocolbundle_default + */ + typedef ConcretePacket IPv6RoutingPacket; + + // ===================================================================================================== - + /** \brief Parse in IPv6 Hop-By-Hop extension header Parser implementing the IPv6 routing Header extension. The fields implemented are: - \image html IPv6Extensions_HopByHop.png + \image html IPv6HopByHopOptionsPacket.png - \see IPv6ExtensionType_HopByHop \n - RFC 2460 + \see IPv6ExtensionType_HopByHop \n + RFC 2460 */ + struct IPv6HopByHopOptionsPacketParser : public PacketParserBase + { +# include SENF_PARSER() -// Hop-By-Hop skeleton without Options + SENF_PARSER_FIELD ( nextHeader, UInt8Parser ); + SENF_PARSER_FIELD_RO ( headerLength, UInt8Parser ); - struct IPv6PacketParserExtension_HopByHop : public PacketParserBase { -# include SENF_PARSER() - SENF_PARSER_FIELD ( nextHeader, UInt8Parser ); - SENF_PARSER_FIELD ( headerLength, UInt8Parser ); - - SENF_PARSER_FINALIZE ( IPv6PacketParserExtension_HopByHop ); + typedef detail::FixedAuxParserPolicy ListOptionTypeAuxPolicy; + typedef detail::ListOptionTypeParser_Policy< + IPv6GenericOptionParser, ListOptionTypeAuxPolicy> ListOptionTypePolicy; + typedef ListParser ListOptionTypeParser; + + SENF_PARSER_FIELD ( options, ListOptionTypeParser); + + SENF_PARSER_FINALIZE ( IPv6HopByHopOptionsPacketParser ); }; - + /** \brief IPv6 Hop-By-Hop extension \par Packet type (typedef): - \ref IPv6Extension_HopByHop + \ref IPv6HopByHopOptionsPacket \par Fields: - \ref IPv6PacketParserExtension_HopByHop - + \ref IPv6HopByHopOptionsPacketParser + \par Associated registries: - \ref IpTypes - + \ref IpTypes + \par Finalize action: - Set \a nextHeader from type of next packet if found in \ref IpTypes + Set \a nextHeader from type of next packet if found in \ref IpTypes - \ingroup protocolbundle_default + \ingroup protocolbundle_default */ - - struct IPv6ExtensionType_HopByHop + struct IPv6HopByHopOptionsPacketType : public PacketTypeBase, - public PacketTypeMixin + public PacketTypeMixin { #ifndef DOXYGEN - typedef PacketTypeMixin mixin; + typedef PacketTypeMixin mixin; #endif /** \brief IPv6 Hop-By-Hop extension packet typedef */ - typedef ConcretePacket packet; + typedef ConcretePacket packet; /** \brief typedef to the parser of IPv6 Hop-By-Hop extension packet */ - typedef IPv6PacketParserExtension_HopByHop parser; - + typedef IPv6HopByHopOptionsPacketParser parser; + using mixin::nextPacketRange; using mixin::nextPacketType; using mixin::init; using mixin::initSize; - - static key_t nextPacketKey(packet p) - { return p->nextHeader(); } - /** \brief Dump given IPv6Extension_HopByHop in readable form to given output stream */ - static void dump(packet p, std::ostream & os); - - static void finalize(packet p) { - p->nextHeader() << key(p.next(nothrow)); } + + static key_t nextPacketKey(packet p) { + return p->nextHeader(); } + + /** \brief Dump given IPv6HopByHopOptionsPacket in readable form to given output stream */ + static void dump(packet p, std::ostream & os); + + static void finalize(packet p); }; - - /** \brief IPv6 routing Hop-By-Hop packet typedef */ - typedef ConcretePacket IPv6Extension_HopByHop; - + + /** \brief IPv6 routing Hop-By-Hop packet typedef + \ingroup protocolbundle_default + */ + typedef ConcretePacket IPv6HopByHopOptionsPacket; + // ===================================================================================================== - + /** \brief Parse in IPv6 Destination Options extension header - Parser implementing the IPv6 Destination Options Header extension. The fields implemented are: - \image html IPv6Extensions_Destination.png + Parser implementing the IPv6 Destination Options Header extension. + The fields implemented are: + \image html IPv6DestinationOptionsPacket.png - \see IPv6ExtensionType_Destination \n - RFC 2460 + \see IPv6ExtensionType_Destination \n + RFC 2460 */ - - // Destination Options skeleton without TLV-Options - - struct IPv6PacketParserExtension_Destination : public PacketParserBase { + struct IPv6DestinationOptionsPacketParser : public PacketParserBase + { # include SENF_PARSER() SENF_PARSER_FIELD ( nextHeader, UInt8Parser ); - SENF_PARSER_FIELD ( headerLength, UInt8Parser ); - - SENF_PARSER_FINALIZE ( IPv6PacketParserExtension_Destination ); + SENF_PARSER_FIELD_RO ( headerLength, UInt8Parser ); + typedef detail::FixedAuxParserPolicy ListOptionTypeAuxPolicy; + typedef detail::ListOptionTypeParser_Policy< + IPv6GenericOptionParser, ListOptionTypeAuxPolicy> ListOptionTypePolicy; + typedef ListParser ListOptionTypeParser; + + SENF_PARSER_FIELD ( options, ListOptionTypeParser); + + SENF_PARSER_FINALIZE ( IPv6DestinationOptionsPacketParser ); }; - + /** \brief IPv6 Destination Options extension \par Packet type (typedef): - \ref IPv6Extension_Destination + \ref IPv6DestinationOptionsPacket \par Fields: - \ref IPv6PacketParserExtension_Destination - + \ref IPv6DestinationOptionsPacketParser + \par Associated registries: - \ref IpTypes - + \ref IpTypes + \par Finalize action: - Set \a nextHeader from type of next packet if found in \ref IpTypes + Set \a nextHeader from type of next packet if found in \ref IpTypes - \ingroup protocolbundle_default - */ - - struct IPv6ExtensionType_Destination + \ingroup protocolbundle_default + */ + struct IPv6DestinationOptionsPacketType : public PacketTypeBase, - public PacketTypeMixin + public PacketTypeMixin { #ifndef DOXYGEN - typedef PacketTypeMixin mixin; + typedef PacketTypeMixin mixin; #endif /** \brief IPv6 Destination Options extension packet typedef */ - typedef ConcretePacket packet; + typedef ConcretePacket packet; /** \brief typedef to the parser of IPv6 Destination Options extension packet */ - typedef IPv6PacketParserExtension_Destination parser; - + typedef IPv6DestinationOptionsPacketParser parser; + using mixin::nextPacketRange; using mixin::nextPacketType; using mixin::init; using mixin::initSize; - - static key_t nextPacketKey(packet p) + + static key_t nextPacketKey(packet p) { return p->nextHeader(); } - /** \brief Dump given IPv6Extension_Destination in readable form to given output stream */ - static void dump(packet p, std::ostream & os); - - static void finalize(packet p) { - p->nextHeader() << key(p.next(nothrow)); } + /** \brief Dump given IPv6DestinationOptionsPacket in readable form to given output stream */ + static void dump(packet p, std::ostream & os); + + static void finalize(packet p); }; - - /** \brief IPv6 routing Destination Options packet typedef */ - typedef ConcretePacket IPv6Extension_Destination; - -} //namespace senf -///////////////////////////////hh.e//////////////////////////////////////// + /** \brief IPv6 routing Destination Options packet typedef + \ingroup protocolbundle_default + */ + typedef ConcretePacket IPv6DestinationOptionsPacket; + +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// //#include "IPv6Extensions.cci" //#include "IPv6Extensions.ct" //#include "IPv6Extensions.cti"