blob: 9bbab6075fbcd9e6d09d533818a08bf8646af7cb [file] [log] [blame]
developer5f1d3ca2024-04-25 05:25:22 +08001From c1553f36bfb1b80be2306a50d98c0a2d256725b7 Mon Sep 17 00:00:00 2001
developer0415fc32024-04-19 18:29:00 +08002From: Peter Chiu <chui-hao.chiu@mediatek.com>
3Date: Tue, 6 Feb 2024 15:03:49 +0800
4Subject: [PATCH 49/61] mtk: mac80211: remove links when removing AP_VLAN
5 interface
6
7Remove links information when removing AP_VLAN interface.
8Without this patch, there would be a kernel crash when station disconnect
9from AP.
10
developer0415fc32024-04-19 18:29:00 +080011Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
developer0415fc32024-04-19 18:29:00 +080012---
13 net/mac80211/cfg.c | 14 ++++++++++++++
14 net/mac80211/iface.c | 4 ++--
15 net/mac80211/mlme.c | 1 -
16 net/wireless/util.c | 8 ++++++++
17 4 files changed, 24 insertions(+), 3 deletions(-)
18
19diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
20index 871623d..c3b9d10 100644
21--- a/net/mac80211/cfg.c
22+++ b/net/mac80211/cfg.c
23@@ -4929,6 +4929,20 @@ static void ieee80211_del_intf_link(struct wiphy *wiphy,
24 {
25 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
26
27+ if (wdev->iftype == NL80211_IFTYPE_AP_VLAN) {
28+ int i;
29+
30+ sdata->vif.valid_links = 0;
31+ sdata->vif.active_links = 0;
32+ sdata->vif.dormant_links = 0;
33+ for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
34+ rcu_assign_pointer(sdata->link[i], NULL);
35+ rcu_assign_pointer(sdata->vif.link_conf[i], NULL);
36+ }
37+
38+ return;
39+ }
40+
41 lockdep_assert_wiphy(sdata->local->hw.wiphy);
42
43 ieee80211_vif_set_links(sdata, wdev->valid_links, 0);
44diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
developer5f1d3ca2024-04-25 05:25:22 +080045index be52a83..e41bf5c 100644
developer0415fc32024-04-19 18:29:00 +080046--- a/net/mac80211/iface.c
47+++ b/net/mac80211/iface.c
developer5f1d3ca2024-04-25 05:25:22 +080048@@ -397,8 +397,8 @@ static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata,
49 sdata->link[i] == &sdata->deflink)
50 continue;
51
developer0415fc32024-04-19 18:29:00 +080052- sdata->link[i] = nsdata->link[i];
53- sdata->vif.link_conf[i] = nsdata->vif.link_conf[i];
54+ rcu_assign_pointer(sdata->link[i], nsdata->link[i]);
55+ rcu_assign_pointer(sdata->vif.link_conf[i], nsdata->vif.link_conf[i]);
56 }
57 }
58 }
59diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
60index e4564de..ebdcf57 100644
61--- a/net/mac80211/mlme.c
62+++ b/net/mac80211/mlme.c
63@@ -1829,7 +1829,6 @@ void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
64 {
65 struct sk_buff *skb;
66 struct ieee80211_hdr *nullfunc;
67- u8 assoc_link_id = ifmgd->assoc_data->assoc_link_id;
68 __le16 fc;
69
70 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
71diff --git a/net/wireless/util.c b/net/wireless/util.c
72index 2bde8a3..d03f612 100644
73--- a/net/wireless/util.c
74+++ b/net/wireless/util.c
75@@ -2826,6 +2826,14 @@ void cfg80211_remove_links(struct wireless_dev *wdev)
76 {
77 unsigned int link_id;
78
79+ if (wdev->iftype == NL80211_IFTYPE_AP_VLAN) {
80+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
81+
82+ if (rdev->ops->del_intf_link)
83+ rdev->ops->del_intf_link(&rdev->wiphy, wdev, 0);
84+
85+ return;
86+ }
87 /*
88 * links are controlled by upper layers (userspace/cfg)
89 * only for AP mode, so only remove them here for AP
90--
developer5f1d3ca2024-04-25 05:25:22 +0800912.18.0
developer0415fc32024-04-19 18:29:00 +080092