Home | History | Annotate | Download | only in utils
      1 #!/usr/bin/env python
      2 #
      3 # Copyright (c) 2012, Intel Corporation
      4 #
      5 # Author: Johannes Berg <johannes (at] sipsolutions.net>
      6 #
      7 # This software may be distributed under the terms of the BSD license.
      8 # See README for more details.
      9 
     10 import sys, struct, re
     11 
     12 def write_pcap_header(pcap_file):
     13     pcap_file.write(
     14         struct.pack('<IHHIIII',
     15                     0xa1b2c3d4, 2, 4, 0, 0, 65535,
     16                     105 # raw 802.11 format
     17                     ))
     18 
     19 def pcap_addpacket(pcap_file, ts, data):
     20     # ts in seconds, float
     21     pcap_file.write(struct.pack('<IIII',
     22         int(ts), int(1000000 * ts) % 1000000,
     23         len(data), len(data)))
     24     pcap_file.write(data)
     25 
     26 if __name__ == "__main__":
     27     try:
     28         input = sys.argv[1]
     29         pcap = sys.argv[2]
     30     except IndexError:
     31         print "Usage: %s <log file> <pcap file>" % sys.argv[0]
     32         sys.exit(2)
     33 
     34     input_file = open(input, 'r')
     35     pcap_file = open(pcap, 'w')
     36     frame_re = re.compile(r'(([0-9]+.[0-9]{6}):\s*)?nl80211: MLME event frame - hexdump\(len=[0-9]*\):((\s*[0-9a-fA-F]{2})*)')
     37 
     38     write_pcap_header(pcap_file)
     39 
     40     for line in input_file:
     41         m = frame_re.match(line)
     42         if m is None:
     43             continue
     44         if m.group(2):
     45             ts = float(m.group(2))
     46         else:
     47             ts = 0
     48         hexdata = m.group(3)
     49         hexdata = hexdata.split()
     50         data = ''.join([chr(int(x, 16)) for x in hexdata])
     51         pcap_addpacket(pcap_file, ts, data)
     52 
     53     input_file.close()
     54     pcap_file.close()
     55