blob: 564475840dfd807c53f977fdbfaf3f93e477de4d [file] [log] [blame]
developer43a264f2024-03-26 14:09:54 +08001From 1cc0213bb5d4152c41cd6dd00eef4a613a5a0a99 Mon Sep 17 00:00:00 2001
developer6a1998b2022-12-08 18:09:45 +08002From: MeiChia Chiu <meichia.chiu@mediatek.com>
3Date: Wed, 19 Oct 2022 13:45:42 +0800
developerd243af02023-12-21 14:49:33 +08004Subject: [PATCH 04/37] mtk: mac80211: add support for runtime set inband
5 discovery
developer6a1998b2022-12-08 18:09:45 +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 +
developere35b8e42023-10-16 11:04:00 +080012 net/mac80211/cfg.c | 30 +++++++++++++++++++++++++++++-
13 net/wireless/nl80211.c | 33 ++++++++++++++++++++++++++++-----
14 5 files changed, 60 insertions(+), 6 deletions(-)
developer6a1998b2022-12-08 18:09:45 +080015
16diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
developer43a264f2024-03-26 14:09:54 +080017index 25f15d0..5b2e242 100644
developer6a1998b2022-12-08 18:09:45 +080018--- a/include/net/cfg80211.h
19+++ b/include/net/cfg80211.h
developer43a264f2024-03-26 14:09:54 +080020@@ -1379,6 +1379,7 @@ struct cfg80211_fils_discovery {
developer6a1998b2022-12-08 18:09:45 +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
developer43a264f2024-03-26 14:09:54 +080029index 231abd1..4eac89a 100644
developer6a1998b2022-12-08 18:09:45 +080030--- a/include/net/mac80211.h
31+++ b/include/net/mac80211.h
developer08748a42023-04-21 11:17:26 +080032@@ -526,6 +526,7 @@ struct ieee80211_ftm_responder_params {
developer6a1998b2022-12-08 18:09:45 +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
developere35b8e42023-10-16 11:04:00 +080041index 88eb85c..72ef4d9 100644
developer6a1998b2022-12-08 18:09:45 +080042--- a/include/uapi/linux/nl80211.h
43+++ b/include/uapi/linux/nl80211.h
developere35b8e42023-10-16 11:04:00 +080044@@ -7619,6 +7619,7 @@ enum nl80211_fils_discovery_attributes {
developer6a1998b2022-12-08 18:09:45 +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
developer43a264f2024-03-26 14:09:54 +080053index 6b62644..3c07357 100644
developer6a1998b2022-12-08 18:09:45 +080054--- a/net/mac80211/cfg.c
55+++ b/net/mac80211/cfg.c
developer43a264f2024-03-26 14:09:54 +080056@@ -993,6 +993,7 @@ static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata,
developer79e690d2022-12-13 17:05:25 +080057 fd = &link_conf->fils_discovery;
developer6a1998b2022-12-08 18:09:45 +080058 fd->min_interval = params->min_interval;
59 fd->max_interval = params->max_interval;
60+ fd->disable = params->disable;
61
developer79e690d2022-12-13 17:05:25 +080062 old = sdata_dereference(link->u.ap.fils_discovery, sdata);
developer6a1998b2022-12-08 18:09:45 +080063 new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
developer43a264f2024-03-26 14:09:54 +080064@@ -1516,9 +1517,11 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
developer79e690d2022-12-13 17:05:25 +080065 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
66 struct ieee80211_link_data *link;
developer6a1998b2022-12-08 18:09:45 +080067 struct beacon_data *old;
68+ struct cfg80211_ap_settings *ap_params;
69+ struct ieee80211_supported_band *sband;
developere35b8e42023-10-16 11:04:00 +080070+ u64 changed = 0;
developer6a1998b2022-12-08 18:09:45 +080071 int err;
developer79e690d2022-12-13 17:05:25 +080072 struct ieee80211_bss_conf *link_conf;
developere35b8e42023-10-16 11:04:00 +080073- u64 changed = 0;
developer6a1998b2022-12-08 18:09:45 +080074
developere35b8e42023-10-16 11:04:00 +080075 sdata_assert_lock(sdata);
76
developer43a264f2024-03-26 14:09:54 +080077@@ -1549,6 +1552,31 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
developere35b8e42023-10-16 11:04:00 +080078 changed |= BSS_CHANGED_HE_BSS_COLOR;
developer79e690d2022-12-13 17:05:25 +080079 }
80
developer6a1998b2022-12-08 18:09:45 +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,
developer79e690d2022-12-13 17:05:25 +080090+ &ap_params->unsol_bcast_probe_resp,
91+ link, link_conf);
developer6a1998b2022-12-08 18:09:45 +080092+ if (err < 0)
93+ return err;
94+ changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
95+ } else {
96+ err = ieee80211_set_fils_discovery(sdata,
developer79e690d2022-12-13 17:05:25 +080097+ &ap_params->fils_discovery,
98+ link, link_conf);
developer6a1998b2022-12-08 18:09:45 +080099+
100+ if (err < 0)
101+ return err;
102+ changed |= BSS_CHANGED_FILS_DISCOVERY;
103+ }
104+ }
105+
developere35b8e42023-10-16 11:04:00 +0800106 ieee80211_link_info_change_notify(sdata, link, changed);
developer6a1998b2022-12-08 18:09:45 +0800107 return 0;
108 }
developer6a1998b2022-12-08 18:09:45 +0800109diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
developer43a264f2024-03-26 14:09:54 +0800110index 508edc1..abb9585 100644
developer6a1998b2022-12-08 18:09:45 +0800111--- a/net/wireless/nl80211.c
112+++ b/net/wireless/nl80211.c
developer43a264f2024-03-26 14:09:54 +0800113@@ -424,6 +424,7 @@ nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
developer79e690d2022-12-13 17:05:25 +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),
developer6a1998b2022-12-08 18:09:45 +0800117+ [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE] = NLA_POLICY_MAX(NLA_U32, 20),
118 };
119
120 static const struct nla_policy
developere35b8e42023-10-16 11:04:00 +0800121@@ -5692,6 +5693,8 @@ static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
developer6a1998b2022-12-08 18:09:45 +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 }
developer43a264f2024-03-26 14:09:54 +0800130@@ -6243,7 +6246,8 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
developer79e690d2022-12-13 17:05:25 +0800131 unsigned int link_id = nl80211_link_id(info->attrs);
developer6a1998b2022-12-08 18:09:45 +0800132 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 &&
developer43a264f2024-03-26 14:09:54 +0800140@@ -6256,17 +6260,36 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
developer79e690d2022-12-13 17:05:25 +0800141 if (!wdev->links[link_id].ap.beacon_interval)
developer6a1998b2022-12-08 18:09:45 +0800142 return -EINVAL;
143
developere35b8e42023-10-16 11:04:00 +0800144- err = nl80211_parse_beacon(rdev, info->attrs, &params, info->extack);
developer6a1998b2022-12-08 18:09:45 +0800145+ memset(&ap_params, 0, sizeof(ap_params));
146+ params = &ap_params.beacon;
147+
developere35b8e42023-10-16 11:04:00 +0800148+ err = nl80211_parse_beacon(rdev, info->attrs, params, info->extack);
developer6a1998b2022-12-08 18:09:45 +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);
developere35b8e42023-10-16 11:04:00 +0800175- kfree(params.rnr_ies);
developer6a1998b2022-12-08 18:09:45 +0800176+ kfree(params->mbssid_ies);
developere35b8e42023-10-16 11:04:00 +0800177+ kfree(params->rnr_ies);
developer6a1998b2022-12-08 18:09:45 +0800178 return err;
179 }
180
181--
developerd243af02023-12-21 14:49:33 +08001822.18.0
developer6a1998b2022-12-08 18:09:45 +0800183