blob: fd6c2750e78fc1d9e18972a5988b748ddf0634b0 [file] [log] [blame]
developerebaa5512023-04-19 18:23:21 +08001From 0a99124e2d3cd3c5d34903c92cedff7461284993 Mon Sep 17 00:00:00 2001
developerc9eaf902023-03-13 05:45:10 +08002From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
3Date: Mon, 13 Mar 2023 05:36:59 +0800
developerebaa5512023-04-19 18:23:21 +08004Subject: [PATCH 13/14] mac80211: mtk: ageout color bitmap
developerc9eaf902023-03-13 05:45:10 +08005
6Adding a periodic work which runs once per second to check BSS color.
7OBSS BSS Color will be ageout if not seen for 10 seconds.
8---
9 include/net/mac80211.h | 1 +
developer63e4dfd2023-03-22 09:11:04 +080010 net/mac80211/cfg.c | 30 ++++++++++++++++++++++++++++++
developered151932023-03-24 02:06:28 +080011 net/mac80211/ieee80211_i.h | 5 +++++
developerc9eaf902023-03-13 05:45:10 +080012 net/mac80211/iface.c | 5 +++++
developered151932023-03-24 02:06:28 +080013 net/mac80211/link.c | 2 ++
developerc9eaf902023-03-13 05:45:10 +080014 net/mac80211/rx.c | 1 +
developered151932023-03-24 02:06:28 +080015 6 files changed, 44 insertions(+)
developerc9eaf902023-03-13 05:45:10 +080016
17diff --git a/include/net/mac80211.h b/include/net/mac80211.h
developerebaa5512023-04-19 18:23:21 +080018index 299425a..b4f156e 100644
developerc9eaf902023-03-13 05:45:10 +080019--- a/include/net/mac80211.h
20+++ b/include/net/mac80211.h
developerebaa5512023-04-19 18:23:21 +080021@@ -742,6 +742,7 @@ struct ieee80211_bss_conf {
developerc9eaf902023-03-13 05:45:10 +080022 struct ieee80211_he_obss_pd he_obss_pd;
23 struct cfg80211_he_bss_color he_bss_color;
24 u64 used_color_bitmap;
25+ u64 color_last_seen[64];
26 struct ieee80211_fils_discovery fils_discovery;
27 u32 unsol_bcast_probe_resp_interval;
28 struct cfg80211_bitrate_mask beacon_tx_rate;
29diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
developerebaa5512023-04-19 18:23:21 +080030index 0ecc026..3c83024 100644
developerc9eaf902023-03-13 05:45:10 +080031--- a/net/mac80211/cfg.c
32+++ b/net/mac80211/cfg.c
developerebaa5512023-04-19 18:23:21 +080033@@ -4817,6 +4817,36 @@ out:
developerc9eaf902023-03-13 05:45:10 +080034 return err;
35 }
36
37+void
38+ieee80211_color_aging_work(struct work_struct *work)
39+{
40+ struct ieee80211_sub_if_data *sdata =
41+ container_of(work, struct ieee80211_sub_if_data,
developered151932023-03-24 02:06:28 +080042+ deflink.color_aging_work.work);
developerc9eaf902023-03-13 05:45:10 +080043+ struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
44+ int i = 0;
45+
46+ sdata_lock(sdata);
47+
developer63e4dfd2023-03-22 09:11:04 +080048+ if (!ieee80211_sdata_running(sdata))
49+ goto unlock;
50+
developerc9eaf902023-03-13 05:45:10 +080051+ for (i = 0; i < IEEE80211_BSS_COLOR_MAX; i++) {
52+ /* ageout if not seen for a period */
53+ if ((bss_conf->used_color_bitmap & BIT_ULL(i)) &&
54+ time_before(bss_conf->color_last_seen[i],
55+ jiffies - IEEE80211_BSS_COLOR_AGEOUT_TIME * HZ)) {
56+ bss_conf->used_color_bitmap &= ~BIT_ULL(i);
57+ }
58+ }
59+
60+ ieee80211_queue_delayed_work(&sdata->local->hw,
developered151932023-03-24 02:06:28 +080061+ &sdata->deflink.color_aging_work, HZ);
developerc9eaf902023-03-13 05:45:10 +080062+
developer63e4dfd2023-03-22 09:11:04 +080063+unlock:
developerc9eaf902023-03-13 05:45:10 +080064+ sdata_unlock(sdata);
65+}
66+
67 static int
68 ieee80211_set_radar_background(struct wiphy *wiphy,
69 struct cfg80211_chan_def *chandef)
70diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
developerebaa5512023-04-19 18:23:21 +080071index 04128d5..bf2c51e 100644
developerc9eaf902023-03-13 05:45:10 +080072--- a/net/mac80211/ieee80211_i.h
73+++ b/net/mac80211/ieee80211_i.h
developerebaa5512023-04-19 18:23:21 +080074@@ -989,6 +989,7 @@ struct ieee80211_link_data {
developerc9eaf902023-03-13 05:45:10 +080075
developered151932023-03-24 02:06:28 +080076 struct work_struct color_change_finalize_work;
developerebaa5512023-04-19 18:23:21 +080077 struct delayed_work color_collision_detect_work;
developerc9eaf902023-03-13 05:45:10 +080078+ struct delayed_work color_aging_work;
developerebaa5512023-04-19 18:23:21 +080079 u64 color_bitmap;
developered151932023-03-24 02:06:28 +080080
81 /* context reservation -- protected with chanctx_mtx */
developerebaa5512023-04-19 18:23:21 +080082@@ -1932,9 +1933,13 @@ void ieee80211_csa_finalize_work(struct work_struct *work);
developerc9eaf902023-03-13 05:45:10 +080083 int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
84 struct cfg80211_csa_settings *params);
85
86+#define IEEE80211_BSS_COLOR_AGEOUT_TIME 10
87+#define IEEE80211_BSS_COLOR_MAX 64
88+
89 /* color change handling */
90 void ieee80211_color_change_finalize_work(struct work_struct *work);
developerebaa5512023-04-19 18:23:21 +080091 void ieee80211_color_collision_detection_work(struct work_struct *work);
developerc9eaf902023-03-13 05:45:10 +080092+void ieee80211_color_aging_work(struct work_struct *work);
93
94 /* interface handling */
95 #define MAC80211_SUPPORTED_FEATURES_TX (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \
96diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
developer8eb72a32023-03-30 08:32:07 +080097index b82065c..6a300ab 100644
developerc9eaf902023-03-13 05:45:10 +080098--- a/net/mac80211/iface.c
99+++ b/net/mac80211/iface.c
developer63e4dfd2023-03-22 09:11:04 +0800100@@ -541,6 +541,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
developerc9eaf902023-03-13 05:45:10 +0800101 cancel_work_sync(&sdata->deflink.color_change_finalize_work);
102
103 cancel_delayed_work_sync(&sdata->deflink.dfs_cac_timer_work);
developered151932023-03-24 02:06:28 +0800104+ cancel_delayed_work_sync(&sdata->deflink.color_aging_work);
developerc9eaf902023-03-13 05:45:10 +0800105
106 if (sdata->wdev.cac_started) {
107 chandef = sdata->vif.bss_conf.chandef;
developer6ca17562023-03-24 17:07:44 +0800108@@ -1470,6 +1471,10 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
developer63e4dfd2023-03-22 09:11:04 +0800109
developered151932023-03-24 02:06:28 +0800110 set_bit(SDATA_STATE_RUNNING, &sdata->state);
111
112+ if (sdata->vif.type == NL80211_IFTYPE_AP)
113+ ieee80211_queue_delayed_work(&sdata->local->hw,
114+ &sdata->deflink.color_aging_work, HZ);
115+
116 return 0;
117 err_del_interface:
118 drv_remove_interface(local, sdata);
119diff --git a/net/mac80211/link.c b/net/mac80211/link.c
developerebaa5512023-04-19 18:23:21 +0800120index a1b3031..7d4cdfb 100644
developered151932023-03-24 02:06:28 +0800121--- a/net/mac80211/link.c
122+++ b/net/mac80211/link.c
developerebaa5512023-04-19 18:23:21 +0800123@@ -45,6 +45,8 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
developered151932023-03-24 02:06:28 +0800124 INIT_LIST_HEAD(&link->reserved_chanctx_list);
125 INIT_DELAYED_WORK(&link->dfs_cac_timer_work,
126 ieee80211_dfs_cac_timer_work);
127+ INIT_DELAYED_WORK(&link->color_aging_work,
developer63e4dfd2023-03-22 09:11:04 +0800128+ ieee80211_color_aging_work);
129
developered151932023-03-24 02:06:28 +0800130 if (!deflink) {
131 switch (sdata->vif.type) {
developerc9eaf902023-03-13 05:45:10 +0800132diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
developerebaa5512023-04-19 18:23:21 +0800133index 0048c22..d953e46 100644
developerc9eaf902023-03-13 05:45:10 +0800134--- a/net/mac80211/rx.c
135+++ b/net/mac80211/rx.c
136@@ -3340,6 +3340,7 @@ ieee80211_rx_check_bss_color_collision(struct ieee80211_rx_data *rx)
137 IEEE80211_HE_OPERATION_BSS_COLOR_MASK);
138
139 bss_conf->used_color_bitmap |= BIT_ULL(color);
140+ bss_conf->color_last_seen[color] = jiffies;
141
142 trace_bss_color_bitmap(color, bss_conf->used_color_bitmap);
143
144--
developerebaa5512023-04-19 18:23:21 +08001452.39.2
developerc9eaf902023-03-13 05:45:10 +0800146