]>
git.ipfire.org Git - thirdparty/hostap.git/blob - wlantest/readpcap.c
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
);