PPI: Checkin of first compiling (yet not working) version
[senf.git] / Packets / DefaultBundle / IpV6Extensions.hh
index 380a2bb..a0bd5b0 100644 (file)
 
 namespace senf {
 
-    // See RFC2460
-    template <class Iterator=nil, class IPacket=nil>
-    struct Parse_IpV6Extension_Fragment
-        : public ParserBase<Iterator,IPacket>
+    /** \brief Parse in IpV6 fragment extension header
+        
+        Parser implementing the IpV6 fragment extension. The fields implemented are:
+
+        \see IpV6ExtensionType_Fragment \n
+            <a href="http://tools.ietf.org/html/rfc2460">RFC 2460</a>
+     */
+    struct Parse_IpV6Extension_Fragment : public PacketParserBase
     {
-        template <class I, class P=nil>
-        struct rebind { typedef Parse_IpV6Extension_Fragment<I,P> parser; };
-        typedef Iterator byte_iterator;
-
-        Parse_IpV6Extension_Fragment() {}
-        Parse_IpV6Extension_Fragment(Iterator const & i) : ParserBase<Iterator,IPacket>(i) {}
-
-        static unsigned bytes() { return 8; }
-
-        ///////////////////////////////////////////////////////////////////////////
-
-        typedef Parse_UInt8     <         Iterator > Parse_8bit;
-        typedef Parse_UIntField <  0, 13, Iterator > Parse_Offset;
-        typedef Parse_UIntField < 13, 15, Iterator > Parse_Reserved;
-        typedef Parse_Flag      < 15,     Iterator > Parse_More;
-        typedef Parse_UInt32    <         Iterator > Parse_32bit;
-
-        Parse_8bit      nextHeader()      const { return Parse_8bit      (this->i()      ); }
-        Parse_8bit      reserved1()       const { return Parse_8bit      (this->i() +  1 ); }
-        Parse_Offset    fragmentOffset()  const { return Parse_Offset    (this->i() +  2 ); }
-        Parse_Reserved  reserved2()       const { return Parse_Reserved  (this->i() +  2 ); }
-        Parse_More      moreFragments()   const { return Parse_More      (this->i() +  2 ); }
-        Parse_32bit     id()              const { return Parse_32bit     (this->i() +  4 ); }
+        typedef Parse_UInt8                Parse_8bit;
+        typedef Parse_UIntField <  0, 13 > Parse_Offset;
+        typedef Parse_UIntField < 13, 15 > Parse_Reserved;
+        typedef Parse_Flag      < 15     > Parse_More;
+        typedef Parse_UInt32               Parse_32bit;
+
+#       ifndef DOXYGEN
+
+        SENF_PACKET_PARSER_INIT(Parse_IpV6Extension_Fragment);
+
+        SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS(
+            ((Field       )( nextHeader     , Parse_8bit     ))
+            ((Field       )( reserved1      , Parse_8bit     ))
+            ((OverlayField)( fragmentOffset , Parse_Offset   ))
+            ((OverlayField)( reserved2      , Parse_Reserved ))
+            ((Field       )( moreFragments  , Parse_More     ))
+            ((Field       )( id             , Parse_32bit    )) );
+
+#       else
+
+        Parse_8bit nextHeader();
+        Parse_8bit reserved1();
+        Parse_Offset fragmentOffset();
+        Parse_Reserved reserved2();
+        Parse_More moreFragments();
+        Parse_32bit id();
+
+#       endif
     };
 
-    class IpV6Extension_Fragment
-        : public Packet,
-          public Parse_IpV6Extension_Fragment<Packet::iterator, IpV6Extension_Fragment>,
-          public PacketRegistryMixin<IpTypes, IpV6Extension_Fragment>
+    /** \brief IpV6 fragment extension
+
+        \par Packet type (typedef):
+            \ref IpV6Extension_Fragment
+
+        \par Fields:
+            \ref Parse_IpV6Extension_Fragment
+        
+        \par Associated registries:
+            \par IpTypes
+        
+        \ingroup protocolbundle_default
+     */
+    struct IpV6ExtensionType_Fragment
+        : public PacketTypeBase,
+          public PacketTypeMixin<IpV6ExtensionType_Fragment, IpTypes>
     {
-        using PacketRegistryMixin<IpTypes,IpV6Extension_Fragment>::registerInterpreter;
-    public:
-        ///////////////////////////////////////////////////////////////////////////
-        // Types
-
-        typedef ptr_t<IpV6Extension_Fragment>::ptr ptr;
-
-        ///////////////////////////////////////////////////////////////////////////
-
-    private:
-        template <class Arg>
-        IpV6Extension_Fragment(Arg const & arg);
-
-        virtual void v_nextInterpreter() const;
-        virtual void v_finalize();
-        virtual void v_dump(std::ostream & os) const;
-
-        friend class Packet;
+        typedef PacketTypeMixin<IpV6ExtensionType_Fragment, IpTypes> mixin;
+        typedef ConcretePacket<IpV6ExtensionType_Fragment> packet;
+        typedef Parse_IpV6Extension_Fragment parser;
+
+        using mixin::nextPacketRange;
+        using mixin::nextPacketType;
+        using mixin::initSize;
+        using mixin::init;
+
+        static registry_key_t nextPacketKey(packet p) 
+            { return p->nextHeader(); }
+        
+        static void dump(packet p, std::ostream & os);
     };
+
+    /** \brief IpV6 fragment extension packet typedef */
+    typedef IpV6ExtensionType_Fragment::packet IpV6Extension_Fragment;
 }
 
 ///////////////////////////////hh.e////////////////////////////////////////
+#endif
+#ifndef SENF_PACKETS_DECL_ONLY
 //#include "IpV6Extensions.cci"
-#include "IpV6Extensions.ct"
+//#include "IpV6Extensions.ct"
 //#include "IpV6Extensions.cti"
 #endif