ieee80211: Improve A-MSDU dissecting
Fix subframe length issue. Add padding. Signed-off-by: Chien Wong <m@xv97.com>
This commit is contained in:
parent
3b7c611be1
commit
5c216de8cc
|
@ -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[] = {
|
||||
|
|
Loading…
Reference in New Issue