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

Source Code for Module dpkt.radiotap

  1  '''Radiotap''' 
  2   
  3  import dpkt 
  4   
  5  # Ref: http://www.radiotap.org 
  6  # Fields Ref: http://www.radiotap.org/defined-fields/all 
  7   
  8  # Present flags 
  9  _TSFT_MASK            = 0x1000000 
 10  _FLAGS_MASK           = 0x2000000 
 11  _RATE_MASK            = 0x4000000 
 12  _CHANNEL_MASK         = 0x8000000 
 13  _FHSS_MASK            = 0x10000000 
 14  _ANT_SIG_MASK         = 0x20000000 
 15  _ANT_NOISE_MASK       = 0x40000000 
 16  _LOCK_QUAL_MASK       = 0x80000000 
 17  _TX_ATTN_MASK         = 0x10000 
 18  _DB_TX_ATTN_MASK      = 0x20000 
 19  _DBM_TX_POWER_MASK    = 0x40000 
 20  _ANTENNA_MASK         = 0x80000 
 21  _DB_ANT_SIG_MASK      = 0x100000 
 22  _DB_ANT_NOISE_MASK    = 0x200000 
 23  _RX_FLAGS_MASK        = 0x400000 
 24  _CHANNELPLUS_MASK     = 0x200 
 25  _EXT_MASK             = 0x1 
 26   
 27  _TSFT_SHIFT           = 24 
 28  _FLAGS_SHIFT          = 25 
 29  _RATE_SHIFT           = 26 
 30  _CHANNEL_SHIFT        = 27 
 31  _FHSS_SHIFT           = 28 
 32  _ANT_SIG_SHIFT        = 29 
 33  _ANT_NOISE_SHIFT      = 30 
 34  _LOCK_QUAL_SHIFT      = 31 
 35  _TX_ATTN_SHIFT        = 16 
 36  _DB_TX_ATTN_SHIFT     = 17 
 37  _DBM_TX_POWER_SHIFT   = 18 
 38  _ANTENNA_SHIFT        = 19 
 39  _DB_ANT_SIG_SHIFT     = 20 
 40  _DB_ANT_NOISE_SHIFT   = 21 
 41  _RX_FLAGS_SHIFT       = 22 
 42  _CHANNELPLUS_SHIFT    = 10 
 43  _EXT_SHIFT            = 0 
 44   
 45  # Flags elements 
 46  _FLAGS_SIZE           = 2 
 47  _CFP_FLAG_SHIFT       = 0 
 48  _PREAMBLE_SHIFT       = 1 
 49  _WEP_SHIFT            = 2 
 50  _FRAG_SHIFT           = 3 
 51  _FCS_SHIFT            = 4 
 52  _DATA_PAD_SHIFT       = 5 
 53  _BAD_FCS_SHIFT        = 6 
 54  _SHORT_GI_SHIFT       = 7 
 55   
 56  # Channel type 
 57  _CHAN_TYPE_SIZE       = 4 
 58  _CHANNEL_TYPE_SHIFT   = 4 
 59  _CCK_SHIFT            = 5 
 60  _OFDM_SHIFT           = 6 
 61  _TWO_GHZ_SHIFT        = 7 
 62  _FIVE_GHZ_SHIFT       = 8 
 63  _PASSIVE_SHIFT        = 9 
 64  _DYN_CCK_OFDM_SHIFT   = 10 
 65  _GFSK_SHIFT           = 11 
 66  _GSM_SHIFT            = 12 
 67  _STATIC_TURBO_SHIFT   = 13 
 68  _HALF_RATE_SHIFT      = 14 
 69  _QUARTER_RATE_SHIFT   = 15 
 70   
