Ethereal-dev: [Ethereal-dev] Better parsing of TIM info element for 802.11 beacon
Attached patch provides:
- better parsing for TIM info element: it parses 'bitmap control' byte
and provides list of AID for stations having power saving traffic.
- separate names for TIM elements. It helps to higlight beacons with
some properties, for example DTIM ones (dtim_count==0).
this is quick fix. I will try to do something uniform for all IE's to
enable frame selection based on some IE subfield.
Vladimir
--- ethereal-0.10.9/epan/dissectors/packet-ieee80211.c 2005-01-18 04:39:44.000000000 +0200
+++ /home/vkondra-l/work/ethereal-0.10.9/epan/dissectors/packet-ieee80211.c 2005-03-06 18:18:54.000000000 +0200
@@ -458,6 +458,10 @@
static int tag_length = -1;
static int tag_interpretation = -1;
+static int tim_length = -1;
+static int tim_dtim_count = -1;
+static int tim_dtim_period = -1;
+static int tim_bmapctl = -1;
static int hf_fixed_parameters = -1; /* Protocol payload for management frames */
@@ -1202,7 +1206,7 @@
"Reserved tag number"));
tag_len = tvb_get_guint8(tvb, offset + 1);
- proto_tree_add_uint (tree, tag_length, tvb, offset + 1, 1, tag_len);
+ proto_tree_add_uint (tree, (tag_no==5 ? tim_length : tag_length), tvb, offset + 1, 1, tag_len);
tag_data_ptr = tvb_get_ptr (tvb, offset + 2, tag_len);
@@ -1301,13 +1305,43 @@
case TAG_TIM:
+
memset (out_buff, 0, SHORT_STR);
- snprintf (out_buff, SHORT_STR,
- "DTIM count %u, DTIM period %u, Bitmap control 0x%X, "
- "(Bitmap suppressed)", tag_data_ptr[0], tag_data_ptr[1],
- tag_data_ptr[2]);
- proto_tree_add_string (tree, tag_interpretation, tvb, offset + 2,
- tag_len, out_buff);
+ if (tag_len>3) {
+ guint8 bmapctl=tag_data_ptr[2];
+ guint8 bmapoff=bmapctl>>1;
+ guint8 bmaplen=tag_len-3;
+ guint8* bmap=&tag_data_ptr[3];
+ proto_tree_add_uint(tree, tim_dtim_count, tvb,
+ offset + 2, 1, tag_data_ptr[0]);
+ proto_tree_add_uint(tree, tim_dtim_period, tvb,
+ offset + 3, 1, tag_data_ptr[1]);
+
+ proto_tree_add_uint_format(tree, tim_bmapctl, tvb,
+ offset + 4, 1, bmapctl,
+ "Bitmap Control: 0x%02X (mcast:%u, bitmap offset %u)",
+ bmapctl, bmapctl&1, bmapoff);
+
+ if (bmaplen>1 || bmap[0]) {
+ int len=snprintf (out_buff, SHORT_STR,
+ "Bitmap: traffic for AID's:");
+ int i=0;
+ for (i=0;i<bmaplen*8;i++) {
+ if (bmap[i/8] & (1<<(i%8))) {
+ int aid=i+bmapoff*8;
+ len+=snprintf (out_buff+len, SHORT_STR-len," %d", aid);
+ if (len>=SHORT_STR) {
+ break;
+ }
+ }
+ }
+ proto_tree_add_string (tree, tag_interpretation, tvb, offset + 5,
+ bmaplen, out_buff);
+ }
+ } else {
+ snprintf (out_buff, SHORT_STR, "Mailformed TIM: length is %d, should be >=4",tag_len);
+ proto_tree_add_string (tree, tag_interpretation, tvb, offset + 2, tag_len, out_buff);
+ }
break;
@@ -3159,6 +3193,26 @@
{"Tag interpretation", "wlan_mgt.tag.interpretation",
FT_STRING, BASE_NONE, NULL, 0, "Interpretation of tag", HFILL }},
+ {&tim_length,
+ {"TIM length", "wlan_mgt.tim.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Traffic Indication Map length", HFILL }},
+
+ {&tim_dtim_count,
+ {"DTIM count", "wlan_mgt.tim.dtim_count",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "DTIM count", HFILL }},
+
+ {&tim_dtim_period,
+ {"DTIM period", "wlan_mgt.tim.dtim_period",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "DTIM period", HFILL }},
+
+ {&tim_bmapctl,
+ {"Bitmap control", "wlan_mgt.tim.bmapctl",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Bitmap control", HFILL }},
+
{&rsn_cap,
{"RSN Capabilities", "wlan_mgt.rsn.capabilities", FT_UINT16, BASE_HEX,
NULL, 0, "RSN Capability information", HFILL }},