aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,