blob: 26c07c3ccc8524826a4f68e2370a615ec6a90d70 [file] [log] [blame]
developer5f1d3ca2024-04-25 05:25:22 +08001From 06d3d93fc257b9f8cef083b9b84711fc9c3cee19 Mon Sep 17 00:00:00 2001
developer0415fc32024-04-19 18:29:00 +08002From: Michael-CY Lee <michael-cy.lee@mediatek.com>
3Date: Wed, 21 Feb 2024 16:32:13 +0800
4Subject: [PATCH 54/61] mtk: mac80211: send broadcast/multicast mgmt. via all
5 links.
6
7This patch makes broadcast/multicast mgmt. be sent via all links.
8
developer0415fc32024-04-19 18:29:00 +08009Signed-off-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
10Change-id: Id1bd06694a73cc29b3f571a57c4c864ee3742441
11---
12 net/mac80211/offchannel.c | 20 +++++++++++++++++++-
13 1 file changed, 19 insertions(+), 1 deletion(-)
14
15diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
16index 3ed5fc5..ec1d7a1 100644
17--- a/net/mac80211/offchannel.c
18+++ b/net/mac80211/offchannel.c
19@@ -976,7 +976,25 @@ int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
20 }
21
22 if (!need_offchan) {
23- ieee80211_tx_skb_tid(sdata, skb, 7, link_id);
24+ unsigned long links = sdata->vif.active_links;
25+ if (is_multicast_ether_addr(mgmt->da) && hweight16(links) > 1) {
26+ unsigned int link;
27+ struct sk_buff *dskb;
28+
29+ for_each_set_bit(link, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
30+ dskb = skb_clone(skb, GFP_ATOMIC);
31+ if (dskb) {
32+ ieee80211_tx_skb_tid(sdata, dskb, 7, link);
33+ } else {
34+ ret = -ENOMEM;
35+ kfree_skb(skb);
36+ goto out_unlock;
37+ }
38+ }
39+ kfree_skb(skb);
40+ } else {
41+ ieee80211_tx_skb_tid(sdata, skb, 7, link_id);
42+ }
43 ret = 0;
44 goto out_unlock;
45 }
46--
developer5f1d3ca2024-04-25 05:25:22 +0800472.18.0
developer0415fc32024-04-19 18:29:00 +080048