71 -class Radiotap(dpkt.Packet):
72 __hdr__ = ( 73 ('version', 'B', 0), 74 ('pad', 'B', 0), 75 ('length', 'H', 0), 76 ('present_flags', 'I', 0) 77 ) 78
79 - def _get_tsft_present(self): return (self.present_flags & _TSFT_MASK) >> _TSFT_SHIFT
80 - def _set_tsft_present(self, val): self.present_flags = self.present_flags | (val << _TSFT_SHIFT)
81 - def _get_flags_present(self): return (self.present_flags & _FLAGS_MASK) >> _FLAGS_SHIFT
82 - def _set_flags_present(self, val): self.present_flags = self.present_flags | (val << _FLAGS_SHIFT)
83 - def _get_rate_present(self): return (self.present_flags & _RATE_MASK) >> _RATE_SHIFT
84 - def _set_rate_present(self, val): self.present_flags = self.present_flags | (val << _RATE_SHIFT)
86 - def _set_channel_present(self, val): self.present_flags = self.present_flags | (val << _CHANNEL_SHIFT)
87 - def _get_fhss_present(self): return (self.present_flags & _FHSS_MASK) >> _FHSS_SHIFT
88 - def _set_fhss_present(self, val): self.present_flags = self.present_flags | (val << _FHSS_SHIFT)
90 - def _set_ant_sig_present(self, val): self.present_flags = self.present_flags | (val << _ANT_SIG_SHIFT)
96 - def _set_tx_attn_present(self, val): self.present_flags = self.present_flags | (val << _TX_ATTN_SHIFT)
101 - def _get_ant_present(self): return (self.present_flags & _ANTENNA_MASK) >> _ANTENNA_SHIFT
102 - def _set_ant_present(self, val): self.present_flags = self.present_flags | (val << _ANTENNA_SHIFT)
108 - def _set_rx_flags_present(self, val): self.present_flags = self.present_flags | (val << _RX_FLAGS_SHIFT)
111 - def _get_ext_present(self): return (self.present_flags & _EXT_MASK) >> _EXT_SHIFT
112 - def _set_ext_present(self, val): self.present_flags = self.present_flags | (val << _EXT_SHIFT)
113 114 tsft_present = property(_get_tsft_present, _set_tsft_present) 115 flags_present = property(_get_flags_present, _set_flags_present) 116 rate_present = property(_get_rate_present, _set_rate_present) 117 channel_present = property(_get_channel_present, _set_channel_present) 118 fhss_present = property(_get_fhss_present, _set_fhss_present) 119 ant_sig_present = property(_get_ant_sig_present, _set_ant_sig_present) 120 ant_noise_present = property(_get_ant_noise_present, _set_ant_noise_present) 121 lock_qual_present = property(_get_lock_qual_present, _set_lock_qual_present) 122 tx_attn_present = property(_get_tx_attn_present, _set_tx_attn_present) 123 db_tx_attn_present = property(_get_db_tx_attn_present, _set_db_tx_attn_present) 124 dbm_tx_power_present = property(_get_dbm_power_present, _set_dbm_power_present) 125 ant_present = property(_get_ant_present, _set_ant_present) 126 db_ant_sig_present = property(_get_db_ant_sig_present, _set_db_ant_sig_present) 127 db_ant_noise_present = property(_get_db_ant_noise_present, _set_db_ant_noise_present) 128 rx_flags_present = property(_get_rx_flags_present, _set_rx_flags_present) 129 chanplus_present = property(_get_chanplus_present, _set_chanplus_present) 130 ext_present = property(_get_ext_present, _set_ext_present) 131
132 - def unpack(self, buf):
133 dpkt.Packet.unpack(self, buf) 134 self.data = buf[self.length:] 135 136 self.fields = [] 137 buf = buf[self.__hdr_len__:] 138 139 # decode each field into self.<name> (eg. self.tsft) as well as append it self.fields list 140 field_decoder = [ 141 ('tsft', self.tsft_present, self.TSFT), 142 ('flags', self.flags_present, self.Flags), 143 ('rate', self.rate_present, self.Rate), 144 ('channel', self.channel_present, self.Channel), 145 ('fhss', self.fhss_present, self.FHSS), 146 ('ant_sig', self.ant_sig_present, self.AntennaSignal), 147 ('ant_noise', self.ant_noise_present, self.AntennaNoise), 148 ('lock_qual', self.lock_qual_present, self.LockQuality), 149 ('tx_attn', self.tx_attn_present, self.TxAttenuation), 150 ('db_tx_attn', self.db_tx_attn_present, self.DbTxAttenuation), 151 ('dbm_tx_power', self.dbm_tx_power_present, self.DbmTxPower), 152 ('ant', self.ant_present, self.Antenna), 153 ('db_ant_sig', self.db_ant_sig_present, self.DbAntennaSignal), 154 ('db_ant_noise', self.db_ant_noise_present, self.DbAntennaNoise), 155 ('rx_flags', self.rx_flags_present, self.RxFlags) 156 ] 157 for name, present_bit, parser in field_decoder: 158 if present_bit: 159 field = parser(buf) 160 field.data = '' 161 setattr(self, name, field) 162 self.fields.append(field) 163 buf = buf[len(field):]
164
165 - class Antenna(dpkt.Packet):
166 __hdr__ = ( 167 ('index', 'B', 0), 168 )
169
170 - class AntennaNoise(dpkt.Packet):
171 __hdr__ = ( 172 ('db', 'B', 0), 173 )
174
175 - class AntennaSignal(dpkt.Packet):
176 __hdr__ = ( 177 ('db', 'B', 0), 178 )
179
180 - class Channel(dpkt.Packet):
181 __hdr__ = ( 182 ('freq', 'H', 0), 183 ('flags', 'H', 0), 184 )
185
186 - class FHSS(dpkt.Packet):
187 __hdr__ = ( 188 ('set', 'B', 0), 189 ('pattern', 'B', 0), 190 )
191
192 - class Flags(dpkt.Packet):
193 __hdr__ = ( 194 ('val', 'B', 0), 195 )
196
197 - class LockQuality(dpkt.Packet):
198 __hdr__ = ( 199 ('val', 'H', 0), 200 )
201
202 - class RxFlags(dpkt.Packet):
203 __hdr__ = ( 204 ('val', 'H', 0), 205 )
206
207 - class Rate(dpkt.Packet):
208 __hdr__ = ( 209 ('val', 'B', 0), 210 )
211
212 - class TSFT(dpkt.Packet):
213 __hdr__ = ( 214 ('usecs', 'Q', 0), 215 )
216
217 - class TxAttenuation(dpkt.Packet):
218 __hdr__ = ( 219 ('val', 'H', 0), 220 )
221
222 - class DbTxAttenuation(dpkt.Packet):
223 __hdr__ = ( 224 ('db', 'H', 0), 225 )
226
227 - class DbAntennaNoise(dpkt.Packet):
228 __hdr__ = ( 229 ('db', 'B', 0), 230 )
231
232 - class DbAntennaSignal(dpkt.Packet):
233 __hdr__ = ( 234 ('db', 'B', 0), 235 )
236
237 - class DbmTxPower(dpkt.Packet):
238 __hdr__ = ( 239 ('dbm', 'B', 0), 240 )
241 242 if __name__ == '__main__': 243 import unittest 244
245 - class RadiotapTestCase(unittest.TestCase):
246 - def test_Radiotap(self):
247 s = '\x00\x00\x00\x18\x6e\x48\x00\x00\x00\x02\x6c\x09\xa0\x00\xa8\x81\x02\x00\x00\x00\x00\x00\x00\x00' 248 rad = Radiotap(s) 249 self.failUnless(rad.version == 0) 250 self.failUnless(rad.present_flags == 0x6e480000) 251 self.failUnless(rad.tsft_present == 0) 252 self.failUnless(rad.flags_present == 1) 253 self.failUnless(rad.rate_present == 1) 254 self.failUnless(rad.channel_present == 1) 255 self.failUnless(rad.fhss_present == 0) 256 self.failUnless(rad.ant_sig_present == 1) 257 self.failUnless(rad.ant_noise_present == 1) 258 self.failUnless(rad.lock_qual_present == 0) 259 self.failUnless(rad.db_tx_attn_present == 0) 260 self.failUnless(rad.dbm_tx_power_present == 0) 261 self.failUnless(rad.ant_present == 1) 262 self.failUnless(rad.db_ant_sig_present == 0) 263 self.failUnless(rad.db_ant_noise_present == 0) 264 self.failUnless(rad.rx_flags_present == 1) 265 self.failUnless(rad.channel.freq == 0x6c09) 266 self.failUnless(rad.channel.flags == 0xa000) 267 self.failUnless(len(rad.fields) == 7)
268 unittest.main() 269