]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-802_11.c
DNS: Sync types with IANA
[tcpdump] / print-802_11.c
index 73b79764cd26219eaaa56f7183dc6f533cc01d11..dc8953a9ee5bf3836215876b6742a6ef37e4cb02 100644 (file)
@@ -831,82 +831,176 @@ static const char *auth_alg_text[]={"Open System","Shared Key","EAP"};
 static const char *status_text[] = {
        "Successful",                                           /*  0 */
        "Unspecified failure",                                  /*  1 */
-       "Reserved",                                             /*  2 */
-       "Reserved",                                             /*  3 */
+       "TDLS wakeup schedule rejected but alternative schedule "
+         "provided",                                   /*  2 */
+       "TDLS wakeup schedule rejected",/*  3 */
        "Reserved",                                             /*  4 */
-       "Reserved",                                             /*  5 */
-       "Reserved",                                             /*  6 */
-       "Reserved",                                             /*  7 */
+       "Security disabled",                    /*  5 */
+       "Unacceptable lifetime",                /*  6 */
+       "Not in same BSS",                              /*  7 */
        "Reserved",                                             /*  8 */
        "Reserved",                                             /*  9 */
        "Cannot Support all requested capabilities in the Capability "
          "Information field",                                  /* 10 */
        "Reassociation denied due to inability to confirm that association "
          "exists",                                             /* 11 */
-       "Association denied due to reason outside the scope of the "
+       "Association denied due to reason outside the scope of this "
          "standard",                                           /* 12 */
-       "Responding station does not support the specified authentication "
-         "algorithm ",                                         /* 13 */
+       "Responding STA does not support the specified authentication "
+         "algorithm",                                          /* 13 */
        "Received an Authentication frame with authentication transaction "
          "sequence number out of expected sequence",           /* 14 */
        "Authentication rejected because of challenge failure", /* 15 */
        "Authentication rejected due to timeout waiting for next frame in "
          "sequence",                                           /* 16 */
-       "Association denied because AP is unable to handle additional"
-         "associated stations",                                /* 17 */
-       "Association denied due to requesting station not supporting all of "
-         "the data rates in BSSBasicRateSet parameter",        /* 18 */
-       "Association denied due to requesting station not supporting "
-         "short preamble operation",                           /* 19 */
-       "Association denied due to requesting station not supporting "
-         "PBCC encoding",                                      /* 20 */
-       "Association denied due to requesting station not supporting "
-         "channel agility",                                    /* 21 */
+       "Association denied because AP is unable to handle "
+         "additional associated STAs",                         /* 17 */
+       "Association denied due to requesting STA not supporting "
+         "all of the data rates in the BSSBasicRateSet parameter, "
+         "the Basic HT-MCS Set field of the HT Operation "
+         "parameter, or the Basic VHT-MCS and NSS Set field in "
+         "the VHT Operation parameter",        /* 18 */
+       "Association denied due to requesting STA not supporting "
+         "the short preamble option",                          /* 19 */
+       "Reserved",                                     /* 20 */
+       "Reserved",                                     /* 21 */
        "Association request rejected because Spectrum Management "
          "capability is required",                             /* 22 */
        "Association request rejected because the information in the "
          "Power Capability element is unacceptable",           /* 23 */
        "Association request rejected because the information in the "
          "Supported Channels element is unacceptable",         /* 24 */
-       "Association denied due to requesting station not supporting "
-         "short slot operation",                               /* 25 */
-       "Association denied due to requesting station not supporting "
-         "DSSS-OFDM operation",                                /* 26 */
+       "Association denied due to requesting STA not supporting "
+         "the Short Slot Time option",                         /* 25 */
+       "Reserved",                             /* 26 */
        "Association denied because the requested STA does not support HT "
          "features",                                           /* 27 */
-       "Reserved",                                             /* 28 */
-       "Association denied because the requested STA does not support "
-         "the PCO transition time required by the AP",         /* 29 */
-       "Reserved",                                             /* 30 */
-       "Reserved",                                             /* 31 */
+       "R0KH unreachable",                                     /* 28 */
+       "Association denied because the requesting STA does not "
+         "support the phased coexistence operation (PCO) "
+         "transition time required by the AP",         /* 29 */
+       "Association request rejected temporarily; try again "
+         "later",                                                      /* 30 */
+       "Robust management frame policy violation",     /* 31 */
        "Unspecified, QoS-related failure",                     /* 32 */
-       "Association denied due to QAP having insufficient bandwidth "
-         "to handle another QSTA",                             /* 33 */
+       "Association denied because QoS AP or PCP has "
+         "insufficient bandwidth to handle another QoS "
+         "STA",                                                                        /* 33 */
        "Association denied due to excessive frame loss rates and/or "
          "poor conditions on current operating channel",       /* 34 */
-       "Association (with QBSS) denied due to requesting station not "
-         "supporting the QoS facility",                        /* 35 */
-       "Association denied due to requesting station not supporting "
-         "Block Ack",                                          /* 36 */
+       "Association (with QoS BSS) denied because the requesting STA "
+         "does not support the QoS facility",                  /* 35 */
+       "Reserved",                                                                     /* 36 */
        "The request has been declined",                        /* 37 */
        "The request has not been successful as one or more parameters "
          "have invalid values",                                /* 38 */
-       "The TS has not been created because the request cannot be honored. "
-         "Try again with the suggested changes to the TSPEC",  /* 39 */
-       "Invalid Information Element",                          /* 40 */
-       "Group Cipher is not valid",                            /* 41 */
-       "Pairwise Cipher is not valid",                         /* 42 */
-       "AKMP is not valid",                                    /* 43 */
-       "Unsupported RSN IE version",                           /* 44 */
-       "Invalid RSN IE Capabilities",                          /* 45 */
-       "Cipher suite is rejected per security policy",         /* 46 */
-       "The TS has not been created. However, the HC may be capable of "
-         "creating a TS, in response to a request, after the time indicated "
-         "in the TS Delay element",                            /* 47 */
+       "The allocation or TS has not been created because the request "
+         "cannot be honored; however, a suggested TSPEC/DMG TSPEC is "
+         "provided so that the initiating STA can attempt to set "
+         "another allocation or TS with the suggested changes to the "
+         "TSPEC/DMG TSPEC",                                    /* 39 */
+       "Invalid element, i.e., an element defined in this standard "
+         "for which the content does not meet the specifications in "
+         "Clause 9",                                                           /* 40 */
+       "Invalid group cipher",                                         /* 41 */
+       "Invalid pairwise cipher",                                      /* 42 */
+       "Invalid AKMP",                                                         /* 43 */
+       "Unsupported RSNE version",                                     /* 44 */
+       "Invalid RSNE capabilities",                            /* 45 */
+       "Cipher suite rejected because of security policy",             /* 46 */
+       "The TS or allocation has not been created; however, the "
+         "HC or PCP might be capable of creating a TS or "
+         "allocation, in response to a request, after the time "
+         "indicated in the TS Delay element",          /* 47 */
        "Direct Link is not allowed in the BSS by policy",      /* 48 */
-       "Destination STA is not present within this QBSS.",     /* 49 */
-       "The Destination STA is not a QSTA.",                   /* 50 */
-
+       "The Destination STA is not present within this BSS",   /* 49 */
+       "The Destination STA is not a QoS STA",         /* 50 */
+
+       "Association denied because the listen interval is "
+         "too large",                                                          /* 51 */
+       "Invalid FT Action frame count",                        /* 52 */
+       "Invalid pairwise master key identifier (PMKID)", /* 53 */
+       "Invalid MDE",                                                          /* 54 */
+       "Invalid FTE",                                                          /* 55 */
+       "Requested TCLAS processing is not supported by the AP "
+         "or PCP",                                                                     /* 56 */
+       "The AP or PCP has insufficient TCLAS processing "
+         "resources to satisfy the request",           /* 57 */
+       "The TS has not been created because the request "
+         "cannot be honored; however, the HC or PCP suggests "
+         "that the STA transition to a different BSS to set up "
+         "the TS",                                                                     /* 58 */
+       "GAS Advertisement Protocol not supported",     /* 59 */
+       "No outstanding GAS request",                           /* 60 */
+       "GAS Response not received from the Advertisement "
+         "Server",                                                                     /* 61 */
+       "STA timed out waiting for GAS Query Response", /* 62 */
+       "LARGE GAS Response is larger than query response "
+         "length limit",                                                       /* 63 */
+       "Request refused because home network does not support "
+         "request",                                                            /* 64 */
+       "Advertisement Server in the network is not currently "
+         "reachable",                                                          /* 65 */
+       "Reserved",                                                                     /* 66 */
+       "Request refused due to permissions received via SSPN "
+         "interface",                                                          /* 67 */
+       "Request refused because the AP or PCP does not "
+         "support unauthenticated access",                     /* 68 */
+       "Reserved",                                                                     /* 69 */
+       "Reserved",                                                                     /* 70 */
+       "Reserved",                                                                     /* 71 */
+       "Invalid contents of RSNE",                             /* 72 */
+       "U-APSD coexistence is not supported",          /* 73 */
+       "Requested U-APSD coexistence mode is not supported", /* 74 */
+       "Requested Interval/Duration value cannot be "
+         "supported with U-APSD coexistence",          /* 75 */
+       "Authentication is rejected because an Anti-Clogging "
+         "Token is required",                                          /* 76 */
+       "Authentication is rejected because the offered "
+         "finite cyclic group is not supported",       /* 77 */
+       "The TBTT adjustment request has not been successful "
+         "because the STA could not find an alternative TBTT", /* 78 */
+       "Transmission failure",                                         /* 79 */
+       "Requested TCLAS Not Supported",                        /* 80 */
+       "TCLAS Resources Exhausted",                            /* 81 */
+       "Rejected with Suggested BSS transition",       /* 82 */
+       "Reject with recommended schedule",                     /* 83 */
+       "Reject because no wakeup schedule specified", /* 84 */
+       "Success, the destination STA is in power save mode", /* 85 */
+       "FST pending, in process of admitting FST session", /* 86 */
+       "Performing FST now",                                           /* 87 */
+       "FST pending, gap(s) in block ack window",      /* 88 */
+       "Reject because of U-PID setting",                      /* 89 */
+       "Reserved",                                                                     /* 90 */
+       "Reserved",                                                                     /* 91 */
+       "(Re)Association refused for some external reason", /* 92 */
+       "(Re)Association refused because of memory limits "
+         "at the AP",                                                          /* 93 */
+       "(Re)Association refused because emergency services "
+         "are not supported at the AP",                        /* 94 */
+       "GAS query response not yet received",          /* 95 */
+       "Reject since the request is for transition to a "
+         "frequency band subject to DSE procedures and "
+         "FST Initiator is a dependent STA",           /* 96 */
+       "Requested TCLAS processing has been terminated by "
+         "the AP",                                                                     /* 97 */
+       "The TS schedule conflicts with an existing "
+         "schedule; an alternative schedule is provided", /* 98 */
+       "The association has been denied; however, one or "
+         "more Multi-band elements are included that can "
+         "be used by the receiving STA to join the BSS", /* 99 */
+       "The request failed due to a reservation conflict", /* 100 */
+       "The request failed due to exceeded MAF limit", /* 101 */
+       "The request failed due to exceeded MCCA track "
+         "limit",                                                                      /* 102 */
+       "Association denied because the information in the"
+         "Spectrum Management field is unacceptable", /* 103 */
+       "Association denied because the requesting STA "
+         "does not support VHT features",                      /* 104 */
+       "Enablement denied",                                            /* 105 */
+       "Enablement denied due to restriction from an "
+         "authorized GDB",                                                     /* 106 */
+       "Authorization deenabled",                                      /* 107 */
 };
 #define NUM_STATUSES   (sizeof(status_text) / sizeof(status_text[0]))
 
