#define HH_IpV6Packet_ 1
// Custom includes
-#include "Packets/Packet.hh"
-#include "Packets/ParseInt.hh"
-#include "Packets/ParseArray.hh"
-#include "Packets/PacketRegistry.hh"
+#include "../../Socket/Protocols/INet/INet6Address.hh"
+#include "../../Packets/Packets.hh"
#include "IpV4Packet.hh"
//#include "IpV6Packet.mpp"
namespace senf {
- // See RFC2460
- template <class Iterator=nil, class IpV6Packet=nil>
- struct Parse_IpV6 : public ParserBase<Iterator,IpV6Packet>
+ /** \brief Parse an IpV6 address
+
+ \see INet6Address
+ */
+ struct Parse_INet6Address : public PacketParserBase
{
- template <class I, class P=nil>
- struct rebind { typedef Parse_IpV6<I,P> parser; };
- typedef Iterator byte_iterator;
-
- Parse_IpV6() {}
- Parse_IpV6(Iterator const & i) : ParserBase<Iterator,IpV6Packet>(i) {}
-
- static unsigned bytes() { return 40; }
+ Parse_INet6Address(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {}
///////////////////////////////////////////////////////////////////////////
- typedef Parse_UIntField < 0, 4, Iterator > Parse_Version;
- typedef Parse_UIntField < 4, 12, Iterator > Parse_Class;
- typedef Parse_UIntField < 12, 32, Iterator > Parse_FlowLabel;
- typedef Parse_UInt8 < Iterator > Parse_8bit;
- typedef Parse_UInt16 < Iterator > Parse_16bit;
-
- typedef Parse_Array < 16, Parse_8bit, Iterator > Parse_Addr;
-
- Parse_Version version() const { return Parse_Version (this->i() ); }
- Parse_Class trafficClass() const { return Parse_Class (this->i() ); }
- Parse_FlowLabel flowLabel() const { return Parse_FlowLabel (this->i() ); }
- Parse_16bit length() const { return Parse_16bit (this->i() + 4 ); }
- Parse_8bit nextHeader() const { return Parse_8bit (this->i() + 6 ); }
- Parse_8bit hopLimit() const { return Parse_8bit (this->i() + 7 ); }
- Parse_Addr source() const { return Parse_Addr (this->i() + 8 ); }
- Parse_Addr destination() const { return Parse_Addr (this->i() + 24 ); }
+ typedef INet6Address value_type;
+ static const size_type fixed_bytes = 16u;
+
+ value_type value() const { return value_type::from_data(i()); }
+ void value(value_type const & v) { std::copy(v.begin(), v.end(), i()); }
+ operator value_type() { return value(); }
+ byte & operator[](size_type index) { return *boost::next(i(),index); }
+ Parse_INet6Address const & operator= (value_type const & other)
+ { value(other); return *this; }
};
- class IpV6Packet
- : public Packet,
- public Parse_IpV6<Packet::iterator, IpV6Packet>,
- public PacketRegistryMixin<IpTypes, IpV6Packet>
+ /** \brief Parse an IpV6 packet
+
+ \see IpV6PacketType \n
+ <a href="http://tools.ietf.org/html/rfc2460">RFC 2460</a>
+ */
+ struct Parse_IpV6 : public PacketParserBase
{
- using PacketRegistryMixin<IpTypes,IpV6Packet>::registerInterpreter;
- public:
- ///////////////////////////////////////////////////////////////////////////
- // Types
+# include SENF_FIXED_PARSER()
- typedef ptr_t<IpV6Packet>::ptr ptr;
+ SENF_PARSER_BITFIELD( version, 4, unsigned );
+ SENF_PARSER_BITFIELD( trafficClass, 8, unsigned );
+ SENF_PARSER_BITFIELD( flowLabel, 20, unsigned );
- ///////////////////////////////////////////////////////////////////////////
+ SENF_PARSER_FIELD( length, Parse_UInt16 );
+ SENF_PARSER_FIELD( nextHeader, Parse_UInt8 );
+ SENF_PARSER_FIELD( hopLimit, Parse_UInt8 );
+ SENF_PARSER_FIELD( source, Parse_INet6Address );
+ SENF_PARSER_FIELD( destination, Parse_INet6Address );
+
+ SENF_PARSER_INIT() {
+ version() = 6;
+ }
+
+ SENF_PARSER_FINALIZE(Parse_IpV6);
+ };
- private:
- template <class Arg>
- IpV6Packet(Arg const & arg);
+ /** \brief IpV6 packet
- virtual void v_nextInterpreter() const;
- virtual void v_finalize();
- virtual void v_dump(std::ostream & os) const;
+ \par Packet type (typedef):
+ \ref IpV6Packet
+
+ \par Fields:
+ \ref Parse_IpV6
- friend class Packet;
+ \par Associated registries:
+ \ref IpTypes
+
+ \par Finalize action:
+ Set \a length from payload size\n
+ Set \a nextHeader from type of next packet if found in \ref IpTypes
+
+ \ingroup protocolbundle_default
+ */
+ struct IpV6PacketType
+ : public PacketTypeBase,
+ public PacketTypeMixin<IpV6PacketType, IpTypes>
+ {
+ typedef PacketTypeMixin<IpV6PacketType, IpTypes> mixin;
+ typedef ConcretePacket<IpV6PacketType> packet;
+ typedef Parse_IpV6 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);
+
+ static void finalize(packet p);
};
+ /** \brief IpV6 packet typedef */
+ typedef IpV6PacketType::packet IpV6Packet;
+
+ ///@}
}
///////////////////////////////hh.e////////////////////////////////////////
+#endif
+#ifndef SENF_PACKETS_DECL_ONLY
//#include "IpV6Packet.cci"
//#include "IpV6Packet.ct"
-#include "IpV6Packet.cti"
+//#include "IpV6Packet.cti"
#endif
\f
// indent-tabs-mode: nil
// ispell-local-dictionary: "american"
// compile-command: "scons -u test"
+// comment-column: 40
// End: