diff options
author | Chien Wong <m@xv97.com> | 2022-08-19 21:52:31 +0800 |
---|---|---|
committer | Richard Sharpe <realrichardsharpe@gmail.com> | 2022-08-20 16:43:32 +0000 |
commit | 5c216de8cc9df808d9da1bc864ed89154ee51cfd (patch) | |
tree | 9bc0113614469cd7cf8f4f85c5f903a9d61e6ebb /epan | |
parent | 3b7c611be158ed4995f61b70783d1574fc3be45a (diff) |
ieee80211: Improve A-MSDU dissecting
Fix subframe length issue.
Add padding.
Signed-off-by: Chien Wong <m@xv97.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-ieee80211.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c index 1ef129a80b..803c6a5052 100644 --- a/epan/dissectors/packet-ieee80211.c +++ b/epan/dissectors/packet-ieee80211.c @@ -4518,6 +4518,7 @@ static int hf_ieee80211_ff_cf_reserved6 = -1; /* ************************************************************************* */ static int hf_ieee80211_amsdu_subframe = -1; static int hf_ieee80211_amsdu_length = -1; +static int hf_ieee80211_amsdu_padding = -1; /* ************************************************************************* */ /* Tagged value format fields */ @@ -34779,6 +34780,8 @@ dissect_ieee80211_pv0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, tvbuff_t *msdu_tvb; guint16 msdu_length; proto_tree *subframe_tree; + gboolean last_subframe = FALSE; + guint16 subframe_length; const gchar *resolve_name; /* @@ -34793,8 +34796,17 @@ dissect_ieee80211_pv0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, */ msdu_length = tvb_get_ntohs(next_tvb, msdu_offset+12); + if (tvb_reported_length_remaining(next_tvb, msdu_offset+14+msdu_length) <= 14) + last_subframe = TRUE; + + /* The last A-MSDU subframe has no padding. */ + if (last_subframe) + subframe_length = 14+msdu_length; + else + subframe_length = WS_ROUNDUP_4(14+msdu_length); + parent_item = proto_tree_add_item(mpdu_tree, hf_ieee80211_amsdu_subframe, next_tvb, - msdu_offset, WS_ROUNDUP_4(msdu_offset+14+msdu_length), ENC_NA); + msdu_offset, subframe_length, ENC_NA); proto_item_append_text(parent_item, " #%u", i); subframe_tree = proto_item_add_subtree(parent_item, ett_msdu_aggregation_subframe_tree); i += 1; @@ -34814,6 +34826,12 @@ dissect_ieee80211_pv0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, msdu_offset += 14; msdu_tvb = tvb_new_subset_length(next_tvb, msdu_offset, msdu_length); call_dissector(llc_handle, msdu_tvb, pinfo, subframe_tree); + if (!last_subframe) { + guint8 padding = (4-((msdu_offset+msdu_length)&3))&3; + if (padding > 0) + proto_tree_add_item(subframe_tree, hf_ieee80211_amsdu_padding, next_tvb, msdu_offset+msdu_length, padding, ENC_NA); + } + msdu_offset = WS_ROUNDUP_4(msdu_offset+msdu_length); } while (tvb_reported_length_remaining(next_tvb, msdu_offset) > 14); } else { @@ -51440,14 +51458,19 @@ proto_register_ieee80211(void) static hf_register_info aggregate_fields[] = { {&hf_ieee80211_amsdu_subframe, - {"A-MSDU Subframe", "wlan_aggregate.a_mdsu.subframe", + {"A-MSDU Subframe", "wlan_aggregate.a_msdu.subframe", FT_NONE, BASE_NONE, NULL, 0x0, "Aggregate MAC Service Data Unit (MSDU) Subframe", HFILL }}, {&hf_ieee80211_amsdu_length, - {"A-MSDU Length", "wlan_aggregate.a_mdsu.length", + {"A-MSDU Length", "wlan_aggregate.a_msdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, - NULL, HFILL }} + NULL, HFILL }}, + + {&hf_ieee80211_amsdu_padding, + {"A-MSDU Padding", "wlan_aggregate.a_msdu.padding", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, }; static uat_field_t wep_uat_flds[] = { |