Packets: created 80211Bundle for Packet Parser wich are associated with (802.11)...
[senf.git] / Packets / 80211Bundle / RadiotapPacket.hh
1 // $Id:$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Christian Niephaus <christian.niephaus@fokus.fraunhofer.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief Radiotap header \n
25         <b>Radiotap uses least significant bit byte order</b>
26
27
28     */
29
30 #ifndef HH_RadiotapPacket_
31 #define HH_RadioPacket_ 1
32
33 #include "../../Packets/Packets.hh"
34
35 namespace senf
36 {
37
38     /** \brief Parse Flag field in Radiotap header
39      * <b>Re-ordering of bits due to LSB byte order</b>
40
41      */
42     struct RadiotapPacketParser_Flags : public senf::PacketParserBase
43     {
44     #   include SENF_FIXED_PARSER()
45
46         SENF_PARSER_BITFIELD ( shortGI,         1, bool);
47         SENF_PARSER_BITFIELD ( badFCS,          1, bool);
48         SENF_PARSER_BITFIELD ( padding,         1, bool);
49         SENF_PARSER_BITFIELD ( fcsPresent,      1, bool);
50         SENF_PARSER_BITFIELD ( fragmentation,   1, bool);
51         SENF_PARSER_BITFIELD ( wep,             1, bool);
52         SENF_PARSER_BITFIELD ( shortPreamble,   1, bool);
53         SENF_PARSER_BITFIELD ( cfp,             1, bool);
54
55         SENF_PARSER_FINALIZE ( RadiotapPacketParser_Flags );
56
57     };
58
59     /** \brief Parse in Radiotap Header channel frequency and flag field
60
61         <b>Re-ordering of bits due to LSB byte order</b>
62      */
63     struct RadiotapPacketParser_ChannelOptions : public senf::PacketParserBase
64     {
65     #   include SENF_FIXED_PARSER()
66
67         SENF_PARSER_FIELD       ( freq,          UInt16LSBParser );
68
69         SENF_PARSER_BITFIELD    ( flag2ghz,             1, bool  );
70         SENF_PARSER_BITFIELD    ( ofdm,                 1, bool  );
71         SENF_PARSER_BITFIELD    ( cck,                  1, bool  );
72         SENF_PARSER_BITFIELD    ( turbo,                1, bool  );
73         SENF_PARSER_SKIP_BITS   ( 4                              ); //currently unused in radiotap
74         SENF_PARSER_BITFIELD    ( quarterRateChannel,   1, bool  );
75         SENF_PARSER_BITFIELD    ( halfRateChannel,      1, bool  );
76         SENF_PARSER_BITFIELD    ( gsm,                  1, bool  );
77         SENF_PARSER_BITFIELD    ( staticTurbo,          1, bool  );
78         SENF_PARSER_BITFIELD    ( gfsk,                 1, bool  );
79         SENF_PARSER_BITFIELD    ( cckOfdm,              1, bool  );
80         SENF_PARSER_BITFIELD    ( passive,              1, bool  );
81         SENF_PARSER_BITFIELD    ( flag5ghz,             1, bool  );
82
83         SENF_PARSER_FINALIZE ( RadiotapPacketParser_ChannelOptions );
84     };
85
86     /** \brief Parse an Radiotap header
87
88         Parser implementing the Radiotap header
89
90         \see <a href="http://www.radiotap.org">Radiotap.org</a>
91
92         \todo extended present field (bit 31 of present field is set)
93     */
94     struct RadiotapPacketParser : public senf::PacketParserBase
95     {
96     #   include SENF_PARSER()
97
98         /*
99          * mandatory fields
100          */
101         SENF_PARSER_FIELD    ( version,            UInt8Parser      );
102         //padding bits, currently unused, it simply aligns the fields onto natural word boundaries.
103         SENF_PARSER_SKIP     ( 1,1                                  );
104         SENF_PARSER_FIELD    ( length,             UInt16LSBParser);
105
106         /*
107          * present flags
108          * indicate which data field are contained in the packet
109          */
110         SENF_PARSER_BITFIELD_RO    ( lockQualityPresent,       1,    bool );
111         SENF_PARSER_BITFIELD_RO    ( dbmAntennaNoisePresent,   1,    bool );
112         SENF_PARSER_BITFIELD_RO    ( dbmAntennaSignalPresent,  1,    bool );
113         SENF_PARSER_BITFIELD_RO    ( fhssPresent,              1,    bool );
114         SENF_PARSER_BITFIELD_RO    ( channelPresent,           1,    bool );
115         SENF_PARSER_BITFIELD_RO    ( ratePresent,              1,    bool );
116         SENF_PARSER_BITFIELD_RO    ( flagsPresent,             1,    bool );
117         SENF_PARSER_BITFIELD_RO    ( tsftPresent,              1,    bool );
118         SENF_PARSER_SKIP_BITS   ( 2                                    ); //currently unused bits
119         SENF_PARSER_BITFIELD_RO    ( dbAntennaNoisePresent,    1,    bool );
120         SENF_PARSER_BITFIELD_RO    ( dbAntennaSignalPresent,   1,    bool );
121         SENF_PARSER_BITFIELD_RO    ( antennaPresent,           1,    bool );
122         SENF_PARSER_BITFIELD_RO    ( dbmTxAttenuationPresent,  1,    bool );
123         SENF_PARSER_BITFIELD_RO    ( dbTxAttenuationPresent,   1,    bool );
124         SENF_PARSER_BITFIELD_RO    ( txAttenuationPresent,     1,    bool );
125         SENF_PARSER_SKIP_BITS   ( 8                                    ); //currently unused bits
126         //if bit is set,another 32 bit present flag is attached (not implemented yet)
127         SENF_PARSER_BITFIELD    ( extendedBitmaskPresent,   1,    bool );
128         SENF_PARSER_SKIP_BITS   ( 7                                    ); //currently unused bits
129
130
131         /*
132          * Radiotap data
133          * parsing data according to present flags
134          */
135         SENF_PARSER_VARIANT ( tsft_,             tsftPresent,
136                                 ( novalue ( disable_tsft,               VoidPacketParser                    ))
137                                 ( id      ( tsft,                       UInt64LSBParser                     )) );
138         SENF_PARSER_VARIANT ( flags_,            flagsPresent,
139                                 ( novalue ( disable_flags,              VoidPacketParser                    ))
140                                 ( id      ( flags,                      RadiotapPacketParser_Flags          )) );
141         SENF_PARSER_VARIANT ( rate_,             ratePresent,
142                                 ( novalue ( disable_rate,               VoidPacketParser                    ))
143                                 ( id      ( rate,                       UInt8Parser                         )) );
144         SENF_PARSER_VARIANT ( channelFlags_,     channelPresent,
145                                 ( novalue ( disable_channelOptions,       VoidPacketParser                    ))
146                                 ( id      ( channelOptions,               RadiotapPacketParser_ChannelOptions   )) );
147         SENF_PARSER_VARIANT ( fhss_,             fhssPresent,
148                                 ( novalue ( disable_fhss,               VoidPacketParser                    ))
149                                 ( id      ( fhss,                       UInt16LSBParser                     )) );
150         SENF_PARSER_VARIANT ( dbmAntennaSignal_, dbmAntennaSignalPresent,
151                                 ( novalue ( disable_dbmAntennaSignal,   VoidPacketParser                    ))
152                                 ( id      ( dbmAntennaSignal,           Int8Parser                          )) );
153         SENF_PARSER_VARIANT ( dbmAntennaNoise_,  dbmAntennaNoisePresent,
154                                 ( novalue ( disable_dbmAntennaNoise,    VoidPacketParser                    ))
155                                 ( id      ( dbmAntennaNoise,            Int8Parser                          )) );
156         SENF_PARSER_VARIANT ( lockQuality_,      lockQualityPresent,
157                                 ( novalue ( disable_lockQuality,        VoidPacketParser                    ))
158                                 ( id      ( lockQuality,                UInt16LSBParser                     )) );
159         SENF_PARSER_VARIANT ( txAttenuation_,    txAttenuationPresent,
160                                 ( novalue ( disable_txAttenuation,      VoidPacketParser                    ))
161                                 ( id      ( txAttenuation,              UInt16LSBParser                     )) );
162         SENF_PARSER_VARIANT ( dbTxAttenuation_,  dbTxAttenuationPresent,
163                                 ( novalue ( disable_dbTxAttenuation,    VoidPacketParser                    ))
164                                 ( id      ( dbTxAttenuation,            UInt16LSBParser                     )) );
165         SENF_PARSER_VARIANT ( antenna_,          antennaPresent,
166                                 ( novalue ( disable_antenna,            VoidPacketParser                    ))
167                                 ( id      ( antenna,                    UInt8Parser                         )) );
168         SENF_PARSER_VARIANT ( dbAntennaSignal_,  dbAntennaSignalPresent,
169                                 ( novalue ( disable_dbAntennaSignal,    VoidPacketParser                    ))
170                                 ( id      ( dbAntennaSignal,            UInt8Parser                         )) );
171         SENF_PARSER_VARIANT ( dbAntennaNoise_, dbAntennaNoisePresent,
172                                 ( novalue ( disable_dbAntennaNoise,     VoidPacketParser                    ))
173                                 ( id      ( dbAntennaNoise,             UInt8Parser                         )) );
174
175         SENF_PARSER_INIT() {
176             version() = 0;
177         }
178
179
180         SENF_PARSER_FINALIZE(RadiotapPacketParser);
181     };
182
183
184
185     struct RadiotapPacketType
186         : public senf::PacketTypeBase,
187           public senf::PacketTypeMixin<RadiotapPacketType>
188     {
189         typedef senf::PacketTypeMixin<RadiotapPacketType> mixin;
190         typedef senf::ConcretePacket<RadiotapPacketType> packet;
191         typedef senf::RadiotapPacketParser parser;
192
193         using mixin::nextPacketRange;
194         using mixin::init;
195         using mixin::initSize;
196
197         static void dump(packet p, std::ostream &os);
198         static void finalize(packet p);
199
200
201     };
202
203         typedef RadiotapPacketType::packet RadiotapPacket;
204 }
205
206 #endif