[PATCH] wlantest: always write radiotap pcap-ng

Johannes Berg johannes at sipsolutions.net
Fri May 31 07:57:47 EDT 2013


From: Johannes Berg <johannes.berg at intel.com>

When writing pcap-ng files, always include a radiotap
header even if there wasn't one in the input. For now
just drop prism headers, I don't have any to test.

Signed-hostap: Johannes Berg <johannes.berg at intel.com>
---
 wlantest/writepcap.c | 40 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/wlantest/writepcap.c b/wlantest/writepcap.c
index 44a251d..58f01a0 100644
--- a/wlantest/writepcap.c
+++ b/wlantest/writepcap.c
@@ -272,12 +272,23 @@ void write_pcapng_write_read(struct wlantest *wt, int dlt,
 	u8 *pos;
 	u32 *block_len;
 	u64 timestamp;
-	size_t len;
+	size_t len, datalen = hdr->caplen;
+	u8 rtap[] = {
+		0x00 /* rev */,
+		0x00 /* pad */,
+		0x0a, 0x00, /* header len */
+		0x02, 0x00, 0x00, 0x00, /* present flags */
+		0x00, /* flags */
+		0x00 /* pad */
+	};
+
+	if (wt->assume_fcs)
+		rtap[8] |= 0x10;
 
 	if (!wt->pcapng)
 		return;
 
-	len = sizeof(*pkt) + hdr->len + 100 + notes_len(wt, 32);
+	len = sizeof(*pkt) + hdr->len + 100 + notes_len(wt, 32) + sizeof(rtap);
 	pkt = os_zalloc(len);
 	if (pkt == NULL)
 		return;
@@ -293,8 +304,29 @@ void write_pcapng_write_read(struct wlantest *wt, int dlt,
 	pkt->packet_len = hdr->len;
 
 	pos = (u8 *) (pkt + 1);
-	os_memcpy(pos, data, hdr->caplen);
-	pos += ALIGN32(hdr->caplen);
+
+	switch (dlt) {
+	case DLT_IEEE802_11_RADIO:
+		break;
+	case DLT_PRISM_HEADER:
+		/* remove prism header (could be kept ... lazy) */
+		pkt->captured_len -= WPA_GET_LE32(data + 4);
+		pkt->packet_len -= WPA_GET_LE32(data + 4);
+		datalen -= WPA_GET_LE32(data + 4);
+		data += WPA_GET_LE32(data + 4);
+		/* fall through */
+	case DLT_IEEE802_11:
+		pkt->captured_len += sizeof(rtap);
+		pkt->packet_len += sizeof(rtap);
+		os_memcpy(pos, &rtap, sizeof(rtap));
+		pos += sizeof(rtap);
+		break;
+	default:
+		return;
+	}
+
+	os_memcpy(pos, data, datalen);
+	pos += datalen + PAD32(pkt->captured_len);
 	pos = pcapng_add_comments(wt, pos);
 
 	block_len = (u32 *) pos;
-- 
1.8.0



More information about the HostAP mailing list