X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2F80221Bundle%2FMIHPacket.hh;h=5f4f997810f24bf7cc3c636189b23bcf8c6b51ea;hb=b89e3166f7680755683dccee5e48cb3a820185c0;hp=2021102bcfe1b1aca97255d6baa95633beb2fbbd;hpb=32be66071113df31a085821e31414eeb776022fa;p=senf.git diff --git a/Packets/80221Bundle/MIHPacket.hh b/Packets/80221Bundle/MIHPacket.hh index 2021102..5f4f997 100644 --- a/Packets/80221Bundle/MIHPacket.hh +++ b/Packets/80221Bundle/MIHPacket.hh @@ -28,12 +28,182 @@ // Custom includes #include "../../Packets/Packets.hh" +#include "../../Socket/Protocols/Raw/MACAddress.hh" +#include "../../Socket/Protocols/INet/INet4Address.hh" +#include "../../Socket/Protocols/INet/INet6Address.hh" +#include "TLVPacket.hh" +#include +#include + //#include "MIHPacket.mpp" ///////////////////////////////hh.p//////////////////////////////////////// namespace senf { + /** \brief Parse a MIHF_ID + + the maximum length of a MIHF_ID is 253 octets (see F.3.11 in 802.21) + we could set maxLengthValue in init(), but for the most MIHF_IDs the default + maximum length of 127 should be enough. + + \note you must call mihfIdPacket.maxLengthValue( 253) *before* + setting longer MIHF_IDs values. + */ + class MIHFId_TLVParser : public BaseTLVPacketParser + { + # include SENF_PARSER() + SENF_PARSER_INHERIT ( BaseTLVPacketParser ); + SENF_PARSER_SKIP ( length(), 0 ); + SENF_PARSER_FINALIZE ( MIHFId_TLVParser ); + + std::string asString() const; + void setString(std::string const &id); + + senf::MACAddress asMACAddress() const; + void setMACAddress(senf::MACAddress const &mac); + + senf::INet4Address asINet4Address() const; + void setINet4Address(senf::INet4Address const &addr); + + senf::INet6Address asINet6Address() const; + void setINet6Address(senf::INet6Address const &addr); + + private: + template + struct binaryNAIEncoder { + binaryNAIEncoder(OutputIterator &i) : i_(i) {} + void operator()(const boost::uint8_t &v) const { + *i_++ = '\\'; + *i_++ = v; + } + OutputIterator &i_; + }; + template + static boost::function_output_iterator > getNAIEncodedOutputIterator(OutputIterator i) { + return boost::make_function_output_iterator(binaryNAIEncoder(i)); + } + + struct binaryNAIDecoder { + binaryNAIDecoder() : readNextByte_(true) {} + bool operator()(const boost::uint8_t &v) { + readNextByte_ = readNextByte_ ? false : true; + return readNextByte_; + } + bool readNextByte_; + }; + template + static boost::filter_iterator getNAIDecodedIterator(Iterator begin, Iterator end) { + return boost::make_filter_iterator(begin, end); + } + }; + + /** \brief Parse a MIH packet + + Parser implementing the MIH header. The fields implemented are: + \image html MIHPacket.png + + \see MIHPacketType + */ + 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_FIELD ( src_mihfId, MIHFId_TLVParser ); + // Destination MIHF Id + SENF_PARSER_FIELD ( dst_mihfId, MIHFId_TLVParser ); + + SENF_PARSER_FINALIZE ( MIHPacketParser ); + + SENF_PARSER_INIT() { + version_() = 1; + src_mihfId().type() = 1; + dst_mihfId().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 + { +#ifndef DOXYGEN + typedef PacketTypeMixin mixin; +#endif + typedef ConcretePacket packet; ///< MIH packet typedef + typedef MIHPacketParser parser; ///< typedef to the parser of MIH packet + + using mixin::nextPacketRange; + using mixin::init; + using mixin::initSize; + + /** \brief Dump given MIH packet in readable form to given output stream */ + static void dump(packet p, std::ostream &os); + static void finalize(packet p); + static factory_t nextPacketType(packet p); + }; + + /** \brief MIH packet typedef */ + typedef ConcretePacket MIHPacket; + + + struct MIHPayloadPacketParser : public PacketParserBase + { + # include SENF_PARSER() + SENF_PARSER_LIST ( tlv_list, packetSize(), GenericTLVPacketParser ); + + SENF_PARSER_FINALIZE ( MIHPayloadPacketParser ); + }; + + struct MIHPayloadPacketType + : public PacketTypeBase, + public PacketTypeMixin + { +#ifndef DOXYGEN + typedef PacketTypeMixin mixin; +#endif + typedef ConcretePacket packet; ///< MIH Payload packet typedef + typedef MIHPayloadPacketParser parser; ///< typedef to the parser of MIH Payload packet + + using mixin::nextPacketRange; + using mixin::init; + using mixin::initSize; + + /** \brief Dump given MIHPayload in readable form to given output stream */ + static void dump(packet p, std::ostream &os); + }; + + /** \brief MIH Payload packet typedef */ + typedef ConcretePacket MIHPayloadPacket; } @@ -45,7 +215,7 @@ namespace senf { //#include "MIHPacket.cti" #endif - + // Local Variables: // mode: c++ // fill-column: 100