00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef HH_SENF_Packets_80211Bundle_WLANPacket_
00027 #define HH_SENF_Packets_80211Bundle_WLANPacket_ 1
00028
00029 #include <senf/Packets/Packets.hh>
00030 #include <senf/Packets/DefaultBundle/EthernetPacket.hh>
00031 #include <senf/Packets/DefaultBundle/LlcSnapPacket.hh>
00032
00033
00034
00035 namespace senf
00036 {
00037
00044 struct WLANPacketParser : public PacketParserBase
00045 {
00046 # include SENF_PARSER()
00047
00048
00049
00050
00051
00052 SENF_PARSER_BITFIELD_RO ( subtype, 4, unsigned );
00053 SENF_PARSER_BITFIELD_RO ( type, 2, unsigned );
00054 SENF_PARSER_BITFIELD ( version, 2, unsigned );
00055 SENF_PARSER_BITFIELD ( order, 1, bool );
00056 SENF_PARSER_BITFIELD ( protectedFrame, 1, bool );
00057 SENF_PARSER_BITFIELD ( moreData, 1, bool );
00058 SENF_PARSER_BITFIELD ( pwrMgt, 1, bool );
00059 SENF_PARSER_BITFIELD ( retry, 1, bool );
00060 SENF_PARSER_BITFIELD ( moreFrag, 1, bool );
00061 SENF_PARSER_BITFIELD ( fromDS, 1, bool );
00062 SENF_PARSER_BITFIELD ( toDS, 1, bool );
00063
00064 SENF_PARSER_FIELD ( duration, UInt16LSBParser );
00065
00066 SENF_PARSER_FINALIZE(WLANPacketParser);
00067 };
00068
00069
00070
00074 struct WLANPacket_MgtFrameParser : public WLANPacketParser
00075 {
00076 # include SENF_PARSER()
00077
00078 SENF_PARSER_INHERIT(WLANPacketParser);
00079
00080 SENF_PARSER_FIELD ( destinationAddress, MACAddressParser );
00081 SENF_PARSER_FIELD ( sourceAddress, MACAddressParser );
00082 SENF_PARSER_FIELD ( bssid, MACAddressParser );
00083
00084
00085 SENF_PARSER_PRIVATE_BITFIELD ( seqNumber_1, 4, unsigned );
00086 SENF_PARSER_BITFIELD ( fragmentNumber, 4, unsigned );
00087 SENF_PARSER_PRIVATE_FIELD ( seqNumber_2, UInt8Parser );
00088
00089 SENF_PARSER_INIT() { type_() = 0; }
00090
00091 SENF_PARSER_FINALIZE(WLANPacket_MgtFrameParser);
00092
00093 boost::uint16_t sequenceNumber() const {
00094 return (uint16_t)(seqNumber_2()) << 4 | seqNumber_1();
00095 };
00096
00097 void sequenceNumber(boost::uint16_t sn);
00098 };
00099
00111 struct WLANPacket_MgtFrameType
00112 : public PacketTypeBase,
00113 public PacketTypeMixin<WLANPacket_MgtFrameType>
00114 {
00115 typedef PacketTypeMixin<WLANPacket_MgtFrameType> mixin;
00116 typedef ConcretePacket<WLANPacket_MgtFrameType> packet;
00117 typedef WLANPacket_MgtFrameParser parser;
00118
00119 using mixin::init;
00120 using mixin::initSize;
00121 using PacketTypeBase::nextPacketRange;
00122
00123 static void dump(packet p, std::ostream & os);
00124 };
00125
00129 typedef WLANPacket_MgtFrameType::packet WLANPacket_MgtFrame;
00130
00131
00132
00138 struct WLANPacket_CtrlFrameParser : public WLANPacketParser
00139 {
00140 # include SENF_PARSER()
00141
00142 SENF_PARSER_INHERIT(WLANPacketParser);
00143
00144 SENF_PARSER_FIELD ( receiverAddress, MACAddressParser );
00145
00146
00147
00148 SENF_PARSER_VARIANT ( subtype__, subtype,
00149 ( ids( na, is_cts, set_cts, key(12, VoidPacketParser)) )
00150 ( ids( na, is_ack, set_ack, key(13, VoidPacketParser)) )
00151 ( ids( sourceAddress, is_rts, set_rts, key(11, MACAddressParser)) ) );
00152
00153 SENF_PARSER_INIT() { type_() = 1; }
00154
00155 SENF_PARSER_FINALIZE(WLANPacket_CtrlFrameParser);
00156 };
00157
00169 struct WLANPacket_CtrlFrameType
00170 : public PacketTypeBase,
00171 public PacketTypeMixin<WLANPacket_CtrlFrameType>
00172 {
00173 typedef PacketTypeMixin<WLANPacket_CtrlFrameType> mixin;
00174 typedef ConcretePacket<WLANPacket_CtrlFrameType> packet;
00175 typedef WLANPacket_CtrlFrameParser parser;
00176
00177 using mixin::init;
00178 using mixin::initSize;
00179 using PacketTypeBase::nextPacketRange;
00180
00181 static void dump(packet p, std::ostream & os);
00182 };
00183
00187 typedef WLANPacket_CtrlFrameType::packet WLANPacket_CtrlFrame;
00188
00189
00190
00194 struct WLANPacket_DataFrameParser : public WLANPacketParser
00195 {
00196 # include SENF_PARSER()
00197
00198 SENF_PARSER_INHERIT(WLANPacketParser);
00199
00200 protected:
00201 typedef UIntFieldParser<6, 6+2> dsBits_t;
00202 dsBits_t::value_type dsBits() const { return parse<dsBits_t>( 1); }
00203
00204 MACAddressParser addr1() const { return parse<MACAddressParser>( 4); }
00205 MACAddressParser addr2() const { return parse<MACAddressParser>( 10); }
00206 MACAddressParser addr3() const { return parse<MACAddressParser>( 16); }
00207
00208
00209
00210
00211 typedef UIntFieldParser<0, 0+4> seqNumber_1_t;
00212 seqNumber_1_t seqNumber_1() const { return parse<seqNumber_1_t>( 22); }
00213
00214 public:
00215 typedef UIntFieldParser<4, 4+4> fragmentNumber_t;
00216 fragmentNumber_t fragmentNumber() const { return parse<fragmentNumber_t>( 22); }
00217
00218 protected:
00219 UInt8Parser seqNumber_2() const { return parse<UInt8Parser>( 23); }
00220
00221 public:
00222 boost::uint16_t sequenceNumber() const {
00223 return (uint16_t)(seqNumber_2()) << 4 | seqNumber_1();
00224 };
00225
00226 void sequenceNumber(boost::uint16_t sn);
00227
00228 SENF_PARSER_GOTO_OFFSET( 24, 24);
00229
00230
00231
00232
00233
00234
00235
00236 SENF_PARSER_VARIANT ( qosField_, subtype,
00237 ( ids( na, na, set_data, key(0, VoidPacketParser)) )
00238 ( ids( na, na, set_nullData, key(4, VoidPacketParser)) )
00239 ( ids( qosField, has_qosField, set_qosData, key(8, UInt16LSBParser )) )
00240
00241 ( ids( na, na, set_qosNullData, key(12, UInt16LSBParser)) ) );
00242
00243 SENF_PARSER_INIT() { type_() = 2; }
00244
00245 SENF_PARSER_FINALIZE(WLANPacket_DataFrameParser);
00246
00247 MACAddressParser receiverAddress() const { return addr1(); };
00248 MACAddressParser transmitterAddress() const { return addr2(); };
00249 MACAddressParser sourceAddress() const;
00250 MACAddressParser destinationAddress() const;
00251 MACAddressParser bssid() const;
00252
00253 friend class WLANPacket_DataFrameType;
00254 };
00255
00267 struct WLANPacket_DataFrameType
00268 : public PacketTypeBase,
00269 public PacketTypeMixin<WLANPacket_DataFrameType>
00270 {
00271 typedef PacketTypeMixin<WLANPacket_DataFrameType> mixin;
00272 typedef ConcretePacket<WLANPacket_DataFrameType> packet;
00273 typedef WLANPacket_DataFrameParser parser;
00274
00275 using mixin::init;
00276 using mixin::initSize;
00277 using mixin::nextPacketRange;
00278
00279 static factory_t nextPacketType(packet p) {
00280 return p->subtype() == 0 || p->subtype() == 8
00281 ? LlcSnapPacket::factory()
00282 : no_factory();
00283 }
00284
00285 static void dump(packet p, std::ostream & os);
00286 };
00287
00291 typedef WLANPacket_DataFrameType::packet WLANPacket_DataFrame;
00292 }
00293
00294
00295
00296
00297
00298 #endif
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309