@@ -914,40 +1008,45 @@ static const char *reason_text[] = {
        "Reserved",                                             /* 0 */
        "Unspecified reason",                                   /* 1 */
        "Previous authentication no longer valid",              /* 2 */
-       "Deauthenticated because sending station is leaving (or has left) "
+       "Deauthenticated because sending STA is leaving (or has left) "
          "IBSS or ESS",                                        /* 3 */
        "Disassociated due to inactivity",                      /* 4 */
        "Disassociated because AP is unable to handle all currently "
-         " associated stations",                               /* 5 */
-       "Class 2 frame received from nonauthenticated station", /* 6 */
-       "Class 3 frame received from nonassociated station",    /* 7 */
-       "Disassociated because sending station is leaving "
+         " associated STAs",                           /* 5 */
+       "Class 2 frame received from nonauthenticated STA", /* 6 */
+       "Class 3 frame received from nonassociated STA",        /* 7 */
+       "Disassociated because sending STA is leaving "
          "(or has left) BSS",                                  /* 8 */
-       "Station requesting (re)association is not authenticated with "
-         "responding station",                                 /* 9 */
+       "STA requesting (re)association is not authenticated with "
+         "responding STA",                                     /* 9 */
        "Disassociated because the information in the Power Capability "
          "element is unacceptable",                            /* 10 */
-       "Disassociated because the information in the SupportedChannels "
+       "Disassociated because the information in the Supported Channels "
          "element is unacceptable",                            /* 11 */
-       "Invalid Information Element",                          /* 12 */
-       "Reserved",                                             /* 13 */
-       "Michael MIC failure",                                  /* 14 */
+       "Disassociated due to BSS transition management",       /* 12 */
+       "Invalid element, i.e., an element defined in this standard for "
+         "which the content does not meet the specifications "
+         "in Clause 9",                                                /* 13 */
+       "Message integrity code (MIC) failure", /* 14 */
        "4-Way Handshake timeout",                              /* 15 */
-       "Group key update timeout",                             /* 16 */
+       "Group key handshake timeout",                  /* 16 */
        "Information element in 4-Way Handshake different from (Re)Association"
-         "Request/Probe Response/Beacon",                      /* 17 */
-       "Group Cipher is not valid",                            /* 18 */
-       "AKMP is not valid",                                    /* 20 */
-       "Unsupported RSN IE version",                           /* 21 */
-       "Invalid RSN IE Capabilities",                          /* 22 */
-       "IEEE 802.1X Authentication failed",                    /* 23 */
-       "Cipher suite is rejected per security policy",         /* 24 */
-       "Reserved",                                             /* 25 */
-       "Reserved",                                             /* 26 */
-       "Reserved",                                             /* 27 */
-       "Reserved",                                             /* 28 */
-       "Reserved",                                             /* 29 */
-       "Reserved",                                             /* 30 */
+         "Request/Probe Response/Beacon frame",        /* 17 */
+       "Invalid group cipher",                                 /* 18 */
+       "Invalid pairwise cipher",                              /* 19 */
+       "Invalid AKMP",                                                 /* 20 */
+       "Unsupported RSNE version",                             /* 21 */
+       "Invalid RSNE capabilities",                            /* 22 */
+       "IEEE 802.1X authentication failed",                    /* 23 */
+       "Cipher suite rejected because of the security policy",         /* 24 */
+       "TDLS direct-link teardown due to TDLS peer STA "
+         "unreachable via the TDLS direct link",                               /* 25 */
+       "TDLS direct-link teardown for unspecified reason",             /* 26 */
+       "Disassociated because session terminated by SSP request",/* 27 */
+       "Disassociated because of lack of SSP roaming agreement",/* 28 */
+       "Requested service rejected because of SSP cipher suite or "
+         "AKM requirement",                                            /* 29 */
+       "Requested service not authorized in this location",    /* 30 */
        "TS deleted because QoS AP lacks sufficient bandwidth for this "
          "QoS STA due to a change in BSS service characteristics or "
          "operational mode (e.g. an HT BSS change from 40 MHz channel "
@@ -956,7 +1055,7 @@ static const char *reason_text[] = {
        "Disassociated because QoS AP lacks sufficient bandwidth for this "
          "QoS STA",                                            /* 33 */
        "Disassociated because of excessive number of frames that need to be "
-         "acknowledged, but are not acknowledged for AP transmissions "
+         "acknowledged, but are not acknowledged due to AP transmissions "
          "and/or poor channel conditions",                     /* 34 */
        "Disassociated because STA is transmitting outside the limits "
          "of its TXOPs",                                       /* 35 */
@@ -973,8 +1072,47 @@ static const char *reason_text[] = {
        "Reserved",                                             /* 43 */
        "Reserved",                                             /* 44 */
        "Peer STA does not support the requested cipher suite", /* 45 */
-       "Association denied due to requesting STA not supporting HT "
-         "features",                                           /* 46 */
+       "In a DLS Teardown frame: The teardown was initiated by the "
+         "DLS peer. In a Disassociation frame: Disassociated because "
+         "authorized access limit reached",                                    /* 46 */
+       "In a DLS Teardown frame: The teardown was initiated by the "
+         "AP. In a Disassociation frame: Disassociated due to external "
+         "service requirements",                                                               /* 47 */
+       "Invalid FT Action frame count",                                                /* 48 */
+       "Invalid pairwise master key identifier (PMKID)",               /* 49 */
+       "Invalid MDE",                                                                                  /* 50 */
+       "Invalid FTE",                                                                                  /* 51 */
+       "Mesh peering canceled for unknown reasons",                    /* 52 */
+       "The mesh STA has reached the supported maximum number of "
+         "peer mesh STAs",                                                                             /* 53 */
+       "The received information violates the Mesh Configuration "
+         "policy configured in the mesh STA profile",                  /* 54 */
+       "The mesh STA has received a Mesh Peering Close frame "
+         "requesting to close the mesh peering",                               /* 55 */
+       "The mesh STA has resent dot11MeshMaxRetries Mesh "
+         "Peering Open frames, without receiving a Mesh Peering "
+         "Confirm frame",                                                                              /* 56 */
+       "The confirmTimer for the mesh peering instance times out",     /* 57 */
+       "The mesh STA fails to unwrap the GTK or the values in the "
+         "wrapped contents do not match",                                              /* 58 */
+       "The mesh STA receives inconsistent information about the "
+         "mesh parameters between mesh peering Management frames",     /* 59 */
+       "The mesh STA fails the authenticated mesh peering exchange "
+         "because due to failure in selecting either the pairwise "
+         "ciphersuite or group ciphersuite",                                   /* 60 */
+       "The mesh STA does not have proxy information for this "
+         "external destination",                                                               /* 61 */
+       "The mesh STA does not have forwarding information for this "
+         "destination",                                                                                /* 62 */
+       "The mesh STA determines that the link to the next hop of an "
+         "active path in its forwarding information is no longer "
+         "usable",                                                                                             /* 63 */
+       "The Deauthentication frame was sent because the MAC "
+         "address of the STA already exists in the mesh BSS",  /* 64 */
+       "The mesh STA performs channel switch to meet regulatory "
+         "requirements",                                                                               /* 65 */
+       "The mesh STA performs channel switching with unspecified "
+         "reason",                                                                                             /* 66 */
 };
 #define NUM_REASONS    (sizeof(reason_text) / sizeof(reason_text[0]))
 
@@ -985,7 +1123,7 @@ wep_print(netdissect_options *ndo,
        uint32_t iv;
 
        ND_TCHECK_LEN(p, IEEE802_11_IV_LEN + IEEE802_11_KID_LEN);
-       iv = EXTRACT_LE_U_4(p);
+       iv = GET_LE_U_4(p);
 
        ND_PRINT(" IV:%3x Pad %x KeyID %x", IV_IV(iv), IV_PAD(iv),
            IV_KEYID(iv));
@@ -1023,14 +1161,14 @@ parse_elements(netdissect_options *ndo,
                ND_TCHECK_2(p + offset);
                if (length < 2)
                        goto trunc;
-               elementlen = EXTRACT_U_1(p + offset + 1);
+               elementlen = GET_U_1(p + offset + 1);
 
                /* Make sure we have the entire element. */
                ND_TCHECK_LEN(p + offset + 2, elementlen);
                if (length < elementlen + 2)
                        goto trunc;
 
-               switch (EXTRACT_U_1(p + offset)) {
+               switch (GET_U_1(p + offset)) {
                case E_SSID:
                        memcpy(&ssid, p + offset, 2);
                        offset += 2;
@@ -1122,7 +1260,7 @@ parse_elements(netdissect_options *ndo,
                                length -= ds.length;
                                break;
                        }
-                       ds.channel = EXTRACT_U_1(p + offset);
+                       ds.channel = GET_U_1(p + offset);
                        offset += 1;
                        length -= 1;
                        /*
@@ -1146,9 +1284,18 @@ parse_elements(netdissect_options *ndo,
                                length -= cf.length;
                                break;
                        }
-                       memcpy(&cf.count, p + offset, 6);
-                       offset += 6;
-                       length -= 6;
+                       cf.count = GET_U_1(p + offset);
+                       offset += 1;
+                       length -= 1;
+                       cf.period = GET_U_1(p + offset);
+                       offset += 1;
+                       length -= 1;
+                       cf.max_duration = GET_LE_U_2(p + offset);
+                       offset += 2;
+                       length -= 2;
+                       cf.dur_remaining = GET_LE_U_2(p + offset);
+                       offset += 2;
+                       length -= 2;
                        /*
                         * Present and not truncated.
                         *
@@ -1172,10 +1319,15 @@ parse_elements(netdissect_options *ndo,
                        }
                        if (tim.length - 3U > sizeof(tim.bitmap))
                                return 0;
-                       memcpy(&tim.count, p + offset, 3);
-                       offset += 3;
-                       length -= 3;
-
+                       tim.count = GET_U_1(p + offset);
+                       offset += 1;
+                       length -= 1;
+                       tim.period = GET_U_1(p + offset);
+                       offset += 1;
+                       length -= 1;
+                       tim.bitmap_control = GET_U_1(p + offset);
+                       offset += 1;
+                       length -= 1;
                        memcpy(tim.bitmap, p + offset, tim.length - 3);
                        offset += tim.length - 3;
                        length -= tim.length - 3;
@@ -1194,7 +1346,7 @@ parse_elements(netdissect_options *ndo,
                default:
 #if 0
                        ND_PRINT("(1) unhandled element_id (%u)  ",
-                           EXTRACT_U_1(p + offset));
+                           GET_U_1(p + offset));
 #endif
                        offset += 2 + elementlen;
                        length -= 2 + elementlen;
@@ -1230,10 +1382,10 @@ handle_beacon(netdissect_options *ndo,
        memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN);
        offset += IEEE802_11_TSTAMP_LEN;
        length -= IEEE802_11_TSTAMP_LEN;
-       pbody.beacon_interval = EXTRACT_LE_U_2(p + offset);
+       pbody.beacon_interval = GET_LE_U_2(p + offset);
        offset += IEEE802_11_BCNINT_LEN;
        length -= IEEE802_11_BCNINT_LEN;
-       pbody.capability_info = EXTRACT_LE_U_2(p + offset);
+       pbody.capability_info = GET_LE_U_2(p + offset);
        offset += IEEE802_11_CAPINFO_LEN;
        length -= IEEE802_11_CAPINFO_LEN;
 
@@ -1263,10 +1415,10 @@ handle_assoc_request(netdissect_options *ndo,
        ND_TCHECK_LEN(p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN);
        if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN)
                goto trunc;
-       pbody.capability_info = EXTRACT_LE_U_2(p);
+       pbody.capability_info = GET_LE_U_2(p);
        offset += IEEE802_11_CAPINFO_LEN;
        length -= IEEE802_11_CAPINFO_LEN;
-       pbody.listen_interval = EXTRACT_LE_U_2(p + offset);
+       pbody.listen_interval = GET_LE_U_2(p + offset);
        offset += IEEE802_11_LISTENINT_LEN;
        length -= IEEE802_11_LISTENINT_LEN;
 
@@ -1294,13 +1446,13 @@ handle_assoc_response(netdissect_options *ndo,
        if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_STATUS_LEN +
            IEEE802_11_AID_LEN)
                goto trunc;
-       pbody.capability_info = EXTRACT_LE_U_2(p);
+       pbody.capability_info = GET_LE_U_2(p);
        offset += IEEE802_11_CAPINFO_LEN;
        length -= IEEE802_11_CAPINFO_LEN;
-       pbody.status_code = EXTRACT_LE_U_2(p + offset);
+       pbody.status_code = GET_LE_U_2(p + offset);
        offset += IEEE802_11_STATUS_LEN;
        length -= IEEE802_11_STATUS_LEN;
-       pbody.aid = EXTRACT_LE_U_2(p + offset);
+       pbody.aid = GET_LE_U_2(p + offset);
        offset += IEEE802_11_AID_LEN;
        length -= IEEE802_11_AID_LEN;
 
@@ -1332,10 +1484,10 @@ handle_reassoc_request(netdissect_options *ndo,
        if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN +
            IEEE802_11_AP_LEN)
                goto trunc;
-       pbody.capability_info = EXTRACT_LE_U_2(p);
+       pbody.capability_info = GET_LE_U_2(p);
        offset += IEEE802_11_CAPINFO_LEN;
        length -= IEEE802_11_CAPINFO_LEN;
-       pbody.listen_interval = EXTRACT_LE_U_2(p + offset);
+       pbody.listen_interval = GET_LE_U_2(p + offset);
        offset += IEEE802_11_LISTENINT_LEN;
        length -= IEEE802_11_LISTENINT_LEN;
        memcpy(&pbody.ap, p+offset, IEEE802_11_AP_LEN);
@@ -1396,10 +1548,10 @@ handle_probe_response(netdissect_options *ndo,
        memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN);
        offset += IEEE802_11_TSTAMP_LEN;
        length -= IEEE802_11_TSTAMP_LEN;
-       pbody.beacon_interval = EXTRACT_LE_U_2(p + offset);
+       pbody.beacon_interval = GET_LE_U_2(p + offset);
        offset += IEEE802_11_BCNINT_LEN;
        length -= IEEE802_11_BCNINT_LEN;
-       pbody.capability_info = EXTRACT_LE_U_2(p + offset);
+       pbody.capability_info = GET_LE_U_2(p + offset);
        offset += IEEE802_11_CAPINFO_LEN;
        length -= IEEE802_11_CAPINFO_LEN;
 
@@ -1432,7 +1584,7 @@ handle_disassoc(netdissect_options *ndo,
        ND_TCHECK_LEN(p, IEEE802_11_REASON_LEN);
        if (length < IEEE802_11_REASON_LEN)
                goto trunc;
-       pbody.reason_code = EXTRACT_LE_U_2(p);
+       pbody.reason_code = GET_LE_U_2(p);
 
        ND_PRINT(": %s",
            (pbody.reason_code < NUM_REASONS)
@@ -1457,13 +1609,13 @@ handle_auth(netdissect_options *ndo,
        ND_TCHECK_6(p);
        if (length < 6)
                goto trunc;
-       pbody.auth_alg = EXTRACT_LE_U_2(p);
+       pbody.auth_alg = GET_LE_U_2(p);
        offset += 2;
        length -= 2;
-       pbody.auth_trans_seq_num = EXTRACT_LE_U_2(p + offset);
+       pbody.auth_trans_seq_num = GET_LE_U_2(p + offset);
        offset += 2;
        length -= 2;
-       pbody.status_code = EXTRACT_LE_U_2(p + offset);
+       pbody.status_code = GET_LE_U_2(p + offset);
        offset += 2;
        length -= 2;
 
@@ -1511,7 +1663,7 @@ handle_deauth(netdissect_options *ndo,
        ND_TCHECK_LEN(p, IEEE802_11_REASON_LEN);
        if (length < IEEE802_11_REASON_LEN)
                goto trunc;
-       pbody.reason_code = EXTRACT_LE_U_2(p);
+       pbody.reason_code = GET_LE_U_2(p);
 
        reason = (pbody.reason_code < NUM_REASONS)
                        ? reason_text[pbody.reason_code]
@@ -1520,7 +1672,7 @@ handle_deauth(netdissect_options *ndo,
        if (ndo->ndo_eflag) {
                ND_PRINT(": %s", reason);
        } else {
-               ND_PRINT(" (%s): %s", etheraddr_string(ndo, src), reason);
+               ND_PRINT(" (%s): %s", GET_ETHERADDR_STRING(src), reason);
        }
        return 1;
 trunc:
@@ -1587,24 +1739,24 @@ handle_action(netdissect_options *ndo,
        if (ndo->ndo_eflag) {
                ND_PRINT(": ");
        } else {
-               ND_PRINT(" (%s): ", etheraddr_string(ndo, src));
+               ND_PRINT(" (%s): ", GET_ETHERADDR_STRING(src));
        }
-       switch (EXTRACT_U_1(p)) {
-       case 0: ND_PRINT("Spectrum Management Act#%u", EXTRACT_U_1(p + 1)); break;
-       case 1: ND_PRINT("QoS Act#%u", EXTRACT_U_1(p + 1)); break;
-       case 2: ND_PRINT("DLS Act#%u", EXTRACT_U_1(p + 1)); break;
-       case 3: ND_PRINT("BA "); PRINT_BA_ACTION(EXTRACT_U_1(p + 1)); break;
-       case 7: ND_PRINT("HT "); PRINT_HT_ACTION(EXTRACT_U_1(p + 1)); break;
-       case 13: ND_PRINT("MeshAction "); PRINT_MESH_ACTION(EXTRACT_U_1(p + 1)); break;
+       switch (GET_U_1(p)) {
+       case 0: ND_PRINT("Spectrum Management Act#%u", GET_U_1(p + 1)); break;
+       case 1: ND_PRINT("QoS Act#%u", GET_U_1(p + 1)); break;
+       case 2: ND_PRINT("DLS Act#%u", GET_U_1(p + 1)); break;
+       case 3: ND_PRINT("BA "); PRINT_BA_ACTION(GET_U_1(p + 1)); break;
+       case 7: ND_PRINT("HT "); PRINT_HT_ACTION(GET_U_1(p + 1)); break;
+       case 13: ND_PRINT("MeshAction "); PRINT_MESH_ACTION(GET_U_1(p + 1)); break;
        case 14:
                ND_PRINT("MultiohopAction ");
-               PRINT_MULTIHOP_ACTION(EXTRACT_U_1(p + 1)); break;
+               PRINT_MULTIHOP_ACTION(GET_U_1(p + 1)); break;
        case 15:
                ND_PRINT("SelfprotectAction ");
-               PRINT_SELFPROT_ACTION(EXTRACT_U_1(p + 1)); break;
-       case 127: ND_PRINT("Vendor Act#%u", EXTRACT_U_1(p + 1)); break;
+               PRINT_SELFPROT_ACTION(GET_U_1(p + 1)); break;
+       case 127: ND_PRINT("Vendor Act#%u", GET_U_1(p + 1)); break;
        default:
-               ND_PRINT("Reserved(%u) Act#%u", EXTRACT_U_1(p), EXTRACT_U_1(p + 1));
+               ND_PRINT("Reserved(%u) Act#%u", GET_U_1(p), GET_U_1(p + 1));
                break;
        }
        return 1;
@@ -1675,51 +1827,51 @@ ctrl_body_print(netdissect_options *ndo,
                ND_TCHECK_LEN(p, CTRL_BAR_HDRLEN);
                if (!ndo->ndo_eflag)
                        ND_PRINT(" RA:%s TA:%s CTL(%x) SEQ(%u) ",
-                           etheraddr_string(ndo, ((const struct ctrl_bar_hdr_t *)p)->ra),
-                           etheraddr_string(ndo, ((const struct ctrl_bar_hdr_t *)p)->ta),
-                           EXTRACT_LE_U_2(((const struct ctrl_bar_hdr_t *)p)->ctl),
-                           EXTRACT_LE_U_2(((const struct ctrl_bar_hdr_t *)p)->seq));
+                           GET_ETHERADDR_STRING(((const struct ctrl_bar_hdr_t *)p)->ra),
+                           GET_ETHERADDR_STRING(((const struct ctrl_bar_hdr_t *)p)->ta),
+                           GET_LE_U_2(((const struct ctrl_bar_hdr_t *)p)->ctl),
+                           GET_LE_U_2(((const struct ctrl_bar_hdr_t *)p)->seq));
                break;
        case CTRL_BA:
                ND_TCHECK_LEN(p, CTRL_BA_HDRLEN);
                if (!ndo->ndo_eflag)
                        ND_PRINT(" RA:%s ",
-                           etheraddr_string(ndo, ((const struct ctrl_ba_hdr_t *)p)->ra));
+                           GET_ETHERADDR_STRING(((const struct ctrl_ba_hdr_t *)p)->ra));
                break;
        case CTRL_PS_POLL:
                ND_TCHECK_LEN(p, CTRL_PS_POLL_HDRLEN);
                ND_PRINT(" AID(%x)",
-                   EXTRACT_LE_U_2(((const struct ctrl_ps_poll_hdr_t *)p)->aid));
+                   GET_LE_U_2(((const struct ctrl_ps_poll_hdr_t *)p)->aid));
                break;
        case CTRL_RTS:
                ND_TCHECK_LEN(p, CTRL_RTS_HDRLEN);
                if (!ndo->ndo_eflag)
                        ND_PRINT(" TA:%s ",
-                           etheraddr_string(ndo, ((const struct ctrl_rts_hdr_t *)p)->ta));
+                           GET_ETHERADDR_STRING(((const struct ctrl_rts_hdr_t *)p)->ta));
                break;
        case CTRL_CTS:
                ND_TCHECK_LEN(p, CTRL_CTS_HDRLEN);
                if (!ndo->ndo_eflag)
                        ND_PRINT(" RA:%s ",
-                           etheraddr_string(ndo, ((const struct ctrl_cts_hdr_t *)p)->ra));
+                           GET_ETHERADDR_STRING(((const struct ctrl_cts_hdr_t *)p)->ra));
                break;
        case CTRL_ACK:
                ND_TCHECK_LEN(p, CTRL_ACK_HDRLEN);
                if (!ndo->ndo_eflag)
                        ND_PRINT(" RA:%s ",
-                           etheraddr_string(ndo, ((const struct ctrl_ack_hdr_t *)p)->ra));
+                           GET_ETHERADDR_STRING(((const struct ctrl_ack_hdr_t *)p)->ra));
                break;
        case CTRL_CF_END:
                ND_TCHECK_LEN(p, CTRL_END_HDRLEN);
                if (!ndo->ndo_eflag)
                        ND_PRINT(" RA:%s ",
-                           etheraddr_string(ndo, ((const struct ctrl_end_hdr_t *)p)->ra));
+                           GET_ETHERADDR_STRING(((const struct ctrl_end_hdr_t *)p)->ra));
                break;
        case CTRL_END_ACK:
                ND_TCHECK_LEN(p, CTRL_END_ACK_HDRLEN);
                if (!ndo->ndo_eflag)
                        ND_PRINT(" RA:%s ",
-                           etheraddr_string(ndo, ((const struct ctrl_end_ack_hdr_t *)p)->ra));
+                           GET_ETHERADDR_STRING(((const struct ctrl_end_ack_hdr_t *)p)->ra));
                break;
        }
        return 1;
@@ -1761,7 +1913,7 @@ get_data_src_dst_mac(uint16_t fc, const u_char *p, const uint8_t **srcp,
                }
        } else {
                if (!FC_FROM_DS(fc)) {
-                       /* From DS and not To DS */
+                       /* To DS and not From DS */
                        *srcp = ADDR2;
                        *dstp = ADDR3;
                } else {
@@ -1821,20 +1973,20 @@ data_header_print(netdissect_options *ndo, uint16_t fc, const u_char *p)
 
        if (!FC_TO_DS(fc) && !FC_FROM_DS(fc)) {
                ND_PRINT("DA:%s SA:%s BSSID:%s ",
-                   etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2),
-                   etheraddr_string(ndo, ADDR3));
+                   GET_ETHERADDR_STRING(ADDR1), GET_ETHERADDR_STRING(ADDR2),
+                   GET_ETHERADDR_STRING(ADDR3));
        } else if (!FC_TO_DS(fc) && FC_FROM_DS(fc)) {
                ND_PRINT("DA:%s BSSID:%s SA:%s ",
-                   etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2),
-                   etheraddr_string(ndo, ADDR3));
+                   GET_ETHERADDR_STRING(ADDR1), GET_ETHERADDR_STRING(ADDR2),
+                   GET_ETHERADDR_STRING(ADDR3));
        } else if (FC_TO_DS(fc) && !FC_FROM_DS(fc)) {
                ND_PRINT("BSSID:%s SA:%s DA:%s ",
-                   etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2),
-                   etheraddr_string(ndo, ADDR3));
+                   GET_ETHERADDR_STRING(ADDR1), GET_ETHERADDR_STRING(ADDR2),
+                   GET_ETHERADDR_STRING(ADDR3));
        } else if (FC_TO_DS(fc) && FC_FROM_DS(fc)) {
                ND_PRINT("RA:%s TA:%s DA:%s SA:%s ",
-                   etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2),
-                   etheraddr_string(ndo, ADDR3), etheraddr_string(ndo, ADDR4));
+                   GET_ETHERADDR_STRING(ADDR1), GET_ETHERADDR_STRING(ADDR2),
+                   GET_ETHERADDR_STRING(ADDR3), GET_ETHERADDR_STRING(ADDR4));
        }
 
 #undef ADDR1
