1
2 """Radiotap"""
3 from __future__ import print_function
4 from __future__ import absolute_import
5
6 import socket
7
8 from . import dpkt
9 from . import ieee80211
10 from .decorators import deprecated
11
12
13
14
15
16 _TSFT_MASK = 0x1000000
17 _FLAGS_MASK = 0x2000000
18 _RATE_MASK = 0x4000000
19 _CHANNEL_MASK = 0x8000000
20 _FHSS_MASK = 0x10000000
21 _ANT_SIG_MASK = 0x20000000
22 _ANT_NOISE_MASK = 0x40000000
23 _LOCK_QUAL_MASK = 0x80000000
24 _TX_ATTN_MASK = 0x10000
25 _DB_TX_ATTN_MASK = 0x20000
26 _DBM_TX_POWER_MASK = 0x40000
27 _ANTENNA_MASK = 0x80000
28 _DB_ANT_SIG_MASK = 0x100000
29 _DB_ANT_NOISE_MASK = 0x200000
30 _RX_FLAGS_MASK = 0x400000
31 _CHANNELPLUS_MASK = 0x200
32 _EXT_MASK = 0x1
33
34 _TSFT_SHIFT = 24
35 _FLAGS_SHIFT = 25
36 _RATE_SHIFT = 26
37 _CHANNEL_SHIFT = 27
38 _FHSS_SHIFT = 28
39 _ANT_SIG_SHIFT = 29
40 _ANT_NOISE_SHIFT = 30
41 _LOCK_QUAL_SHIFT = 31
42 _TX_ATTN_SHIFT = 16
43 _DB_TX_ATTN_SHIFT = 17
44 _DBM_TX_POWER_SHIFT = 18
45 _ANTENNA_SHIFT = 19
46 _DB_ANT_SIG_SHIFT = 20
47 _DB_ANT_NOISE_SHIFT = 21
48 _RX_FLAGS_SHIFT = 22
49 _CHANNELPLUS_SHIFT = 10
50 _EXT_SHIFT = 0
51
52
53 _FLAGS_SIZE = 2
54 _CFP_FLAG_SHIFT = 0
55 _PREAMBLE_SHIFT = 1
56 _WEP_SHIFT = 2
57 _FRAG_SHIFT = 3
58 _FCS_SHIFT = 4
59 _DATA_PAD_SHIFT = 5
60 _BAD_FCS_SHIFT = 6
61 _SHORT_GI_SHIFT = 7
62
63
64 _CHAN_TYPE_SIZE = 4
65 _CHANNEL_TYPE_SHIFT = 4
66 _CCK_SHIFT = 5
67 _OFDM_SHIFT = 6
68 _TWO_GHZ_SHIFT = 7
69 _FIVE_GHZ_SHIFT = 8
70 _PASSIVE_SHIFT = 9
71 _DYN_CCK_OFDM_SHIFT = 10
72 _GFSK_SHIFT = 11
73 _GSM_SHIFT = 12
74 _STATIC_TURBO_SHIFT = 13
75 _HALF_RATE_SHIFT = 14
76 _QUARTER_RATE_SHIFT = 15
77
78
79 _FCS_SHIFT = 4
80 _FCS_MASK = 0x10
84 """Radiotap.
85
86 TODO: Longer class information....
87
88 Attributes:
89 __hdr__: Header fields of Radiotap.
90 TODO.
91 """
92
93 __hdr__ = (
94 ('version', 'B', 0),
95 ('pad', 'B', 0),
96 ('length', 'H', 0),
97 ('present_flags', 'I', 0)
98 )
99
100 @property
103
104 @tsft_present.setter
107
108 @property
111
112 @flags_present.setter
115
116 @property
119
120 @rate_present.setter
123
124 @property
127
128 @channel_present.setter
131
132 @property
135
136 @fhss_present.setter
139
140 @property
143
144 @ant_sig_present.setter
147
148 @property
151
152 @ant_noise_present.setter
155
156 @property
159
160 @lock_qual_present.setter
163
164 @property
167
168 @tx_attn_present.setter
171
172 @property
175
176 @db_tx_attn_present.setter
179
180 @property
183
184 @dbm_tx_power_present.setter
187
188 @property
191
192 @ant_present.setter
195
196 @property
199
200 @db_ant_sig_present.setter
203
204 @property
207
208 @db_ant_noise_present.setter
211
212 @property
215
216 @rx_flags_present.setter
219
220 @property
223
224 @chanplus_present.setter
227
228 @property
231
232 @ext_present.setter
235
237 dpkt.Packet.unpack(self, buf)
238 self.data = buf[socket.ntohs(self.length):]
239
240 self.fields = []
241 buf = buf[self.__hdr_len__:]
242
243
244 field_decoder = [
245 ('tsft', self.tsft_present, self.TSFT),
246 ('flags', self.flags_present, self.Flags),
247 ('rate', self.rate_present, self.Rate),
248 ('channel', self.channel_present, self.Channel),
249 ('fhss', self.fhss_present, self.FHSS),
250 ('ant_sig', self.ant_sig_present, self.AntennaSignal),
251 ('ant_noise', self.ant_noise_present, self.AntennaNoise),
252 ('lock_qual', self.lock_qual_present, self.LockQuality),
253 ('tx_attn', self.tx_attn_present, self.TxAttenuation),
254 ('db_tx_attn', self.db_tx_attn_present, self.DbTxAttenuation),
255 ('dbm_tx_power', self.dbm_tx_power_present, self.DbmTxPower),
256 ('ant', self.ant_present, self.Antenna),
257 ('db_ant_sig', self.db_ant_sig_present, self.DbAntennaSignal),
258 ('db_ant_noise', self.db_ant_noise_present, self.DbAntennaNoise),
259 ('rx_flags', self.rx_flags_present, self.RxFlags)
260 ]
261 for name, present_bit, parser in field_decoder:
262 if present_bit:
263 field = parser(buf)
264 field.data = b''
265 setattr(self, name, field)
266 self.fields.append(field)
267 buf = buf[len(field):]
268
269 if len(self.data) > 0:
270 if self.flags_present and self.flags.fcs:
271 self.data = ieee80211.IEEE80211(self.data, fcs=self.flags.fcs)
272 else:
273 self.data = ieee80211.IEEE80211(self.data)
274
276 __hdr__ = (
277 ('index', 'B', 0),
278 )
279
281 __hdr__ = (
282 ('db', 'B', 0),
283 )
284
286 __hdr__ = (
287 ('db', 'B', 0),
288 )
289
291 __hdr__ = (
292 ('freq', 'H', 0),
293 ('flags', 'H', 0),
294 )
295
296 - class FHSS(dpkt.Packet):
297 __hdr__ = (
298 ('set', 'B', 0),
299 ('pattern', 'B', 0),
300 )
301
302 - class Flags(dpkt.Packet):
303 __hdr__ = (
304 ('val', 'B', 0),
305 )
306
307 @property
309
310
311 @fcs.setter
313
314
316 __hdr__ = (
317 ('val', 'H', 0),
318 )
319
321 __hdr__ = (
322 ('val', 'H', 0),
323 )
324
325 - class Rate(dpkt.Packet):
326 __hdr__ = (
327 ('val', 'B', 0),
328 )
329
330 - class TSFT(dpkt.Packet):
331 __hdr__ = (
332 ('usecs', 'Q', 0),
333 )
334
336 __hdr__ = (
337 ('val', 'H', 0),
338 )
339
341 __hdr__ = (
342 ('db', 'H', 0),
343 )
344
346 __hdr__ = (
347 ('db', 'B', 0),
348 )
349
351 __hdr__ = (
352 ('db', 'B', 0),
353 )
354
356 __hdr__ = (
357 ('dbm', 'B', 0),
358 )
359
383
386 s = b'\x00\x00\x1a\x00\x2f\x48\x00\x00\x34\x8f\x71\x09\x00\x00\x00\x00\x10\x0c\x85\x09\xc0\x00\xcc\x01\x00\x00'
387 rt = Radiotap(s)
388 assert(rt.flags_present == 1)
389 assert(rt.flags.fcs == 1)
390
391
392 if __name__ == '__main__':
393 test_Radiotap()
394 test_fcs()
395 print('Tests Successful...')
396