2 * PCAP capture file reader
3 * Copyright (c) 2010, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
9 #include "utils/includes.h"
12 #include "utils/common.h"
16 static void write_pcap_with_radiotap(struct wlantest *wt,
17 const u8 *data, size_t data_len)
23 0x0a, 0x00, /* header len */
24 0x02, 0x00, 0x00, 0x00, /* present flags */
34 os_memset(&h, 0, sizeof(h));
35 h.ts = wt->write_pcap_time;
36 len = sizeof(rtap) + data_len;
40 os_memcpy(buf, rtap, sizeof(rtap));
41 os_memcpy(buf + sizeof(rtap), data, data_len);
44 pcap_dump(wt->write_pcap_dumper, &h, buf);
49 int read_cap_file(struct wlantest *wt, const char *fname)
51 char errbuf[PCAP_ERRBUF_SIZE];
53 unsigned int count = 0;
54 struct pcap_pkthdr *hdr;
59 pcap = pcap_open_offline(fname, errbuf);
61 wpa_printf(MSG_ERROR, "Failed to read pcap file '%s': %s",
65 dlt = pcap_datalink(pcap);
66 if (dlt != DLT_IEEE802_11_RADIO && dlt != DLT_PRISM_HEADER &&
67 dlt != DLT_IEEE802_11) {
68 wpa_printf(MSG_ERROR, "Unsupported pcap datalink type: %d",
73 wpa_printf(MSG_DEBUG, "pcap datalink type: %d", dlt);
77 os_free(wt->decrypted);
80 res = pcap_next_ex(pcap, &hdr, &data);
82 break; /* No more packets */
84 wpa_printf(MSG_INFO, "pcap_next_ex failure: %s",
89 wpa_printf(MSG_INFO, "Unexpected pcap_next_ex return "
94 /* Packet was read without problems */
95 wpa_printf(MSG_EXCESSIVE, "pcap hdr: ts=%d.%06d "
97 (int) hdr->ts.tv_sec, (int) hdr->ts.tv_usec,
98 hdr->caplen, hdr->len);
99 if (wt->write_pcap_dumper) {
100 wt->write_pcap_time = hdr->ts;
101 if (dlt == DLT_IEEE802_11)
102 write_pcap_with_radiotap(wt, data, hdr->caplen);
104 pcap_dump(wt->write_pcap_dumper, hdr, data);
105 if (wt->pcap_no_buffer)
106 pcap_dump_flush(wt->write_pcap_dumper);
108 if (hdr->caplen < hdr->len) {
109 add_note(wt, MSG_DEBUG, "pcap: Dropped incomplete "
110 "frame (%u/%u captured)",
111 hdr->caplen, hdr->len);
112 write_pcapng_write_read(wt, dlt, hdr, data);
117 case DLT_IEEE802_11_RADIO:
118 wlantest_process(wt, data, hdr->caplen);
120 case DLT_PRISM_HEADER:
121 wlantest_process_prism(wt, data, hdr->caplen);
124 wlantest_process_80211(wt, data, hdr->caplen);
127 write_pcapng_write_read(wt, dlt, hdr, data);
132 wpa_printf(MSG_DEBUG, "Read %s: %u packets", fname, count);
138 int read_wired_cap_file(struct wlantest *wt, const char *fname)
140 char errbuf[PCAP_ERRBUF_SIZE];
142 unsigned int count = 0;
143 struct pcap_pkthdr *hdr;
147 pcap = pcap_open_offline(fname, errbuf);
149 wpa_printf(MSG_ERROR, "Failed to read pcap file '%s': %s",
155 res = pcap_next_ex(pcap, &hdr, &data);
157 break; /* No more packets */
159 wpa_printf(MSG_INFO, "pcap_next_ex failure: %s",
164 wpa_printf(MSG_INFO, "Unexpected pcap_next_ex return "
169 /* Packet was read without problems */
170 wpa_printf(MSG_EXCESSIVE, "pcap hdr: ts=%d.%06d "
172 (int) hdr->ts.tv_sec, (int) hdr->ts.tv_usec,
173 hdr->caplen, hdr->len);
174 if (hdr->caplen < hdr->len) {
175 wpa_printf(MSG_DEBUG, "pcap: Dropped incomplete frame "
177 hdr->caplen, hdr->len);
181 wlantest_process_wired(wt, data, hdr->caplen);
186 wpa_printf(MSG_DEBUG, "Read %s: %u packets", fname, count);