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);
106 if (hdr->caplen < hdr->len) {
107 add_note(wt, MSG_DEBUG, "pcap: Dropped incomplete "
108 "frame (%u/%u captured)",
109 hdr->caplen, hdr->len);
110 write_pcapng_write_read(wt, dlt, hdr, data);
115 case DLT_IEEE802_11_RADIO:
116 wlantest_process(wt, data, hdr->caplen);
118 case DLT_PRISM_HEADER:
119 wlantest_process_prism(wt, data, hdr->caplen);
122 wlantest_process_80211(wt, data, hdr->caplen);
125 write_pcapng_write_read(wt, dlt, hdr, data);
130 wpa_printf(MSG_DEBUG, "Read %s: %u packets", fname, count);
136 int read_wired_cap_file(struct wlantest *wt, const char *fname)
138 char errbuf[PCAP_ERRBUF_SIZE];
140 unsigned int count = 0;
141 struct pcap_pkthdr *hdr;
145 pcap = pcap_open_offline(fname, errbuf);
147 wpa_printf(MSG_ERROR, "Failed to read pcap file '%s': %s",
153 res = pcap_next_ex(pcap, &hdr, &data);
155 break; /* No more packets */
157 wpa_printf(MSG_INFO, "pcap_next_ex failure: %s",
162 wpa_printf(MSG_INFO, "Unexpected pcap_next_ex return "
167 /* Packet was read without problems */
168 wpa_printf(MSG_EXCESSIVE, "pcap hdr: ts=%d.%06d "
170 (int) hdr->ts.tv_sec, (int) hdr->ts.tv_usec,
171 hdr->caplen, hdr->len);
172 if (hdr->caplen < hdr->len) {
173 wpa_printf(MSG_DEBUG, "pcap: Dropped incomplete frame "
175 hdr->caplen, hdr->len);
179 wlantest_process_wired(wt, data, hdr->caplen);
184 wpa_printf(MSG_DEBUG, "Read %s: %u packets", fname, count);