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 
  6   
  7  # Frame Types 
  8  MANAGEMENT          = 0 
  9  CONTROL             = 1 
 10  DATA                = 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  C_PS_POLL           = 10 
 20  C_RTS               = 11 
 21  C_CTS               = 12 
 22  C_ACK               = 13 
 23  C_CF_END            = 14 
 24  C_CF_END_ACK        = 15 
 25  D_DATA              = 0 
 26  D_DATA_CF_ACK       = 1 
 27  D_DATA_CF_POLL      = 2 
 28  D_DATA_CF_ACK_POLL  = 3 
 29  D_NULL              = 4 
 30  D_CF_ACK            = 5 
 31  D_CF_POLL           = 6 
 32  D_CF_ACK_POLL       = 7 
 33   
 34  # Bitshifts for Frame Control 
 35  _VERSION_MASK       = 0x0300 
 36  _TYPE_MASK          = 0x0c00 
 37  _SUBTYPE_MASK       = 0xf000 
 38  _TO_DS_MASK         = 0x0001 
 39  _FROM_DS_MASK       = 0x0002 
 40  _MORE_FRAG_MASK     = 0x0004 
 41  _RETRY_MASK         = 0x0008 
 42  _PWR_MGT_MASK       = 0x0010 
 43  _MORE_DATA_MASK     = 0x0020 
 44  _WEP_MASK           = 0x0040 
 45  _ORDER_MASK         = 0x0080 
 46  _VERSION_SHIFT      = 8 
 47  _TYPE_SHIFT         = 10 
 48  _SUBTYPE_SHIFT      = 12 
 49  _TO_DS_SHIFT        = 0 
 50  _FROM_DS_SHIFT      = 1 
 51  _MORE_FRAG_SHIFT    = 2 
 52  _RETRY_SHIFT        = 3 
 53  _PWR_MGT_SHIFT      = 4 
 54  _MORE_DATA_SHIFT    = 5 
 55  _WEP_SHIFT          = 6 
 56  _ORDER_SHIFT        = 7 
 57   
