Packets/80211Bundle: some clean-up
[senf.git] / Packets / 80211Bundle / WLANPacket.hh
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Christian Niephaus <cni@berlios.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 802.11 WLANPacket public header */
25
26 #ifndef HH_SENF_Packets_80211Bundle_WLANPacket_
27 #define HH_SENF_Packets_80211Bundle_WLANPacket_ 1
28
29 #include "../../Packets/Packets.hh"
30 #include "../DefaultBundle/EthernetPacket.hh"
31
32 namespace senf
33 {
34
35     /** \brief Management frame parser
36      * <b>Re-ordering of bits due to LSB byte order</b>
37
38      */
39     struct WLANPacket_MgtFrameParser : public senf::PacketParserBase
40     {
41     #   include SENF_FIXED_PARSER()
42         
43         SENF_PARSER_PRIVATE_BITFIELD ( subtype, 4,  unsigned                );
44         SENF_PARSER_SKIP_BITS        (          4                           ); //skip type and version
45         //jump to fist address field
46         SENF_PARSER_SKIP             ( 3                                    );
47         SENF_PARSER_FIELD            ( destinationAddress, MACAddressParser );
48         SENF_PARSER_FIELD            ( sourceAddress,      MACAddressParser );
49         SENF_PARSER_FIELD            ( bssid,              MACAddressParser );
50
51         //workaround since bitfield LSB parsers are not available
52         SENF_PARSER_PRIVATE_BITFIELD ( seqNumber_1,    4, unsigned );
53         SENF_PARSER_BITFIELD         ( fragmentNumber, 4, unsigned );
54         SENF_PARSER_PRIVATE_FIELD    ( seqNumber_2,    UInt8Parser );
55
56         SENF_PARSER_FINALIZE(WLANPacket_MgtFrameParser);
57
58         //this is needed due to the goto in the WLANPacketParser. Don't know exactly why yet.
59         SENF_PARSER_INIT() {}
60
61         boost::uint16_t sequenceNumber() const;
62     };
63
64     /** \brief Control frame parser
65      * <b>Re-ordering of bits due to LSB byte order</b>
66      *
67      * currently only CTS, RTS and ACK control frames are supported
68
69      */
70     struct WLANPacket_CtrlFrameParser : public senf::PacketParserBase
71     {
72     #   include SENF_PARSER()
73         
74         SENF_PARSER_PRIVATE_BITFIELD ( subtype,  4,  unsigned            );
75         SENF_PARSER_SKIP_BITS        (           4                       ); //skip type and version
76         //jump to fist address field
77         SENF_PARSER_SKIP             ( 3, 3                              );
78         SENF_PARSER_FIELD            ( receiverAddress, MACAddressParser );
79
80         //only RTS frame contains a source address field
81         //variant is also needed to set correct subtype value
82         SENF_PARSER_VARIANT ( subtype__, subtype,
83                 ( ids( na,            is_cts, set_cts, key(12, VoidPacketParser)) )
84                 ( ids( na,            is_ack, set_ack, key(13, VoidPacketParser)) )
85                 ( ids( sourceAddress, is_rts, set_rts, key(11, MACAddressParser)) ) );
86
87         SENF_PARSER_FINALIZE(WLANPacket_CtrlFrameParser);
88
89         //this is needed to due to the goto in the WLANPacketParser. Don't know exactly why yet.
90         SENF_PARSER_INIT() {}
91     };
92
93     /** \brief Data frame parser
94      * <b>Re-ordering of bits due to LSB byte order</b>
95
96      */
97     struct WLANPacket_DataFrameParser : public senf::PacketParserBase
98     {
99     #   include SENF_PARSER()
100         SENF_PARSER_PRIVATE_BITFIELD ( subtype,  4,  unsigned  );
101         //jump to 'toDS' and 'fromDS' bits
102         //skip type and version
103         SENF_PARSER_SKIP_BITS        ( 4                       );
104         //skip other flags
105         SENF_PARSER_SKIP_BITS        ( 6                       );
106         //needed in data frames due to the variable address fields
107         SENF_PARSER_PRIVATE_BITFIELD ( dsBits,  2,  unsigned   );
108         //skip duration field
109         SENF_PARSER_SKIP             ( 2, 0                    );
110
111         SENF_PARSER_PRIVATE_FIELD    ( addr1, MACAddressParser );
112         SENF_PARSER_PRIVATE_FIELD    ( addr2, MACAddressParser );
113         SENF_PARSER_PRIVATE_FIELD    ( addr3, MACAddressParser );
114
115         //sequence Number and fragment number
116         //shift bits manually due to LSB
117         SENF_PARSER_PRIVATE_BITFIELD ( seqNumber_1,    4, unsigned );
118         SENF_PARSER_BITFIELD         ( fragmentNumber, 4, unsigned );
119         SENF_PARSER_PRIVATE_FIELD    ( seqNumber_2,    UInt8Parser );
120
121         //TODO fourth address field in case of WDS
122 //        SENF_PARSER_PRIVATE_VARIANT (wds_, dsBits,
123 //                ( novalue ( disable_addr4,               VoidPacketParser                    ))
124 //                ( id      ( addr4,  key (3,                   MACAddressParser                     ))) );
125
126         //QoS Filed
127         SENF_PARSER_VARIANT ( qosField_, subtype,
128                 ( ids( na,       na,           set_data,        key(0, VoidPacketParser)) )
129                 ( ids( na,       na,           set_nullData,    key(4, VoidPacketParser)) )
130                 ( ids( qosField, has_qosField, set_qosData,     key(8, UInt16LSBParser )) )
131                 //we cannot parse qos Null (data) frames at the moment
132                 ( ids( na,       na,           set_qosNullData, key(12, UInt16LSBParser)) ) );
133
134         SENF_PARSER_FINALIZE(WLANPacket_DataFrameParser);
135
136         //this is needed to due to the goto in the WLANPacketParser. Don't know exactly why yet.
137         SENF_PARSER_INIT() {}
138
139         boost::uint16_t sequenceNumber() const;
140
141         MACAddressParser receiverAddress() const    { return addr1(); }; //ra is always addr1
142         MACAddressParser transmitterAddress() const { return addr2(); }; //ta is always addr2
143         MACAddressParser sourceAddress() const;
144         MACAddressParser destinationAddress() const;
145         MACAddressParser bssid() const;
146     };
147
148
149     /** \brief 802.11 Frame parser
150      * (see IEEE 802.11-2007 standard - Chapter 7 Frame formats)
151      * <b>Re-ordering of bits due to LSB byte order</b>
152
153      */
154     struct WLANPacketParser : public senf::PacketParserBase
155     {
156     #   include SENF_PARSER()
157
158         /*
159          * Frame control field
160          * re-ordering of fields due to the byte order
161          */
162         SENF_PARSER_BITFIELD_RO ( subtype,        4,  unsigned );
163         SENF_PARSER_BITFIELD_RO ( type,           2,  unsigned );
164         SENF_PARSER_BITFIELD    ( version,        2,  unsigned );
165         SENF_PARSER_BITFIELD    ( order,          1,  bool     );
166         SENF_PARSER_BITFIELD    ( protectedFrame, 1,  bool     );
167         SENF_PARSER_BITFIELD    ( moreData,       1,  bool     );
168         SENF_PARSER_BITFIELD    ( pwrMgt,         1,  bool     );
169         SENF_PARSER_BITFIELD    ( retry,          1,  bool     );
170         SENF_PARSER_BITFIELD    ( moreFrag,       1,  bool     );
171         SENF_PARSER_BITFIELD    ( fromDS,         1,  bool     );
172         SENF_PARSER_BITFIELD    ( toDS,           1,  bool     );
173
174         SENF_PARSER_FIELD       ( duration,       UInt16LSBParser );
175
176         SENF_PARSER_GOTO( subtype ); // subparsers need to know the subtype
177         SENF_PARSER_VARIANT ( frameType_,  type,
178                 (     ids( mgtFrame,  is_mgtFrame,  init_mgtFrame,  WLANPacket_MgtFrameParser  ))
179                 (     ids( ctrlFrame, is_ctrlFrame, init_ctrlFrame, WLANPacket_CtrlFrameParser ))
180                 (     ids( dataFrame, is_dataFrame, init_dataFrame, WLANPacket_DataFrameParser ))
181                 ( novalue( reserved,                                WLANPacket_CtrlFrameParser )) );
182
183         SENF_PARSER_CUSTOM_FIELD( fcs, senf::UInt32Parser, fcs_t::fixed_bytes, fcs_t::fixed_bytes) {
184           return parse<UInt32Parser>( data().size()-4 ); }
185
186         SENF_PARSER_FINALIZE(WLANPacketParser);
187
188         SENF_PARSER_INIT() {
189             version() = 0;
190         }
191
192         //Problems can occur with old madwifi and ath5k. Some frames only
193         //contains two byte FCS instead of four.
194 //        UInt32Parser fcs() const { return parse<UInt32Parser>( data().size()-4 ); }
195
196     };
197
198     /** \brief WLAN packet
199
200         \par Packet type (typedef):
201             \ref WLANPacket
202
203         \par Fields:
204             \ref WLANPacketParser
205
206         \ingroup protocolbundle_80211
207      */
208     struct WLANPacketType
209         : public senf::PacketTypeBase,
210           public senf::PacketTypeMixin<WLANPacketType>
211     {
212         typedef senf::PacketTypeMixin<WLANPacketType> mixin;
213         typedef senf::ConcretePacket<WLANPacketType> packet;
214         typedef WLANPacketParser parser;
215
216 //        using mixin::nextPacketRange;
217         using mixin::init;
218         using mixin::initSize;
219         using senf::PacketTypeBase::nextPacketRange;;
220
221         static void dump(packet p, std::ostream &os);
222 //        static PacketParserBase::size_type initSize();
223     };
224
225     typedef senf::ConcretePacket<WLANPacketType> WLANPacket;
226 }
227
228
229 #endif /* HH_SENF_Packets_80211Bundle_WLANPacket_ */