blob: 564475840dfd807c53f977fdbfaf3f93e477de4d [file] [log] [blame]
developer23b6c0f2024-02-23 07:09:37 +08001From 1cc0213bb5d4152c41cd6dd00eef4a613a5a0a99 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
developer5f4e6c32023-12-20 06:12:53 +08004Subject: [PATCH 04/37] mtk: mac80211: add support for runtime set inband
5 discovery
developer4a339e82022-12-12 19:00:30 +08006
7Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com>
8---
9 include/net/cfg80211.h | 1 +
10 include/net/mac80211.h | 1 +
11 include/uapi/linux/nl80211.h | 1 +
developerbba872d2023-09-20 13:23:33 +080012 net/mac80211/cfg.c | 30 +++++++++++++++++++++++++++++-
developer83ad30d2023-09-12 17:28:06 +080013 net/wireless/nl80211.c | 33 ++++++++++++++++++++++++++++-----
developerbba872d2023-09-20 13:23:33 +080014 5 files changed, 60 insertions(+), 6 deletions(-)
developer4a339e82022-12-12 19:00:30 +080015
16diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
developer23b6c0f2024-02-23 07:09:37 +080017index 25f15d0..5b2e242 100644
developer4a339e82022-12-12 19:00:30 +080018--- a/include/net/cfg80211.h
19+++ b/include/net/cfg80211.h
developer23b6c0f2024-02-23 07:09:37 +080020@@ -1379,6 +1379,7 @@ struct cfg80211_fils_discovery {
developer4a339e82022-12-12 19:00:30 +080021 u32 max_interval;
22 size_t tmpl_len;
23 const u8 *tmpl;
24+ u8 disable;
25 };
26
27 /**
28diff --git a/include/net/mac80211.h b/include/net/mac80211.h
developer23b6c0f2024-02-23 07:09:37 +080029index 231abd1..4eac89a 100644
developer4a339e82022-12-12 19:00:30 +080030--- a/include/net/mac80211.h
31+++ b/include/net/mac80211.h
developerebaa5512023-04-19 18:23:21 +080032@@ -526,6 +526,7 @@ struct ieee80211_ftm_responder_params {
developer4a339e82022-12-12 19:00:30 +080033 struct ieee80211_fils_discovery {
34 u32 min_interval;
35 u32 max_interval;
36+ u8 disable;
37 };
38
39 /**
40diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
developer83ad30d2023-09-12 17:28:06 +080041index 88eb85c..72ef4d9 100644
developer4a339e82022-12-12 19:00:30 +080042--- a/include/uapi/linux/nl80211.h
43+++ b/include/uapi/linux/nl80211.h
developer83ad30d2023-09-12 17:28:06 +080044@@ -7619,6 +7619,7 @@ enum nl80211_fils_discovery_attributes {
developer4a339e82022-12-12 19:00:30 +080045 NL80211_FILS_DISCOVERY_ATTR_INT_MIN,
46 NL80211_FILS_DISCOVERY_ATTR_INT_MAX,
47 NL80211_FILS_DISCOVERY_ATTR_TMPL,
48+ NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE,
49
50 /* keep last */
51 __NL80211_FILS_DISCOVERY_ATTR_LAST,
52diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
developer23b6c0f2024-02-23 07:09:37 +080053index 6b62644..3c07357 100644
developer4a339e82022-12-12 19:00:30 +080054--- a/net/mac80211/cfg.c
55+++ b/net/mac80211/cfg.c
developer23b6c0f2024-02-23 07:09:37 +080056@@ -993,6 +993,7 @@ static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata,
developer4a339e82022-12-12 19:00:30 +080057 fd = &link_conf->fils_discovery;
58 fd->min_interval = params->min_interval;
59 fd->max_interval = params->max_interval;
60+ fd->disable = params->disable;
61
62 old = sdata_dereference(link->u.ap.fils_discovery, sdata);
63 new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
developer23b6c0f2024-02-23 07:09:37 +080064@@ -1516,9 +1517,11 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
developer4a339e82022-12-12 19:00:30 +080065 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
66 struct ieee80211_link_data *link;
67 struct beacon_data *old;
68+ struct cfg80211_ap_settings *ap_params;
69+ struct ieee80211_supported_band *sband;
developer83ad30d2023-09-12 17:28:06 +080070+ u64 changed = 0;
developer4a339e82022-12-12 19:00:30 +080071 int err;
72 struct ieee80211_bss_conf *link_conf;
developer83ad30d2023-09-12 17:28:06 +080073- u64 changed = 0;
developer4a339e82022-12-12 19:00:30 +080074
developer83ad30d2023-09-12 17:28:06 +080075 sdata_assert_lock(sdata);
76
developer23b6c0f2024-02-23 07:09:37 +080077@@ -1549,6 +1552,31 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
developer83ad30d2023-09-12 17:28:06 +080078 changed |= BSS_CHANGED_HE_BSS_COLOR;
developer4a339e82022-12-12 19:00:30 +080079 }
80
developer4a339e82022-12-12 19:00:30 +080081+ sband = ieee80211_get_sband(sdata);
82+ if (!sband)
83+ return -EINVAL;
84+
85+ if (sband->band == NL80211_BAND_6GHZ) {
86+ ap_params = container_of(params, struct cfg80211_ap_settings, beacon);
87+
88+ if(ap_params->unsol_bcast_probe_resp.interval) {
89+ err = ieee80211_set_unsol_bcast_probe_resp(sdata,
90+ &ap_params->unsol_bcast_probe_resp,
91+ link, link_conf);
92+ if (err < 0)
93+ return err;
94+ changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
95+ } else {
96+ err = ieee80211_set_fils_discovery(sdata,
97+ &ap_params->fils_discovery,
98+ link, link_conf);
99+
100+ if (err < 0)
101+ return err;
102+ changed |= BSS_CHANGED_FILS_DISCOVERY;
103+ }
104+ }
105+
developer83ad30d2023-09-12 17:28:06 +0800106 ieee80211_link_info_change_notify(sdata, link, changed);
developer4a339e82022-12-12 19:00:30 +0800107 return 0;
108 }
developer4a339e82022-12-12 19:00:30 +0800109diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
developer23b6c0f2024-02-23 07:09:37 +0800110index 508edc1..abb9585 100644
developer4a339e82022-12-12 19:00:30 +0800111--- a/net/wireless/nl80211.c
112+++ b/net/wireless/nl80211.c
developer23b6c0f2024-02-23 07:09:37 +0800113@@ -424,6 +424,7 @@ nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
developer4a339e82022-12-12 19:00:30 +0800114 [NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000),
115 [NL80211_FILS_DISCOVERY_ATTR_TMPL] =
116 NLA_POLICY_BINARY_RANGE(NL80211_FILS_DISCOVERY_TMPL_MIN_LEN, IEEE80211_MAX_DATA_LEN),
117+ [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE] = NLA_POLICY_MAX(NLA_U32, 20),
118 };
119
120 static const struct nla_policy
developer83ad30d2023-09-12 17:28:06 +0800121@@ -5692,6 +5693,8 @@ static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
developer4a339e82022-12-12 19:00:30 +0800122 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
123 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]);
124 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]);
125+ fd->disable = !(fd->max_interval ||
126+ nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE]));
127
128 return 0;
129 }
developer23b6c0f2024-02-23 07:09:37 +0800130@@ -6243,7 +6246,8 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
developer4a339e82022-12-12 19:00:30 +0800131 unsigned int link_id = nl80211_link_id(info->attrs);
132 struct net_device *dev = info->user_ptr[1];
133 struct wireless_dev *wdev = dev->ieee80211_ptr;
134- struct cfg80211_beacon_data params;
135+ struct cfg80211_ap_settings ap_params;
136+ struct cfg80211_beacon_data *params;
137 int err;
138
139 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
developer23b6c0f2024-02-23 07:09:37 +0800140@@ -6256,17 +6260,36 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
developer4a339e82022-12-12 19:00:30 +0800141 if (!wdev->links[link_id].ap.beacon_interval)
142 return -EINVAL;
143
developer83ad30d2023-09-12 17:28:06 +0800144- err = nl80211_parse_beacon(rdev, info->attrs, &params, info->extack);
developer4a339e82022-12-12 19:00:30 +0800145+ memset(&ap_params, 0, sizeof(ap_params));
146+ params = &ap_params.beacon;
147+
developer83ad30d2023-09-12 17:28:06 +0800148+ err = nl80211_parse_beacon(rdev, info->attrs, params, info->extack);
developer4a339e82022-12-12 19:00:30 +0800149 if (err)
150 goto out;
151
152+ if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) {
153+ err = nl80211_parse_fils_discovery(rdev,
154+ info->attrs[NL80211_ATTR_FILS_DISCOVERY],
155+ &ap_params);
156+ if (err)
157+ goto out;
158+ }
159+
160+ if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
161+ err = nl80211_parse_unsol_bcast_probe_resp(rdev,
162+ info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
163+ &ap_params);
164+ if (err)
165+ goto out;
166+ }
167+
168 wdev_lock(wdev);
169- err = rdev_change_beacon(rdev, dev, &params);
170+ err = rdev_change_beacon(rdev, dev, params);
171 wdev_unlock(wdev);
172
173 out:
174- kfree(params.mbssid_ies);
developer83ad30d2023-09-12 17:28:06 +0800175- kfree(params.rnr_ies);
developer4a339e82022-12-12 19:00:30 +0800176+ kfree(params->mbssid_ies);
developer83ad30d2023-09-12 17:28:06 +0800177+ kfree(params->rnr_ies);
developer4a339e82022-12-12 19:00:30 +0800178 return err;
179 }
180
181--
developer5f4e6c32023-12-20 06:12:53 +08001822.18.0
developer4a339e82022-12-12 19:00:30 +0800183