blob: d6fd5f441ac467d8d75846fb234bce70c1d9965b [file] [log] [blame]
From cf275081660642ebfc9aaef0722ac499922fb17b Mon Sep 17 00:00:00 2001
From: Peter Chiu <chui-hao.chiu@mediatek.com>
Date: Tue, 6 Feb 2024 15:03:49 +0800
Subject: [PATCH 49/61] mtk: mac80211: remove links when removing AP_VLAN
interface
Remove links information when removing AP_VLAN interface.
Without this patch, there would be a kernel crash when station disconnect
from AP.
CR-Id: WCNCR00240772
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Change-Id: Idffdc83cd6a13bc01b7f877fb748a8a08e99c212
---
net/mac80211/cfg.c | 14 ++++++++++++++
net/mac80211/iface.c | 4 ++--
net/mac80211/mlme.c | 1 -
net/wireless/util.c | 8 ++++++++
4 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 871623d..c3b9d10 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -4929,6 +4929,20 @@ static void ieee80211_del_intf_link(struct wiphy *wiphy,
{
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
+ if (wdev->iftype == NL80211_IFTYPE_AP_VLAN) {
+ int i;
+
+ sdata->vif.valid_links = 0;
+ sdata->vif.active_links = 0;
+ sdata->vif.dormant_links = 0;
+ for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
+ rcu_assign_pointer(sdata->link[i], NULL);
+ rcu_assign_pointer(sdata->vif.link_conf[i], NULL);
+ }
+
+ return;
+ }
+
lockdep_assert_wiphy(sdata->local->hw.wiphy);
ieee80211_vif_set_links(sdata, wdev->valid_links, 0);
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index cdeb787..83b579a 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -393,8 +393,8 @@ static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata,
sdata->vif.active_links = nsdata->vif.active_links;
sdata->vif.dormant_links = nsdata->vif.dormant_links;
for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
- sdata->link[i] = nsdata->link[i];
- sdata->vif.link_conf[i] = nsdata->vif.link_conf[i];
+ rcu_assign_pointer(sdata->link[i], nsdata->link[i]);
+ rcu_assign_pointer(sdata->vif.link_conf[i], nsdata->vif.link_conf[i]);
}
}
}
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index e4564de..ebdcf57 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1829,7 +1829,6 @@ void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
{
struct sk_buff *skb;
struct ieee80211_hdr *nullfunc;
- u8 assoc_link_id = ifmgd->assoc_data->assoc_link_id;
__le16 fc;
if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 2bde8a3..d03f612 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -2826,6 +2826,14 @@ void cfg80211_remove_links(struct wireless_dev *wdev)
{
unsigned int link_id;
+ if (wdev->iftype == NL80211_IFTYPE_AP_VLAN) {
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
+
+ if (rdev->ops->del_intf_link)
+ rdev->ops->del_intf_link(&rdev->wiphy, wdev, 0);
+
+ return;
+ }
/*
* links are controlled by upper layers (userspace/cfg)
* only for AP mode, so only remove them here for AP
--
2.39.2