X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=wlantest%2Freadpcap.c;h=6c3853b058f59b80cb013a4f7392e62f419c0a4a;hb=711e3cab0756623335af83599253971c468f0545;hp=fd8b1e8de629341d96a77b9c8a5f62a5897f532f;hpb=ef00c78097315b51cea46421ae6e0c98e992c21c;p=mech_eap.git diff --git a/wlantest/readpcap.c b/wlantest/readpcap.c index fd8b1e8..6c3853b 100644 --- a/wlantest/readpcap.c +++ b/wlantest/readpcap.c @@ -2,14 +2,8 @@ * PCAP capture file reader * Copyright (c) 2010, Jouni Malinen * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Alternatively, this software may be distributed under the terms of BSD - * license. - * - * See README and COPYING for more details. + * This software may be distributed under the terms of the BSD license. + * See README for more details. */ #include "utils/includes.h" @@ -19,6 +13,39 @@ #include "wlantest.h" +static void write_pcap_with_radiotap(struct wlantest *wt, + const u8 *data, size_t data_len) +{ + struct pcap_pkthdr h; + u8 rtap[] = { + 0x00 /* rev */, + 0x00 /* pad */, + 0x0a, 0x00, /* header len */ + 0x02, 0x00, 0x00, 0x00, /* present flags */ + 0x00, /* flags */ + 0x00 /* pad */ + }; + u8 *buf; + size_t len; + + if (wt->assume_fcs) + rtap[8] |= 0x10; + + os_memset(&h, 0, sizeof(h)); + h.ts = wt->write_pcap_time; + len = sizeof(rtap) + data_len; + buf = os_malloc(len); + if (buf == NULL) + return; + os_memcpy(buf, rtap, sizeof(rtap)); + os_memcpy(buf + sizeof(rtap), data, data_len); + h.caplen = len; + h.len = len; + pcap_dump(wt->write_pcap_dumper, &h, buf); + os_free(buf); +} + + int read_cap_file(struct wlantest *wt, const char *fname) { char errbuf[PCAP_ERRBUF_SIZE]; @@ -46,6 +73,10 @@ int read_cap_file(struct wlantest *wt, const char *fname) wpa_printf(MSG_DEBUG, "pcap datalink type: %d", dlt); for (;;) { + clear_notes(wt); + os_free(wt->decrypted); + wt->decrypted = NULL; + res = pcap_next_ex(pcap, &hdr, &data); if (res == -2) break; /* No more packets */ @@ -67,12 +98,18 @@ int read_cap_file(struct wlantest *wt, const char *fname) hdr->caplen, hdr->len); if (wt->write_pcap_dumper) { wt->write_pcap_time = hdr->ts; - pcap_dump(wt->write_pcap_dumper, hdr, data); + if (dlt == DLT_IEEE802_11) + write_pcap_with_radiotap(wt, data, hdr->caplen); + else + pcap_dump(wt->write_pcap_dumper, hdr, data); + if (wt->pcap_no_buffer) + pcap_dump_flush(wt->write_pcap_dumper); } if (hdr->caplen < hdr->len) { - wpa_printf(MSG_DEBUG, "pcap: Dropped incomplete frame " - "(%u/%u captured)", - hdr->caplen, hdr->len); + add_note(wt, MSG_DEBUG, "pcap: Dropped incomplete " + "frame (%u/%u captured)", + hdr->caplen, hdr->len); + write_pcapng_write_read(wt, dlt, hdr, data); continue; } count++; @@ -85,7 +122,9 @@ int read_cap_file(struct wlantest *wt, const char *fname) break; case DLT_IEEE802_11: wlantest_process_80211(wt, data, hdr->caplen); + break; } + write_pcapng_write_read(wt, dlt, hdr, data); } pcap_close(pcap);