blob: f6fc98ffc539bd012e458485be6ba40d97cb2661 [file] [log] [blame]
developer7d2399a2022-05-13 17:59:07 +08001diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
2--- a/include/net/cfg80211.h
3+++ b/include/net/cfg80211.h
4@@ -1158,6 +1158,7 @@ struct cfg80211_fils_discovery {
5 u32 max_interval;
6 size_t tmpl_len;
7 const u8 *tmpl;
8+ u8 disable;
9 };
10
11 /**
12diff --git a/include/net/mac80211.h b/include/net/mac80211.h
13--- a/include/net/mac80211.h
14+++ b/include/net/mac80211.h
15@@ -505,6 +505,7 @@ struct ieee80211_ftm_responder_params {
16 struct ieee80211_fils_discovery {
17 u32 min_interval;
18 u32 max_interval;
19+ u8 disable;
20 };
21
22 /**
23diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
24--- a/include/uapi/linux/nl80211.h
25+++ b/include/uapi/linux/nl80211.h
26@@ -7236,6 +7236,7 @@ enum nl80211_fils_discovery_attributes {
27 NL80211_FILS_DISCOVERY_ATTR_INT_MIN,
28 NL80211_FILS_DISCOVERY_ATTR_INT_MAX,
29 NL80211_FILS_DISCOVERY_ATTR_TMPL,
30+ NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE,
31
32 /* keep last */
33 __NL80211_FILS_DISCOVERY_ATTR_LAST,
34diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
35--- a/net/mac80211/cfg.c
36+++ b/net/mac80211/cfg.c
37@@ -906,6 +906,7 @@ static int ieee80211_set_fils_discovery(
38 fd = &sdata->vif.bss_conf.fils_discovery;
39 fd->min_interval = params->min_interval;
40 fd->max_interval = params->max_interval;
41+ fd->disable = params->disable;
42
43 old = sdata_dereference(sdata->u.ap.fils_discovery, sdata);
44 new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
45@@ -1316,6 +1317,8 @@ static int ieee80211_change_beacon(struc
46 {
47 struct ieee80211_sub_if_data *sdata;
48 struct beacon_data *old;
49+ struct cfg80211_ap_settings *ap_params;
50+ u32 changed;
51 int err;
52
53 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
54@@ -1334,7 +1337,26 @@ static int ieee80211_change_beacon(struc
55 err = ieee80211_assign_beacon(sdata, params, NULL, NULL);
56 if (err < 0)
57 return err;
58- ieee80211_bss_info_change_notify(sdata, err);
59+
60+ changed = err;
61+ ap_params = container_of(params, struct cfg80211_ap_settings, beacon);
62+
63+ if(ap_params->unsol_bcast_probe_resp.interval) {
64+ err = ieee80211_set_unsol_bcast_probe_resp(sdata,
65+ &ap_params->unsol_bcast_probe_resp);
66+ if (err < 0)
67+ return err;
68+ changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
69+ } else {
70+ err = ieee80211_set_fils_discovery(sdata,
71+ &ap_params->fils_discovery);
72+ if (err < 0)
73+ return err;
74+ changed |= BSS_CHANGED_FILS_DISCOVERY;
75+
76+ }
77+
78+ ieee80211_bss_info_change_notify(sdata, changed);
79 return 0;
80 }
81
82diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
83--- a/net/wireless/nl80211.c
84+++ b/net/wireless/nl80211.c
85@@ -421,6 +421,7 @@ nl80211_fils_discovery_policy[NL80211_FI
86 [NL80211_FILS_DISCOVERY_ATTR_TMPL] = { .type = NLA_BINARY,
87 .len = IEEE80211_MAX_DATA_LEN },
88 #endif
89+ [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE] = NLA_POLICY_MAX(NLA_U32, 20),
90 };
91
92 static const struct nla_policy
93@@ -5349,6 +5350,8 @@ static int nl80211_parse_fils_discovery(
94 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
95 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]);
96 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]);
97+ fd->disable = !(fd->max_interval ||
98+ nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INTE]));
99
100 return 0;
101 }
102@@ -5754,7 +5757,8 @@ static int nl80211_set_beacon(struct sk_
103 struct cfg80211_registered_device *rdev = info->user_ptr[0];
104 struct net_device *dev = info->user_ptr[1];
105 struct wireless_dev *wdev = dev->ieee80211_ptr;
106- struct cfg80211_beacon_data params;
107+ struct cfg80211_ap_settings ap_params;
108+ struct cfg80211_beacon_data *params;
109 int err;
110
111 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
112@@ -5767,16 +5771,35 @@ static int nl80211_set_beacon(struct sk_
113 if (!wdev->beacon_interval)
114 return -EINVAL;
115
116- err = nl80211_parse_beacon(rdev, info->attrs, &params);
117+ memset(&ap_params, 0, sizeof(ap_params));
118+ params = &ap_params.beacon;
119+
120+ err = nl80211_parse_beacon(rdev, info->attrs, params);
121 if (err)
122 goto out;
123
124+ if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) {
125+ err = nl80211_parse_fils_discovery(rdev,
126+ info->attrs[NL80211_ATTR_FILS_DISCOVERY],
127+ &ap_params);
128+ if (err)
129+ goto out;
130+ }
131+
132+ if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
133+ err = nl80211_parse_unsol_bcast_probe_resp(rdev,
134+ info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
135+ &ap_params);
136+ if (err)
137+ goto out;
138+ }
139+
140 wdev_lock(wdev);
141- err = rdev_change_beacon(rdev, dev, &params);
142+ err = rdev_change_beacon(rdev, dev, params);
143 wdev_unlock(wdev);
144
145 out:
146- kfree(params.mbssid_ies);
147+ kfree(params->mbssid_ies);
148 return err;
149 }
150