diff --git a/patches/openwrt/0013-mac80211-mask-nested-A-MSDU-support-for-mesh.patch b/patches/openwrt/0013-mac80211-mask-nested-A-MSDU-support-for-mesh.patch new file mode 100644 index 00000000..694be04c --- /dev/null +++ b/patches/openwrt/0013-mac80211-mask-nested-A-MSDU-support-for-mesh.patch @@ -0,0 +1,52 @@ +From: David Bauer +Date: Fri, 8 Oct 2021 00:30:23 +0200 +Subject: 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 +(cherry picked from commit f96744ba6b2fd444f4f7575d234c7579bd3030cd) + +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 0000000000000000000000000000000000000000..415c6dfb803639cd726ee3f9b35359712b3e075d +--- /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);