Ethereal-dev: [Ethereal-dev] IEEE 802.11 (wlan) dissector update
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Johan Jorgensen <johan.jorgensen@xxxxxxxx>
Date: Wed, 30 May 2001 13:33:30 +0200
Hi everybody, The attached patch corrects the following errors: 1. Lockups in calls to add_tagged_field(..) when dissecting corrupt frames. (Thanks to Marco Molteni for pointing it out) 2. Beacon interval is now shown in real-time 3. Current AP address was mistakenly interpreted as a string - caused ethereal to crash. 4. Corrections to fixed fields. All fixed fields suffered from BIT_SWAPomania (introduced by me by mistake). This caused some fields to be displayed incorrectly. Various other small fixes which have to do with byte-ordering (sequence and fragment numbers etc are now displayed correctly) People who are using my prismdump utility to capture 802.11 frames should download a new version as I fixed a few bugs in there too. Regards, Johan Jorgensen
Index: packet-ieee80211.c
===================================================================
RCS file: /cvsroot/ethereal/packet-ieee80211.c,v
retrieving revision 1.17
diff -u -r1.17 packet-ieee80211.c
--- packet-ieee80211.c 2001/04/20 20:34:28 1.17
+++ packet-ieee80211.c 2001/05/30 09:43:29
@@ -24,6 +24,15 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Credits:
+ *
+ * The following people helped me by pointing out bugs etc. Thank you!
+ *
+ * Marco Molteni
+ * Lena-Marie Nilsson
+ * Magnus Hultman-Persson
+ *
*/
#ifdef HAVE_CONFIG_H
@@ -231,15 +240,15 @@
/* ************************************************************************* */
/* Fixed fields found in mgt frames */
/* ************************************************************************* */
-static int ff_auth_alg = -1; /* Authentication algorithm field */
-static int ff_auth_seq = -1; /* Authentication transaction sequence */
-static int ff_current_ap = -1; /* Current AP MAC address */
-static int ff_listen_ival = -1; /* Listen interval fixed field */
-static int ff_timestamp = -1; /* 64 bit timestamp */
-static int ff_beacon_interval = -1; /* 16 bit Beacon interval */
-static int ff_assoc_id = -1; /* 16 bit AID field */
-static int ff_reason = -1; /* 16 bit reason code */
-static int ff_status_code = -1; /* Status code */
+static int ff_auth_alg = -1; /* Authentication algorithm field */
+static int ff_auth_seq = -1; /* Authentication transaction sequence */
+static int ff_current_ap = -1; /* Current AP MAC address */
+static int ff_listen_ival = -1; /* Listen interval fixed field */
+static int ff_timestamp = -1; /* 64 bit timestamp */
+static int ff_beacon_interval = -1; /* 16 bit Beacon interval */
+static int ff_assoc_id = -1; /* 16 bit AID field */
+static int ff_reason = -1; /* 16 bit reason code */
+static int ff_status_code = -1; /* Status code */
/* ************************************************************************* */
/* Flags found in the capability field (fixed field) */
@@ -381,6 +390,7 @@
guint16 *temp16;
proto_item *cap_item;
static proto_tree *cap_tree;
+ double temp_double;
switch (lfcode)
{
@@ -388,14 +398,14 @@
dataptr = tvb_get_ptr (tvb, offset, 8);
memset (out_buff, 0, SHORT_STR);
snprintf (out_buff, SHORT_STR, "0x%02X%02X%02X%02X%02X%02X%02X%02X",
- BIT_SWAP (dataptr[7]),
- BIT_SWAP (dataptr[6]),
- BIT_SWAP (dataptr[5]),
- BIT_SWAP (dataptr[4]),
- BIT_SWAP (dataptr[3]),
- BIT_SWAP (dataptr[2]),
- BIT_SWAP (dataptr[1]),
- BIT_SWAP (dataptr[0]));
+ dataptr[7],
+ dataptr[6],
+ dataptr[5],
+ dataptr[4],
+ dataptr[3],
+ dataptr[2],
+ dataptr[1],
+ dataptr[0]);
proto_tree_add_string (tree, ff_timestamp, tvb, offset, 8, out_buff);
break;
@@ -403,19 +413,17 @@
case FIELD_BEACON_INTERVAL:
dataptr = tvb_get_ptr (tvb, offset, 2);
- out_buff[0] = BIT_SWAP (dataptr[1]);
- out_buff[1] = BIT_SWAP (dataptr[0]);
- temp16 = (guint16 *) out_buff;
- proto_tree_add_uint (tree, ff_beacon_interval, tvb, offset, 2,
- pntohs (temp16));
+ temp_double = ((double) *((guint16 *) dataptr));
+ temp_double = temp_double * 1024 / 1000000;
+ proto_tree_add_double_format (tree, ff_beacon_interval, tvb, offset, 2,
+ temp_double,"Beacon Interval: %f [Seconds]",
+ temp_double);
break;
case FIELD_CAP_INFO:
dataptr = tvb_get_ptr (tvb, offset, 2);
- out_buff[0] = BIT_SWAP (dataptr[1]);
- out_buff[0] = BIT_SWAP (dataptr[0]);
- temp16 = (guint16 *) out_buff;
+ temp16 = (guint16 *) dataptr;
cap_item = proto_tree_add_uint_format (tree, ff_capture,
tvb, offset, 2,
@@ -441,9 +449,7 @@
case FIELD_AUTH_ALG:
dataptr = tvb_get_ptr (tvb, offset, 2);
- out_buff[0] = BIT_SWAP (dataptr[1]);
- out_buff[1] = BIT_SWAP (dataptr[0]);
- temp16 = (guint16 *) out_buff;
+ temp16 =(guint16 *) dataptr;
proto_tree_add_uint (tree, ff_auth_alg, tvb, offset, 2,
pntohs (temp16));
break;
@@ -451,9 +457,7 @@
case FIELD_AUTH_TRANS_SEQ:
dataptr = tvb_get_ptr (tvb, offset, 2);
- out_buff[0] = BIT_SWAP (dataptr[1]);
- out_buff[1] = BIT_SWAP (dataptr[0]);
- temp16 = (guint16 *) out_buff;
+ temp16 = (guint16 *)dataptr;
proto_tree_add_uint (tree, ff_auth_seq, tvb, offset, 2,
pntohs (temp16));
break;
@@ -461,23 +465,13 @@
case FIELD_CURRENT_AP_ADDR:
dataptr = tvb_get_ptr (tvb, offset, 6);
- memset (out_buff, 0, SHORT_STR);
- out_buff[0] = BIT_SWAP (dataptr[5]);
- out_buff[1] = BIT_SWAP (dataptr[4]);
- out_buff[2] = BIT_SWAP (dataptr[3]);
- out_buff[3] = BIT_SWAP (dataptr[2]);
- out_buff[4] = BIT_SWAP (dataptr[1]);
- out_buff[5] = BIT_SWAP (dataptr[0]);
-
- proto_tree_add_string (tree, ff_current_ap, tvb, offset, 6, out_buff);
+ proto_tree_add_ether (tree, ff_current_ap, tvb, offset, 6, dataptr);
break;
case FIELD_LISTEN_IVAL:
dataptr = tvb_get_ptr (tvb, offset, 2);
- out_buff[0] = BIT_SWAP (dataptr[1]);
- out_buff[1] = BIT_SWAP (dataptr[0]);
- temp16 = (guint16 *) out_buff;
+ temp16 = (guint16 *) dataptr;
proto_tree_add_uint (tree, ff_listen_ival, tvb, offset, 2,
pntohs (temp16));
break;
@@ -485,26 +479,20 @@
case FIELD_REASON_CODE:
dataptr = tvb_get_ptr (tvb, offset, 2);
- out_buff[0] = BIT_SWAP (dataptr[1]);
- out_buff[1] = BIT_SWAP (dataptr[0]);
- temp16 = (guint16 *) out_buff;
+ temp16 = (guint16 *) dataptr;
proto_tree_add_uint (tree, ff_reason, tvb, offset, 2, pntohs (temp16));
break;
case FIELD_ASSOC_ID:
dataptr = tvb_get_ptr (tvb, offset, 2);
- out_buff[0] = BIT_SWAP (dataptr[1]);
- out_buff[1] = BIT_SWAP (dataptr[0]);
- temp16 = (guint16 *) out_buff;
+ temp16 = (guint16 *) dataptr;
proto_tree_add_uint (tree, ff_assoc_id, tvb, offset, 2, pntohs (temp16));
break;
case FIELD_STATUS_CODE:
dataptr = tvb_get_ptr (tvb, offset, 2);
- out_buff[0] = BIT_SWAP (dataptr[1]);
- out_buff[1] = BIT_SWAP (dataptr[0]);
- temp16 = (guint16 *) out_buff;
+ temp16 = (guint16 *) dataptr;
proto_tree_add_uint (tree, ff_status_code, tvb, offset, 2,
pntohs (temp16));
break;
@@ -731,6 +719,7 @@
tvbuff_t *next_tvb;
guint32 next_idx;
guint32 addr_type;
+ guint32 next_len;
cap_len = pinfo->captured_len;
fcf = tvb_get_letohs (tvb, 0);
@@ -827,11 +816,11 @@
tvb_get_ptr (tvb, 16, 6));
proto_tree_add_uint (hdr_tree, hf_frag_number, tvb, 22, 2,
- COOK_FRAGMENT_NUMBER (tvb_get_ntohs
+ COOK_FRAGMENT_NUMBER (tvb_get_letohs
(tvb, 22)));
proto_tree_add_uint (hdr_tree, hf_seq_number, tvb, 22, 2,
- COOK_SEQUENCE_NUMBER (tvb_get_ntohs
+ COOK_SEQUENCE_NUMBER (tvb_get_letohs
(tvb, 22)));
cap_len = cap_len - MGT_FRAME_LEN - 4;
}
@@ -984,8 +973,11 @@
next_idx);
- while (pinfo->captured_len > (next_idx + 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
+ while (pinfo->captured_len > (next_idx + 4)) {
+ if ((next_len=add_tagged_field (tagged_tree, tvb, next_idx))==0)
+ break;
+ next_idx +=next_len;
+ }
}
break;
@@ -1008,13 +1000,16 @@
tagged_tree = get_tagged_parameter_tree (tree, tvb, next_idx,
pinfo->captured_len - 4 -
next_idx);
-
- while (pinfo->captured_len > (next_idx + 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
+ while (pinfo->captured_len > (next_idx + 4)) {
+ if ((next_len=add_tagged_field (tagged_tree, tvb, next_idx))==0)
+ break;
+ next_idx +=next_len;
+ }
}
break;
+
case MGT_REASSOC_REQ:
COL_SHOW_INFO (pinfo->fd, "Reassociation Request");
if (tree)
@@ -1031,8 +1026,11 @@
pinfo->captured_len - 4 -
next_idx);
- while ((pinfo->captured_len) > (next_idx + 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
+ while ((pinfo->captured_len) > (next_idx + 4)) {
+ if ((next_len=add_tagged_field (tagged_tree, tvb, next_idx))==0)
+ break;
+ next_idx +=next_len;
+ }
}
break;
@@ -1051,14 +1049,16 @@
tagged_tree = get_tagged_parameter_tree (tree, tvb, next_idx,
pinfo->captured_len - 4 -
next_idx);
-
- while (pinfo->captured_len > (next_idx + 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
-
+ while (pinfo->captured_len > (next_idx + 4)) {
+ if ((next_len=add_tagged_field (tagged_tree, tvb, next_idx))==0)
+ break;
+ next_idx +=next_len;
+ }
}
break;
+
case MGT_PROBE_REQ:
COL_SHOW_INFO (pinfo->fd, "Probe Request");
if (tree)
@@ -1068,13 +1068,15 @@
pinfo->captured_len - 4 -
next_idx);
- while (pinfo->captured_len > (next_idx + 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
+ while (pinfo->captured_len > (next_idx + 4)) {
+ if ((next_len=add_tagged_field (tagged_tree, tvb, next_idx))==0)
+ break;
+ next_idx +=next_len;
+ }
}
break;
-
case MGT_PROBE_RESP:
COL_SHOW_INFO (pinfo->fd, "Probe Response");
if (tree)
@@ -1091,8 +1093,11 @@
pinfo->captured_len - 4 -
next_idx);
- while ((pinfo->captured_len) > (next_idx + 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
+ while ((pinfo->captured_len) > (next_idx + 4)) {
+ if ((next_len=add_tagged_field (tagged_tree, tvb, next_idx))==0)
+ break;
+ next_idx +=next_len;
+ }
}
break;
@@ -1116,9 +1121,11 @@
pinfo->captured_len - 4 -
next_idx);
- while (pinfo->captured_len > (next_idx + 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
-
+ while (pinfo->captured_len > (next_idx + 4)) {
+ if ((next_len=add_tagged_field (tagged_tree, tvb, next_idx))==0)
+ break;
+ next_idx +=next_len;
+ }
}
break;
@@ -1135,8 +1142,7 @@
COL_SHOW_INFO (pinfo->fd, "Dissassociate");
if (tree)
{
- fixed_tree =
- get_fixed_parameter_tree (tree, tvb, MGT_FRAME_LEN, cap_len);
+ fixed_tree = get_fixed_parameter_tree (tree, tvb, MGT_FRAME_LEN, cap_len);
add_fixed_field (fixed_tree, tvb, MGT_FRAME_LEN, FIELD_REASON_CODE);
}
break;
@@ -1162,8 +1168,11 @@
pinfo->captured_len -
next_idx - 4);
- while ((pinfo->captured_len) > (next_idx - 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
+ while ((pinfo->captured_len) > (next_idx - 4)) {
+ if ((next_len=add_tagged_field (tagged_tree, tvb, next_idx))==0)
+ break;
+ next_idx +=next_len;
+ }
}
}
break;
@@ -1648,7 +1657,7 @@
FT_UINT16, BASE_DEC, VALS (&auth_alg), 0, ""}},
{&ff_beacon_interval,
- {"Beacon Interval", "wlan.fixed.beacon", FT_UINT16, BASE_DEC, NULL, 0,
+ {"Beacon Interval", "wlan.fixed.beacon", FT_DOUBLE, BASE_DEC, NULL, 0,
""}},
{&hf_fixed_parameters,
- Follow-Ups:
- Re: [Ethereal-dev] IEEE 802.11 (wlan) dissector update
- From: Guy Harris
- Re: [Ethereal-dev] IEEE 802.11 (wlan) dissector update
- Prev by Date: [Ethereal-dev] ABS/REL time in display filters
- Next by Date: [Ethereal-dev] glib library
- Previous by thread: Re: [Ethereal-dev] ABS/REL time in display filters
- Next by thread: Re: [Ethereal-dev] IEEE 802.11 (wlan) dissector update
- Index(es):