@@ -1849,8 +2001,8 @@ mgmt_header_print(netdissect_options *ndo, const u_char *p)
        const struct mgmt_header_t *hp = (const struct mgmt_header_t *) p;
 
        ND_PRINT("BSSID:%s DA:%s SA:%s ",
-           etheraddr_string(ndo, (hp)->bssid), etheraddr_string(ndo, (hp)->da),
-           etheraddr_string(ndo, (hp)->sa));
+           GET_ETHERADDR_STRING((hp)->bssid), GET_ETHERADDR_STRING((hp)->da),
+           GET_ETHERADDR_STRING((hp)->sa));
 }
 
 static void
@@ -1859,42 +2011,42 @@ ctrl_header_print(netdissect_options *ndo, uint16_t fc, const u_char *p)
        switch (FC_SUBTYPE(fc)) {
        case CTRL_BAR:
                ND_PRINT(" RA:%s TA:%s CTL(%x) SEQ(%u) ",
-                   etheraddr_string(ndo, ((const struct ctrl_bar_hdr_t *)p)->ra),
-                   etheraddr_string(ndo, ((const struct ctrl_bar_hdr_t *)p)->ta),
-                   EXTRACT_LE_U_2(((const struct ctrl_bar_hdr_t *)p)->ctl),
-                   EXTRACT_LE_U_2(((const struct ctrl_bar_hdr_t *)p)->seq));
+                   GET_ETHERADDR_STRING(((const struct ctrl_bar_hdr_t *)p)->ra),
+                   GET_ETHERADDR_STRING(((const struct ctrl_bar_hdr_t *)p)->ta),
+                   GET_LE_U_2(((const struct ctrl_bar_hdr_t *)p)->ctl),
+                   GET_LE_U_2(((const struct ctrl_bar_hdr_t *)p)->seq));
                break;
        case CTRL_BA:
                ND_PRINT("RA:%s ",
-                   etheraddr_string(ndo, ((const struct ctrl_ba_hdr_t *)p)->ra));
+                   GET_ETHERADDR_STRING(((const struct ctrl_ba_hdr_t *)p)->ra));
                break;
        case CTRL_PS_POLL:
                ND_PRINT("BSSID:%s TA:%s ",
-                   etheraddr_string(ndo, ((const struct ctrl_ps_poll_hdr_t *)p)->bssid),
-                   etheraddr_string(ndo, ((const struct ctrl_ps_poll_hdr_t *)p)->ta));
+                   GET_ETHERADDR_STRING(((const struct ctrl_ps_poll_hdr_t *)p)->bssid),
+                   GET_ETHERADDR_STRING(((const struct ctrl_ps_poll_hdr_t *)p)->ta));
                break;
        case CTRL_RTS:
                ND_PRINT("RA:%s TA:%s ",
-                   etheraddr_string(ndo, ((const struct ctrl_rts_hdr_t *)p)->ra),
-                   etheraddr_string(ndo, ((const struct ctrl_rts_hdr_t *)p)->ta));
+                   GET_ETHERADDR_STRING(((const struct ctrl_rts_hdr_t *)p)->ra),
+                   GET_ETHERADDR_STRING(((const struct ctrl_rts_hdr_t *)p)->ta));
                break;
        case CTRL_CTS:
                ND_PRINT("RA:%s ",
-                   etheraddr_string(ndo, ((const struct ctrl_cts_hdr_t *)p)->ra));
+                   GET_ETHERADDR_STRING(((const struct ctrl_cts_hdr_t *)p)->ra));
                break;
        case CTRL_ACK:
                ND_PRINT("RA:%s ",
-                   etheraddr_string(ndo, ((const struct ctrl_ack_hdr_t *)p)->ra));
+                   GET_ETHERADDR_STRING(((const struct ctrl_ack_hdr_t *)p)->ra));
                break;
        case CTRL_CF_END:
                ND_PRINT("RA:%s BSSID:%s ",
-                   etheraddr_string(ndo, ((const struct ctrl_end_hdr_t *)p)->ra),
-                   etheraddr_string(ndo, ((const struct ctrl_end_hdr_t *)p)->bssid));
+                   GET_ETHERADDR_STRING(((const struct ctrl_end_hdr_t *)p)->ra),
+                   GET_ETHERADDR_STRING(((const struct ctrl_end_hdr_t *)p)->bssid));
                break;
        case CTRL_END_ACK:
                ND_PRINT("RA:%s BSSID:%s ",
-                   etheraddr_string(ndo, ((const struct ctrl_end_ack_hdr_t *)p)->ra),
-                   etheraddr_string(ndo, ((const struct ctrl_end_ack_hdr_t *)p)->bssid));
+                   GET_ETHERADDR_STRING(((const struct ctrl_end_ack_hdr_t *)p)->ra),
+                   GET_ETHERADDR_STRING(((const struct ctrl_end_ack_hdr_t *)p)->bssid));
                break;
        default:
                /* We shouldn't get here - we should already have quit */
