Commit 3b1c256e authored by Aloka Dixit's avatar Aloka Dixit Committed by Johannes Berg
Browse files

wifi: mac80211: fixes in FILS discovery updates



FILS discovery configuration gets updated only if the maximum interval
is set to a non-zero value, hence there is no way to reset this value
to 0 once set. Replace the check for interval with a new flag which is
set only if the configuration should be updated.

Add similar changes for the unsolicited broadcast probe response handling.

Signed-off-by: default avatarAloka Dixit <quic_alokad@quicinc.com>
Reviewed-by: default avatarJeff Johnson <quic_jjohnson@quicinc.com>
Link: https://lore.kernel.org/r/20230727174100.11721-3-quic_alokad@quicinc.com


[move NULL'ing to else branch to not have intermediate NULL visible]
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 0cfaec25
Loading
Loading
Loading
Loading
+40 −37
Original line number Diff line number Diff line
@@ -952,25 +952,29 @@ static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata,
	struct fils_discovery_data *new, *old = NULL;
	struct ieee80211_fils_discovery *fd;

	if (!params->tmpl || !params->tmpl_len)
		return -EINVAL;
	if (!params->update)
		return 0;

	fd = &link_conf->fils_discovery;
	fd->min_interval = params->min_interval;
	fd->max_interval = params->max_interval;

	old = sdata_dereference(link->u.ap.fils_discovery, sdata);
	if (old)
		kfree_rcu(old, rcu_head);

	if (params->tmpl && params->tmpl_len) {
		new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
		if (!new)
			return -ENOMEM;
		new->len = params->tmpl_len;
		memcpy(new->data, params->tmpl, params->tmpl_len);
		rcu_assign_pointer(link->u.ap.fils_discovery, new);
	} else {
		RCU_INIT_POINTER(link->u.ap.fils_discovery, NULL);
	}

	if (old)
		kfree_rcu(old, rcu_head);

	return 0;
	return BSS_CHANGED_FILS_DISCOVERY;
}

static int
@@ -981,23 +985,27 @@ ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata,
{
	struct unsol_bcast_probe_resp_data *new, *old = NULL;

	if (!params->tmpl || !params->tmpl_len)
		return -EINVAL;
	if (!params->update)
		return 0;

	link_conf->unsol_bcast_probe_resp_interval = params->interval;

	old = sdata_dereference(link->u.ap.unsol_bcast_probe_resp, sdata);
	if (old)
		kfree_rcu(old, rcu_head);

	if (params->tmpl && params->tmpl_len) {
		new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
		if (!new)
			return -ENOMEM;
		new->len = params->tmpl_len;
		memcpy(new->data, params->tmpl, params->tmpl_len);
		rcu_assign_pointer(link->u.ap.unsol_bcast_probe_resp, new);
	} else {
		RCU_INIT_POINTER(link->u.ap.unsol_bcast_probe_resp, NULL);
	}

	if (old)
		kfree_rcu(old, rcu_head);

	link_conf->unsol_bcast_probe_resp_interval = params->interval;

	return 0;
	return BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
}

static int ieee80211_set_ftm_responder_params(
@@ -1428,23 +1436,18 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
	if (err < 0)
		goto error;

	if (params->fils_discovery.max_interval) {
		err = ieee80211_set_fils_discovery(sdata,
						   &params->fils_discovery,
	err = ieee80211_set_fils_discovery(sdata, &params->fils_discovery,
					   link, link_conf);
	if (err < 0)
		goto error;
		changed |= BSS_CHANGED_FILS_DISCOVERY;
	}
	changed |= err;

	if (params->unsol_bcast_probe_resp.interval) {
	err = ieee80211_set_unsol_bcast_probe_resp(sdata,
						   &params->unsol_bcast_probe_resp,
						   link, link_conf);
	if (err < 0)
		goto error;
		changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
	}
	changed |= err;

	err = drv_start_ap(sdata->local, sdata, link_conf);
	if (err) {