blob: 66a784dff45bd2a7d3a5f0e9ee1b742ccd020b45 [file] [log] [blame]
developerbba872d2023-09-20 13:23:33 +08001From f6907ff7ff3669e73f64f802de10346bfd1d24d8 Mon Sep 17 00:00:00 2001
developer4a339e82022-12-12 19:00:30 +08002From: MeiChia Chiu <meichia.chiu@mediatek.com>
3Date: Wed, 19 Oct 2022 13:45:42 +0800
developerbba872d2023-09-20 13:23:33 +08004Subject: [PATCH] mac80211: mtk: add support for runtime set inband discovery
developer4a339e82022-12-12 19:00:30 +08005
6Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com>
7---
8 include/net/cfg80211.h | 1 +
9 include/net/mac80211.h | 1 +
10 include/uapi/linux/nl80211.h | 1 +
developerbba872d2023-09-20 13:23:33 +080011 net/mac80211/cfg.c | 30 +++++++++++++++++++++++++++++-
developer83ad30d2023-09-12 17:28:06 +080012 net/wireless/nl80211.c | 33 ++++++++++++++++++++++++++++-----
developerbba872d2023-09-20 13:23:33 +080013 5 files changed, 60 insertions(+), 6 deletions(-)
developer4a339e82022-12-12 19:00:30 +080014
15diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
developerbba872d2023-09-20 13:23:33 +080016index 072a787..02e342e 100644
developer4a339e82022-12-12 19:00:30 +080017--- a/include/net/cfg80211.h
18+++ b/include/net/cfg80211.h
developerbba872d2023-09-20 13:23:33 +080019@@ -1309,6 +1309,7 @@ struct cfg80211_fils_discovery {
developer4a339e82022-12-12 19:00:30 +080020 u32 max_interval;
21 size_t tmpl_len;
22 const u8 *tmpl;
23+ u8 disable;
24 };
25
26 /**
27diff --git a/include/net/mac80211.h b/include/net/mac80211.h
developer83ad30d2023-09-12 17:28:06 +080028index 2e5b5c6..96e4ec9 100644
developer4a339e82022-12-12 19:00:30 +080029--- a/include/net/mac80211.h
30+++ b/include/net/mac80211.h
developerebaa5512023-04-19 18:23:21 +080031@@ -526,6 +526,7 @@ struct ieee80211_ftm_responder_params {
developer4a339e82022-12-12 19:00:30 +080032 struct ieee80211_fils_discovery {
33 u32 min_interval;
34 u32 max_interval;
35+ u8 disable;
36 };
37
38 /**
39diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
developer83ad30d2023-09-12 17:28:06 +080040index 88eb85c..72ef4d9 100644
developer4a339e82022-12-12 19:00:30 +080041--- a/include/uapi/linux/nl80211.h
42+++ b/include/uapi/linux/nl80211.h
developer83ad30d2023-09-12 17:28:06 +080043@@ -7619,6 +7619,7 @@ enum nl80211_fils_discovery_attributes {
developer4a339e82022-12-12 19:00:30 +080044 NL80211_FILS_DISCOVERY_ATTR_INT_MIN,
45 NL80211_FILS_DISCOVERY_ATTR_INT_MAX,
46 NL80211_FILS_DISCOVERY_ATTR_TMPL,
47+ NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE,
48
49 /* keep last */
50 __NL80211_FILS_DISCOVERY_ATTR_LAST,
51diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
developerbba872d2023-09-20 13:23:33 +080052index f4649d1..baff0e6 100644
developer4a339e82022-12-12 19:00:30 +080053--- a/net/mac80211/cfg.c
54+++ b/net/mac80211/cfg.c
developer83ad30d2023-09-12 17:28:06 +080055@@ -990,6 +990,7 @@ static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata,
developer4a339e82022-12-12 19:00:30 +080056 fd = &link_conf->fils_discovery;
57 fd->min_interval = params->min_interval;
58 fd->max_interval = params->max_interval;
59+ fd->disable = params->disable;
60
61 old = sdata_dereference(link->u.ap.fils_discovery, sdata);
62 new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
developer83ad30d2023-09-12 17:28:06 +080063@@ -1513,9 +1514,11 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
developer4a339e82022-12-12 19:00:30 +080064 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
65 struct ieee80211_link_data *link;
66 struct beacon_data *old;
67+ struct cfg80211_ap_settings *ap_params;
68+ struct ieee80211_supported_band *sband;
developer83ad30d2023-09-12 17:28:06 +080069+ u64 changed = 0;
developer4a339e82022-12-12 19:00:30 +080070 int err;
71 struct ieee80211_bss_conf *link_conf;
developer83ad30d2023-09-12 17:28:06 +080072- u64 changed = 0;
developer4a339e82022-12-12 19:00:30 +080073
developer83ad30d2023-09-12 17:28:06 +080074 sdata_assert_lock(sdata);
75
developerbba872d2023-09-20 13:23:33 +080076@@ -1546,6 +1549,31 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
developer83ad30d2023-09-12 17:28:06 +080077 changed |= BSS_CHANGED_HE_BSS_COLOR;
developer4a339e82022-12-12 19:00:30 +080078 }
79
developer4a339e82022-12-12 19:00:30 +080080+ sband = ieee80211_get_sband(sdata);
81+ if (!sband)
82+ return -EINVAL;
83+
84+ if (sband->band == NL80211_BAND_6GHZ) {
85+ ap_params = container_of(params, struct cfg80211_ap_settings, beacon);
86+
87+ if(ap_params->unsol_bcast_probe_resp.interval) {
88+ err = ieee80211_set_unsol_bcast_probe_resp(sdata,
89+ &ap_params->unsol_bcast_probe_resp,
90+ link, link_conf);
91+ if (err < 0)
92+ return err;
93+ changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
94+ } else {
95+ err = ieee80211_set_fils_discovery(sdata,
96+ &ap_params->fils_discovery,
97+ link, link_conf);
98+
99+ if (err < 0)
100+ return err;
101+ changed |= BSS_CHANGED_FILS_DISCOVERY;
102+ }
103+ }
104+
developer83ad30d2023-09-12 17:28:06 +0800105 ieee80211_link_info_change_notify(sdata, link, changed);
developer4a339e82022-12-12 19:00:30 +0800106 return 0;
107 }
developer4a339e82022-12-12 19:00:30 +0800108diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
developer83ad30d2023-09-12 17:28:06 +0800109index e0ee534..ff8afa5 100644
developer4a339e82022-12-12 19:00:30 +0800110--- a/net/wireless/nl80211.c
111+++ b/net/wireless/nl80211.c
112@@ -423,6 +423,7 @@ nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
113 [NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000),
114 [NL80211_FILS_DISCOVERY_ATTR_TMPL] =
115 NLA_POLICY_BINARY_RANGE(NL80211_FILS_DISCOVERY_TMPL_MIN_LEN, IEEE80211_MAX_DATA_LEN),
116+ [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE] = NLA_POLICY_MAX(NLA_U32, 20),
117 };
118
119 static const struct nla_policy
developer83ad30d2023-09-12 17:28:06 +0800120@@ -5692,6 +5693,8 @@ static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
developer4a339e82022-12-12 19:00:30 +0800121 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
122 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]);
123 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]);
124+ fd->disable = !(fd->max_interval ||
125+ nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE]));
126
127 return 0;
128 }
developer83ad30d2023-09-12 17:28:06 +0800129@@ -6224,7 +6227,8 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
developer4a339e82022-12-12 19:00:30 +0800130 unsigned int link_id = nl80211_link_id(info->attrs);
131 struct net_device *dev = info->user_ptr[1];
132 struct wireless_dev *wdev = dev->ieee80211_ptr;
133- struct cfg80211_beacon_data params;
134+ struct cfg80211_ap_settings ap_params;
135+ struct cfg80211_beacon_data *params;
136 int err;
137
138 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
developer83ad30d2023-09-12 17:28:06 +0800139@@ -6237,17 +6241,36 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
developer4a339e82022-12-12 19:00:30 +0800140 if (!wdev->links[link_id].ap.beacon_interval)
141 return -EINVAL;
142
developer83ad30d2023-09-12 17:28:06 +0800143- err = nl80211_parse_beacon(rdev, info->attrs, &params, info->extack);
developer4a339e82022-12-12 19:00:30 +0800144+ memset(&ap_params, 0, sizeof(ap_params));
145+ params = &ap_params.beacon;
146+
developer83ad30d2023-09-12 17:28:06 +0800147+ err = nl80211_parse_beacon(rdev, info->attrs, params, info->extack);
developer4a339e82022-12-12 19:00:30 +0800148 if (err)
149 goto out;
150
151+ if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) {
152+ err = nl80211_parse_fils_discovery(rdev,
153+ info->attrs[NL80211_ATTR_FILS_DISCOVERY],
154+ &ap_params);
155+ if (err)
156+ goto out;
157+ }
158+
159+ if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
160+ err = nl80211_parse_unsol_bcast_probe_resp(rdev,
161+ info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
162+ &ap_params);
163+ if (err)
164+ goto out;
165+ }
166+
167 wdev_lock(wdev);
168- err = rdev_change_beacon(rdev, dev, &params);
169+ err = rdev_change_beacon(rdev, dev, params);
170 wdev_unlock(wdev);
171
172 out:
173- kfree(params.mbssid_ies);
developer83ad30d2023-09-12 17:28:06 +0800174- kfree(params.rnr_ies);
developer4a339e82022-12-12 19:00:30 +0800175+ kfree(params->mbssid_ies);
developer83ad30d2023-09-12 17:28:06 +0800176+ kfree(params->rnr_ies);
developer4a339e82022-12-12 19:00:30 +0800177 return err;
178 }
179
180--
developerbba872d2023-09-20 13:23:33 +08001812.25.1
developer4a339e82022-12-12 19:00:30 +0800182