import tracecmd
import struct

def pcap_open(filename):
    pcap_file = file(filename, 'w')

    # pcap header
    pcap_file.write(
        struct.pack('<IHHIIII',
            0xa1b2c3d4,         # pcap magic
            2,                  # version major
            4,                  # version minor
            0,                  # time zone
            0,                  # time accuracy
            65536,              # max snaplen
            105))               # linktype_ieee80211

    return pcap_file

def pcap_add_packet(pcap_file, ts, packet):
    datalen = len(packet)
    pcap_file.write(
        struct.pack('<IIII',
            ts/1000000000, (ts % 1000000000) / 1000,
            datalen, datalen))
    pcap_file.write(packet)

def ath5k_tx_handler(trace_seq, event):
    priv = event['priv']
    skb = event['skbaddr']
    data = event['frame'].data
    pcap_add_packet(pcap, event.ts, data)
    trace_seq.puts("[0x%x] TX skb=%x (%u bytes)" % (priv, skb, len(data)))

def ath5k_rx_handler(trace_seq, event):
    priv = event['priv']
    data = event['frame'].data
    pcap_add_packet(pcap, event.ts, data)
    trace_seq.puts("[0x%x] RX (%u bytes)" % (priv, len(data)))

def register(pevent):
    pevent.register_event_handler("ath5k", "ath5k_tx", ath5k_tx_handler)
    pevent.register_event_handler("ath5k", "ath5k_rx", ath5k_rx_handler)

pcap = pcap_open("/tmp/pcap.out")
pcap_add_packet(pcap, 0, '')

