| 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 |
| |