58 -class IEEE80211(dpkt.Packet):
59 __hdr__ = ( 60 ('framectl', 'H', 0), 61 ('duration', 'H', 0) 62 ) 63
64 - def _get_version(self): return (self.framectl & _VERSION_MASK) >> _VERSION_SHIFT
65 - def _set_version(self, val): self.framectl = (val << _VERSION_SHIFT) | (self.framectl & ~_VERSION_MASK)
66 - def _get_type(self): return (self.framectl & _TYPE_MASK) >> _TYPE_SHIFT
67 - def _set_type(self, val): self.framectl = (val << _TYPE_SHIFT) | (self.framectl & ~_TYPE_MASK)
68 - def _get_subtype(self): return (self.framectl & _SUBTYPE_MASK) >> _SUBTYPE_SHIFT
69 - def _set_subtype(self, val): self.framectl = (val << _SUBTYPE_SHIFT) | (self.framectl & ~_SUBTYPE_MASK)
70 - def _get_to_ds(self): return (self.framectl & _TO_DS_MASK) >> _TO_DS_SHIFT
71 - def _set_to_ds(self, val): self.framectl = (val << _TO_DS_SHIFT) | (self.framectl & ~_TO_DS_MASK)
72 - def _get_from_ds(self): return (self.framectl & _FROM_DS_MASK) >> _FROM_DS_SHIFT
73 - def _set_from_ds(self, val): self.framectl = (val << _FROM_DS_SHIFT) | (self.framectl & ~_FROM_DS_MASK)
74 - def _get_more_frag(self): return (self.framectl & _MORE_FRAG_MASK) >> _MORE_FRAG_SHIFT
75 - def _set_more_frag(self, val): self.framectl = (val << _MORE_FRAG_SHIFT) | (self.framectl & ~_MORE_FRAG_MASK)
76 - def _get_retry(self): return (self.framectl & _RETRY_MASK) >> _RETRY_SHIFT
77 - def _set_retry(self, val): self.framectl = (val << _RETRY_SHIFT) | (self.framectl & ~_RETRY_MASK)
78 - def _get_pwr_mgt(self): return (self.framectl & _PWR_MGT_MASK) >> _PWR_MGT_SHIFT
79 - def _set_pwr_mgt(self, val): self.framectl = (val << _PWR_MGT_SHIFT) | (self.framectl & ~_PWR_MGT_MASK)
80 - def _get_more_data(self): return (self.framectl & _MORE_DATA_MASK) >> _MORE_DATA_SHIFT
81 - def _set_more_data(self, val): self.framectl = (val << _MORE_DATA_SHIFT) | (self.framectl & ~_MORE_DATA_MASK)
82 - def _get_wep(self): return (self.framectl & _WEP_MASK) >> _WEP_SHIFT
83 - def _set_wep(self, val): self.framectl = (val << _WEP_SHIFT) | (self.framectl & ~_WEP_MASK)
84 - def _get_order(self): return (self.framectl & _ORDER_MASK) >> _ORDER_SHIFT
85 - def _set_order(self, val): self.framectl = (val << _ORDER_SHIFT) | (self.framectl & ~_ORDER_MASK)
86 87 version = property(_get_version, _set_version) 88 type = property(_get_type, _set_type) 89 subtype = property(_get_subtype, _set_subtype) 90 to_ds = property(_get_to_ds, _set_to_ds) 91 from_ds = property(_get_from_ds, _set_from_ds) 92 more_frag = property(_get_more_frag, _set_more_frag) 93 retry = property(_get_retry, _set_retry) 94 pwr_mgt = property(_get_pwr_mgt, _set_pwr_mgt) 95 more_data = property(_get_more_data, _set_more_data) 96 wep = property(_get_wep, _set_wep) 97 order = property(_get_order, _set_order) 98
99 - def unpack(self, buf):
100 dpkt.Packet.unpack(self, buf) 101 self.data = buf[self.__hdr_len__:] 102 103 if self.type == CONTROL: 104 if self.subtype == C_RTS: 105 self.data = self.rts = self.RTS(self.data) 106 if self.subtype == C_CTS: 107 self.data = self.cts = self.CTS(self.data) 108 if self.subtype == C_ACK: 109 self.data = self.ack = self.ACK(self.data)
110
111 - class RTS(dpkt.Packet):
112 __hdr__ = ( 113 ('dst', '6s', '\x00' * 6), 114 ('src', '6s', '\x00' * 6) 115 )
116
117 - class CTS(dpkt.Packet):
118 __hdr__ = ( 119 ('dst', '6s', '\x00' * 6), 120 )
121
122 - class ACK(dpkt.Packet):
123 __hdr__ = ( 124 ('dst', '6s', '\x00' * 6), 125 )
126 127 if __name__ == '__main__': 128 import unittest 129
130 - class IEEE80211TestCase(unittest.TestCase):
131 - def test_802211(self):
132 s = '\xd4\x00\x00\x00\x00\x12\xf0\xb6\x1c\xa4' 133 ieee = IEEE80211(s) 134 self.failUnless(str(ieee) == s) 135 self.failUnless(ieee.version == 0) 136 self.failUnless(ieee.type == CONTROL) 137 self.failUnless(ieee.subtype == C_ACK) 138 self.failUnless(ieee.to_ds == 0) 139 self.failUnless(ieee.from_ds == 0) 140 self.failUnless(ieee.pwr_mgt == 0) 141 self.failUnless(ieee.more_data == 0) 142 self.failUnless(ieee.wep == 0) 143 self.failUnless(ieee.order == 0) 144 self.failUnless(ieee.ack.dst == '\x00\x12\xf0\xb6\x1c\xa4')
145 146 unittest.main() 147