diff options
author | Bruce M Simpson <bms@FreeBSD.org> | 2004-04-03 06:24:17 +0000 |
---|---|---|
committer | Bruce M Simpson <bms@FreeBSD.org> | 2004-04-03 06:24:17 +0000 |
commit | 636cf71163d6bbe046512b4f78dc31baf0bb2478 (patch) | |
tree | 16c9bd409594c82f16dbc0f8cd2a9aa927f34aae /net/tcpdump | |
parent | 2c7983e007f20bd300c32b1632b7b851a00d02f5 (diff) | |
download | ports-636cf71163d6bbe046512b4f78dc31baf0bb2478.tar.gz ports-636cf71163d6bbe046512b4f78dc31baf0bb2478.zip |
Notes
Diffstat (limited to 'net/tcpdump')
-rw-r--r-- | net/tcpdump/Makefile | 5 | ||||
-rw-r--r-- | net/tcpdump/files/extra-patch-Makefile.in | 20 | ||||
-rw-r--r-- | net/tcpdump/files/extra-patch-cpack.c | 184 | ||||
-rw-r--r-- | net/tcpdump/files/extra-patch-cpack.h | 56 | ||||
-rw-r--r-- | net/tcpdump/files/extra-patch-extract.h | 4 | ||||
-rw-r--r-- | net/tcpdump/files/extra-patch-ieee802_11_radio.h | 10 | ||||
-rw-r--r-- | net/tcpdump/files/extra-patch-print-802_11.c | 332 | ||||
-rw-r--r-- | net/tcpdump/files/extra-patch-tcpdump.c | 15 |
8 files changed, 209 insertions, 417 deletions
diff --git a/net/tcpdump/Makefile b/net/tcpdump/Makefile index b80741ff18c3..444161c57076 100644 --- a/net/tcpdump/Makefile +++ b/net/tcpdump/Makefile @@ -49,10 +49,7 @@ CONFIGURE_ARGS+= --without-crypto .endif .if defined(WITH_RADIOTAP) -EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-Makefile.in \ - ${PATCHDIR}/extra-patch-cpack.c \ - ${PATCHDIR}/extra-patch-cpack.h \ - ${PATCHDIR}/extra-patch-extract.h \ +EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-extract.h \ ${PATCHDIR}/extra-patch-ieee802_11_radio.h \ ${PATCHDIR}/extra-patch-print-802_11.c .endif diff --git a/net/tcpdump/files/extra-patch-Makefile.in b/net/tcpdump/files/extra-patch-Makefile.in deleted file mode 100644 index 5f69c1f012ca..000000000000 --- a/net/tcpdump/files/extra-patch-Makefile.in +++ /dev/null @@ -1,20 +0,0 @@ ---- Makefile.in.orig Sun Mar 28 22:25:02 2004 -+++ Makefile.in Wed Mar 31 01:04:18 2004 -@@ -65,7 +65,7 @@ - @rm -f $@ - $(CC) $(CFLAGS) -c $(srcdir)/$*.c - --CSRC = addrtoname.c gmpls.c gmt2local.c machdep.c oui.c parsenfsfh.c \ -+CSRC = addrtoname.c cpack.c gmpls.c gmt2local.c machdep.c oui.c parsenfsfh.c \ - print-802_11.c print-ap1394.c print-ah.c print-arcnet.c \ - print-aodv.c print-arp.c print-ascii.c print-atalk.c print-atm.c \ - print-beep.c print-bfd.c print-bgp.c print-bootp.c print-cdp.c \ -@@ -95,7 +95,7 @@ - # We would like to say "OBJ = $(SRC:.c=.o)" but Ultrix's make cannot - # hack the extra indirection - OBJ = $(CSRC:.c=.o) $(GENSRC:.c=.o) $(LOCALSRC:.c=.o) $(LIBOBJS) --HDR = addrtoname.h appletalk.h bootp.h decnet.h \ -+HDR = addrtoname.h appletalk.h bootp.h cpack.h decnet.h \ - ethertype.h extract.h fddi.h gmt2local.h igrp.h interface.h \ - ipx.h llc.h machdep.h mib.h nfsfh.h nfsv2.h ntp.h ospf.h \ - setsignal.h \ diff --git a/net/tcpdump/files/extra-patch-cpack.c b/net/tcpdump/files/extra-patch-cpack.c deleted file mode 100644 index b646ce9ed5b3..000000000000 --- a/net/tcpdump/files/extra-patch-cpack.c +++ /dev/null @@ -1,184 +0,0 @@ ---- cpack.c.orig Wed Mar 31 01:03:41 2004 -+++ cpack.c Wed Mar 31 01:03:41 2004 -@@ -0,0 +1,181 @@ -+/*- -+ * Copyright (c) 2003, 2004 David Young. All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of David Young may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY -+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID -+ * YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -+ * OF SUCH DAMAGE. -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+#include <stdlib.h> -+#include <tcpdump-stdinc.h> -+ -+#include "cpack.h" -+ -+static u_char * -+cpack_next_boundary(u_char *p, size_t alignment) -+{ -+ size_t misalignment = (u_int)p % alignment; -+ -+ if (misalignment == 0) -+ return p; -+ -+ return p + (alignment - misalignment); -+} -+ -+/* Advance to the next wordsize boundary. Return NULL if fewer than -+ * wordsize bytes remain in the buffer after the boundary. Otherwise, -+ * return a pointer to the boundary. -+ */ -+static u_char * -+cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize) -+{ -+ u_char *next; -+ -+ /* Ensure alignment. */ -+ next = cpack_next_boundary(cs->c_next, wordsize); -+ -+ /* Too little space for wordsize bytes? */ -+ if (next - cs->c_buf + wordsize > cs->c_len) -+ return NULL; -+ -+ return next; -+} -+ -+int -+cpack_init_in(struct cpack_state *cs, u_int8_t *buf, size_t buflen) -+{ -+ memset(cs, 0, sizeof(*cs)); -+ cs->c_mode = CPACK_MODE_UNPACK; -+ cs->c_buf = buf; -+ cs->c_len = buflen; -+ cs->c_next = cs->c_buf; -+ -+ return 0; -+} -+ -+int -+cpack_init_out(struct cpack_state *cs, size_t buflen, size_t max_alignment) -+{ -+ u_int8_t *buf; -+ size_t len; -+ -+ memset(cs, 0, sizeof(*cs)); -+ cs->c_mode = CPACK_MODE_PACK; -+ len = buflen + max_alignment - 1; -+ -+ if ((cs->c_buf = malloc(len)) == NULL) -+ return -1; -+ -+ /* Correct alignment. */ -+ buf = cpack_next_boundary(cs->c_buf, max_alignment); -+ cs->c_len = len - (buf - cs->c_buf); -+ cs->c_buf = buf; -+ cs->c_next = cs->c_buf; -+ -+ return 0; -+} -+ -+/* (Un)pack a 64-bit unsigned integer. */ -+int -+cpack_uint64(struct cpack_state *cs, u_int64_t *u) -+{ -+ u_char *next; -+ -+ if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) -+ return -1; -+ -+ /* (Un)pack depending on mode. */ -+ if (cs->c_mode == CPACK_MODE_PACK) -+ *(u_int64_t*)next = *u; -+ else -+ *u = *(u_int64_t*)next; -+ -+ /* Move pointer past the u_int64_t. */ -+ cs->c_next = next + sizeof(*u); -+ return 0; -+} -+ -+/* (Un)pack a 32-bit unsigned integer. */ -+int -+cpack_uint32(struct cpack_state *cs, u_int32_t *u) -+{ -+ u_char *next; -+ -+ if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) -+ return -1; -+ -+ /* (Un)pack depending on mode. */ -+ if (cs->c_mode == CPACK_MODE_PACK) -+ *(u_int32_t*)next = *u; -+ else -+ *u = *(u_int32_t*)next; -+ -+ /* Move pointer past the u_int32_t. */ -+ cs->c_next = next + sizeof(*u); -+ return 0; -+} -+ -+/* (Un)pack a 16-bit unsigned integer. */ -+int -+cpack_uint16(struct cpack_state *cs, u_int16_t *u) -+{ -+ u_char *next; -+ -+ if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) -+ return -1; -+ -+ /* (Un)pack depending on mode. */ -+ if (cs->c_mode == CPACK_MODE_PACK) -+ *(u_int16_t*)next = *u; -+ else -+ *u = *(u_int16_t*)next; -+ -+ /* Move pointer past the u_int16_t. */ -+ cs->c_next = next + sizeof(*u); -+ return 0; -+} -+ -+/* (Un)pack an 8-bit unsigned integer. */ -+int -+cpack_uint8(struct cpack_state *cs, u_int8_t *u) -+{ -+ /* No space left? */ -+ if (cs->c_next - cs->c_buf >= cs->c_len) -+ return -1; -+ -+ /* (Un)pack depending on mode. */ -+ if (cs->c_mode == CPACK_MODE_PACK) -+ *cs->c_next = *u; -+ else -+ *u = *cs->c_next; -+ -+ /* Move pointer past the u_int8_t. */ -+ cs->c_next++; -+ return 0; -+} -+ diff --git a/net/tcpdump/files/extra-patch-cpack.h b/net/tcpdump/files/extra-patch-cpack.h deleted file mode 100644 index 9832261f5c8d..000000000000 --- a/net/tcpdump/files/extra-patch-cpack.h +++ /dev/null @@ -1,56 +0,0 @@ ---- cpack.h.orig Wed Mar 31 01:03:41 2004 -+++ cpack.h Wed Mar 31 01:03:41 2004 -@@ -0,0 +1,53 @@ -+/*- -+ * Copyright (c) 2003, 2004 David Young. All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The name of David Young may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY -+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID -+ * YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -+ * OF SUCH DAMAGE. -+ */ -+ -+#ifndef _CPACK_H -+#define _CPACK_H -+ -+struct cpack_state { -+ u_int8_t *c_buf; -+ u_int8_t *c_next; -+ size_t c_len; -+ enum {CPACK_MODE_PACK, CPACK_MODE_UNPACK} c_mode; -+}; -+ -+int cpack_init_in(struct cpack_state *, u_int8_t *, size_t); -+int cpack_init_out(struct cpack_state *, size_t, size_t); -+ -+int cpack_uint8(struct cpack_state *, u_int8_t *); -+int cpack_uint16(struct cpack_state *, u_int16_t *); -+int cpack_uint32(struct cpack_state *, u_int32_t *); -+int cpack_uint64(struct cpack_state *, u_int64_t *); -+ -+#define cpack_int8(s, i) cpack_uint8((s), (u_int8_t*)(i)) -+#define cpack_int16(s, i) cpack_uint16((s), (u_int16_t*)(i)) -+#define cpack_int32(s, i) cpack_uint32((s), (u_int32_t*)(i)) -+#define cpack_int64(s, i) cpack_uint64((s), (u_int64_t*)(i)) -+ -+#endif /* _CPACK_H */ diff --git a/net/tcpdump/files/extra-patch-extract.h b/net/tcpdump/files/extra-patch-extract.h index 1accfcbab2c5..0557722c67f2 100644 --- a/net/tcpdump/files/extra-patch-extract.h +++ b/net/tcpdump/files/extra-patch-extract.h @@ -1,5 +1,5 @@ ---- extract.h.orig Wed Dec 11 07:13:51 2002 -+++ extract.h Wed Mar 31 01:03:41 2004 +--- extract.h.orig Tue Dec 10 23:13:51 2002 ++++ extract.h Tue Mar 30 20:38:35 2004 @@ -96,3 +96,12 @@ (u_int32_t)*((const u_int8_t *)(p) + 2) << 16 | \ (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \ diff --git a/net/tcpdump/files/extra-patch-ieee802_11_radio.h b/net/tcpdump/files/extra-patch-ieee802_11_radio.h index ae2132628418..5851fe5ca4ef 100644 --- a/net/tcpdump/files/extra-patch-ieee802_11_radio.h +++ b/net/tcpdump/files/extra-patch-ieee802_11_radio.h @@ -1,7 +1,7 @@ ---- ieee802_11_radio.h.orig Wed Mar 31 01:03:41 2004 -+++ ieee802_11_radio.h Wed Mar 31 01:03:41 2004 -@@ -0,0 +1,201 @@ -+/* $FreeBSD: /tmp/pcvs/ports/net/tcpdump/files/Attic/extra-patch-ieee802_11_radio.h,v 1.2 2004-03-31 00:14:06 bms Exp $ */ +--- ieee802_11_radio.h.orig Tue Mar 30 20:38:35 2004 ++++ ieee802_11_radio.h Wed Mar 31 10:51:15 2004 +@@ -0,0 +1,203 @@ ++/* $FreeBSD: /tmp/pcvs/ports/net/tcpdump/files/Attic/extra-patch-ieee802_11_radio.h,v 1.3 2004-04-03 06:24:17 bms Exp $ */ +/* $NetBSD: ieee80211_radiotap.h,v 1.3 2003/11/16 09:02:42 dyoung Exp $ */ +/* $Header$ */ + @@ -184,6 +184,8 @@ +#define IEEE80211_CHAN_2GHZ 0x0080 /* 2 GHz spectrum channel. */ +#define IEEE80211_CHAN_5GHZ 0x0100 /* 5 GHz spectrum channel */ +#define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */ ++#define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */ ++#define IEEE80211_CHAN_GFSK 0x0800 /* GFSK channel (FHSS PHY) */ +#endif /* !_KERNEL */ + +/* For IEEE80211_RADIOTAP_FLAGS */ diff --git a/net/tcpdump/files/extra-patch-print-802_11.c b/net/tcpdump/files/extra-patch-print-802_11.c index 571adc13b29d..9166b213ad69 100644 --- a/net/tcpdump/files/extra-patch-print-802_11.c +++ b/net/tcpdump/files/extra-patch-print-802_11.c @@ -1,11 +1,8 @@ ---- print-802_11.c.orig Wed Dec 10 09:52:33 2003 -+++ print-802_11.c Wed Mar 31 01:03:41 2004 -@@ -41,15 +41,20 @@ - +--- print-802_11.c.orig Wed Dec 10 01:52:33 2003 ++++ print-802_11.c Wed Mar 31 11:51:54 2004 +@@ -42,14 +42,17 @@ #include "extract.h" -+#include "cpack.h" -+ #include "ieee802_11.h" +#include "ieee802_11_radio.h" @@ -23,124 +20,38 @@ sep = " "; \ } \ if (p.rates.length != 0) \ -@@ -919,9 +924,194 @@ +@@ -919,9 +922,265 @@ return ieee802_11_print(p, h->len, h->caplen); } -+static int -+print_radiotap_field(struct cpack_state *s, u_int32_t bit) -+{ -+ union { -+ int8_t i8; -+ u_int8_t u8; -+ int16_t i16; -+ u_int16_t u16; -+ u_int32_t u32; -+ u_int64_t u64; -+ } u, u2; -+ int rc; -+ -+ switch (bit) { -+ case IEEE80211_RADIOTAP_FLAGS: -+ case IEEE80211_RADIOTAP_RATE: -+ case IEEE80211_RADIOTAP_DB_ANTSIGNAL: -+ case IEEE80211_RADIOTAP_DB_ANTNOISE: -+ case IEEE80211_RADIOTAP_ANTENNA: -+ rc = cpack_uint8(s, &u.u8); -+ break; -+ case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: -+ case IEEE80211_RADIOTAP_DBM_ANTNOISE: -+ rc = cpack_int8(s, &u.i8); -+ break; -+ case IEEE80211_RADIOTAP_CHANNEL: -+ rc = cpack_uint16(s, &u.u16); -+ if (rc != 0) -+ break; -+ rc = cpack_uint16(s, &u2.u16); -+ break; -+ case IEEE80211_RADIOTAP_FHSS: -+ case IEEE80211_RADIOTAP_LOCK_QUALITY: -+ case IEEE80211_RADIOTAP_TX_ATTENUATION: -+ rc = cpack_uint16(s, &u.u16); -+ break; -+ case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: -+ rc = cpack_uint8(s, &u.u8); -+ break; -+ case IEEE80211_RADIOTAP_DBM_TX_POWER: -+ rc = cpack_uint8(s, &u.i8); -+ break; -+ case IEEE80211_RADIOTAP_TSFT: -+ rc = cpack_uint64(s, &u.u64); -+ break; -+ default: -+ /* this bit indicates a field whose -+ * size we do not know, so we cannot -+ * proceed. -+ */ -+ printf("[0x%08x] ", bit); -+ return -1; -+ } ++/* ++ * Useful combinations of channel characteristics. ++ */ ++#define IEEE80211_CHAN_FHSS \ ++ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_GFSK) ++#define IEEE80211_CHAN_A \ ++ (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) ++#define IEEE80211_CHAN_B \ ++ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) ++#define IEEE80211_CHAN_PUREG \ ++ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) ++#define IEEE80211_CHAN_G \ ++ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) ++#define IEEE80211_CHAN_T \ ++ (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO) + -+ if (rc != 0) { -+ printf("[|802.11]"); -+ return rc; -+ } -+ -+ switch (bit) { -+ case IEEE80211_RADIOTAP_CHANNEL: -+ printf("%u MHz ", u.u16); -+ if (u2.u16 != 0) -+ printf("(0x%04x) ", u2.u16); -+ break; -+ case IEEE80211_RADIOTAP_FHSS: -+ printf("fhset %d fhpat %d ", u.u16 & 0xff, (u.u16 >> 8) & 0xff); -+ break; -+ case IEEE80211_RADIOTAP_RATE: -+ PRINT_RATE("", u.u8, " Mb/s "); -+ break; -+ case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: -+ printf("%ddB signal ", u.i8); -+ break; -+ case IEEE80211_RADIOTAP_DBM_ANTNOISE: -+ printf("%ddB noise ", u.i8); -+ break; -+ case IEEE80211_RADIOTAP_DB_ANTSIGNAL: -+ printf("%ddB signal ", u.u8); -+ break; -+ case IEEE80211_RADIOTAP_DB_ANTNOISE: -+ printf("%ddB noise ", u.u8); -+ break; -+ case IEEE80211_RADIOTAP_LOCK_QUALITY: -+ printf("%u sq ", u.u16); -+ break; -+ case IEEE80211_RADIOTAP_TX_ATTENUATION: -+ printf("%d tx power ", -(int)u.u16); -+ break; -+ case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: -+ printf("%ddB tx power ", -(int)u.u8); -+ break; -+ case IEEE80211_RADIOTAP_DBM_TX_POWER: -+ printf("%ddBm tx power ", u.i8); -+ break; -+ case IEEE80211_RADIOTAP_FLAGS: -+ if (u.u8 & IEEE80211_RADIOTAP_F_CFP) -+ printf("cfp "); -+ if (u.u8 & IEEE80211_RADIOTAP_F_SHORTPRE) -+ printf("short preamble "); -+ if (u.u8 & IEEE80211_RADIOTAP_F_WEP) -+ printf("wep "); -+ if (u.u8 & IEEE80211_RADIOTAP_F_FRAG) -+ printf("fragmented "); -+ break; -+ case IEEE80211_RADIOTAP_ANTENNA: -+ printf("antenna %d ", u.u8); -+ break; -+ case IEEE80211_RADIOTAP_TSFT: -+ printf("%lldus tsft ", (long long)u.u64); -+ break; -+ } -+ return 0; -+} ++#define IEEE80211_IS_CHAN_FHSS(_flags) \ ++ (((_flags) & IEEE80211_CHAN_FHSS) == IEEE80211_CHAN_FHSS) ++#define IEEE80211_IS_CHAN_A(_flags) \ ++ (((_flags) & IEEE80211_CHAN_A) == IEEE80211_CHAN_A) ++#define IEEE80211_IS_CHAN_B(_flags) \ ++ (((_flags) & IEEE80211_CHAN_B) == IEEE80211_CHAN_B) ++#define IEEE80211_IS_CHAN_PUREG(_flags) \ ++ (((_flags) & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG) ++#define IEEE80211_IS_CHAN_G(_flags) \ ++ (((_flags) & IEEE80211_CHAN_G) == IEEE80211_CHAN_G) ++#define IEEE80211_IS_CHAN_T(_flags) \ ++ (((_flags) & IEEE80211_CHAN_T) == IEEE80211_CHAN_T) + static u_int ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen) @@ -152,13 +63,43 @@ +#define BITNO_2(x) (((x) & 2) ? 1 : 0) +#define BIT(n) (1 << n) + -+ struct cpack_state cpacker; ++#define CHECK_EXTRACT_LE_8BITS(_v,_bad) do { \ ++ if (iter + sizeof(u_int8_t) > iterlast) { \ ++ _bad; \ ++ } \ ++ _v = EXTRACT_LE_8BITS(iter); \ ++ iter += sizeof(u_int8_t); \ ++} while (0) ++#define CHECK_EXTRACT_LE_16BITS(_v,_bad) do { \ ++ if (iter + sizeof(u_int16_t) > iterlast) { \ ++ _bad; \ ++ } \ ++ _v = EXTRACT_LE_16BITS(iter); \ ++ iter += sizeof(u_int16_t); \ ++} while (0) ++#define CHECK_EXTRACT_LE_64BITS(_v,_bad) do { \ ++ if (iter + sizeof(u_int64_t) > iterlast) { \ ++ _bad; \ ++ } \ ++ _v = EXTRACT_LE_64BITS(iter); \ ++ iter += sizeof(u_int64_t); \ ++} while (0) ++ + struct ieee80211_radiotap_header *hdr; + u_int32_t present, next_present; + u_int32_t *presentp, *last_presentp; + enum ieee80211_radiotap_type bit; -+ int bit0; -+ const u_char *iter; ++ int bit0, len; ++ const u_int8_t *iter; ++ const u_int8_t *iterlast; ++ union { ++ int8_t i8; ++ u_int8_t u8; ++ int16_t i16; ++ u_int16_t u16; ++ u_int32_t u32; ++ u_int64_t u64; ++ } u, u2; + + if (caplen < sizeof(*hdr)) { + printf("[|802.11]"); @@ -167,14 +108,15 @@ + + hdr = (struct ieee80211_radiotap_header *)p; + -+ if (caplen < hdr->it_len) { ++ len = EXTRACT_LE_16BITS(&hdr->it_len); ++ if (caplen < len) { + printf("[|802.11]"); + return caplen; + } + + for (last_presentp = &hdr->it_present; + (*last_presentp & BIT(IEEE80211_RADIOTAP_EXT)) != 0 && -+ (u_char*)(last_presentp + 1) <= p + hdr->it_len; ++ (u_char*)(last_presentp + 1) <= p + len; + last_presentp++); + + /* are there more bitmap extensions than bytes in header? */ @@ -184,26 +126,138 @@ + } + + iter = (u_char*)(last_presentp + 1); -+ -+ cpack_init_in(&cpacker, (u_int8_t*)iter, hdr->it_len - (iter - p)); ++ iterlast = (u_char*)(p + len); + + for (bit0 = 0, presentp = &hdr->it_present; presentp <= last_presentp; + presentp++, bit0 += 32) { -+ for (present = *presentp; present; present = next_present) { ++ present = EXTRACT_LE_32BITS(presentp); ++ for (; present; present = next_present) { + /* clear the least significant bit that is set */ + next_present = present & (present - 1); + + /* extract the least significant bit that is set */ + bit = bit0 + BITNO_32(present ^ next_present); + -+ if (print_radiotap_field(&cpacker, bit) != 0) ++ switch (bit) { ++ case IEEE80211_RADIOTAP_FLAGS: ++ case IEEE80211_RADIOTAP_RATE: ++ case IEEE80211_RADIOTAP_DB_ANTSIGNAL: ++ case IEEE80211_RADIOTAP_DB_ANTNOISE: ++ case IEEE80211_RADIOTAP_ANTENNA: ++ case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: ++ CHECK_EXTRACT_LE_8BITS(u.u8, goto bad); ++ break; ++ case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: ++ case IEEE80211_RADIOTAP_DBM_ANTNOISE: ++ case IEEE80211_RADIOTAP_DBM_TX_POWER: ++ CHECK_EXTRACT_LE_8BITS(u.i8, goto bad); ++ break; ++ case IEEE80211_RADIOTAP_FHSS: ++ case IEEE80211_RADIOTAP_LOCK_QUALITY: ++ case IEEE80211_RADIOTAP_TX_ATTENUATION: ++ case IEEE80211_RADIOTAP_CHANNEL: ++ CHECK_EXTRACT_LE_16BITS(u.u16, goto bad); ++ if (bit == IEEE80211_RADIOTAP_CHANNEL) ++ CHECK_EXTRACT_LE_16BITS(u2.u16, ++ goto bad); ++ break; ++ case IEEE80211_RADIOTAP_TSFT: ++ CHECK_EXTRACT_LE_64BITS(u.u64, goto bad); ++ break; ++ default: ++ /* this bit indicates a field whose ++ * size we do not know, so we cannot ++ * proceed. ++ */ ++ printf("[0x%08x] ", bit); ++ return -1; ++ bad: ++ /* ++ * There wasn't enough data for the ++ * data type; stop decoding. ++ */ ++ printf("[|802.11]"); + goto out; ++ } ++ ++ switch (bit) { ++ case IEEE80211_RADIOTAP_CHANNEL: ++ printf("%u MHz ", u.u16); ++ if (u2.u16 != 0) { ++ /* use flags to disambiguate */ ++ if (IEEE80211_IS_CHAN_G(u2.u16) || ++ IEEE80211_IS_CHAN_PUREG(u2.u16)) ++ printf("(11g) ", u2.u16); ++ else if (IEEE80211_IS_CHAN_T(u2.u16)) ++ printf("(turbo) ", u2.u16); ++ else if (IEEE80211_IS_CHAN_B(u2.u16)) ++ ; ++ else if (IEEE80211_IS_CHAN_A(u2.u16)) ++ ; ++ else if (IEEE80211_IS_CHAN_FHSS(u2.u16)) ++ ; ++ else ++ printf("(0x%04x) ", u2.u16); ++ } ++ break; ++ case IEEE80211_RADIOTAP_FHSS: ++ printf("fhset %d fhpat %d ", ++ u.u16 & 0xff, (u.u16 >> 8) & 0xff); ++ break; ++ case IEEE80211_RADIOTAP_RATE: ++ PRINT_RATE("", u.u8, " Mb/s "); ++ break; ++ case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: ++ printf("%ddB signal ", u.i8); ++ break; ++ case IEEE80211_RADIOTAP_DBM_ANTNOISE: ++ printf("%ddB noise ", u.i8); ++ break; ++ case IEEE80211_RADIOTAP_DB_ANTSIGNAL: ++ printf("%ddB signal ", u.u8); ++ break; ++ case IEEE80211_RADIOTAP_DB_ANTNOISE: ++ printf("%ddB noise ", u.u8); ++ break; ++ case IEEE80211_RADIOTAP_LOCK_QUALITY: ++ printf("%u sq ", u.u16); ++ break; ++ case IEEE80211_RADIOTAP_TX_ATTENUATION: ++ printf("%d tx power ", -(int)u.u16); ++ break; ++ case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: ++ printf("%ddB tx power ", -(int)u.u8); ++ break; ++ case IEEE80211_RADIOTAP_DBM_TX_POWER: ++ printf("%ddBm tx power ", u.i8); ++ break; ++ case IEEE80211_RADIOTAP_FLAGS: ++ if (u.u8 & IEEE80211_RADIOTAP_F_CFP) ++ printf("cfp "); ++ if (u.u8 & IEEE80211_RADIOTAP_F_SHORTPRE) ++ printf("short preamble "); ++ if (u.u8 & IEEE80211_RADIOTAP_F_WEP) ++ printf("wep "); ++ if (u.u8 & IEEE80211_RADIOTAP_F_FRAG) ++ printf("fragmented "); ++ break; ++ case IEEE80211_RADIOTAP_ANTENNA: ++ printf("antenna %d ", u.u8); ++ break; ++ case IEEE80211_RADIOTAP_TSFT: ++ printf("%lldus tsft ", (long long)u.u64); ++ break; ++ } + } + } +out: + -+ return hdr->it_len + ieee802_11_print(p + hdr->it_len, -+ length - hdr->it_len, caplen - hdr->it_len); ++ return len + ieee802_11_print(p + len, length - len, caplen - len); ++ ++#undef CHECK_EXTRACT_8BITS ++#undef CHECK_EXTRACT_LE_16BITS ++#undef CHECK_EXTRACT_LE_64BITS ++ +#undef BITNO_32 +#undef BITNO_16 +#undef BITNO_8 @@ -212,13 +266,27 @@ +#undef BIT +} + ++#undef IEEE80211_CHAN_FHSS ++#undef IEEE80211_CHAN_A ++#undef IEEE80211_CHAN_B ++#undef IEEE80211_CHAN_PUREG ++#undef IEEE80211_CHAN_G ++#undef IEEE80211_CHAN_T ++ ++#undef IEEE80211_IS_CHAN_FHSS ++#undef IEEE80211_IS_CHAN_A ++#undef IEEE80211_IS_CHAN_B ++#undef IEEE80211_IS_CHAN_PUREG ++#undef IEEE80211_IS_CHAN_G ++#undef IEEE80211_IS_CHAN_T ++ +static u_int +ieee802_11_avs_radio_print(const u_char *p, u_int length, u_int caplen) +{ u_int32_t caphdr_len; caphdr_len = EXTRACT_32BITS(p + 4); -@@ -972,7 +1162,7 @@ +@@ -972,7 +1231,7 @@ } if (EXTRACT_32BITS(p) == WLANCAP_MAGIC_COOKIE_V1) diff --git a/net/tcpdump/files/extra-patch-tcpdump.c b/net/tcpdump/files/extra-patch-tcpdump.c deleted file mode 100644 index 348eaa29bb46..000000000000 --- a/net/tcpdump/files/extra-patch-tcpdump.c +++ /dev/null @@ -1,15 +0,0 @@ ---- tcpdump.c.orig Wed Mar 17 19:47:48 2004 -+++ tcpdump.c Wed Mar 31 01:03:41 2004 -@@ -69,6 +69,12 @@ - #include "gmt2local.h" - #include "pcap-missing.h" - -+/* -+ * XXX: quick and dirty until FreeBSD defines DLT_IEEE802_11_RADIO in -+ * <net/bpf.h>. -bms -+ */ -+#include "ieee802_11_radio.h" -+ - int dflag; /* print filter code */ - int eflag; /* print ethernet header */ - int fflag; /* don't translate "foreign" IP address */ |