]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-802_11.c
Merge pull request #926 from gokulkumar792/print_Block_Ack_TA_field
[tcpdump] / print-802_11.c
index 7864fb275180860e5223ad8944898ce8566f76af..d52a0338b1e7e37b6d95fccf41830923b9574612 100644 (file)
@@ -236,6 +236,11 @@ struct tim_t {
        uint8_t         bitmap[251];
 };
 
+struct meshid_t {
+       u_int           length;
+       u_char          meshid[33];  /* 32 + 1 for null */
+};
+
 #define        E_SSID          0
 #define        E_RATES 1
 #define        E_FH            2
@@ -260,6 +265,7 @@ struct tim_t {
 /* reserved            19 */
 /* reserved            16 */
 /* reserved            16 */
+#define E_MESHID       114
 
 
 struct mgmt_body_t {
@@ -287,6 +293,8 @@ struct mgmt_body_t {
        struct fh_t     fh;
        int             tim_present;
        struct tim_t    tim;
+       int             meshid_present;
+       struct meshid_t meshid;
 };
 
 struct ctrl_control_wrapper_hdr_t {
@@ -422,6 +430,13 @@ struct meshcntl_t {
        ND_PRINT("%s", \
            CAPABILITY_PRIVACY(p.capability_info) ? ", PRIVACY" : "");
 
+#define PRINT_MESHID(p) \
+       if (p.meshid_present) { \
+               ND_PRINT(" (MESHID: "); \
+               fn_print_str(ndo, p.meshid.meshid); \
+               ND_PRINT(")"); \
+       }
+
 #define MAX_MCS_INDEX  76
 
 /*
@@ -1140,6 +1155,7 @@ parse_elements(netdissect_options *ndo,
        struct ds_t ds;
        struct cf_t cf;
        struct tim_t tim;
+       struct meshid_t meshid;
 
        /*
         * We haven't seen any elements yet.
@@ -1150,6 +1166,7 @@ parse_elements(netdissect_options *ndo,
        pbody->ds_present = 0;
        pbody->cf_present = 0;
        pbody->tim_present = 0;
+       pbody->meshid_present = 0;
 
        while (length != 0) {
                /* Make sure we at least have the element ID and length. */
@@ -1338,6 +1355,30 @@ parse_elements(netdissect_options *ndo,
                                pbody->tim_present = 1;
                        }
                        break;
+               case E_MESHID:
+                       meshid.length = elementlen;
+                       offset += 2;
+                       length -= 2;
+                       if (meshid.length != 0) {
+                               if (meshid.length > sizeof(meshid.meshid) - 1)
+                                       return 0;
+                               memcpy(&meshid.meshid, p + offset, meshid.length);
+                               offset += meshid.length;
+                               length -= meshid.length;
+                       }
+                       meshid.meshid[meshid.length] = '\0';
+                       /*
+                        * Present and not truncated.
+                        *
+                        * If we haven't already seen a MESHID IE,
+                        * copy this one, otherwise ignore this one,
+                        * so we later report the first one we saw.
+                        */
+                       if (!pbody->meshid_present) {
+                               pbody->meshid = meshid;
+                               pbody->meshid_present = 1;
+                       }
+                       break;
                default:
 #if 0
                        ND_PRINT("(1) unhandled element_id (%u)  ",
@@ -1391,6 +1432,7 @@ handle_beacon(netdissect_options *ndo,
        ND_PRINT(" %s",
            CAPABILITY_ESS(pbody.capability_info) ? "ESS" : "IBSS");
        PRINT_DS_CHANNEL(pbody);
+       PRINT_MESHID(pbody);
 
        return ret;
 trunc:
@@ -1555,6 +1597,7 @@ handle_probe_response(netdissect_options *ndo,
        PRINT_SSID(pbody);
        PRINT_RATES(pbody);
        PRINT_DS_CHANNEL(pbody);
+       PRINT_MESHID(pbody);
 
        return ret;
 trunc: