4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Christian Niephaus <cni@berlios.de>
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.
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.
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.
24 \brief 802.11 WLANPacket public header */
26 #ifndef HH_SENF_Packets_80211Bundle_WLANPacket_
27 #define HH_SENF_Packets_80211Bundle_WLANPacket_ 1
29 #include "../../Packets/Packets.hh"
30 #include "../DefaultBundle/EthernetPacket.hh"
35 /** \brief Management frame parser
36 * <b>Re-ordering of bits due to LSB byte order</b>
39 struct WLANPacket_MgtFrameParser : public senf::PacketParserBase
41 # include SENF_FIXED_PARSER()
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 );
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 );
56 SENF_PARSER_FINALIZE(WLANPacket_MgtFrameParser);
58 //this is needed due to the goto in the WLANPacketParser. Don't know exactly why yet.
61 boost::uint16_t sequenceNumber() const;
64 /** \brief Control frame parser
65 * <b>Re-ordering of bits due to LSB byte order</b>
67 * currently only CTS, RTS and ACK control frames are supported
70 struct WLANPacket_CtrlFrameParser : public senf::PacketParserBase
72 # include SENF_PARSER()
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 );
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)) ) );
87 SENF_PARSER_FINALIZE(WLANPacket_CtrlFrameParser);
89 //this is needed to due to the goto in the WLANPacketParser. Don't know exactly why yet.
93 /** \brief Data frame parser
94 * <b>Re-ordering of bits due to LSB byte order</b>
97 struct WLANPacket_DataFrameParser : public senf::PacketParserBase
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 );
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 );
111 SENF_PARSER_PRIVATE_FIELD ( addr1, MACAddressParser );
112 SENF_PARSER_PRIVATE_FIELD ( addr2, MACAddressParser );
113 SENF_PARSER_PRIVATE_FIELD ( addr3, MACAddressParser );
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 );
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 ))) );
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)) ) );
134 SENF_PARSER_FINALIZE(WLANPacket_DataFrameParser);
136 //this is needed to due to the goto in the WLANPacketParser. Don't know exactly why yet.
137 SENF_PARSER_INIT() {}
139 boost::uint16_t sequenceNumber() const;
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;
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>
154 struct WLANPacketParser : public senf::PacketParserBase
156 # include SENF_PARSER()
159 * Frame control field
160 * re-ordering of fields due to the byte order
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 );
174 SENF_PARSER_FIELD ( duration, UInt16LSBParser );
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 )) );
183 SENF_PARSER_CUSTOM_FIELD( fcs, senf::UInt32Parser, fcs_t::fixed_bytes, fcs_t::fixed_bytes) {
184 return parse<UInt32Parser>( data().size()-4 ); }
186 SENF_PARSER_FINALIZE(WLANPacketParser);
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 ); }
198 /** \brief WLAN packet
200 \par Packet type (typedef):
204 \ref WLANPacketParser
206 \ingroup protocolbundle_80211
208 struct WLANPacketType
209 : public senf::PacketTypeBase,
210 public senf::PacketTypeMixin<WLANPacketType>
212 typedef senf::PacketTypeMixin<WLANPacketType> mixin;
213 typedef senf::ConcretePacket<WLANPacketType> packet;
214 typedef WLANPacketParser parser;
216 // using mixin::nextPacketRange;
218 using mixin::initSize;
219 using senf::PacketTypeBase::nextPacketRange;;
221 static void dump(packet p, std::ostream &os);
222 // static PacketParserBase::size_type initSize();
225 typedef senf::ConcretePacket<WLANPacketType> WLANPacket;
229 #endif /* HH_SENF_Packets_80211Bundle_WLANPacket_ */