Ethereal-dev: [Ethereal-dev] 802.11
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Javier Achirica <achirica@xxxxxxx>
Date: Thu, 31 May 2001 15:39:03 +0200 (MEST)
Hello, I've been enhancing the Cisco Aironet wireless driver to support raw 802.11 packet capture. With a small patch to libpcap I'm able to use ethereal to see that traffic, but I've found a few bugs in the dissector. Enclosed is a patch that fixes most of them and adds missing info. Do I have to talk with someone to get it integrated in the code? Javier Achirica
--- packet-ieee80211.c.FCS Mon Apr 23 18:57:55 2001
+++ packet-ieee80211.c Wed May 30 23:49:02 2001
@@ -72,12 +72,14 @@
#define COOK_PROT_VERSION(x) ((x & 0x3))
#define COOK_FRAME_TYPE(x) ((x & 0xC) >> 2)
#define COOK_FRAME_SUBTYPE(x) ((x & 0xF0) >> 4)
-#define COOK_ADDR_SELECTOR(x) (((x & 0x2)) && ((x & 0x1)))
+#define COOK_ADDR_SELECTOR(x) (((x & 0x200)) && ((x & 0x100)))
#define COOK_ASSOC_ID(x) ((x & 0x3FFF))
#define COOK_FRAGMENT_NUMBER(x) (x & 0x000F)
#define COOK_SEQUENCE_NUMBER(x) ((x & 0xFFF0) >> 4)
#define COOK_FLAGS(x) ((x & 0xFF00) >> 8)
#define COOK_DS_STATUS(x) (x & 0x3)
+#define COOK_WEP_IV(x) (x & 0xFFFFFF)
+#define COOK_WEP_KEY(x) ((x & 0xC0000000) >> 30)
#define COL_SHOW_INFO(fd,info) if (check_col(fd,COL_INFO)) \
col_add_str(fd,COL_INFO,info);
@@ -135,10 +137,10 @@
#define DATA_CF_POLL_NOD 0x26 /* Data - Data + CF poll (No data) */
#define DATA_CF_ACK_POLL_NOD 0x27 /* Data - CF ack + CF poll (no data) */
-#define DATA_ADDR_T1 0x00
-#define DATA_ADDR_T2 0x01
-#define DATA_ADDR_T3 0x02
-#define DATA_ADDR_T4 0x03
+#define DATA_ADDR_T1 0x0000
+#define DATA_ADDR_T2 0x0100
+#define DATA_ADDR_T3 0x0200
+#define DATA_ADDR_T4 0x0300
/* ************************************************************************* */
@@ -250,6 +252,9 @@
static int ff_cf_ess = -1;
static int ff_cf_ibss = -1;
static int ff_cf_privacy = -1;
+static int ff_cf_preamble = -1;
+static int ff_cf_pbcc = -1;
+static int ff_cf_agility = -1;
/* ************************************************************************* */
/* Tagged value format fields */
@@ -262,6 +267,10 @@
static int hf_fixed_parameters = -1; /* Protocol payload for management frames */
static int hf_tagged_parameters = -1; /* Fixed payload item */
+static int hf_wep_parameters = -1;
+static int hf_wep_iv = -1;
+static int hf_wep_key = -1;
+static int hf_wep_crc = -1;
/* ************************************************************************* */
/* Protocol trees */
@@ -272,6 +281,7 @@
static gint ett_fc_tree = -1;
static gint ett_fixed_parameters = -1;
static gint ett_tagged_parameters = -1;
+static gint ett_wep_parameters = -1;
static dissector_handle_t llc_handle;
@@ -283,7 +293,7 @@
{
guint16 frame_control;
- frame_control = pntohs (pd);
+ frame_control = COOK_FLAGS(pletohs (pd));
return ((IS_FROM_DS(frame_control))
&& (IS_TO_DS(frame_control))) ? 30 : 24;
}
@@ -302,6 +312,12 @@
hdr_length = MGT_FRAME_HDR_LEN; /* Set the header length of the frame */
+ if (IS_WEP(COOK_FLAGS(fcf)))
+ {
+ ld->other++;
+ return;
+ }
+
switch (COMPOSE_FRAME_TYPE (fcf))
{
@@ -369,6 +385,30 @@
}
+/* ************************************************************************* */
+/* Add the subtree used to store WEP parameters */
+/* ************************************************************************* */
+void
+get_wep_parameter_tree (proto_tree * tree, tvbuff_t *tvb, int start, int size)
+{
+ proto_item *wep_fields;
+ proto_tree *wep_tree;
+ int crc_offset = size - 4;
+
+ wep_fields = proto_tree_add_string_format(tree, hf_wep_parameters, tvb,
+ 0, 4, 0, "WEP parameters");
+
+ wep_tree = proto_item_add_subtree (wep_fields, ett_wep_parameters);
+ proto_tree_add_uint (wep_tree, hf_wep_iv, tvb, start, 3,
+ COOK_WEP_IV (tvb_get_letohl (tvb, start)));
+
+ proto_tree_add_uint (wep_tree, hf_wep_key, tvb, start + 3, 1,
+ COOK_WEP_KEY (tvb_get_letohl (tvb, start)));
+
+ if (tvb_bytes_exist(tvb, start + crc_offset, 4))
+ proto_tree_add_uint (wep_tree, hf_wep_crc, tvb, start + crc_offset, 4,
+ tvb_get_ntohl (tvb, start + crc_offset));
+}
/* ************************************************************************* */
/* Dissect and add fixed mgmt fields to protocol tree */
@@ -388,14 +428,8 @@
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,110 +437,93 @@
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;
+ temp16 = (guint16 *) dataptr;
proto_tree_add_uint (tree, ff_beacon_interval, tvb, offset, 2,
- pntohs (temp16));
+ pletohs (temp16));
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,
- pntohs (temp16),
+ pletohs (temp16),
"Capability Information: %04X",
- pntohs (temp16));
+ pletohs (temp16));
cap_tree = proto_item_add_subtree (cap_item, ett_cap_tree);
proto_tree_add_boolean (cap_tree, ff_cf_ess, tvb, offset, 1,
- pntohs (temp16));
+ pletohs (temp16));
proto_tree_add_boolean (cap_tree, ff_cf_ibss, tvb, offset, 1,
- pntohs (temp16));
+ pletohs (temp16));
proto_tree_add_boolean (cap_tree, ff_cf_privacy, tvb, offset, 1,
- pntohs (temp16));
- if (ESS_SET (pntohs (temp16)) != 0) /* This is an AP */
+ pletohs (temp16));
+ proto_tree_add_boolean (cap_tree, ff_cf_preamble, tvb, offset, 1,
+ pletohs (temp16));
+ proto_tree_add_boolean (cap_tree, ff_cf_pbcc, tvb, offset, 1,
+ pletohs (temp16));
+ proto_tree_add_boolean (cap_tree, ff_cf_agility, tvb, offset, 1,
+ pletohs (temp16));
+ if (ESS_SET (pletohs (temp16)) != 0) /* This is an AP */
proto_tree_add_uint (cap_tree, ff_cf_ap_poll, tvb, offset, 2,
- ((pntohs (temp16) & 0xC) >> 2));
+ ((pletohs (temp16) & 0xC) >> 2));
else /* This is a STA */
proto_tree_add_uint (cap_tree, ff_cf_sta_poll, tvb, offset, 2,
- ((pntohs (temp16) & 0xC) >> 2));
+ ((pletohs (temp16) & 0xC) >> 2));
break;
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));
+ pletohs (temp16));
break;
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));
+ pletohs (temp16));
break;
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_string (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));
+ pletohs (temp16));
break;
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;
- proto_tree_add_uint (tree, ff_reason, tvb, offset, 2, pntohs (temp16));
+ temp16 = (guint16 *) dataptr;
+ proto_tree_add_uint (tree, ff_reason, tvb, offset, 2, pletohs (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;
- proto_tree_add_uint (tree, ff_assoc_id, tvb, offset, 2, pntohs (temp16));
+ temp16 = (guint16 *) dataptr;
+ proto_tree_add_uint (tree, ff_assoc_id, tvb, offset, 2, pletohs (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));
+ pletohs (temp16));
break;
}
}
@@ -541,7 +558,7 @@
proto_tree_add_uint (tree, tag_length, tvb, offset + 1, 1, tag_len);
proto_tree_add_string (tree, tag_interpretation, tvb, offset + 2,
tag_len, "Not interpreted");
- return (int) tag_len;
+ return (int) tag_len + 2;
}
/* Next See if tag is reserved - if true, skip it! */
@@ -556,7 +573,7 @@
proto_tree_add_string (tree, tag_interpretation, tvb, offset + 2,
tag_len, "Not interpreted");
- return (int) tag_len;
+ return (int) tag_len + 2;
}
@@ -616,7 +633,7 @@
snprintf (out_buff, SHORT_STR,
"Dwell time 0x%04X, Hop Set %2d, Hop Pattern %2d, "
- "Hop Index %2d", pntohs (tag_data_ptr), tag_data_ptr[2],
+ "Hop Index %2d", pletohs (tag_data_ptr), tag_data_ptr[2],
tag_data_ptr[3], tag_data_ptr[4]);
proto_tree_add_string (tree, tag_interpretation, tvb, offset + 2,
@@ -650,7 +667,7 @@
snprintf (out_buff, SHORT_STR,
"CFP count %u, CFP period %u, CFP max duration %u, "
"CFP Remaining %u", tag_data_ptr[0], tag_data_ptr[1],
- pntohs (tag_data_ptr + 2), pntohs (tag_data_ptr + 4));
+ pletohs (tag_data_ptr + 2), pletohs (tag_data_ptr + 4));
proto_tree_add_string (tree, tag_interpretation, tvb, offset + 2,
tag_len, out_buff);
@@ -682,7 +699,7 @@
proto_tree_add_uint (tree, tag_length, tvb, offset + 1, 1, tag_len);
memset (out_buff, 0, SHORT_STR);
snprintf (out_buff, SHORT_STR, "ATIM window 0x%X",
- pntohs (tag_data_ptr));
+ pletohs (tag_data_ptr));
proto_tree_add_string (tree, tag_interpretation, tvb, offset + 2,
tag_len, out_buff);
@@ -791,11 +808,11 @@
if ((COMPOSE_FRAME_TYPE(fcf))==CTRL_PS_POLL)
proto_tree_add_uint(hdr_tree, hf_assoc_id,tvb,2,2,
- COOK_ASSOC_ID(tvb_get_ntohs(tvb,2)));
+ COOK_ASSOC_ID(tvb_get_letohs(tvb,2)));
else
proto_tree_add_uint (hdr_tree, hf_did_duration, tvb, 2, 2,
- tvb_get_ntohs (tvb, 2));
+ tvb_get_letohs (tvb, 2));
}
/* Perform tasks which are common to a certain frame type */
@@ -827,11 +844,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;
}
@@ -902,10 +919,10 @@
proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 16, 6,
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)));
break;
@@ -918,10 +935,10 @@
proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 16, 6,
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)));
break;
@@ -934,10 +951,10 @@
proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 16, 6,
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)));
break;
@@ -950,10 +967,10 @@
proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 16, 6,
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)));
proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 24, 6,
tvb_get_ptr (tvb, 24, 6));
@@ -1145,25 +1162,39 @@
COL_SHOW_INFO (pinfo->fd, "Authentication");
if (tree)
{
- fixed_tree = get_fixed_parameter_tree (tree, tvb, MGT_FRAME_LEN, 6);
- add_fixed_field (fixed_tree, tvb, MGT_FRAME_LEN, FIELD_AUTH_ALG);
- add_fixed_field (fixed_tree, tvb, MGT_FRAME_LEN + 2,
- FIELD_AUTH_TRANS_SEQ);
- add_fixed_field (fixed_tree, tvb, MGT_FRAME_LEN + 4,
- FIELD_STATUS_CODE);
-
- next_idx = MGT_FRAME_LEN + 6; /* Size of fixed fields */
-
- if ((pinfo->captured_len - next_idx - 4) != 0)
+ if (IS_WEP(COOK_FLAGS(fcf)))
{
- tagged_tree = get_tagged_parameter_tree (tree,
- tvb,
- next_idx,
- pinfo->captured_len -
- next_idx - 4);
+ int pkt_len = tvb_reported_length (tvb);
+ int cap_len = tvb_length (tvb);
- while ((pinfo->captured_len) > (next_idx - 4))
- next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
+ get_wep_parameter_tree (tree, tvb, MGT_FRAME_LEN, pkt_len);
+ pkt_len = MAX (pkt_len - 8 - MGT_FRAME_LEN, 0);
+ cap_len = MIN (pkt_len, MAX (cap_len - 8 - MGT_FRAME_LEN, 0));
+ next_tvb = tvb_new_subset (tvb, MGT_FRAME_LEN + 4, cap_len, pkt_len);
+ dissect_data (next_tvb, 0, pinfo, tree);
+ }
+ else
+ {
+ fixed_tree = get_fixed_parameter_tree (tree, tvb, MGT_FRAME_LEN, 6);
+ add_fixed_field (fixed_tree, tvb, MGT_FRAME_LEN, FIELD_AUTH_ALG);
+ add_fixed_field (fixed_tree, tvb, MGT_FRAME_LEN + 2,
+ FIELD_AUTH_TRANS_SEQ);
+ add_fixed_field (fixed_tree, tvb, MGT_FRAME_LEN + 4,
+ FIELD_STATUS_CODE);
+
+ next_idx = MGT_FRAME_LEN + 6; /* Size of fixed fields */
+
+ if ((pinfo->captured_len - next_idx - 4) != 0)
+ {
+ tagged_tree = get_tagged_parameter_tree (tree,
+ tvb,
+ next_idx,
+ pinfo->captured_len -
+ next_idx - 4);
+
+ while ((pinfo->captured_len) > (next_idx - 4))
+ next_idx += add_tagged_field (tagged_tree, tvb, next_idx);
+ }
}
}
break;
@@ -1332,9 +1363,21 @@
if (tree)
{
hdr_len = find_header_length (tvb_get_ptr (tvb, 0, cap_len), 0);
-
next_tvb = tvb_new_subset (tvb, hdr_len, -1, -1);
- call_dissector (llc_handle, next_tvb, pinfo, tree);
+
+ if (IS_WEP(COOK_FLAGS(fcf)))
+ {
+ int pkt_len = tvb_reported_length (next_tvb);
+ int cap_len = tvb_length (next_tvb);
+
+ get_wep_parameter_tree (tree, next_tvb, 0, pkt_len);
+ pkt_len = MAX (pkt_len - 8, 0);
+ cap_len = MIN (pkt_len, MAX (cap_len - 8, 0));
+ next_tvb = tvb_new_subset (tvb, hdr_len + 4, cap_len, pkt_len);
+ dissect_data (next_tvb, 0, pinfo, tree);
+ }
+ else
+ call_dissector (llc_handle, next_tvb, pinfo, tree);
}
break;
@@ -1345,9 +1388,21 @@
if (tree)
{
hdr_len = find_header_length (tvb_get_ptr (tvb, 0, cap_len), 0);
-
next_tvb = tvb_new_subset (tvb, hdr_len, -1, -1);
- call_dissector (llc_handle, next_tvb, pinfo, tree);
+
+ if (IS_WEP(COOK_FLAGS(fcf)))
+ {
+ int pkt_len = tvb_reported_length (next_tvb);
+ int cap_len = tvb_length (next_tvb);
+
+ get_wep_parameter_tree (tree, next_tvb, 0, pkt_len);
+ pkt_len = MAX (pkt_len - 8, 0);
+ cap_len = MIN (pkt_len, MAX (cap_len - 8, 0));
+ next_tvb = tvb_new_subset (tvb, hdr_len + 4, cap_len, pkt_len);
+ dissect_data (next_tvb, 0, pinfo, tree);
+ }
+ else
+ call_dissector (llc_handle, next_tvb, pinfo, tree);
}
break;
@@ -1359,7 +1414,20 @@
{
hdr_len = find_header_length (tvb_get_ptr (tvb, 0, cap_len), 0);
next_tvb = tvb_new_subset (tvb, hdr_len, -1, -1);
- call_dissector (llc_handle, next_tvb, pinfo, tree);
+
+ if (IS_WEP(COOK_FLAGS(fcf)))
+ {
+ int pkt_len = tvb_reported_length (next_tvb);
+ int cap_len = tvb_length (next_tvb);
+
+ get_wep_parameter_tree (tree, next_tvb, 0, pkt_len);
+ pkt_len = MAX (pkt_len - 8, 0);
+ cap_len = MIN (pkt_len, MAX (cap_len - 8, 0));
+ next_tvb = tvb_new_subset (tvb, hdr_len + 4, cap_len, pkt_len);
+ dissect_data (next_tvb, 0, pinfo, tree);
+ }
+ else
+ call_dissector (llc_handle, next_tvb, pinfo, tree);
}
break;
@@ -1371,7 +1439,20 @@
{
hdr_len = find_header_length (tvb_get_ptr (tvb, 0, cap_len), 0);
next_tvb = tvb_new_subset (tvb, hdr_len, -1, -1);
- call_dissector (llc_handle, next_tvb, pinfo, tree);
+
+ if (IS_WEP(COOK_FLAGS(fcf)))
+ {
+ int pkt_len = tvb_reported_length (next_tvb);
+ int cap_len = tvb_length (next_tvb);
+
+ get_wep_parameter_tree (tree, next_tvb, 0, pkt_len);
+ pkt_len = MAX (pkt_len - 8, 0);
+ cap_len = MIN (pkt_len, MAX (cap_len - 8, 0));
+ next_tvb = tvb_new_subset (tvb, hdr_len + 4, cap_len, pkt_len);
+ dissect_data (next_tvb, 0, pinfo, tree);
+ }
+ else
+ call_dissector (llc_handle, next_tvb, pinfo, tree);
}
break;
@@ -1467,6 +1548,21 @@
"AP/STA cannot support WEP"
};
+ static const true_false_string cf_preamble_flags = {
+ "Short preamble allowed",
+ "Short preamble not allowed"
+ };
+
+ static const true_false_string cf_pbcc_flags = {
+ "PBCC modulation allowed",
+ "PBCC modulation not allowed"
+ };
+
+ static const true_false_string cf_agility_flags = {
+ "Channel agility in use",
+ "Channel agility not in use"
+ };
+
static const true_false_string cf_ibss_flags = {
"Transmitter belongs to an IBSS",
@@ -1659,6 +1755,22 @@
{"Tagged parameters", "wlan.tagged.all", FT_UINT16, BASE_DEC, NULL, 0,
""}},
+ {&hf_wep_parameters,
+ {"WEP parameters", "wlan.wep.all", FT_STRING, BASE_NONE, NULL, 0,
+ ""}},
+
+ {&hf_wep_iv,
+ {"Initialization Vector", "wlan.wep.iv", FT_UINT32, BASE_HEX, NULL, 0,
+ "Initialization Vector"}},
+
+ {&hf_wep_key,
+ {"Key", "wlan.wep.key", FT_UINT32, BASE_DEC, NULL, 0,
+ "Key"}},
+
+ {&hf_wep_crc,
+ {"WEP CRC (not verified)", "wlan.wep.crc", FT_UINT32, BASE_HEX, NULL, 0,
+ "WEP CRC"}},
+
{&ff_capture,
{"Capabilities", "wlan.fixed.capabilities", FT_UINT16, BASE_HEX, NULL, 0,
"Capability information"}},
@@ -1675,16 +1787,28 @@
{&ff_cf_ess,
{"ESS capabilities", "wlan.fixed.capabilities.ess",
- FT_BOOLEAN, 1, TFS (&cf_ess_flags), 0x0001, "ESS capabilities"}},
+ FT_BOOLEAN, 8, TFS (&cf_ess_flags), 0x0001, "ESS capabilities"}},
{&ff_cf_ibss,
{"IBSS status", "wlan.fixed.capabilities.ibss",
- FT_BOOLEAN, 1, TFS (&cf_ibss_flags), 0x0002, "IBSS participation"}},
+ FT_BOOLEAN, 8, TFS (&cf_ibss_flags), 0x0002, "IBSS participation"}},
{&ff_cf_privacy,
{"Privacy", "wlan.fixed.capabilities.privacy",
- FT_BOOLEAN, 1, TFS (&cf_privacy_flags), 0x0010, "WEP support"}},
+ FT_BOOLEAN, 8, TFS (&cf_privacy_flags), 0x0010, "WEP support"}},
+
+ {&ff_cf_preamble,
+ {"Short Preamble", "wlan.fixed.capabilities.preamble",
+ FT_BOOLEAN, 8, TFS (&cf_preamble_flags), 0x0020, "Short Preamble"}},
+
+ {&ff_cf_pbcc,
+ {"PBCC", "wlan.fixed.capabilities.pbcc",
+ FT_BOOLEAN, 8, TFS (&cf_pbcc_flags), 0x0040, "PBCC Modulation"}},
+
+ {&ff_cf_agility,
+ {"Channel Agility", "wlan.fixed.capabilities.agility",
+ FT_BOOLEAN, 8, TFS (&cf_agility_flags), 0x0080, "Channel Agility"}},
{&ff_auth_seq,
@@ -1735,6 +1859,7 @@
&ett_proto_flags,
&ett_fixed_parameters,
&ett_tagged_parameters,
+ &ett_wep_parameters,
&ett_cap_tree,
};
- Follow-Ups:
- Re: [Ethereal-dev] 802.11
- From: Guy Harris
- Re: [Ethereal-dev] 802.11
- Prev by Date: [Ethereal-dev] packet-iscsi.c improvements
- Next by Date: [Ethereal-dev] Decode As problem
- Previous by thread: Re: [Ethereal-dev] packet-iscsi.c improvements
- Next by thread: Re: [Ethereal-dev] 802.11
- Index(es):





