diff options
author | Guy Harris <guy@alum.mit.edu> | 2016-03-16 12:36:38 -0700 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2016-03-16 19:36:48 +0000 |
commit | 53e8bb89cd1b2558006a1b7ed44695282d6d06d3 (patch) | |
tree | fae66618137c17fe321eade08f3008dddd90eaa8 | |
parent | 597b227aab07be0b57bc6e27f8ee58b5cc43d3c6 (diff) |
Fix dissection of control frames.
Don't conditiionalize stuff that should always be done with a test of
whether the protocol tree is being constructed or not.
Don't add an extra bogus address field to CF-End frames.
Bug: 12266
Change-Id: I0840d63480f9d7d8ffa434d984082a4a46a00d12
Reviewed-on: https://code.wireshark.org/review/14493
Reviewed-by: Guy Harris <guy@alum.mit.edu>
-rw-r--r-- | epan/dissectors/packet-ieee80211.c | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c index 0b279c9902..ac5d4af4d6 100644 --- a/epan/dissectors/packet-ieee80211.c +++ b/epan/dissectors/packet-ieee80211.c @@ -16960,37 +16960,27 @@ dissect_ieee80211_common (tvbuff_t *tvb, packet_info *pinfo, /* * Start shoving in other fields if needed. */ - if ((frame_type_subtype == CTRL_CONTROL_WRAPPER) && tree) { - cw_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2, - ett_cntrl_wrapper_fc, NULL, "Contained Frame Control"); - dissect_frame_control(cw_tree, tvb, FALSE, offset, pinfo); - dissect_ht_control(hdr_tree, tvb, offset + 2); - offset += 6; - hdr_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2, - ett_cntrl_wrapper_fc, &cw_item, "Carried Frame"); - if(isDMG == TRUE) { - expert_add_info_format(pinfo, cw_item, &ei_ieee80211_dmg_subtype, - "DMG STA shouldn't transmit Control Wrapper frame"); - } - } - - if ((frame_type_subtype == CTRL_CFP_END) && tree) { - if(isDMG == TRUE) - set_src_addr_cols(pinfo, tvb, offset, "TA"); - else - set_src_addr_cols(pinfo, tvb, offset, "BSSID"); - if (tree) { - proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA); - hidden_item = proto_tree_add_item (hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA); - PROTO_ITEM_SET_HIDDEN(hidden_item); - } + if (frame_type_subtype == CTRL_CONTROL_WRAPPER) { + if (tree) { + cw_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2, + ett_cntrl_wrapper_fc, NULL, "Contained Frame Control"); + dissect_frame_control(cw_tree, tvb, FALSE, offset, pinfo); + dissect_ht_control(hdr_tree, tvb, offset + 2); + } offset += 6; + if (tree) { + hdr_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2, + ett_cntrl_wrapper_fc, &cw_item, "Carried Frame"); + } + if (isDMG) { + expert_add_info_format(pinfo, cw_item, &ei_ieee80211_dmg_subtype, + "DMG STA shouldn't transmit Control Wrapper frame"); + } } switch (ctrl_type_subtype) { case CTRL_PS_POLL: - case CTRL_CFP_END: case CTRL_CFP_ENDACK: { set_src_addr_cols(pinfo, tvb, offset, "BSSID"); @@ -17008,6 +16998,32 @@ dissect_ieee80211_common (tvbuff_t *tvb, packet_info *pinfo, break; } + case CTRL_CFP_END: + { + if (isDMG) + set_src_addr_cols(pinfo, tvb, offset, "TA"); + else + set_src_addr_cols(pinfo, tvb, offset, "BSSID"); + if (tree) { + const gchar *ether_name = tvb_get_ether_name(tvb, offset); + if (isDMG) { + proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA); + hidden_item = proto_tree_add_string (hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, offset, 6, ether_name); + PROTO_ITEM_SET_HIDDEN(hidden_item); + } else { + proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, offset, 6, ENC_NA); + hidden_item = proto_tree_add_string (hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name); + PROTO_ITEM_SET_HIDDEN(hidden_item); + } + hidden_item = proto_tree_add_item (hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_string (hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name); + PROTO_ITEM_SET_HIDDEN(hidden_item); + offset += 6; + } + break; + } + case CTRL_BEAMFORM_RPT_POLL: { set_src_addr_cols(pinfo, tvb, offset, "TA"); @@ -18393,7 +18409,7 @@ dissect_ieee80211_common (tvbuff_t *tvb, packet_info *pinfo, } pinfo->fragmented = save_fragmented; - end_of_wlan: +end_of_wlan: whdr->stats = wlan_stats; tap_queue_packet(wlan_tap, pinfo, whdr); memset (&wlan_stats, 0, sizeof wlan_stats); |