Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82a8e17d authored by Luciano Coelho's avatar Luciano Coelho Committed by Johannes Berg
Browse files

mac80211: refactor ieee80211_ibss_process_chanswitch()



Refactor ieee80211_ibss_process_chanswitch() to use
ieee80211_channel_switch() and avoid code duplication.

Tested by: Simon Wunderlich <sw@simonwunderlich.de>
Acked by: Simon Wunderlich <sw@simonwunderlich.de>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 43552be1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -3038,7 +3038,7 @@ void ieee80211_csa_finalize_work(struct work_struct *work)
	sdata_unlock(sdata);
}

static int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
			     struct cfg80211_csa_settings *params)
{
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+13 −48
Original line number Diff line number Diff line
@@ -788,18 +788,10 @@ ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
	struct cfg80211_csa_settings params;
	struct ieee80211_csa_ie csa_ie;
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
	struct ieee80211_chanctx_conf *chanctx_conf;
	struct ieee80211_chanctx *chanctx;
	enum nl80211_channel_type ch_type;
	int err, num_chanctx;
	int err;
	u32 sta_flags;

	if (sdata->vif.csa_active)
		return true;

	if (!sdata->vif.bss_conf.ibss_joined)
		return false;

	sta_flags = IEEE80211_STA_DISABLE_VHT;
	switch (ifibss->chandef.width) {
	case NL80211_CHAN_WIDTH_5:
@@ -834,9 +826,6 @@ ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
	params.count = csa_ie.count;
	params.chandef = csa_ie.chandef;

	if (ifibss->chandef.chan->band != params.chandef.chan->band)
		goto disconnect;

	switch (ifibss->chandef.width) {
	case NL80211_CHAN_WIDTH_20_NOHT:
	case NL80211_CHAN_WIDTH_20:
@@ -892,28 +881,12 @@ ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
		params.radar_required = true;
	}

	rcu_read_lock();
	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
	if (!chanctx_conf) {
		rcu_read_unlock();
		goto disconnect;
	}

	/* don't handle for multi-VIF cases */
	chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
	if (chanctx->refcount > 1) {
		rcu_read_unlock();
		goto disconnect;
	}
	num_chanctx = 0;
	list_for_each_entry_rcu(chanctx, &sdata->local->chanctx_list, list)
		num_chanctx++;

	if (num_chanctx > 1) {
		rcu_read_unlock();
		goto disconnect;
	if (cfg80211_chandef_identical(&params.chandef,
				       &sdata->vif.bss_conf.chandef)) {
		ibss_dbg(sdata,
			 "received csa with an identical chandef, ignoring\n");
		return true;
	}
	rcu_read_unlock();

	/* all checks done, now perform the channel switch. */
	ibss_dbg(sdata,
@@ -922,19 +895,9 @@ ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,

	params.block_tx = !!csa_ie.mode;

	ieee80211_ibss_csa_beacon(sdata, &params);
	sdata->csa_radar_required = params.radar_required;

	if (params.block_tx)
		ieee80211_stop_queues_by_reason(&sdata->local->hw,
				IEEE80211_MAX_QUEUE_MAP,
				IEEE80211_QUEUE_STOP_REASON_CSA);

	sdata->csa_chandef = params.chandef;
	sdata->vif.csa_active = true;

	ieee80211_bss_info_change_notify(sdata, err);
	drv_channel_switch_beacon(sdata, &params.chandef);
	if (ieee80211_channel_switch(sdata->local->hw.wiphy, sdata->dev,
				     &params))
		goto disconnect;

	ieee80211_ibss_csa_mark_radar(sdata);

@@ -970,6 +933,7 @@ ieee80211_rx_mgmt_spectrum_mgmt(struct ieee80211_sub_if_data *sdata,
	if (len < required_len)
		return;

	if (!sdata->vif.csa_active)
		ieee80211_ibss_process_chanswitch(sdata, elems, false);
}

@@ -1151,7 +1115,8 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
		goto put_bss;

	/* process channel switch */
	if (ieee80211_ibss_process_chanswitch(sdata, elems, true))
	if (sdata->vif.csa_active ||
	    ieee80211_ibss_process_chanswitch(sdata, elems, true))
		goto put_bss;

	/* same BSSID */
+2 −0
Original line number Diff line number Diff line
@@ -1450,6 +1450,8 @@ void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc);

/* channel switch handling */
void ieee80211_csa_finalize_work(struct work_struct *work);
int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
			     struct cfg80211_csa_settings *params);

/* interface handling */
int ieee80211_iface_init(void);