X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2F80211Bundle%2FWLANPacket.hh;h=814263ef3bdac70c1a3613d4e0231e63f9043f5c;hb=78a6e233083efa63a9cd0684a92abc64202a9ee7;hp=c632aa5bbb9c85a34affd7d53839b028b17fcf9f;hpb=601d1f509f5bb24df167a4dd5a20da67a0af9af8;p=senf.git diff --git a/senf/Packets/80211Bundle/WLANPacket.hh b/senf/Packets/80211Bundle/WLANPacket.hh index c632aa5..814263e 100644 --- a/senf/Packets/80211Bundle/WLANPacket.hh +++ b/senf/Packets/80211Bundle/WLANPacket.hh @@ -26,9 +26,11 @@ #ifndef HH_SENF_Packets_80211Bundle_WLANPacket_ #define HH_SENF_Packets_80211Bundle_WLANPacket_ 1 -#include "../../Packets/Packets.hh" -#include "../DefaultBundle/EthernetPacket.hh" -#include "../DefaultBundle/LlcSnapPacket.hh" +#include +#include +#include + +///////////////////////////////hh.p//////////////////////////////////////// namespace senf { @@ -39,7 +41,7 @@ namespace senf Frame base class. */ - struct WLANPacketParser : public senf::PacketParserBase + struct WLANPacketParser : public PacketParserBase { # include SENF_PARSER() @@ -91,12 +93,14 @@ namespace senf boost::uint16_t sequenceNumber() const { return (uint16_t)(seqNumber_2()) << 4 | seqNumber_1(); }; + + void sequenceNumber(boost::uint16_t sn); }; /** \brief WLAN Management frame packet \par Packet type (typedef): - \refWLANPacket_MgtFrame + \ref WLANPacket_MgtFrame \par Fields: \ref WLANPacket_MgtFrameParser @@ -105,20 +109,23 @@ namespace senf \ingroup protocolbundle_80211 */ struct WLANPacket_MgtFrameType - : public senf::PacketTypeBase, - public senf::PacketTypeMixin + : public PacketTypeBase, + public PacketTypeMixin { - typedef senf::PacketTypeMixin mixin; - typedef senf::ConcretePacket packet; + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; typedef WLANPacket_MgtFrameParser parser; using mixin::init; using mixin::initSize; - using senf::PacketTypeBase::nextPacketRange; + using PacketTypeBase::nextPacketRange; static void dump(packet p, std::ostream &os); }; + /** \brief WLAN Management frame packet typedef + \ingroup protocolbundle_80211 + */ typedef WLANPacket_MgtFrameType::packet WLANPacket_MgtFrame; /////////////////////////////////////////////////////////////////////////// @@ -134,7 +141,7 @@ namespace senf SENF_PARSER_INHERIT(WLANPacketParser); - SENF_PARSER_FIELD ( receiverAddress, MACAddressParser ); + SENF_PARSER_FIELD ( receiverAddress, MACAddressParser ); //only RTS frame contains a source address field //variant is also needed to set correct subtype value @@ -160,20 +167,23 @@ namespace senf \ingroup protocolbundle_80211 */ struct WLANPacket_CtrlFrameType - : public senf::PacketTypeBase, - public senf::PacketTypeMixin + : public PacketTypeBase, + public PacketTypeMixin { - typedef senf::PacketTypeMixin mixin; - typedef senf::ConcretePacket packet; + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; typedef WLANPacket_CtrlFrameParser parser; using mixin::init; using mixin::initSize; - using senf::PacketTypeBase::nextPacketRange; + using PacketTypeBase::nextPacketRange; static void dump(packet p, std::ostream &os); }; + /** \brief WLAN Control frame packet typedef + \ingroup protocolbundle_80211 + */ typedef WLANPacket_CtrlFrameType::packet WLANPacket_CtrlFrame; /////////////////////////////////////////////////////////////////////////// @@ -187,25 +197,36 @@ namespace senf SENF_PARSER_INHERIT(WLANPacketParser); - SENF_PARSER_GOTO(subtype); - SENF_PARSER_SKIP_BITS(14); // dsBits_t; + dsBits_t::value_type dsBits() const { return parse( 1); } - SENF_PARSER_PRIVATE_FIELD ( addr1, MACAddressParser ); - SENF_PARSER_PRIVATE_FIELD ( addr2, MACAddressParser ); - SENF_PARSER_PRIVATE_FIELD ( addr3, MACAddressParser ); + MACAddressParser addr1() const { return parse( 4); } + MACAddressParser addr2() const { return parse( 10); } + MACAddressParser addr3() const { return parse( 16); } //sequence Number and fragment number //shift bits manually due to LSB - SENF_PARSER_PRIVATE_BITFIELD ( seqNumber_1, 4, unsigned ); - SENF_PARSER_BITFIELD ( fragmentNumber, 4, unsigned ); - SENF_PARSER_PRIVATE_FIELD ( seqNumber_2, UInt8Parser ); + typedef UIntFieldParser<0, 0+4> seqNumber_1_t; + seqNumber_1_t seqNumber_1() const { return parse( 22); } + + public: + typedef UIntFieldParser<4, 4+4> fragmentNumber_t; + fragmentNumber_t fragmentNumber() const { return parse( 22); } + + protected: + UInt8Parser seqNumber_2() const { return parse( 23); } + + public: boost::uint16_t sequenceNumber() const { return (uint16_t)(seqNumber_2()) << 4 | seqNumber_1(); }; + void sequenceNumber(boost::uint16_t sn); + + SENF_PARSER_GOTO_OFFSET( 24, 24); + // TODO fourth address field in case of WDS // SENF_PARSER_PRIVATE_VARIANT (wds_, dsBits, // ( novalue ( disable_addr4, VoidPacketParser )) @@ -244,30 +265,37 @@ namespace senf \ingroup protocolbundle_80211 */ struct WLANPacket_DataFrameType - : public senf::PacketTypeBase, - public senf::PacketTypeMixin + : public PacketTypeBase, + public PacketTypeMixin { - typedef senf::PacketTypeMixin mixin; - typedef senf::ConcretePacket packet; + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; typedef WLANPacket_DataFrameParser parser; using mixin::init; using mixin::initSize; using mixin::nextPacketRange; - static factory_t nextPacketType(packet p) { - return p->subtype() == 0 || p->subtype() == 8 - ? LlcSnapPacket::factory() + static factory_t nextPacketType(packet p) { + return p->subtype() == 0 || p->subtype() == 8 + ? LlcSnapPacket::factory() : no_factory(); } static void dump(packet p, std::ostream &os); }; + /** \brief WLAN Data frame packet typedef + \ingroup protocolbundle_80211 + */ typedef WLANPacket_DataFrameType::packet WLANPacket_DataFrame; } -#endif /* HH_SENF_Packets_80211Bundle_WLANPacket_ */ +///////////////////////////////hh.e//////////////////////////////////////// +//#include "WLANPacket.cci" +//#include "WLANPacket.ct" +//#include "WLANPacket.cti" +#endif // Local Variables: