// Custom includes
#include "../../Packets/Packets.hh"
+#include "TLVPacket.hh"
//#include "MIHPacket.mpp"
///////////////////////////////hh.p////////////////////////////////////////
namespace senf {
+ struct MIHF_IdParser : public PacketParserBase
+ {
+ # include SENF_PARSER()
+
+ SENF_PARSER_FINALIZE ( MIHF_IdParser );
+ };
+
+ struct MIHPacketParser : public PacketParserBase
+ {
+ # include SENF_PARSER()
+
+ SENF_PARSER_BITFIELD_RO ( version, 4, unsigned );
+ SENF_PARSER_BITFIELD ( ackRequest, 1, bool );
+ SENF_PARSER_BITFIELD ( ackResponse, 1, bool );
+ SENF_PARSER_BITFIELD ( uir, 1, bool );
+ SENF_PARSER_BITFIELD ( moreFragment, 1, bool );
+ SENF_PARSER_BITFIELD ( fragmentNr, 7, unsigned );
+ SENF_PARSER_SKIP_BITS ( 1 );
+
+ // MIH message ID (MID)
+ SENF_PARSER_BITFIELD ( sid, 4, unsigned );
+ SENF_PARSER_BITFIELD ( opcode, 2, unsigned );
+ SENF_PARSER_BITFIELD ( aid, 10, unsigned );
+
+ SENF_PARSER_SKIP_BITS ( 4 );
+ SENF_PARSER_BITFIELD ( transactionId, 12, unsigned );
+ SENF_PARSER_FIELD_RO ( payloadLength, UInt16Parser );
+
+ // Source MIHF Id
+ SENF_PARSER_PRIVATE_FIELD ( source_type, UInt8Parser );
+ SENF_PARSER_PRIVATE_FIELD ( source_length, DynamicTLVLengthParser );
+ SENF_PARSER_FIELD ( source_mihf_id, MIHF_IdParser );
+
+ // Destination MIHF Id
+ SENF_PARSER_PRIVATE_FIELD ( destination_type, UInt8Parser );
+ SENF_PARSER_PRIVATE_FIELD ( destination_length, DynamicTLVLengthParser );
+ SENF_PARSER_FIELD ( destination_mihf_id, MIHF_IdParser );
+
+ SENF_PARSER_FINALIZE ( MIHPacketParser );
+
+ SENF_PARSER_INIT() {
+ version_() = 1;
+ source_type() = 1;
+ destination_type() = 2;
+ }
+
+ friend class MIHPacketType;
+ };
+
+ /** \brief MIH packet
+
+ \par Packet type (typedef):
+ \ref MIHPacket
+
+ \par Fields:
+ \ref MIHPacketParser
+
+ \ingroup protocolbundle_80221
+ */
+ struct MIHPacketType
+ : public PacketTypeBase,
+ public PacketTypeMixin<MIHPacketType>
+ {
+ typedef PacketTypeMixin<MIHPacketType> mixin;
+ typedef ConcretePacket<MIHPacketType> packet;
+ typedef MIHPacketParser parser;
+
+ using mixin::nextPacketRange;
+ using mixin::init;
+ using mixin::initSize;
+
+ static void dump(packet p, std::ostream &os);
+ static void finalize(packet p);
+ };
+
+ typedef ConcretePacket<MIHPacketType> MIHPacket;
}