ieee80211: Improve A-MSDU dissecting

Fix subframe length issue.
Add padding.

Signed-off-by: Chien Wong <m@xv97.com>
This commit is contained in:
Chien Wong 2022-08-19 21:52:31 +08:00 committed by Richard Sharpe
parent 3b7c611be1
commit 5c216de8cc
1 changed files with 27 additions and 4 deletions

View File

@ -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[] = {