1
2
3 """IEEE 802.11."""
4
5 import dpkt, socket, struct
6
7
8 MGMT_TYPE = 0
9 CTL_TYPE = 1
10 DATA_TYPE = 2
11
12
13 M_ASSOC_REQ = 0
14 M_ASSOC_RESP = 1
15 M_REASSOC_REQ = 2
16 M_REASSOC_RESP = 3
17 M_PROBE_REQ = 4
18 M_PROBE_RESP = 5
19 M_BEACON = 8
20 M_ATIM = 9
21 M_DISASSOC = 10
22 M_AUTH = 11
23 M_DEAUTH = 12
24 M_ACTION = 13
25 C_BLOCK_ACK_REQ = 8
26 C_BLOCK_ACK = 9
27 C_PS_POLL = 10
28 C_RTS = 11
29 C_CTS = 12
30 C_ACK = 13
31 C_CF_END = 14
32 C_CF_END_ACK = 15
33 D_DATA = 0
34 D_DATA_CF_ACK = 1
35 D_DATA_CF_POLL = 2
36 D_DATA_CF_ACK_POLL = 3
37 D_NULL = 4
38 D_CF_ACK = 5
39 D_CF_POLL = 6
40 D_CF_ACK_POLL = 7
41 D_QOS_DATA = 8
42 D_QOS_CF_ACK = 9
43 D_QOS_CF_POLL = 10
44 D_QOS_CF_ACK_POLL = 11
45 D_QOS_NULL = 12
46 D_QOS_CF_POLL_EMPTY = 14
47
48 TO_DS_FLAG = 10
49 FROM_DS_FLAG = 1
50 INTER_DS_FLAG = 11
51
52
53 _VERSION_MASK = 0x0300
54 _TYPE_MASK = 0x0c00
55 _SUBTYPE_MASK = 0xf000
56 _TO_DS_MASK = 0x0001
57 _FROM_DS_MASK = 0x0002
58 _MORE_FRAG_MASK = 0x0004
59 _RETRY_MASK = 0x0008
60 _PWR_MGT_MASK = 0x0010
61 _MORE_DATA_MASK = 0x0020
62 _WEP_MASK = 0x0040
63 _ORDER_MASK = 0x0080
64 _VERSION_SHIFT = 8
65 _TYPE_SHIFT = 10
66 _SUBTYPE_SHIFT = 12
67 _TO_DS_SHIFT = 0
68 _FROM_DS_SHIFT = 1
69 _MORE_FRAG_SHIFT = 2
70 _RETRY_SHIFT = 3
71 _PWR_MGT_SHIFT = 4
72 _MORE_DATA_SHIFT = 5
73 _WEP_SHIFT = 6
74 _ORDER_SHIFT = 7
75
76
77 IE_SSID = 0
78 IE_RATES = 1
79 IE_FH = 2
80 IE_DS = 3
81 IE_CF = 4
82 IE_TIM = 5
83 IE_IBSS = 6
84 IE_HT_CAPA = 45
85 IE_ESR = 50
86 IE_HT_INFO = 61
87
88 FCS_LENGTH = 4
89
90 FRAMES_WITH_CAPABILITY = [ M_BEACON,
91 M_ASSOC_RESP,
92 M_ASSOC_REQ,
93 M_REASSOC_REQ,
94 ]
95
96
97 _ACK_POLICY_SHIFT = 0
98 _MULTI_TID_SHIFT = 1
99 _COMPRESSED_SHIFT = 2
100 _TID_SHIFT = 12
101
102 _ACK_POLICY_MASK = 0x0001
103 _MULTI_TID_MASK = 0x0002
104 _COMPRESSED_MASK = 0x0004
105 _TID_MASK = 0xf000
106
107 _COMPRESSED_BMP_LENGTH = 8
108 _BMP_LENGTH = 128
109
110
111 BLOCK_ACK = 3
112
113
114 BLOCK_ACK_CODE_REQUEST = 0
115 BLOCK_ACK_CODE_RESPONSE = 1
116
118 __hdr__ = (
119 ('framectl', 'H', 0),
120 ('duration', 'H', 0)
121 )
122
145
146 version = property(_get_version, _set_version)
147 type = property(_get_type, _set_type)
148 subtype = property(_get_subtype, _set_subtype)
149 to_ds = property(_get_to_ds, _set_to_ds)
150 from_ds = property(_get_from_ds, _set_from_ds)
151 more_frag = property(_get_more_frag, _set_more_frag)
152 retry = property(_get_retry, _set_retry)
153 pwr_mgt = property(_get_pwr_mgt, _set_pwr_mgt)
154 more_data = property(_get_more_data, _set_more_data)
155 wep = property(_get_wep, _set_wep)
156 order = property(_get_order, _set_order)
157
159 self.ies = []
160
161 ie_decoder = {
162 IE_SSID: ('ssid', self.IE),
163 IE_RATES: ('rate', self.IE),
164 IE_FH: ('fh', self.FH),
165 IE_DS: ('ds', self.DS),
166 IE_CF: ('cf', self.CF),
167 IE_TIM: ('tim', self.TIM),
168 IE_IBSS: ('ibss', self.IBSS),
169 IE_HT_CAPA: ('ht_capa', self.IE),
170 IE_ESR: ('esr', self.IE),
171 IE_HT_INFO: ('ht_info', self.IE)
172 }
173
174
175 while len(buf) > FCS_LENGTH:
176 ie_id = struct.unpack('B',(buf[0]))[0]
177 try:
178 parser = ie_decoder[ie_id][1]
179 name = ie_decoder[ie_id][0]
180 except KeyError:
181 parser = self.IE
182 name = 'ie_' + str(ie_id)
183 ie = parser(buf)
184
185 ie.data = buf[2:2+ie.len]
186 setattr(self, name, ie)
187 self.ies.append(ie)
188 buf = buf[2+ie.len:]
189
192 self.ess = field & 1
193 self.ibss = (field >> 1) & 1
194 self.cf_poll = (field >> 2) & 1
195 self.cf_poll_req = (field >> 3) & 1
196 self.privacy = (field >> 4) & 1
197 self.short_preamble = (field >> 5) & 1
198 self.pbcc = (field >> 6) & 1
199 self.hopping = (field >> 7) & 1
200 self.spec_mgmt = (field >> 8) & 1
201 self.qos = (field >> 9) & 1
202 self.short_slot = (field >> 10) & 1
203 self.apsd = (field >> 11) & 1
204 self.dsss = (field >> 13) & 1
205 self.delayed_blk_ack = (field >> 14) & 1
206 self.imm_blk_ack = (field >> 15) & 1
207
209 if kwargs and 'fcs' in kwargs:
210 self.fcs_present = kwargs.pop('fcs')
211 else:
212 self.fcs_present = False
213
214 super(IEEE80211, self).__init__(*args, **kwargs)
215
217 dpkt.Packet.unpack(self, buf)
218 self.data = buf[self.__hdr_len__:]
219
220 m_decoder = {
221 M_BEACON: ('beacon', self.Beacon),
222 M_ASSOC_REQ: ('assoc_req', self.Assoc_Req),
223 M_ASSOC_RESP: ('assoc_resp', self.Assoc_Resp),
224 M_DISASSOC: ('diassoc', self.Disassoc),
225 M_REASSOC_REQ: ('reassoc_req', self.Reassoc_Req),
226 M_REASSOC_RESP: ('reassoc_resp',self.Assoc_Resp),
227 M_AUTH: ('auth', self.Auth),
228 M_PROBE_RESP: ('probe_resp', self.Beacon),
229 M_DEAUTH: ('deauth', self.Deauth),
230 M_ACTION: ('action', self.Action)
231 }
232
233 c_decoder = {
234 C_RTS: ('rts', self.RTS),
235 C_CTS: ('cts', self.CTS),
236 C_ACK: ('ack', self.ACK),
237 C_BLOCK_ACK_REQ:('bar', self.BlockAckReq),
238 C_BLOCK_ACK: ('back', self.BlockAck),
239 C_CF_END: ('cf_end', self.CFEnd),
240 }
241
242 d_dsData = {
243 0 : self.Data,
244 FROM_DS_FLAG : self.DataFromDS,
245 TO_DS_FLAG : self.DataToDS,
246 INTER_DS_FLAG : self.DataInterDS
247 }
248
249
250
251
252 d_decoder = {
253
254
255 D_DATA: ('data_frame', d_dsData),
256 D_NULL: ('data_frame', d_dsData),
257 D_QOS_DATA: ('data_frame', d_dsData),
258 D_QOS_NULL: ('data_frame', d_dsData)
259 }
260
261 decoder = {
262 MGMT_TYPE:m_decoder,
263 CTL_TYPE:c_decoder,
264 DATA_TYPE:d_decoder
265 }
266
267
268 if self.fcs_present:
269 self.fcs = struct.unpack('I', self.data[-1 * FCS_LENGTH:])[0]
270 self.data = self.data[0: -1 * FCS_LENGTH]
271
272 if self.type == MGMT_TYPE:
273 self.mgmt = self.MGMT_Frame(self.data)
274 self.data = self.mgmt.data
275 if self.subtype == M_PROBE_REQ:
276 self.unpack_ies(self.data)
277 return
278 if self.subtype == M_ATIM:
279 return
280
281 try:
282 parser = decoder[self.type][self.subtype][1]
283 name = decoder[self.type][self.subtype][0]
284 except KeyError:
285 print "Key error:", self.type, self.subtype
286 return
287
288 if self.type == DATA_TYPE:
289
290 parser = parser[self.to_ds*10+self.from_ds]
291
292 if self.type == MGMT_TYPE:
293 field = parser(self.mgmt.data)
294 else:
295 field = parser(self.data)
296 self.data = field
297
298 setattr(self, name, field)
299
300 if self.type == MGMT_TYPE:
301 self.ies = self.unpack_ies(field.data)
302 if self.subtype in FRAMES_WITH_CAPABILITY:
303 self.capability = self.Capability(socket.ntohs(field.capability))
304
305 if self.type == DATA_TYPE and self.subtype == D_QOS_DATA:
306 self.qos_data = self.QoS_Data(field.data)
307 field.data = self.qos_data.data
308
309 self.data = field.data
310
312 __hdr__ = (
313 ('dst', '6s', '\x00' * 6),
314 ('src', '6s', '\x00' *6),
315 ('ctl', 'H', 0),
316 ('seq', 'H', 0),
317 )
318
320 __hdr__ = (
321 ('dst', '6s', '\x00' * 6),
322 ('src', '6s', '\x00' * 6),
323 ('ctl', 'H', 0),
324 ('seq', 'H', 0),
325 )
326
329
332
335
338
339 compressed = property(_get_compressed, _set_compressed)
340 ack_policy = property(_get_ack_policy, _set_ack_policy)
341 multi_tid = property(_get_multi_tid, _set_multi_tid)
342 tid = property(_get_tid, _set_tid)
343
354
355 - class RTS(dpkt.Packet):
356 __hdr__ = (
357 ('dst', '6s', '\x00' * 6),
358 ('src', '6s', '\x00' * 6)
359 )
360
361 - class CTS(dpkt.Packet):
362 __hdr__ = (
363 ('dst', '6s', '\x00' * 6),
364 )
365
366 - class ACK(dpkt.Packet):
367 __hdr__ = (
368 ('dst', '6s', '\x00' * 6),
369 )
370
371 - class CFEnd(dpkt.Packet):
372 __hdr__ = (
373 ('dst', '6s', '\x00' *6),
374 ('src', '6s', '\x00' *6),
375 )
376
378 __hdr__ = (
379 ('dst', '6s', '\x00' *6),
380 ('src', '6s', '\x00' *6),
381 ('bssid', '6s', '\x00' *6),
382 ('frag_seq', 'H', 0)
383 )
384
386 __hdr__ = (
387 ('timestamp', 'Q', 0),
388 ('interval', 'H', 0),
389 ('capability', 'H', 0)
390 )
391
393 __hdr__ = (
394 ('reason', 'H', 0),
395 )
396
398 __hdr__ = (
399 ('capability', 'H', 0),
400 ('interval', 'H', 0)
401 )
402
404 __hdr__ = (
405 ('capability', 'H', 0),
406 ('status', 'H', 0),
407 ('aid', 'H', 0)
408 )
409
411 __hdr__ = (
412 ('capability', 'H', 0),
413 ('interval', 'H', 0),
414 ('current_ap', '6s', '\x00'*6)
415 )
416
417
418 - class Auth(dpkt.Packet):
419 __hdr__ = (
420 ('algorithm', 'H', 0),
421 ('auth_seq', 'H', 0),
422 )
423
425 __hdr__ = (
426 ('reason', 'H', 0),
427 )
428
430 __hdr__ = (
431 ('category', 'B', 0),
432 ('code', 'B', 0),
433 )
434
449
451 __hdr__ = (
452 ('dialog', 'B', 0),
453 ('parameters', 'H', 0),
454 ('timeout', 'H', 0),
455 ('starting_seq', 'H', 0),
456 )
457
459 __hdr__ = (
460 ('dialog', 'B', 0),
461 ('status_code', 'H', 0),
462 ('parameters', 'H', 0),
463 ('timeout', 'H', 0),
464 )
465
466 - class Data(dpkt.Packet):
467 __hdr__ = (
468 ('dst', '6s', '\x00'*6),
469 ('src', '6s', '\x00'*6),
470 ('bssid', '6s', '\x00'*6),
471 ('frag_seq', 'H', 0)
472 )
473
474
476 __hdr__ = (
477 ('dst', '6s', '\x00'*6),
478 ('bssid', '6s', '\x00'*6),
479 ('src', '6s', '\x00'*6),
480 ('frag_seq', 'H', 0)
481 )
482
483
485 __hdr__ = (
486 ('bssid', '6s', '\x00'*6),
487 ('src', '6s', '\x00'*6),
488 ('dst', '6s', '\x00'*6),
489 ('frag_seq', 'H', 0)
490 )
491
493 __hdr__ = (
494 ('dst', '6s', '\x00'*6),
495 ('src', '6s', '\x00'*6),
496 ('da', '6s', '\x00'*6),
497 ('frag_seq', 'H', 0),
498 ('sa', '6s', '\x00'*6)
499 )
500
502 __hdr__ = (
503 ('control', 'H', 0),
504 )
505
506 - class IE(dpkt.Packet):
507 __hdr__ = (
508 ('id', 'B', 0),
509 ('len', 'B', 0)
510 )
514
515 - class FH(dpkt.Packet):
516 __hdr__ = (
517 ('id', 'B', 0),
518 ('len', 'B', 0),
519 ('tu', 'H', 0),
520 ('hopset', 'B', 0),
521 ('hoppattern', 'B', 0),
522 ('hopindex', 'B', 0)
523 )
524
525 - class DS(dpkt.Packet):
526 __hdr__ = (
527 ('id', 'B', 0),
528 ('len', 'B', 0),
529 ('ch', 'B', 0)
530 )
531
532 - class CF(dpkt.Packet):
533 __hdr__ = (
534 ('id', 'B', 0),
535 ('len', 'B', 0),
536 ('count', 'B', 0),
537 ('period', 'B', 0),
538 ('max', 'H', 0),
539 ('dur', 'H', 0)
540 )
541
542 - class TIM(dpkt.Packet):
543 __hdr__ = (
544 ('id', 'B', 0),
545 ('len', 'B', 0),
546 ('count', 'B', 0),
547 ('period', 'B', 0),
548 ('ctrl', 'H', 0)
549 )
553
554 - class IBSS(dpkt.Packet):
555 __hdr__ = (
556 ('id', 'B', 0),
557 ('len', 'B', 0),
558 ('atim', 'H', 0)
559 )
560
561
562
563 if __name__ == '__main__':
564 import unittest
565
568 s = '\xd4\x00\x00\x00\x00\x12\xf0\xb6\x1c\xa4\xff\xff\xff\xff'
569 ieee = IEEE80211(s, fcs = True)
570 self.failUnless(ieee.version == 0)
571 self.failUnless(ieee.type == CTL_TYPE)
572 self.failUnless(ieee.subtype == C_ACK)
573 self.failUnless(ieee.to_ds == 0)
574 self.failUnless(ieee.from_ds == 0)
575 self.failUnless(ieee.pwr_mgt == 0)
576 self.failUnless(ieee.more_data == 0)
577 self.failUnless(ieee.wep == 0)
578 self.failUnless(ieee.order == 0)
579 self.failUnless(ieee.ack.dst == '\x00\x12\xf0\xb6\x1c\xa4')
580 fcs = struct.unpack('I', s[-4:])[0]
581 self.failUnless(ieee.fcs == fcs)
582
584 s = '\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x26\xcb\x18\x6a\x30\x00\x26\xcb\x18\x6a\x30\xa0\xd0\x77\x09\x32\x03\x8f\x00\x00\x00\x66\x00\x31\x04\x00\x04\x43\x41\x45\x4e\x01\x08\x82\x84\x8b\x0c\x12\x96\x18\x24\x03\x01\x01\x05\x04\x00\x01\x00\x00\x07\x06\x55\x53\x20\x01\x0b\x1a\x0b\x05\x00\x00\x6e\x00\x00\x2a\x01\x02\x2d\x1a\x6e\x18\x1b\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x28\x00\x32\x04\x30\x48\x60\x6c\x36\x03\x51\x63\x03\x3d\x16\x01\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x1e\x05\x00\x8f\x00\x0f\x00\xff\x03\x59\x00\x63\x73\x65\x2d\x33\x39\x31\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x96\x06\x00\x40\x96\x00\x14\x00\xdd\x18\x00\x50\xf2\x02\x01\x01\x80\x00\x03\xa4\x00\x00\x27\xa4\x00\x00\x42\x43\x5e\x00\x62\x32\x2f\x00\xdd\x06\x00\x40\x96\x01\x01\x04\xdd\x05\x00\x40\x96\x03\x05\xdd\x05\x00\x40\x96\x0b\x09\xdd\x08\x00\x40\x96\x13\x01\x00\x34\x01\xdd\x05\x00\x40\x96\x14\x05'
585 ieee = IEEE80211(s, fcs = True)
586 self.failUnless(ieee.version == 0)
587 self.failUnless(ieee.type == MGMT_TYPE)
588 self.failUnless(ieee.subtype == M_BEACON)
589 self.failUnless(ieee.to_ds == 0)
590 self.failUnless(ieee.from_ds == 0)
591 self.failUnless(ieee.pwr_mgt == 0)
592 self.failUnless(ieee.more_data == 0)
593 self.failUnless(ieee.wep == 0)
594 self.failUnless(ieee.order == 0)
595 self.failUnless(ieee.mgmt.dst == '\xff\xff\xff\xff\xff\xff')
596 self.failUnless(ieee.mgmt.src == '\x00\x26\xcb\x18\x6a\x30')
597 self.failUnless(ieee.beacon.capability == 0x3104)
598 self.failUnless(ieee.capability.privacy == 1)
599 self.failUnless(ieee.ssid.data == 'CAEN')
600 self.failUnless(ieee.rate.data == '\x82\x84\x8b\x0c\x12\x96\x18\x24')
601 self.failUnless(ieee.ds.data == '\x01')
602 self.failUnless(ieee.tim.data == '\x00\x01\x00\x00')
603 fcs = struct.unpack('I', s[-4:])[0]
604 self.failUnless(ieee.fcs == fcs)
605
607 s = '\x08\x09\x20\x00\x00\x26\xcb\x17\x3d\x91\x00\x16\x44\xb0\xae\xc6\x00\x02\xb3\xd6\x26\x3c\x80\x7e\xaa\xaa\x03\x00\x00\x00\x08\x00\x45\x00\x00\x28\x07\x27\x40\x00\x80\x06\x1d\x39\x8d\xd4\x37\x3d\x3f\xf5\xd1\x69\xc0\x5f\x01\xbb\xb2\xd6\xef\x23\x38\x2b\x4f\x08\x50\x10\x42\x04\xac\x17\x00\x00'
608 ieee = IEEE80211(s, fcs = True)
609 self.failUnless(ieee.type == DATA_TYPE)
610 self.failUnless(ieee.subtype == D_DATA)
611 self.failUnless(ieee.data_frame.dst == '\x00\x02\xb3\xd6\x26\x3c')
612 self.failUnless(ieee.data_frame.src == '\x00\x16\x44\xb0\xae\xc6')
613 self.failUnless(ieee.data_frame.frag_seq == 0x807e)
614 self.failUnless(ieee.data == '\xaa\xaa\x03\x00\x00\x00\x08\x00\x45\x00\x00\x28\x07\x27\x40\x00\x80\x06\x1d\x39\x8d\xd4\x37\x3d\x3f\xf5\xd1\x69\xc0\x5f\x01\xbb\xb2\xd6\xef\x23\x38\x2b\x4f\x08\x50\x10\x42\x04')
615 self.failUnless(ieee.fcs == struct.unpack('I', '\xac\x17\x00\x00')[0])
616
617 import llc, ip
618 llc_pkt = llc.LLC(ieee.data_frame.data)
619 ip_pkt = ip.IP(llc_pkt.data)
620 self.failUnless(ip_pkt.dst == '\x3f\xf5\xd1\x69')
621
623 s = '\x88\x01\x3a\x01\x00\x26\xcb\x17\x44\xf0\x00\x23\xdf\xc9\xc0\x93\x00\x26\xcb\x17\x44\xf0\x20\x7b\x00\x00\xaa\xaa\x03\x00\x00\x00\x88\x8e\x01\x00\x00\x74\x02\x02\x00\x74\x19\x80\x00\x00\x00\x6a\x16\x03\x01\x00\x65\x01\x00\x00\x61\x03\x01\x4b\x4c\xa7\x7e\x27\x61\x6f\x02\x7b\x3c\x72\x39\xe3\x7b\xd7\x43\x59\x91\x7f\xaa\x22\x47\x51\xb6\x88\x9f\x85\x90\x87\x5a\xd1\x13\x20\xe0\x07\x00\x00\x68\xbd\xa4\x13\xb0\xd5\x82\x7e\xc7\xfb\xe7\xcc\xab\x6e\x5d\x5a\x51\x50\xd4\x45\xc5\xa1\x65\x53\xad\xb5\x88\x5b\x00\x1a\x00\x2f\x00\x05\x00\x04\x00\x35\x00\x0a\x00\x09\x00\x03\x00\x08\x00\x33\x00\x39\x00\x16\x00\x15\x00\x14\x01\x00\xff\xff\xff\xff'
624 ieee = IEEE80211(s, fcs = True)
625 self.failUnless(ieee.type == DATA_TYPE)
626 self.failUnless(ieee.subtype == D_QOS_DATA)
627 self.failUnless(ieee.data_frame.dst == '\x00\x26\xcb\x17\x44\xf0')
628 self.failUnless(ieee.data_frame.src == '\x00\x23\xdf\xc9\xc0\x93')
629 self.failUnless(ieee.data_frame.frag_seq == 0x207b)
630 self.failUnless(ieee.data == '\xaa\xaa\x03\x00\x00\x00\x88\x8e\x01\x00\x00\x74\x02\x02\x00\x74\x19\x80\x00\x00\x00\x6a\x16\x03\x01\x00\x65\x01\x00\x00\x61\x03\x01\x4b\x4c\xa7\x7e\x27\x61\x6f\x02\x7b\x3c\x72\x39\xe3\x7b\xd7\x43\x59\x91\x7f\xaa\x22\x47\x51\xb6\x88\x9f\x85\x90\x87\x5a\xd1\x13\x20\xe0\x07\x00\x00\x68\xbd\xa4\x13\xb0\xd5\x82\x7e\xc7\xfb\xe7\xcc\xab\x6e\x5d\x5a\x51\x50\xd4\x45\xc5\xa1\x65\x53\xad\xb5\x88\x5b\x00\x1a\x00\x2f\x00\x05\x00\x04\x00\x35\x00\x0a\x00\x09\x00\x03\x00\x08\x00\x33\x00\x39\x00\x16\x00\x15\x00\x14\x01\x00')
631 self.failUnless(ieee.qos_data.control == 0x0)
632 self.failUnless(ieee.fcs == struct.unpack('I', '\xff\xff\xff\xff')[0])
633
635 s = '\x88\x41\x2c\x00\x00\x26\xcb\x17\x44\xf0\x00\x1e\x52\x97\x14\x11\x00\x1f\x6d\xe8\x18\x00\xd0\x07\x00\x00\x6f\x00\x00\x20\x00\x00\x00\x00'
636 ieee = IEEE80211(s)
637 self.failUnless(ieee.wep == 1)
638
640
641
642
643 s = '\x08\x03\x00\x00\x01\x0b\x85\x00\x00\x00\x00\x26\xcb\x18\x73\x50\x01\x0b\x85\x00\x00\x00\x00\x89\x00\x26\xcb\x18\x73\x50'
644 ieee = IEEE80211(s)
645 self.failUnless(ieee.type == DATA_TYPE)
646 self.failUnless(ieee.to_ds == 1)
647 self.failUnless(ieee.from_ds == 1)
648 self.failUnless(ieee.data_frame.sa == '\x00\x26\xcb\x18\x73\x50')
649 self.failUnless(ieee.data_frame.src == '\x00\x26\xcb\x18\x73\x50')
650 self.failUnless(ieee.data_frame.dst == '\x01\x0b\x85\x00\x00\x00')
651 self.failUnless(ieee.data_frame.da == '\x01\x0b\x85\x00\x00\x00')
652
653 s = '\x88\x41\x50\x01\x00\x26\xcb\x17\x48\xc1\x00\x24\x2c\xe7\xfe\x8a\xff\xff\xff\xff\xff\xff\x80\xa0\x00\x00\x09\x1a\x00\x20\x00\x00\x00\x00'
654 ieee = IEEE80211(s)
655 self.failUnless(ieee.type == DATA_TYPE)
656 self.failUnless(ieee.to_ds == 1)
657 self.failUnless(ieee.from_ds == 0)
658 self.failUnless(ieee.data_frame.bssid == '\x00\x26\xcb\x17\x48\xc1')
659 self.failUnless(ieee.data_frame.src == '\x00\x24\x2c\xe7\xfe\x8a')
660 self.failUnless(ieee.data_frame.dst == '\xff\xff\xff\xff\xff\xff')
661
662 s = '\x08\x02\x02\x01\x00\x02\x44\xac\x27\x70\x00\x1f\x33\x39\x75\x44\x00\x1f\x33\x39\x75\x44\x90\xa4'
663 ieee = IEEE80211(s)
664 self.failUnless(ieee.type == DATA_TYPE)
665 self.failUnless(ieee.to_ds == 0)
666 self.failUnless(ieee.from_ds == 1)
667 self.failUnless(ieee.data_frame.bssid == '\x00\x1f\x33\x39\x75\x44')
668 self.failUnless(ieee.data_frame.src == '\x00\x1f\x33\x39\x75\x44')
669 self.failUnless(ieee.data_frame.dst == '\x00\x02\x44\xac\x27\x70')
670
672 s = '\x94\x00\x00\x00\x34\xc0\x59\xd6\x3f\x62\xb4\x75\x0e\x46\x83\xc1\x05\x50\x80\xee\x03\x00\x00\x00\x00\x00\x00\x00\xa2\xe4\x98\x45'
673 ieee = IEEE80211(s, fcs = True)
674 self.failUnless(ieee.type == CTL_TYPE)
675 self.failUnless(ieee.subtype == C_BLOCK_ACK)
676 self.failUnless(ieee.back.dst == '\x34\xc0\x59\xd6\x3f\x62')
677 self.failUnless(ieee.back.src == '\xb4\x75\x0e\x46\x83\xc1')
678 self.failUnless(ieee.back.compressed == 1)
679 self.failUnless(len(ieee.back.bmp) == 8)
680 self.failUnless(ieee.back.ack_policy == 1)
681 self.failUnless(ieee.back.tid == 5)
682
693
705
706 unittest.main()
707