aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2005-08-16 06:09:39 +0000
committerGuy Harris <guy@alum.mit.edu>2005-08-16 06:09:39 +0000
commitbc35e184c794f2539a33ca8c179650356f1bd480 (patch)
treecdc5be1f0b469018354df9bb5f16956c9aa89d9e
parent3b6b4817e127a587fb56a8746e2b7895bcd7933d (diff)
Change to match more closely the way I read 802.11h, at least; I'm just
guessing about the "17" indicator for "management notification" frames - I'm not sure whether, after paying USD 60 to get the current 802.11e draft, Preview on my Mac could even decrypt it. 802.11h seems to say in 7.2.3.12 and 7.3.1.11 that the body of an Action frame has a 1-byte Category field, with a value of 0 meaning "Spectrum management", followed by, for Spectrum management, a 1-byte Action field, with 0=Measurement Request, 1=Measurement Report, 2=TPC Request, 3=TPC Report, and 4=Channel Switch Announcement, followed by: for all but Channel Switch Announcement, a 1-byte Dialog Token followed by some tagged parameters; for the Channel Switch announcement, some tagged parameters. Show some fields given in decimal in various 802.11 specs in decimal, not hex. svn path=/trunk/; revision=15370
-rw-r--r--epan/dissectors/packet-ieee80211.c135
1 files changed, 79 insertions, 56 deletions
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c
index 3f76a7ae8a..f5d8d03a9e 100644
--- a/epan/dissectors/packet-ieee80211.c
+++ b/epan/dissectors/packet-ieee80211.c
@@ -390,6 +390,19 @@ static const char *wme_acs[4] = {
"Voice",
};
+
+#define CAT_SPECTRUM_MGMT 0
+#define CAT_QOS 1
+#define CAT_DLS 2
+#define CAT_BLOCK_ACK 3
+#define CAT_MGMT_NOTIFICATION 17
+
+#define SM_ACTION_MEASUREMENT_REQUEST 0
+#define SM_ACTION_MEASUREMENT_REPORT 1
+#define SM_ACTION_TPC_REQUEST 2
+#define SM_ACTION_TPC_REPORT 3
+#define SM_ACTION_CHAN_SWITCH_ANNC 4
+
static int proto_wlan = -1;
static packet_info * g_pinfo;
@@ -1687,13 +1700,12 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 4);
add_fixed_field (fixed_tree, tvb, 0, FIELD_CAP_INFO);
add_fixed_field (fixed_tree, tvb, 2, FIELD_LISTEN_IVAL);
-
offset = 4; /* Size of fixed fields */
+
tagged_parameter_tree_len =
tvb_reported_length_remaining(tvb, offset);
tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
tagged_parameter_tree_len);
-
ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
tagged_parameter_tree_len);
break;
@@ -1704,14 +1716,12 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
add_fixed_field (fixed_tree, tvb, 0, FIELD_CAP_INFO);
add_fixed_field (fixed_tree, tvb, 2, FIELD_STATUS_CODE);
add_fixed_field (fixed_tree, tvb, 4, FIELD_ASSOC_ID);
-
offset = 6; /* Size of fixed fields */
tagged_parameter_tree_len =
tvb_reported_length_remaining(tvb, offset);
tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
tagged_parameter_tree_len);
-
ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
tagged_parameter_tree_len);
break;
@@ -1722,29 +1732,27 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
add_fixed_field (fixed_tree, tvb, 0, FIELD_CAP_INFO);
add_fixed_field (fixed_tree, tvb, 2, FIELD_LISTEN_IVAL);
add_fixed_field (fixed_tree, tvb, 4, FIELD_CURRENT_AP_ADDR);
-
offset = 10; /* Size of fixed fields */
+
tagged_parameter_tree_len =
tvb_reported_length_remaining(tvb, offset);
tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
tagged_parameter_tree_len);
-
ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
tagged_parameter_tree_len);
break;
case MGT_REASSOC_RESP:
- fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 10);
+ fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 6);
add_fixed_field (fixed_tree, tvb, 0, FIELD_CAP_INFO);
add_fixed_field (fixed_tree, tvb, 2, FIELD_STATUS_CODE);
add_fixed_field (fixed_tree, tvb, 4, FIELD_ASSOC_ID);
-
offset = 6; /* Size of fixed fields */
+
tagged_parameter_tree_len =
tvb_reported_length_remaining(tvb, offset);
tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
tagged_parameter_tree_len);
-
ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
tagged_parameter_tree_len);
break;
@@ -1756,7 +1764,6 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
tvb_reported_length_remaining(tvb, offset);
tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
tagged_parameter_tree_len);
-
ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
tagged_parameter_tree_len);
break;
@@ -1767,13 +1774,12 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
add_fixed_field (fixed_tree, tvb, 0, FIELD_TIMESTAMP);
add_fixed_field (fixed_tree, tvb, 8, FIELD_BEACON_INTERVAL);
add_fixed_field (fixed_tree, tvb, 10, FIELD_CAP_INFO);
-
offset = 12; /* Size of fixed fields */
+
tagged_parameter_tree_len =
tvb_reported_length_remaining(tvb, offset);
tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
tagged_parameter_tree_len);
-
ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
tagged_parameter_tree_len);
break;
@@ -1781,17 +1787,15 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
case MGT_BEACON: /* Dissect protocol payload fields */
fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 12);
-
add_fixed_field (fixed_tree, tvb, 0, FIELD_TIMESTAMP);
add_fixed_field (fixed_tree, tvb, 8, FIELD_BEACON_INTERVAL);
add_fixed_field (fixed_tree, tvb, 10, FIELD_CAP_INFO);
-
offset = 12; /* Size of fixed fields */
+
tagged_parameter_tree_len =
tvb_reported_length_remaining(tvb, offset);
tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
tagged_parameter_tree_len);
-
ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
tagged_parameter_tree_len);
break;
@@ -1812,7 +1816,6 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
add_fixed_field (fixed_tree, tvb, 0, FIELD_AUTH_ALG);
add_fixed_field (fixed_tree, tvb, 2, FIELD_AUTH_TRANS_SEQ);
add_fixed_field (fixed_tree, tvb, 4, FIELD_STATUS_CODE);
-
offset = 6; /* Size of fixed fields */
tagged_parameter_tree_len =
@@ -1823,7 +1826,6 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
tvb,
offset,
tagged_parameter_tree_len);
-
ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
tagged_parameter_tree_len);
}
@@ -1837,36 +1839,62 @@ dissect_ieee80211_mgt (guint16 fcf, tvbuff_t * tvb, packet_info * pinfo,
case MGT_ACTION:
- fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 3);
- add_fixed_field (fixed_tree, tvb, 0, FIELD_CATEGORY_CODE);
-
switch (tvb_get_guint8(tvb, 0))
{
- case 17: /* Management notification frame */
+ case CAT_SPECTRUM_MGMT:
+ switch (tvb_get_guint8(tvb, 1))
+ {
+ case SM_ACTION_MEASUREMENT_REQUEST:
+ case SM_ACTION_MEASUREMENT_REPORT:
+ case SM_ACTION_TPC_REQUEST:
+ case SM_ACTION_TPC_REPORT:
+ fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 3);
+ add_fixed_field (fixed_tree, tvb, 0, FIELD_CATEGORY_CODE);
+ add_fixed_field (fixed_tree, tvb, 1, FIELD_ACTION_CODE);
+ add_fixed_field (fixed_tree, tvb, 2, FIELD_DIALOG_TOKEN);
+ offset = 3; /* Size of fixed fields */
+ break;
+
+ case SM_ACTION_CHAN_SWITCH_ANNC:
+ fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 2);
+ add_fixed_field (fixed_tree, tvb, 0, FIELD_CATEGORY_CODE);
+ offset = 2; /* Size of fixed fields */
+ break;
+
+ default:
+ fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 2);
+ add_fixed_field (fixed_tree, tvb, 0, FIELD_CATEGORY_CODE);
+ offset = 2; /* Size of fixed fields */
+ break;
+ }
+ break;
+
+ case CAT_MGMT_NOTIFICATION: /* Management notification frame */
+ fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 4);
+ add_fixed_field (fixed_tree, tvb, 0, FIELD_CATEGORY_CODE);
add_fixed_field (fixed_tree, tvb, 1, FIELD_WME_ACTION_CODE);
add_fixed_field (fixed_tree, tvb, 2, FIELD_DIALOG_TOKEN);
add_fixed_field (fixed_tree, tvb, 3, FIELD_WME_STATUS_CODE);
-
offset = 4; /* Size of fixed fields */
-
- tagged_parameter_tree_len =
- tvb_reported_length_remaining(tvb, offset);
- if (tagged_parameter_tree_len != 0)
- {
- tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
-
- ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len);
- }
break;
- default: /* Management action frame */
- add_fixed_field (fixed_tree, tvb, 1, FIELD_ACTION_CODE);
- add_fixed_field (fixed_tree, tvb, 2, FIELD_DIALOG_TOKEN);
+ default:
+ fixed_tree = get_fixed_parameter_tree (mgt_tree, tvb, 0, 1);
+ add_fixed_field (fixed_tree, tvb, 0, FIELD_CATEGORY_CODE);
+ offset = 1; /* Size of fixed fields */
break;
}
+
+ tagged_parameter_tree_len =
+ tvb_reported_length_remaining(tvb, offset);
+ if (tagged_parameter_tree_len != 0)
+ {
+ tagged_tree = get_tagged_parameter_tree (mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters (tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len);
+ }
break;
}
}
@@ -3242,26 +3270,21 @@ proto_register_ieee80211 (void)
};
static const value_string category_codes[] = {
- {0x11, "Management notification frame"},
- {0x00, NULL}
- };
-
- static const value_string action_codes[] = {
- {0x00, "Spectrum Management"},
- {0x01, "QoS"},
- {0x02, "DLS"},
- {0x03, "Block Ack"},
- {0x00, NULL}
+ {CAT_SPECTRUM_MGMT, "Spectrum Management"},
+ {CAT_QOS, "QoS"},
+ {CAT_QOS, "DLS"},
+ {CAT_BLOCK_ACK, "Block Ack"},
+ {CAT_MGMT_NOTIFICATION, "Management notification frame"},
+ {0, NULL}
};
- /* XXX - Table 20e, IEEE 802.11h. Why aren't we using it? */
- static const value_string spec_man_action[] ={
- {0x00, "Measurement Request"},
- {0x01, "Measurement Report"},
- {0x02, "TPC Request"},
- {0x03, "TPC Report"},
- {0x04, "Channel Switch Announcement"},
- {0x00, NULL}
+ static const value_string action_codes[] ={
+ {SM_ACTION_MEASUREMENT_REQUEST, "Measurement Request"},
+ {SM_ACTION_MEASUREMENT_REPORT, "Measurement Report"},
+ {SM_ACTION_TPC_REQUEST, "TPC Request"},
+ {SM_ACTION_TPC_REPORT, "TPC Report"},
+ {SM_ACTION_CHAN_SWITCH_ANNC, "Channel Switch Announcement"},
+ {0, NULL}
};
static const value_string wme_action_codes[] = {
@@ -3628,12 +3651,12 @@ proto_register_ieee80211 (void)
{&ff_category_code,
{"Category code", "wlan_mgt.fixed.category_code",
- FT_UINT16, BASE_HEX, VALS (&category_codes), 0,
+ FT_UINT16, BASE_DEC, VALS (&category_codes), 0,
"Management action category", HFILL }},
{&ff_action_code,
{"Action code", "wlan_mgt.fixed.action_code",
- FT_UINT16, BASE_HEX, VALS (&action_codes), 0,
+ FT_UINT16, BASE_DEC, VALS (&action_codes), 0,
"Management action code", HFILL }},
{&ff_dialog_token,