Missing commits
[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                ); //<pkgdraw: hide
44         //jump to fist address field
45         SENF_PARSER_SKIP_BITS        (          28                          ); //<pkgdraw: hide
46         SENF_PARSER_FIELD            ( destinationAddress, MACAddressParser );
47         SENF_PARSER_FIELD            ( sourceAddress,      MACAddressParser );
48         SENF_PARSER_FIELD            ( bssid,              MACAddressParser );
49
50         //workaround since bitfield LSB parsers are not available
51         SENF_PARSER_PRIVATE_BITFIELD ( seqNumber_1,    4, unsigned );
52         SENF_PARSER_BITFIELD         ( fragmentNumber, 4, unsigned );
53         SENF_PARSER_PRIVATE_FIELD    ( seqNumber_2,    UInt8Parser );
54
55         SENF_PARSER_FINALIZE(WLANPacket_MgtFrameParser);
56
57         //this is needed due to the goto in the WLANPacketParser. Don't know exactly why yet.
58         SENF_PARSER_INIT() {}
59
60         boost::uint16_t sequenceNumber() const {
61             return (uint16_t)(seqNumber_2()) << 4 | seqNumber_1();
62         };
63     };
64
65     /** \brief Control frame parser
66      * <b>Re-ordering of bits due to LSB byte order</b>
67      *
68      * currently only CTS, RTS and ACK control frames are supported
69
70      */
71     struct WLANPacket_CtrlFrameParser : public senf::PacketParserBase
72     {
73     #   include SENF_PARSER()
74         
75         SENF_PARSER_PRIVATE_BITFIELD ( subtype,  4,  unsigned            ); //<pkgdraw: hide
76         //jump to fist address field
77         SENF_PARSER_SKIP_BITS        (          28                       ); //<pkgdraw: hide
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  ); //<pkgdraw: hide
101         //jump to 'toDS' and 'fromDS' bits
102         //skip type, version and other flags
103         SENF_PARSER_SKIP_BITS        ( 10                      ); //<pkgdraw: hide
104         //needed in data frames due to the variable address fields
105         SENF_PARSER_PRIVATE_BITFIELD ( dsBits,  2,  unsigned   ); //<pkgdraw: hide
106         //skip duration field
107         SENF_PARSER_SKIP             ( 2, 2                    ); //<pkgdraw: hide
108
109         SENF_PARSER_PRIVATE_FIELD    ( addr1, MACAddressParser );
110         SENF_PARSER_PRIVATE_FIELD    ( addr2, MACAddressParser );
111         SENF_PARSER_PRIVATE_FIELD    ( addr3, MACAddressParser );
112
113         //sequence Number and fragment number
114         //shift bits manually due to LSB
115         SENF_PARSER_PRIVATE_BITFIELD ( seqNumber_1,    4, unsigned );
116         SENF_PARSER_BITFIELD         ( fragmentNumber, 4, unsigned );
117         SENF_PARSER_PRIVATE_FIELD    ( seqNumber_2,    UInt8Parser );
118
119         //TODO fourth address field in case of WDS
120 //        SENF_PARSER_PRIVATE_VARIANT (wds_, dsBits,
121 //                ( novalue ( disable_addr4,               VoidPacketParser                    ))
122 //                ( id      ( addr4,  key (3,                   MACAddressParser                     ))) );
123
124         //QoS Filed
125         SENF_PARSER_VARIANT ( qosField_, subtype,
126                 ( ids( na,       na,           set_data,        key(0, VoidPacketParser)) )
127                 ( ids( na,       na,           set_nullData,    key(4, VoidPacketParser)) )
128                 ( ids( qosField, has_qosField, set_qosData,     key(8, UInt16LSBParser )) )
129                 //we cannot parse qos Null (data) frames at the moment
130                 ( ids( na,       na,           set_qosNullData, key(12, UInt16LSBParser)) ) );
131
132         SENF_PARSER_FINALIZE(WLANPacket_DataFrameParser);
133
134         //this is needed to due to the goto in the WLANPacketParser. Don't know exactly why yet.
135         SENF_PARSER_INIT() {}
136
137         boost::uint16_t sequenceNumber() const {
138             return (uint16_t)(seqNumber_2()) << 4 | seqNumber_1();
139         };
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             \image html WLANPacket.png
206
207         \ingroup protocolbundle_80211
208      */
209     struct WLANPacketType
210         : public senf::PacketTypeBase,
211           public senf::PacketTypeMixin<WLANPacketType>
212     {
213         typedef senf::PacketTypeMixin<WLANPacketType> mixin;
214         typedef senf::ConcretePacket<WLANPacketType> packet;
215         typedef WLANPacketParser parser;
216
217 //        using mixin::nextPacketRange;
218         using mixin::init;
219         using mixin::initSize;
220         using senf::PacketTypeBase::nextPacketRange;;
221
222         static void dump(packet p, std::ostream &os);
223 //        static PacketParserBase::size_type initSize();
224     };
225
226     typedef senf::ConcretePacket<WLANPacketType> WLANPacket;
227 }
228
229
230 #endif /* HH_SENF_Packets_80211Bundle_WLANPacket_ */