aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorChien Wong <m@xv97.com>2022-08-19 21:52:31 +0800
committerRichard Sharpe <realrichardsharpe@gmail.com>2022-08-20 16:43:32 +0000
commit5c216de8cc9df808d9da1bc864ed89154ee51cfd (patch)
tree9bc0113614469cd7cf8f4f85c5f903a9d61e6ebb /epan
parent3b7c611be158ed4995f61b70783d1574fc3be45a (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.c31
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[] = {