1252190Srpaulo#!/usr/bin/env python
2252190Srpaulo#
3252190Srpaulo# Copyright (c) 2012, Intel Corporation
4252190Srpaulo#
5252190Srpaulo# Author: Johannes Berg <johannes@sipsolutions.net>
6252190Srpaulo#
7252190Srpaulo# This software may be distributed under the terms of the BSD license.
8252190Srpaulo# See README for more details.
9252190Srpaulo
10252190Srpauloimport sys, struct, re
11252190Srpaulo
12252190Srpaulodef write_pcap_header(pcap_file):
13252190Srpaulo    pcap_file.write(
14252190Srpaulo        struct.pack('<IHHIIII',
15252190Srpaulo                    0xa1b2c3d4, 2, 4, 0, 0, 65535,
16252190Srpaulo                    105 # raw 802.11 format
17252190Srpaulo                    ))
18252190Srpaulo
19252190Srpaulodef pcap_addpacket(pcap_file, ts, data):
20252190Srpaulo    # ts in seconds, float
21252190Srpaulo    pcap_file.write(struct.pack('<IIII',
22252190Srpaulo        int(ts), int(1000000 * ts) % 1000000,
23252190Srpaulo        len(data), len(data)))
24252190Srpaulo    pcap_file.write(data)
25252190Srpaulo
26252190Srpauloif __name__ == "__main__":
27252190Srpaulo    try:
28252190Srpaulo        input = sys.argv[1]
29252190Srpaulo        pcap = sys.argv[2]
30252190Srpaulo    except IndexError:
31346981Scy        print("Usage: %s <log file> <pcap file>" % sys.argv[0])
32252190Srpaulo        sys.exit(2)
33252190Srpaulo
34252190Srpaulo    input_file = open(input, 'r')
35252190Srpaulo    pcap_file = open(pcap, 'w')
36252190Srpaulo    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})*)')
37252190Srpaulo
38252190Srpaulo    write_pcap_header(pcap_file)
39252190Srpaulo
40252190Srpaulo    for line in input_file:
41252190Srpaulo        m = frame_re.match(line)
42252190Srpaulo        if m is None:
43252190Srpaulo            continue
44252190Srpaulo        if m.group(2):
45252190Srpaulo            ts = float(m.group(2))
46252190Srpaulo        else:
47252190Srpaulo            ts = 0
48252190Srpaulo        hexdata = m.group(3)
49252190Srpaulo        hexdata = hexdata.split()
50252190Srpaulo        data = ''.join([chr(int(x, 16)) for x in hexdata])
51252190Srpaulo        pcap_addpacket(pcap_file, ts, data)
52252190Srpaulo
53252190Srpaulo    input_file.close()
54252190Srpaulo    pcap_file.close()
55