diff options
author | Joerg Mayer <jmayer@loplof.de> | 2017-03-10 14:54:21 +0100 |
---|---|---|
committer | Jörg Mayer <jmayer@loplof.de> | 2017-03-10 13:57:07 +0000 |
commit | eb19d3517d3a974a76f80f7651e8b883e227eb76 (patch) | |
tree | 8c2fdbf83b5e40c895cdf0b78424cff169b64838 /epan | |
parent | d91cd6865a286e024cfe1c254b88fcb8ddc69b1b (diff) |
Add decoding of EDCA IE
Bug: 13472
Change-Id: Iff8b3e532680ada668581263476b6557518acc50
Reviewed-on: https://code.wireshark.org/review/20486
Reviewed-by: Jörg Mayer <jmayer@loplof.de>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-ieee80211.c | 136 |
1 files changed, 72 insertions, 64 deletions
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c index 81f345e04b..20995b6e04 100644 --- a/epan/dissectors/packet-ieee80211.c +++ b/epan/dissectors/packet-ieee80211.c @@ -10023,6 +10023,67 @@ dissect_wme_qos_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int of } static int +decode_qos_parameter_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype) +{ + int i; + /* WME QoS Info Field */ + offset = dissect_wme_qos_info(tree, tvb, pinfo, offset, ftype); + proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_reserved, tvb, offset, 1, ENC_NA); + offset += 1; + /* AC Parameters */ + for (i = 0; i < 4; i++) + { + proto_item *ac_item, *aci_aifsn_item, *ecw_item; + proto_tree *ac_tree, *aci_aifsn_tree, *ecw_tree; + guint8 aci_aifsn, ecw, ecwmin, ecwmax; + guint16 cwmin, cwmax; + + ac_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_ac_parameters, tvb, offset, 4, ENC_NA); + ac_tree = proto_item_add_subtree(ac_item, ett_wme_ac); + + /* ACI/AIFSN Field */ + aci_aifsn_item = proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_aci_aifsn, tvb, offset, 1, ENC_NA); + aci_aifsn_tree = proto_item_add_subtree(aci_aifsn_item, ett_wme_aci_aifsn); + proto_tree_add_item(aci_aifsn_tree, hf_ieee80211_wfa_ie_wme_acp_aci, tvb, offset, 1, ENC_NA); + proto_tree_add_item(aci_aifsn_tree, hf_ieee80211_wfa_ie_wme_acp_acm, tvb, offset, 1, ENC_NA); + proto_tree_add_item(aci_aifsn_tree, hf_ieee80211_wfa_ie_wme_acp_aifsn, tvb, offset, 1, ENC_NA); + proto_tree_add_item(aci_aifsn_tree, hf_ieee80211_wfa_ie_wme_acp_reserved, tvb, offset, 1, ENC_NA); + aci_aifsn = tvb_get_guint8(tvb, offset); + /* 802.11-2012, 8.4.2.31 EDCA Parameter Set element */ + if (aci_aifsn < 2) { + expert_add_info_format(pinfo, aci_aifsn_tree, &ei_ieee80211_qos_bad_aifsn, + "The minimum value for the AIFSN subfield is 2 (found %u).", aci_aifsn); + } + proto_item_append_text(ac_item, " ACI %u (%s), ACM %s, AIFSN %u", + (aci_aifsn & 0x60) >> 5, try_val_to_str((aci_aifsn & 0x60) >> 5, ieee80211_wfa_ie_wme_acs_vals), + (aci_aifsn & 0x10) ? "yes" : "no", aci_aifsn & 0x0f); + offset += 1; + + /* ECWmin/ECWmax field */ + ecw_item = proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_ecw, tvb, offset, 1, ENC_NA); + ecw_tree = proto_item_add_subtree(ecw_item, ett_wme_ecw); + ecw = tvb_get_guint8(tvb, offset); + ecwmin = ecw & 0x0f; + ecwmax = (ecw & 0xf0) >> 4; + cwmin= (1 << ecwmin) - 1; + cwmax= (1 << ecwmax) - 1; + proto_tree_add_item(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_ecw_max, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_ecw_min, tvb, offset, 1, ENC_NA); + proto_tree_add_uint(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_cw_max, tvb, offset, 1, cwmax); + proto_tree_add_uint(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_cw_min, tvb, offset, 1, cwmin); + proto_item_append_text(ac_item, ", ECWmin/max %u/%u (CWmin/max %u/%u)", ecwmin, ecwmax, cwmin, cwmax); + offset += 1; + + /* TXOP Limit */ + proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_txop_limit, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(ac_item, ", TXOP %u", tvb_get_letohs(tvb, offset)); + offset += 2; + } + + return offset; +} + +static int dissect_vendor_ie_wpawme(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 tag_len, int ftype) { guint8 type; @@ -10127,60 +10188,7 @@ dissect_vendor_ie_wpawme(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, in } case 1: /* WME Parameter Element */ { - int i; - /* WME QoS Info Field */ - offset = dissect_wme_qos_info(tree, tvb, pinfo, offset, ftype); - proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_reserved, tvb, offset, 1, ENC_NA); - offset += 1; - /* AC Parameters */ - for (i = 0; i < 4; i++) - { - proto_item *ac_item, *aci_aifsn_item, *ecw_item; - proto_tree *ac_tree, *aci_aifsn_tree, *ecw_tree; - guint8 aci_aifsn, ecw, ecwmin, ecwmax; - guint16 cwmin, cwmax; - - ac_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_ac_parameters, tvb, offset, 4, ENC_NA); - ac_tree = proto_item_add_subtree(ac_item, ett_wme_ac); - - /* ACI/AIFSN Field */ - aci_aifsn_item = proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_aci_aifsn, tvb, offset, 1, ENC_NA); - aci_aifsn_tree = proto_item_add_subtree(aci_aifsn_item, ett_wme_aci_aifsn); - proto_tree_add_item(aci_aifsn_tree, hf_ieee80211_wfa_ie_wme_acp_aci, tvb, offset, 1, ENC_NA); - proto_tree_add_item(aci_aifsn_tree, hf_ieee80211_wfa_ie_wme_acp_acm, tvb, offset, 1, ENC_NA); - proto_tree_add_item(aci_aifsn_tree, hf_ieee80211_wfa_ie_wme_acp_aifsn, tvb, offset, 1, ENC_NA); - proto_tree_add_item(aci_aifsn_tree, hf_ieee80211_wfa_ie_wme_acp_reserved, tvb, offset, 1, ENC_NA); - aci_aifsn = tvb_get_guint8(tvb, offset); - /* 802.11-2012, 8.4.2.31 EDCA Parameter Set element */ - if (aci_aifsn < 2) { - expert_add_info_format(pinfo, aci_aifsn_tree, &ei_ieee80211_qos_bad_aifsn, - "The minimum value for the AIFSN subfield is 2 (found %u).", aci_aifsn); - } - proto_item_append_text(ac_item, " ACI %u (%s), ACM %s, AIFSN %u", - (aci_aifsn & 0x60) >> 5, try_val_to_str((aci_aifsn & 0x60) >> 5, ieee80211_wfa_ie_wme_acs_vals), - (aci_aifsn & 0x10) ? "yes" : "no", aci_aifsn & 0x0f); - offset += 1; - - /* ECWmin/ECWmax field */ - ecw_item = proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_ecw, tvb, offset, 1, ENC_NA); - ecw_tree = proto_item_add_subtree(ecw_item, ett_wme_ecw); - ecw = tvb_get_guint8(tvb, offset); - ecwmin = ecw & 0x0f; - ecwmax = (ecw & 0xf0) >> 4; - cwmin= (1 << ecwmin) - 1; - cwmax= (1 << ecwmax) - 1; - proto_tree_add_item(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_ecw_max, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_ecw_min, tvb, offset, 1, ENC_NA); - proto_tree_add_uint(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_cw_max, tvb, offset, 1, cwmax); - proto_tree_add_uint(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_cw_min, tvb, offset, 1, cwmin); - proto_item_append_text(ac_item, ", ECWmin/max %u/%u (CWmin/max %u/%u)", ecwmin, ecwmax, cwmin, cwmax); - offset += 1; - - /* TXOP Limit */ - proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_txop_limit, tvb, offset, 2, ENC_LITTLE_ENDIAN); - proto_item_append_text(ac_item, ", TXOP %u", tvb_get_letohs(tvb, offset)); - offset += 2; - } + offset = decode_qos_parameter_set(tree, tvb, pinfo, offset, ftype); break; } case 2: /* WME TSPEC Element */ @@ -14329,21 +14337,23 @@ ieee80211_tag_qbss_load(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi return tvb_captured_length(tvb); } -#if 0 /* ToDo */ /* 8.4.2.31 in 802-11-2012 */ static int ieee80211_tag_edca_param_set(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { + int tag_len = tvb_reported_length(tvb); + ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data; int offset = 0; - offset += add_ff_qos_info_ap(tree, tvb, pinfo, offset); - offset += 1; /* reserved */ - offset += 4; /* AC_BE */ - offset += 4; /* AC_BK */ - offset += 4; /* AC_VI */ - offset += 4; /* AC_VO */ + + if ((tag_len != 18)) + { + expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 18", tag_len); + return tvb_captured_length(tvb); + } + + offset = decode_qos_parameter_set(tree, tvb, pinfo, offset, field_data->ftype); return tvb_captured_length(tvb); } -#endif /* TSPEC element (13) */ static int @@ -28114,9 +28124,7 @@ proto_reg_handoff_ieee80211(void) dissector_add_uint("wlan.tag.number", TAG_FH_HOPPING_TABLE, create_dissector_handle(ieee80211_tag_fh_hopping_table, -1)); dissector_add_uint("wlan.tag.number", TAG_REQUEST, create_dissector_handle(ieee80211_tag_request, -1)); dissector_add_uint("wlan.tag.number", TAG_QBSS_LOAD, create_dissector_handle(ieee80211_tag_qbss_load, -1)); -#if 0 dissector_add_uint("wlan.tag.number", TAG_EDCA_PARAM_SET, create_dissector_handle(ieee80211_tag_edca_param_set, -1)); -#endif dissector_add_uint("wlan.tag.number", TAG_TSPEC, create_dissector_handle(ieee80211_tag_tspec, -1)); dissector_add_uint("wlan.tag.number", TAG_TCLAS, create_dissector_handle(ieee80211_tag_tclas, -1)); dissector_add_uint("wlan.tag.number", TAG_SCHEDULE, create_dissector_handle(ieee80211_tag_schedule, -1)); |