]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-802_11.c
fix bug #303 (DLT_IEEE802_11_RADIO ext. bitmaps)
[tcpdump] / print-802_11.c
index 97badb9fc83eeb8a7011fdb84e9861ac9a9085b5..603e9460cafdd36caee7261b83e113236cabcdea 100644 (file)
@@ -2209,7 +2209,6 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen)
        u_int32_t *presentp, *last_presentp;
        enum ieee80211_radiotap_type bit;
        int bit0;
-       const u_char *iter;
        u_int len;
        u_int8_t flags;
        int pad;
@@ -2229,10 +2228,13 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen)
                printf("[|802.11]");
                return caplen;
        }
+       cpack_init(&cpacker, (u_int8_t *)hdr, len); /* align against header start */
+       cpack_advance(&cpacker, sizeof(*hdr)); /* includes the 1st bitmap */
        for (last_presentp = &hdr->it_present;
             IS_EXTENDED(last_presentp) &&
             (u_char*)(last_presentp + 1) <= p + len;
-            last_presentp++);
+            last_presentp++)
+         cpack_advance(&cpacker, sizeof(hdr->it_present)); /* more bitmaps */
 
        /* are there more bitmap extensions than bytes in header? */
        if (IS_EXTENDED(last_presentp)) {
@@ -2240,14 +2242,6 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen)
                return caplen;
        }
 
-       iter = (u_char*)(last_presentp + 1);
-
-       if (cpack_init(&cpacker, (u_int8_t*)iter, len - (iter - p)) != 0) {
-               /* XXX */
-               printf("[|802.11]");
-               return caplen;
-       }
-
        /* Assume no flags */
        flags = 0;
        /* Assume no Atheros padding between 802.11 header and body */