Package dpkt :: Module ieee80211
[hide private]
[frames] | no frames]

Source Code for Module dpkt.ieee80211

  1  # $Id: 80211.py 53 2008-12-18 01:22:57Z jon.oberheide $ 
  2   
  3  """IEEE 802.11.""" 
  4   
  5  import dpkt, socket, struct 
  6   
  7  # Frame Types 
  8  MGMT_TYPE           = 0 
  9  CTL_TYPE            = 1 
 10  DATA_TYPE           = 2 
 11   
 12  # Frame Sub-Types 
 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  # Bitshifts for Frame Control 
 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  # IEs 
 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  # Block Ack control constants 
 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  # Action frame categories 
111  BLOCK_ACK = 3 
112   
113  # Block ack category action codes 
114  BLOCK_ACK_CODE_REQUEST = 0 
115  BLOCK_ACK_CODE_RESPONSE = 1 
116   
117 -class IEEE80211(dpkt.Packet):
118 __hdr__ = ( 119 ('framectl', 'H', 0), 120 ('duration', 'H', 0) 121 ) 122
123 - def _get_version(self): return (self.framectl & _VERSION_MASK) >> _VERSION_SHIFT
124 - def _set_version(self, val): self.framectl = (val << _VERSION_SHIFT) | (self.framectl & ~_VERSION_MASK)
125 - def _get_type(self): return (self.framectl & _TYPE_MASK) >> _TYPE_SHIFT
126 - def _set_type(self, val): self.framectl = (val << _TYPE_SHIFT) | (self.framectl & ~_TYPE_MASK)
127 - def _get_subtype(self): return (self.framectl & _SUBTYPE_MASK) >> _SUBTYPE_SHIFT
128 - def _set_subtype(self, val): self.framectl = (val << _SUBTYPE_SHIFT) | (self.framectl & ~_SUBTYPE_MASK)
129 - def _get_to_ds(self): return (self.framectl & _TO_DS_MASK) >> _TO_DS_SHIFT
130 - def _set_to_ds(self, val): self.framectl = (val << _TO_DS_SHIFT) | (self.framectl & ~_TO_DS_MASK)
131 - def _get_from_ds(self): return (self.framectl & _FROM_DS_MASK) >> _FROM_DS_SHIFT
132 - def _set_from_ds(self, val): self.framectl = (val << _FROM_DS_SHIFT) | (self.framectl & ~_FROM_DS_MASK)
133 - def _get_more_frag(self): return (self.framectl & _MORE_FRAG_MASK) >> _MORE_FRAG_SHIFT
134 - def _set_more_frag(self, val): self.framectl = (val << _MORE_FRAG_SHIFT) | (self.framectl & ~_MORE_FRAG_MASK)
135 - def _get_retry(self): return (self.framectl & _RETRY_MASK) >> _RETRY_SHIFT
136 - def _set_retry(self, val): self.framectl = (val << _RETRY_SHIFT) | (self.framectl & ~_RETRY_MASK)
137 - def _get_pwr_mgt(self): return (self.framectl & _PWR_MGT_MASK) >> _PWR_MGT_SHIFT
138 - def _set_pwr_mgt(self, val): self.framectl = (val << _PWR_MGT_SHIFT) | (self.framectl & ~_PWR_MGT_MASK)
139 - def _get_more_data(self): return (self.framectl & _MORE_DATA_MASK) >> _MORE_DATA_SHIFT
140 - def _set_more_data(self, val): self.framectl = (val << _MORE_DATA_SHIFT) | (self.framectl & ~_MORE_DATA_MASK)
141 - def _get_wep(self): return (self.framectl & _WEP_MASK) >> _WEP_SHIFT
142 - def _set_wep(self, val): self.framectl = (val << _WEP_SHIFT) | (self.framectl & ~_WEP_MASK)
143 - def _get_order(self): return (self.framectl & _ORDER_MASK) >> _ORDER_SHIFT
144 - def _set_order(self, val): self.framectl = (val << _ORDER_SHIFT) | (self.framectl & ~_ORDER_MASK)
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
158 - def unpack_ies(self, buf):
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 # each IE starts with an ID and a length 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
190 - class Capability:
191 - def __init__(self, field):
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
208 - def __init__(self, *args, **kwargs):
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
216 - def unpack(self, buf):
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 # For now decode everything with DATA. Haven't checked about other QoS 251 # additions 252 d_decoder = { 253 # modified the decoder to consider the ToDS and FromDS flags 254 # Omitting the 11 case for now 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 # Strip off the FCS field 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 # need to grab the ToDS/FromDS info 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
311 - class BlockAckReq(dpkt.Packet):
312 __hdr__ = ( 313 ('dst', '6s', '\x00' * 6), 314 ('src', '6s', '\x00' *6), 315 ('ctl', 'H', 0), 316 ('seq', 'H', 0), 317 )
318
319 - class BlockAck(dpkt.Packet):
320 __hdr__ = ( 321 ('dst', '6s', '\x00' * 6), 322 ('src', '6s', '\x00' * 6), 323 ('ctl', 'H', 0), 324 ('seq', 'H', 0), 325 ) 326
327 - def _get_compressed(self): return (self.ctl & _COMPRESSED_MASK) >> _COMPRESSED_SHIFT
328 - def _set_compressed(self, val): self.ctl = (val << _COMPRESSED_SHIFT) | (self.ctl & ~_COMPRESSED_MASK)
329
330 - def _get_ack_policy(self): return (self.ctl & _ACK_POLICY_MASK) >> _ACK_POLICY_SHIFT
331 - def _set_ack_policy(self, val): self.ctl = (val << _ACK_POLICY_SHIFT) | (self.ctl & ~_ACK_POLICY_MASK)
332
333 - def _get_multi_tid(self): return (self.ctl & _MULTI_TID_MASK) >> _MULTI_TID_SHIFT
334 - def _set_multi_tid(self, val): self.ctl = (val << _MULTI_TID_SHIFT) | (self.ctl & ~_MULTI_TID_MASK)
335
336 - def _get_tid(self): return (self.ctl & _TID_MASK) >> _TID_SHIFT
337 - def _set_tid(self, val): self.ctl = (val << _TID_SHIFT) | (self.ctl & ~_TID_MASK)
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
344 - def unpack(self, buf):
345 dpkt.Packet.unpack(self, buf) 346 self.data = buf[self.__hdr_len__:] 347 self.ctl = socket.ntohs(self.ctl) 348 349 if self.compressed: 350 self.bmp = struct.unpack('8s', self.data[0:_COMPRESSED_BMP_LENGTH])[0] 351 else: 352 self.bmp = struct.unpack('128s', self.data[0:_BMP_LENGTH])[0] 353 self.data = self.data[len(self.__hdr__) + len(self.bmp):]
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
377 - class MGMT_Frame(dpkt.Packet):
378 __hdr__ = ( 379 ('dst', '6s', '\x00' *6), 380 ('src', '6s', '\x00' *6), 381 ('bssid', '6s', '\x00' *6), 382 ('frag_seq', 'H', 0) 383 )
384
385 - class Beacon(dpkt.Packet):
386 __hdr__ = ( 387 ('timestamp', 'Q', 0), 388 ('interval', 'H', 0), 389 ('capability', 'H', 0) 390 )
391
392 - class Disassoc(dpkt.Packet):
393 __hdr__ = ( 394 ('reason', 'H', 0), 395 )
396
397 - class Assoc_Req(dpkt.Packet):
398 __hdr__ = ( 399 ('capability', 'H', 0), 400 ('interval', 'H', 0) 401 )
402
403 - class Assoc_Resp(dpkt.Packet):
404 __hdr__ = ( 405 ('capability', 'H', 0), 406 ('status', 'H', 0), 407 ('aid', 'H', 0) 408 )
409
410 - class Reassoc_Req(dpkt.Packet):
411 __hdr__ = ( 412 ('capability', 'H', 0), 413 ('interval', 'H', 0), 414 ('current_ap', '6s', '\x00'*6) 415 )
416 417 # This obviously doesn't support any of AUTH frames that use encryption
418 - class Auth(dpkt.Packet):
419 __hdr__ = ( 420 ('algorithm', 'H', 0), 421 ('auth_seq', 'H', 0), 422 )
423
424 - class Deauth(dpkt.Packet):
425 __hdr__ = ( 426 ('reason', 'H', 0), 427 )
428
429 - class Action(dpkt.Packet):
430 __hdr__ = ( 431 ('category', 'B', 0), 432 ('code', 'B', 0), 433 ) 434
435 - def unpack(self, buf):
436 dpkt.Packet.unpack(self, buf) 437 438 action_parser = { 439 BLOCK_ACK: { BLOCK_ACK_CODE_REQUEST: ('block_ack_request', IEEE80211.BlockAckActionRequest), 440 BLOCK_ACK_CODE_RESPONSE: ('block_ack_response', IEEE80211.BlockAckActionResponse), 441 }, 442 } 443 444 decoder = action_parser[self.category][self.code][1] 445 field_name = action_parser[self.category][self.code][0] 446 field = decoder(self.data) 447 setattr(self, field_name, field) 448 self.data = field.data
449
450 - class BlockAckActionRequest(dpkt.Packet):
451 __hdr__ = ( 452 ('dialog', 'B', 0), 453 ('parameters', 'H', 0), 454 ('timeout', 'H', 0), 455 ('starting_seq', 'H', 0), 456 )
457
458 - class BlockAckActionResponse(dpkt.Packet):
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
475 - class DataFromDS(dpkt.Packet):
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
484 - class DataToDS(dpkt.Packet):
485 __hdr__ = ( 486 ('bssid', '6s', '\x00'*6), 487 ('src', '6s', '\x00'*6), 488 ('dst', '6s', '\x00'*6), 489 ('frag_seq', 'H', 0) 490 )
491
492 - class DataInterDS(dpkt.Packet):
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
501 - class QoS_Data(dpkt.Packet):
502 __hdr__ = ( 503 ('control', 'H', 0), 504 )
505
506 - class IE(dpkt.Packet):
507 __hdr__ = ( 508 ('id', 'B', 0), 509 ('len', 'B', 0) 510 )
511 - def unpack(self, buf):
512 dpkt.Packet.unpack(self, buf) 513 self.info = buf[2:self.len+ 2]
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 )
550 - def unpack(self, buf):
551 dpkt.Packet.unpack(self, buf) 552 self.bitmap = buf[5:self.len+ 2]
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
566 - class IEEE80211TestCase(unittest.TestCase):
567 - def test_802211_ack(self):
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
583 - def test_80211_beacon(self):
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
606 - def test_80211_data(self):
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
622 - def test_80211_data_qos(self):
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
634 - def test_bug(self):
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
639 - def test_data_ds(self):
640 # verifying the ToDS and FromDS fields and that we're getting the 641 # correct values 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
684 s = '\xd0\x00\x3a\x01\x00\x23\x14\x36\x52\x30\xb4\x75\x0e\x46\x83\xc1\xb4\x75\x0e\x46\x83\xc1\x70\x14\x03\x00\x0d\x02\x10\x00\x00\x40\x29\x06\x50\x33\x9e' 685 ieee = IEEE80211(s, fcs = True) 686 self.failUnless(ieee.type == MGMT_TYPE) 687 self.failUnless(ieee.subtype == M_ACTION) 688 self.failUnless(ieee.action.category == BLOCK_ACK) 689 self.failUnless(ieee.action.code == BLOCK_ACK_CODE_REQUEST) 690 self.failUnless(ieee.action.block_ack_request.timeout == 0) 691 parameters = struct.unpack('H', '\x10\x02')[0] 692 self.failUnless(ieee.action.block_ack_request.parameters == parameters)
693
695 s = '\xd0\x00\x3c\x00\xb4\x75\x0e\x46\x83\xc1\x00\x23\x14\x36\x52\x30\xb4\x75\x0e\x46\x83\xc1\xd0\x68\x03\x01\x0d\x00\x00\x02\x10\x88\x13\x9f\xc0\x0b\x75' 696 ieee = IEEE80211(s, fcs = True) 697 self.failUnless(ieee.type == MGMT_TYPE) 698 self.failUnless(ieee.subtype == M_ACTION) 699 self.failUnless(ieee.action.category == BLOCK_ACK) 700 self.failUnless(ieee.action.code == BLOCK_ACK_CODE_RESPONSE) 701 timeout = struct.unpack('H', '\x13\x88')[0] 702 self.failUnless(ieee.action.block_ack_response.timeout == timeout) 703 parameters = struct.unpack('H', '\x10\x02')[0] 704 self.failUnless(ieee.action.block_ack_response.parameters == parameters)
705 706 unittest.main() 707