From f96744ba6b2fd444f4f7575d234c7579bd3030cd Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 8 Oct 2021 00:30:23 +0200 Subject: [PATCH] mac80211: mask nested A-MSDU support for mesh mac80211 incorrectly processes A-MSDUs contained in A-MPDU frames. This results in dropped packets and severely impacted throughput. As a workaround, don't indicate support for A-MSDUs contained in A-MPDUs. This improves throughput over mesh links by factor 10. Ref: https://github.com/openwrt/mt76/issues/450 Signed-off-by: David Bauer --- ...-mask-nested-A-MSDU-support-for-mesh.patch | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 package/kernel/mac80211/patches/subsys/800-mac80211-mask-nested-A-MSDU-support-for-mesh.patch diff --git a/package/kernel/mac80211/patches/subsys/800-mac80211-mask-nested-A-MSDU-support-for-mesh.patch b/package/kernel/mac80211/patches/subsys/800-mac80211-mask-nested-A-MSDU-support-for-mesh.patch new file mode 100644 index 0000000000..415c6dfb80 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/800-mac80211-mask-nested-A-MSDU-support-for-mesh.patch @@ -0,0 +1,31 @@ +From 313d8c18385f10957402b475f9b0c209ceab6c5a Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Fri, 8 Oct 2021 00:25:19 +0200 +Subject: [PATCH] mac80211: mask nested A-MSDU support for mesh + +mac80211 incorrectly processes A-MSDUs contained in A-MPDU frames. This +results in dropped packets and severely impacted throughput. + +As a workaround, don't indicate support for A-MSDUs contained in +A-MPDUs. This improves throughput over mesh links by factor 10. + +Ref: https://github.com/openwrt/mt76/issues/450 + +Signed-off-by: David Bauer +--- + net/mac80211/agg-rx.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/net/mac80211/agg-rx.c ++++ b/net/mac80211/agg-rx.c +@@ -251,7 +251,9 @@ static void ieee80211_send_addba_resp(st + mgmt->u.action.u.addba_resp.action_code = WLAN_ACTION_ADDBA_RESP; + mgmt->u.action.u.addba_resp.dialog_token = dialog_token; + +- capab = u16_encode_bits(amsdu, IEEE80211_ADDBA_PARAM_AMSDU_MASK); ++ capab = 0; ++ if (!sta->mesh) ++ capab = u16_encode_bits(amsdu, IEEE80211_ADDBA_PARAM_AMSDU_MASK); + capab |= u16_encode_bits(policy, IEEE80211_ADDBA_PARAM_POLICY_MASK); + capab |= u16_encode_bits(tid, IEEE80211_ADDBA_PARAM_TID_MASK); + capab |= u16_encode_bits(buf_size, IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK); -- 2.30.2