@@ -1947,9 +2099,9 @@ extract_header_length(netdissect_options *ndo,
 }
 
 static int
-extract_mesh_header_length(const u_char *p)
+extract_mesh_header_length(netdissect_options *ndo, const u_char *p)
 {
-       return (EXTRACT_U_1(p) &~ 3) ? 0 : 6*(1 + (EXTRACT_U_1(p) & 3));
+       return (GET_U_1(p) &~ 3) ? 0 : 6*(1 + (GET_U_1(p) & 3));
 }
 
 /*
@@ -1975,21 +2127,21 @@ ieee_802_11_hdr_print(netdissect_options *ndo,
                        ND_PRINT("Protected ");
                if (FC_TYPE(fc) != T_CTRL || FC_SUBTYPE(fc) != CTRL_PS_POLL)
                        ND_PRINT("%uus ",
-                           EXTRACT_LE_U_2(((const struct mgmt_header_t *)p)->duration));
+                           GET_LE_U_2(((const struct mgmt_header_t *)p)->duration));
        }
        if (meshdrlen != 0) {
                const struct meshcntl_t *mc =
                    (const struct meshcntl_t *)(p + hdrlen - meshdrlen);
-               u_int ae = EXTRACT_U_1(mc->flags) & 3;
+               u_int ae = GET_U_1(mc->flags) & 3;
 
                ND_PRINT("MeshData (AE %u TTL %u seq %u", ae,
-                   EXTRACT_U_1(mc->ttl), EXTRACT_LE_U_4(mc->seq));
+                   GET_U_1(mc->ttl), GET_LE_U_4(mc->seq));
                if (ae > 0)
-                       ND_PRINT(" A4:%s", etheraddr_string(ndo, mc->addr4));
+                       ND_PRINT(" A4:%s", GET_ETHERADDR_STRING(mc->addr4));
                if (ae > 1)
-                       ND_PRINT(" A5:%s", etheraddr_string(ndo, mc->addr5));
+                       ND_PRINT(" A5:%s", GET_ETHERADDR_STRING(mc->addr5));
                if (ae > 2)
-                       ND_PRINT(" A6:%s", etheraddr_string(ndo, mc->addr6));
+                       ND_PRINT(" A6:%s", GET_ETHERADDR_STRING(mc->addr6));
                ND_PRINT(") ");
        }
 
@@ -2038,7 +2190,7 @@ ieee802_11_print(netdissect_options *ndo,
                return orig_caplen;
        }
 
-       fc = EXTRACT_LE_U_2(p);
+       fc = GET_LE_U_2(p);
        hdrlen = extract_header_length(ndo, fc);
        if (hdrlen == 0) {
                /* Unknown frame type or control frame subtype; quit. */
