aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2016-03-16 12:36:38 -0700
committerGuy Harris <guy@alum.mit.edu>2016-03-16 19:36:48 +0000
commit53e8bb89cd1b2558006a1b7ed44695282d6d06d3 (patch)
treefae66618137c17fe321eade08f3008dddd90eaa8
parent597b227aab07be0b57bc6e27f8ee58b5cc43d3c6 (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.c68
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);