X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2F80211Bundle%2FRadiotapPacket.hh;h=ebea56717b765a028127f955395526bdc58721d4;hb=a1fdb7bb122f0b05be809a922d4b7ef5e125fa67;hp=465e14ac99ca923b02b582143a1456366aa21a4b;hpb=08bba1cbe020e940671a58c0db5afce75ef84619;p=senf.git diff --git a/Packets/80211Bundle/RadiotapPacket.hh b/Packets/80211Bundle/RadiotapPacket.hh index 465e14a..ebea567 100644 --- a/Packets/80211Bundle/RadiotapPacket.hh +++ b/Packets/80211Bundle/RadiotapPacket.hh @@ -1,9 +1,9 @@ -// $Id:$ +// $Id$ // -// Copyright (C) 2006 +// Copyright (C) 2008 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY -// Christian Niephaus +// Christian Niephaus // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -21,14 +21,10 @@ // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /** \file - \brief Radiotap header \n - Radiotap uses least significant bit byte order + \brief Radiotap header */ - - */ - -#ifndef HH_RadiotapPacket_ -#define HH_RadioPacket_ 1 +#ifndef HH_SENF_Packets_80211Bundle_RadiotapPacket_ +#define HH_SENF_Packets_80211Bundle_RadiotapPacket_ 1 #include "../../Packets/Packets.hh" @@ -36,49 +32,48 @@ namespace senf { /** \brief Parse Flag field in Radiotap header - * Re-ordering of bits due to LSB byte order + Re-ordering of bits due to LSB byte order */ - struct RadiotapPacketParser_Flags : public senf::PacketParserBase + struct RadiotapPacketParser_Flags : public PacketParserBase { # include SENF_FIXED_PARSER() - SENF_PARSER_BITFIELD ( shortGI, 1, bool); - SENF_PARSER_BITFIELD ( badFCS, 1, bool); - SENF_PARSER_BITFIELD ( padding, 1, bool); - SENF_PARSER_BITFIELD ( fcsPresent, 1, bool); - SENF_PARSER_BITFIELD ( fragmentation, 1, bool); - SENF_PARSER_BITFIELD ( wep, 1, bool); - SENF_PARSER_BITFIELD ( shortPreamble, 1, bool); - SENF_PARSER_BITFIELD ( cfp, 1, bool); + SENF_PARSER_BITFIELD ( shortGI, 1, bool ); + SENF_PARSER_BITFIELD ( badFCS, 1, bool ); + SENF_PARSER_BITFIELD ( padding, 1, bool ); + SENF_PARSER_BITFIELD ( fcsPresent, 1, bool ); + SENF_PARSER_BITFIELD ( fragmentation, 1, bool ); + SENF_PARSER_BITFIELD ( wep, 1, bool ); + SENF_PARSER_BITFIELD ( shortPreamble, 1, bool ); + SENF_PARSER_BITFIELD ( cfp, 1, bool ); SENF_PARSER_FINALIZE ( RadiotapPacketParser_Flags ); - }; /** \brief Parse in Radiotap Header channel frequency and flag field Re-ordering of bits due to LSB byte order */ - struct RadiotapPacketParser_ChannelOptions : public senf::PacketParserBase + struct RadiotapPacketParser_ChannelOptions : public PacketParserBase { # include SENF_FIXED_PARSER() - SENF_PARSER_FIELD ( freq, UInt16LSBParser ); - - SENF_PARSER_BITFIELD ( flag2ghz, 1, bool ); - SENF_PARSER_BITFIELD ( ofdm, 1, bool ); - SENF_PARSER_BITFIELD ( cck, 1, bool ); - SENF_PARSER_BITFIELD ( turbo, 1, bool ); - SENF_PARSER_SKIP_BITS ( 4 ); //currently unused in radiotap - SENF_PARSER_BITFIELD ( quarterRateChannel, 1, bool ); - SENF_PARSER_BITFIELD ( halfRateChannel, 1, bool ); - SENF_PARSER_BITFIELD ( gsm, 1, bool ); - SENF_PARSER_BITFIELD ( staticTurbo, 1, bool ); - SENF_PARSER_BITFIELD ( gfsk, 1, bool ); - SENF_PARSER_BITFIELD ( cckOfdm, 1, bool ); - SENF_PARSER_BITFIELD ( passive, 1, bool ); - SENF_PARSER_BITFIELD ( flag5ghz, 1, bool ); + SENF_PARSER_FIELD ( freq, UInt16LSBParser ); + + SENF_PARSER_BITFIELD ( flag2ghz, 1, bool ); + SENF_PARSER_BITFIELD ( ofdm, 1, bool ); + SENF_PARSER_BITFIELD ( cck, 1, bool ); + SENF_PARSER_BITFIELD ( turbo, 1, bool ); + SENF_PARSER_SKIP_BITS ( 4 ); //currently unused in radiotap + SENF_PARSER_BITFIELD ( quarterRateChannel, 1, bool ); + SENF_PARSER_BITFIELD ( halfRateChannel, 1, bool ); + SENF_PARSER_BITFIELD ( gsm, 1, bool ); + SENF_PARSER_BITFIELD ( staticTurbo, 1, bool ); + SENF_PARSER_BITFIELD ( gfsk, 1, bool ); + SENF_PARSER_BITFIELD ( cckOfdm, 1, bool ); + SENF_PARSER_BITFIELD ( passive, 1, bool ); + SENF_PARSER_BITFIELD ( flag5ghz, 1, bool ); SENF_PARSER_FINALIZE ( RadiotapPacketParser_ChannelOptions ); }; @@ -87,108 +82,124 @@ namespace senf Parser implementing the Radiotap header + Radiotap requires that all fields in the radiotap header + are aligned to natural boundaries. For radiotap, + that means all 8-, 16-, 32-, and 64-bit fields + must begin on 8-, 16-, 32-, and 64-bit boundaries, respectively. + In this way, generators and parsers can avoid unaligned + accesses to radiotap capture fields. Radiotap-compliant + generators must insert padding before a capture field + to ensure its natural alignment. + \see Radiotap.org \todo extended present field (bit 31 of present field is set) */ - struct RadiotapPacketParser : public senf::PacketParserBase + struct RadiotapPacketParser : public PacketParserBase { # include SENF_PARSER() /* * mandatory fields */ - SENF_PARSER_FIELD ( version, UInt8Parser ); + SENF_PARSER_FIELD ( version, UInt8Parser ); //padding bits, currently unused, it simply aligns the fields onto natural word boundaries. - SENF_PARSER_SKIP ( 1,1 ); - SENF_PARSER_FIELD ( length, UInt16LSBParser); + SENF_PARSER_SKIP ( 1,1 ); + SENF_PARSER_FIELD ( length, UInt16LSBParser ); /* * present flags * indicate which data field are contained in the packet */ - SENF_PARSER_BITFIELD_RO ( lockQualityPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbmAntennaNoisePresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbmAntennaSignalPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( fhssPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( channelPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( ratePresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( flagsPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( tsftPresent, 1, bool ); - SENF_PARSER_SKIP_BITS ( 2 ); //currently unused bits - SENF_PARSER_BITFIELD_RO ( dbAntennaNoisePresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbAntennaSignalPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( antennaPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbmTxAttenuationPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbTxAttenuationPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( txAttenuationPresent, 1, bool ); - SENF_PARSER_SKIP_BITS ( 8 ); //currently unused bits + SENF_PARSER_BITFIELD_RO ( lockQualityPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( dbmAntennaNoisePresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( dbmAntennaSignalPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( fhssPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( channelOptionsPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( ratePresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( flagsPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( tsftPresent, 1, bool ); + SENF_PARSER_SKIP_BITS ( 1 ); //currently unused bits + SENF_PARSER_BITFIELD_RO ( fcsPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( dbAntennaNoisePresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( dbAntennaSignalPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( antennaPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( dbmTxAttenuationPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( dbTxAttenuationPresent, 1, bool ); + SENF_PARSER_BITFIELD_RO ( txAttenuationPresent, 1, bool ); + SENF_PARSER_SKIP_BITS ( 8 ); //currently unused bits //if bit is set,another 32 bit present flag is attached (not implemented yet) - SENF_PARSER_BITFIELD ( extendedBitmaskPresent, 1, bool ); - SENF_PARSER_SKIP_BITS ( 7 ); //currently unused bits - + SENF_PARSER_BITFIELD ( extendedBitmaskPresent, 1, bool ); + SENF_PARSER_SKIP_BITS ( 7 ); //currently unused bits /* * Radiotap data * parsing data according to present flags + * + * PARSER_SKIP required to skip correct length of padding bits */ - SENF_PARSER_VARIANT ( tsft_, tsftPresent, - ( novalue ( disable_tsft, VoidPacketParser )) - ( id ( tsft, UInt64LSBParser )) ); - SENF_PARSER_VARIANT ( flags_, flagsPresent, - ( novalue ( disable_flags, VoidPacketParser )) - ( id ( flags, RadiotapPacketParser_Flags )) ); - SENF_PARSER_VARIANT ( rate_, ratePresent, - ( novalue ( disable_rate, VoidPacketParser )) - ( id ( rate, UInt8Parser )) ); - SENF_PARSER_VARIANT ( channelFlags_, channelPresent, - ( novalue ( disable_channelOptions, VoidPacketParser )) - ( id ( channelOptions, RadiotapPacketParser_ChannelOptions )) ); - SENF_PARSER_VARIANT ( fhss_, fhssPresent, - ( novalue ( disable_fhss, VoidPacketParser )) - ( id ( fhss, UInt16LSBParser )) ); - SENF_PARSER_VARIANT ( dbmAntennaSignal_, dbmAntennaSignalPresent, - ( novalue ( disable_dbmAntennaSignal, VoidPacketParser )) - ( id ( dbmAntennaSignal, Int8Parser )) ); - SENF_PARSER_VARIANT ( dbmAntennaNoise_, dbmAntennaNoisePresent, - ( novalue ( disable_dbmAntennaNoise, VoidPacketParser )) - ( id ( dbmAntennaNoise, Int8Parser )) ); - SENF_PARSER_VARIANT ( lockQuality_, lockQualityPresent, - ( novalue ( disable_lockQuality, VoidPacketParser )) - ( id ( lockQuality, UInt16LSBParser )) ); - SENF_PARSER_VARIANT ( txAttenuation_, txAttenuationPresent, - ( novalue ( disable_txAttenuation, VoidPacketParser )) - ( id ( txAttenuation, UInt16LSBParser )) ); - SENF_PARSER_VARIANT ( dbTxAttenuation_, dbTxAttenuationPresent, - ( novalue ( disable_dbTxAttenuation, VoidPacketParser )) - ( id ( dbTxAttenuation, UInt16LSBParser )) ); - SENF_PARSER_VARIANT ( antenna_, antennaPresent, - ( novalue ( disable_antenna, VoidPacketParser )) - ( id ( antenna, UInt8Parser )) ); - SENF_PARSER_VARIANT ( dbAntennaSignal_, dbAntennaSignalPresent, - ( novalue ( disable_dbAntennaSignal, VoidPacketParser )) - ( id ( dbAntennaSignal, UInt8Parser )) ); - SENF_PARSER_VARIANT ( dbAntennaNoise_, dbAntennaNoisePresent, - ( novalue ( disable_dbAntennaNoise, VoidPacketParser )) - ( id ( dbAntennaNoise, UInt8Parser )) ); + + /* macro to create required variant parser */ + #define OPTIONAL_FIELD(name, parser) SENF_PARSER_VARIANT \ + ( name##_, name##Present, \ + ( novalue( disable_##name, VoidPacketParser )) \ + ( id( name, parser )) ) + + /* macro to create padding parser */ + #define SKIP_OPTIONAL_PADDING(cond, parser, size) \ + SENF_PARSER_SKIP( \ + (cond ? (size - (parser##__offset() + \ + senf::bytes(parser##_())) % size) % size : 0) , 0 ); + + OPTIONAL_FIELD ( tsft, UInt64LSBParser ); + OPTIONAL_FIELD ( flags, RadiotapPacketParser_Flags ); // + : public PacketTypeBase, + public PacketTypeMixin { - typedef senf::PacketTypeMixin mixin; - typedef senf::ConcretePacket packet; - typedef senf::RadiotapPacketParser parser; + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; + typedef RadiotapPacketParser parser; using mixin::nextPacketRange; using mixin::init; @@ -196,11 +207,10 @@ namespace senf static void dump(packet p, std::ostream &os); static void finalize(packet p); - - + static factory_t nextPacketType(packet p); }; - typedef RadiotapPacketType::packet RadiotapPacket; + typedef ConcretePacket RadiotapPacket; } #endif