@@ -2052,7 +2204,7 @@ ieee802_11_print(netdissect_options *ndo,
                        nd_print_trunc(ndo);
                        return hdrlen;
                }
-               meshdrlen = extract_mesh_header_length(p+hdrlen);
+               meshdrlen = extract_mesh_header_length(ndo, p + hdrlen);
                hdrlen += meshdrlen;
        } else
                meshdrlen = 0;
@@ -2127,12 +2279,12 @@ ieee802_11_print(netdissect_options *ndo,
  * 'h->len' is the length of the packet off the wire, and 'h->caplen'
  * is the number of bytes actually captured.
  */
-u_int
+void
 ieee802_11_if_print(netdissect_options *ndo,
                    const struct pcap_pkthdr *h, const u_char *p)
 {
-       ndo->ndo_protocol = "802.11_if";
-       return ieee802_11_print(ndo, p, h->len, h->caplen, 0, 0);
+       ndo->ndo_protocol = "802.11";
+       ndo->ndo_ll_hdr_len += ieee802_11_print(ndo, p, h->len, h->caplen, 0, 0);
 }
 
 
@@ -2504,7 +2656,7 @@ enum ieee80211_radiotap_type {
 
 static void
 print_chaninfo(netdissect_options *ndo,
-              uint16_t freq, int flags, int presentflags)
+              uint16_t freq, uint32_t flags, uint32_t presentflags)
 {
        ND_PRINT("%u MHz", freq);
        if (presentflags & (1 << IEEE80211_RADIOTAP_MCS)) {
@@ -2561,7 +2713,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_TSFT: {
                uint64_t tsft;
 
-               rc = cpack_uint64(s, &tsft);
+               rc = nd_cpack_uint64(ndo, s, &tsft);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%" PRIu64 "us tsft ", tsft);
@@ -2571,7 +2723,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_FLAGS: {
                uint8_t flagsval;
 
-               rc = cpack_uint8(s, &flagsval);
+               rc = nd_cpack_uint8(ndo, s, &flagsval);
                if (rc != 0)
                        goto trunc;
                *flagsp = flagsval;
@@ -2591,7 +2743,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_RATE: {
                uint8_t rate;
 
-               rc = cpack_uint8(s, &rate);
+               rc = nd_cpack_uint8(ndo, s, &rate);
                if (rc != 0)
                        goto trunc;
                /*
@@ -2642,10 +2794,10 @@ print_radiotap_field(netdissect_options *ndo,
                uint16_t frequency;
                uint16_t flags;
 
-               rc = cpack_uint16(s, &frequency);
+               rc = nd_cpack_uint16(ndo, s, &frequency);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint16(s, &flags);
+               rc = nd_cpack_uint16(ndo, s, &flags);
                if (rc != 0)
                        goto trunc;
                /*
@@ -2662,10 +2814,10 @@ print_radiotap_field(netdissect_options *ndo,
                uint8_t hopset;
                uint8_t hoppat;
 
-               rc = cpack_uint8(s, &hopset);
+               rc = nd_cpack_uint8(ndo, s, &hopset);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &hoppat);
+               rc = nd_cpack_uint8(ndo, s, &hoppat);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("fhset %u fhpat %u ", hopset, hoppat);
@@ -2675,7 +2827,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: {
                int8_t dbm_antsignal;
 
-               rc = cpack_int8(s, &dbm_antsignal);
+               rc = nd_cpack_int8(ndo, s, &dbm_antsignal);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%ddBm signal ", dbm_antsignal);
@@ -2685,7 +2837,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_DBM_ANTNOISE: {
                int8_t dbm_antnoise;
 
-               rc = cpack_int8(s, &dbm_antnoise);
+               rc = nd_cpack_int8(ndo, s, &dbm_antnoise);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%ddBm noise ", dbm_antnoise);
@@ -2695,7 +2847,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_LOCK_QUALITY: {
                uint16_t lock_quality;
 
-               rc = cpack_uint16(s, &lock_quality);
+               rc = nd_cpack_uint16(ndo, s, &lock_quality);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%u sq ", lock_quality);
@@ -2705,7 +2857,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_TX_ATTENUATION: {
                int16_t tx_attenuation;
 
-               rc = cpack_int16(s, &tx_attenuation);
+               rc = nd_cpack_int16(ndo, s, &tx_attenuation);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%d tx power ", -tx_attenuation);
@@ -2715,7 +2867,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: {
                int8_t db_tx_attenuation;
 
-               rc = cpack_int8(s, &db_tx_attenuation);
+               rc = nd_cpack_int8(ndo, s, &db_tx_attenuation);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%ddB tx attenuation ", -db_tx_attenuation);
@@ -2725,7 +2877,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_DBM_TX_POWER: {
                int8_t dbm_tx_power;
 
-               rc = cpack_int8(s, &dbm_tx_power);
+               rc = nd_cpack_int8(ndo, s, &dbm_tx_power);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%ddBm tx power ", dbm_tx_power);
@@ -2735,7 +2887,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_ANTENNA: {
                uint8_t antenna;
 
-               rc = cpack_uint8(s, &antenna);
+               rc = nd_cpack_uint8(ndo, s, &antenna);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("antenna %u ", antenna);
@@ -2745,7 +2897,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_DB_ANTSIGNAL: {
                uint8_t db_antsignal;
 
-               rc = cpack_uint8(s, &db_antsignal);
+               rc = nd_cpack_uint8(ndo, s, &db_antsignal);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%udB signal ", db_antsignal);
@@ -2755,7 +2907,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_DB_ANTNOISE: {
                uint8_t db_antnoise;
 
-               rc = cpack_uint8(s, &db_antnoise);
+               rc = nd_cpack_uint8(ndo, s, &db_antnoise);
                if (rc != 0)
                        goto trunc;
                ND_PRINT("%udB noise ", db_antnoise);
@@ -2765,7 +2917,7 @@ print_radiotap_field(netdissect_options *ndo,
        case IEEE80211_RADIOTAP_RX_FLAGS: {
                uint16_t rx_flags;
 
-               rc = cpack_uint16(s, &rx_flags);
+               rc = nd_cpack_uint16(ndo, s, &rx_flags);
                if (rc != 0)
                        goto trunc;
                /* Do nothing for now */
@@ -2778,16 +2930,16 @@ print_radiotap_field(netdissect_options *ndo,
                uint8_t channel;
                uint8_t maxpower;
 
-               rc = cpack_uint32(s, &flags);
+               rc = nd_cpack_uint32(ndo, s, &flags);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint16(s, &frequency);
+               rc = nd_cpack_uint16(ndo, s, &frequency);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &channel);
+               rc = nd_cpack_uint8(ndo, s, &channel);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &maxpower);
+               rc = nd_cpack_uint8(ndo, s, &maxpower);
                if (rc != 0)
                        goto trunc;
                print_chaninfo(ndo, frequency, flags, presentflags);
@@ -2806,13 +2958,13 @@ print_radiotap_field(netdissect_options *ndo,
                };
                float htrate;
 
-               rc = cpack_uint8(s, &known);
+               rc = nd_cpack_uint8(ndo, s, &known);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &flags);
+               rc = nd_cpack_uint8(ndo, s, &flags);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &mcs_index);
+               rc = nd_cpack_uint8(ndo, s, &mcs_index);
                if (rc != 0)
                        goto trunc;
                if (known & IEEE80211_RADIOTAP_MCS_MCS_INDEX_KNOWN) {
@@ -2894,16 +3046,16 @@ print_radiotap_field(netdissect_options *ndo,
                uint8_t delim_crc;
                uint8_t reserved;
 
-               rc = cpack_uint32(s, &reference_num);
+               rc = nd_cpack_uint32(ndo, s, &reference_num);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint16(s, &flags);
+               rc = nd_cpack_uint16(ndo, s, &flags);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &delim_crc);
+               rc = nd_cpack_uint8(ndo, s, &delim_crc);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &reserved);
+               rc = nd_cpack_uint8(ndo, s, &reserved);
                if (rc != 0)
                        goto trunc;
                /* Do nothing for now */
@@ -2953,27 +3105,27 @@ print_radiotap_field(netdissect_options *ndo,
                        "unknown (31)"
                };
 
-               rc = cpack_uint16(s, &known);
+               rc = nd_cpack_uint16(ndo, s, &known);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &flags);
+               rc = nd_cpack_uint8(ndo, s, &flags);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &bandwidth);
+               rc = nd_cpack_uint8(ndo, s, &bandwidth);
                if (rc != 0)
                        goto trunc;
                for (i = 0; i < 4; i++) {
-                       rc = cpack_uint8(s, &mcs_nss[i]);
+                       rc = nd_cpack_uint8(ndo, s, &mcs_nss[i]);
                        if (rc != 0)
                                goto trunc;
                }
-               rc = cpack_uint8(s, &coding);
+               rc = nd_cpack_uint8(ndo, s, &coding);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint8(s, &group_id);
+               rc = nd_cpack_uint8(ndo, s, &group_id);
                if (rc != 0)
                        goto trunc;
-               rc = cpack_uint16(s, &partial_aid);
+               rc = nd_cpack_uint16(ndo, s, &partial_aid);
                if (rc != 0)
                        goto trunc;
                for (i = 0; i < 4; i++) {
@@ -3072,7 +3224,7 @@ ieee802_11_radio_print(netdissect_options *ndo,
 {
 #define        BIT(n)  (1U << n)
 #define        IS_EXTENDED(__p)        \
-           (EXTRACT_LE_U_4(__p) & BIT(IEEE80211_RADIOTAP_EXT)) != 0
+           (GET_LE_U_4(__p) & BIT(IEEE80211_RADIOTAP_EXT)) != 0
 
        struct cpack_state cpacker;
        const struct ieee80211_radiotap_header *hdr;
@@ -3096,7 +3248,7 @@ ieee802_11_radio_print(netdissect_options *ndo,
 
        hdr = (const struct ieee80211_radiotap_header *)p;
 
-       len = EXTRACT_LE_U_2(hdr->it_len);
+       len = GET_LE_U_2(hdr->it_len);
        if (len < sizeof(*hdr)) {
                /*
                 * The length is the length of the entire header, so
@@ -3114,13 +3266,13 @@ ieee802_11_radio_print(netdissect_options *ndo,
                nd_print_trunc(ndo);
                return caplen;
        }
-       cpack_init(&cpacker, (const uint8_t *)hdr, len); /* align against header start */
-       cpack_advance(&cpacker, sizeof(*hdr)); /* includes the 1st bitmap */
+       nd_cpack_init(&cpacker, (const uint8_t *)hdr, len); /* align against header start */
+       nd_cpack_advance(&cpacker, sizeof(*hdr)); /* includes the 1st bitmap */
        for (last_presentp = &hdr->it_present;
             (const u_char*)(last_presentp + 1) <= p + len &&
             IS_EXTENDED(last_presentp);
             last_presentp++)
-         cpack_advance(&cpacker, sizeof(hdr->it_present)); /* more bitmaps */
+         nd_cpack_advance(&cpacker, sizeof(hdr->it_present)); /* more bitmaps */
 
        /* are there more bitmap extensions than bytes in header? */
        if ((const u_char*)(last_presentp + 1) > p + len) {
@@ -3144,7 +3296,7 @@ ieee802_11_radio_print(netdissect_options *ndo,
        fcslen = 0;
        for (presentp = &hdr->it_present; presentp <= last_presentp;
            presentp++) {
-               presentflags = EXTRACT_LE_U_4(presentp);
+               presentflags = GET_LE_U_4(presentp);
 
                /*
                 * If this is a vendor namespace, we don't handle it.
@@ -3156,7 +3308,7 @@ ieee802_11_radio_print(netdissect_options *ndo,
                         * it'd be added here; use vendor_oui and
                         * vendor_subnamespace to interpret the fields.
                         */
-                       if (cpack_advance(&cpacker, skip_length) != 0) {
+                       if (nd_cpack_advance(&cpacker, skip_length) != 0) {
                                /*
                                 * Ran out of space in the packet.
                                 */
@@ -3219,27 +3371,27 @@ ieee802_11_radio_print(netdissect_options *ndo,
                         */
                        bit0 = 0;
                        vendor_namespace = 1;
-                       if ((cpack_align_and_reserve(&cpacker, 2)) == NULL) {
+                       if ((nd_cpack_align_and_reserve(&cpacker, 2)) == NULL) {
                                nd_print_trunc(ndo);
                                break;
                        }
-                       if (cpack_uint8(&cpacker, &vendor_oui[0]) != 0) {
+                       if (nd_cpack_uint8(ndo, &cpacker, &vendor_oui[0]) != 0) {
                                nd_print_trunc(ndo);
                                break;
                        }
-                       if (cpack_uint8(&cpacker, &vendor_oui[1]) != 0) {
+                       if (nd_cpack_uint8(ndo, &cpacker, &vendor_oui[1]) != 0) {
                                nd_print_trunc(ndo);
                                break;
                        }
-                       if (cpack_uint8(&cpacker, &vendor_oui[2]) != 0) {
+                       if (nd_cpack_uint8(ndo, &cpacker, &vendor_oui[2]) != 0) {
                                nd_print_trunc(ndo);
                                break;
                        }
-                       if (cpack_uint8(&cpacker, &vendor_subnamespace) != 0) {
+                       if (nd_cpack_uint8(ndo, &cpacker, &vendor_subnamespace) != 0) {
                                nd_print_trunc(ndo);
                                break;
                        }
-                       if (cpack_uint16(&cpacker, &skip_length) != 0) {
+                       if (nd_cpack_uint16(ndo, &cpacker, &skip_length) != 0) {
                                nd_print_trunc(ndo);
                                break;
                        }
@@ -3281,7 +3433,7 @@ ieee802_11_radio_avs_print(netdissect_options *ndo,
                return caplen;
        }
 
-       caphdr_len = EXTRACT_BE_U_4(p + 4);
+       caphdr_len = GET_BE_U_4(p + 4);
        if (caphdr_len < 8) {
                /*
                 * Yow!  The capture header length is claimed not
@@ -3320,7 +3472,7 @@ ieee802_11_radio_avs_print(netdissect_options *ndo,
  * the AVS header, and the first 4 bytes of the header are used to
  * indicate whether it's a Prism header or an AVS header).
  */
-u_int
+void
 prism_if_print(netdissect_options *ndo,
               const struct pcap_pkthdr *h, const u_char *p)
 {
@@ -3328,36 +3480,43 @@ prism_if_print(netdissect_options *ndo,
        u_int length = h->len;
        uint32_t msgcode;
 
-       ndo->ndo_protocol = "prism_if";
+       ndo->ndo_protocol = "prism";
        if (caplen < 4) {
                nd_print_trunc(ndo);
-               return caplen;
+               ndo->ndo_ll_hdr_len += caplen;
+               return;
        }
 
-       msgcode = EXTRACT_BE_U_4(p);
+       msgcode = GET_BE_U_4(p);
        if (msgcode == WLANCAP_MAGIC_COOKIE_V1 ||
-           msgcode == WLANCAP_MAGIC_COOKIE_V2)
-               return ieee802_11_radio_avs_print(ndo, p, length, caplen);
+           msgcode == WLANCAP_MAGIC_COOKIE_V2) {
+               ndo->ndo_ll_hdr_len += ieee802_11_radio_avs_print(ndo, p, length, caplen);
+               return;
+       }
 
        if (caplen < PRISM_HDR_LEN) {
                nd_print_trunc(ndo);
-               return caplen;
+               ndo->ndo_ll_hdr_len += caplen;
+               return;
        }
 
-       return PRISM_HDR_LEN + ieee802_11_print(ndo, p + PRISM_HDR_LEN,
-           length - PRISM_HDR_LEN, caplen - PRISM_HDR_LEN, 0, 0);
+       p += PRISM_HDR_LEN;
+       length -= PRISM_HDR_LEN;
+       caplen -= PRISM_HDR_LEN;
+       ndo->ndo_ll_hdr_len += PRISM_HDR_LEN;
+       ndo->ndo_ll_hdr_len += ieee802_11_print(ndo, p, length, caplen, 0, 0);
 }
 
 /*
  * For DLT_IEEE802_11_RADIO; like DLT_IEEE802_11, but with an extra
  * header, containing information such as radio information.
  */
-u_int
+void
 ieee802_11_radio_if_print(netdissect_options *ndo,
                          const struct pcap_pkthdr *h, const u_char *p)
 {
-       ndo->ndo_protocol = "802.11_radio_if";
-       return ieee802_11_radio_print(ndo, p, h->len, h->caplen);
+       ndo->ndo_protocol = "802.11_radio";
+       ndo->ndo_ll_hdr_len += ieee802_11_radio_print(ndo, p, h->len, h->caplen);
 }
 
 /*
@@ -3365,10 +3524,10 @@ ieee802_11_radio_if_print(netdissect_options *ndo,
  * extra header, containing information such as radio information,
  * which we currently ignore.
  */
-u_int
+void
 ieee802_11_radio_avs_if_print(netdissect_options *ndo,
                              const struct pcap_pkthdr *h, const u_char *p)
 {
-       ndo->ndo_protocol = "802.11_radio_avs_if";
-       return ieee802_11_radio_avs_print(ndo, p, h->len, h->caplen);
+       ndo->ndo_protocol = "802.11_radio_avs";
+       ndo->ndo_ll_hdr_len += ieee802_11_radio_avs_print(ndo, p, h->len, h->caplen);
 }