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

Commit 0d06d9ba authored by Andrei Otcheretianski's avatar Andrei Otcheretianski Committed by Johannes Berg
Browse files

mac80211: Support multiple CSA counters



Support up to IEEE80211_MAX_CSA_COUNTERS_NUM csa counters.
This is defined to be 2 now, to support both CSA and eCSA
counters.

Signed-off-by: default avatarAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 9a774c78
Loading
Loading
Loading
Loading
+17 −7
Original line number Diff line number Diff line
@@ -3191,14 +3191,24 @@ static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
		if (params->count <= 1)
			break;

		sdata->csa_counter_offset_beacon =
			params->counter_offsets_beacon[0];
		if ((params->n_counter_offsets_beacon >
		     IEEE80211_MAX_CSA_COUNTERS_NUM) ||
		    (params->n_counter_offsets_presp >
		     IEEE80211_MAX_CSA_COUNTERS_NUM))
			return -EINVAL;

		if (params->n_counter_offsets_presp)
			sdata->csa_counter_offset_presp =
				params->counter_offsets_presp[0];
		else
			sdata->csa_counter_offset_presp = 0;
		/* make sure we don't have garbage in other counters */
		memset(sdata->csa_counter_offset_beacon, 0,
		       sizeof(sdata->csa_counter_offset_beacon));
		memset(sdata->csa_counter_offset_presp, 0,
		       sizeof(sdata->csa_counter_offset_presp));

		memcpy(sdata->csa_counter_offset_beacon,
		       params->counter_offsets_beacon,
		       params->n_counter_offsets_beacon * sizeof(u16));
		memcpy(sdata->csa_counter_offset_presp,
		       params->counter_offsets_presp,
		       params->n_counter_offsets_presp * sizeof(u16));

		err = ieee80211_assign_beacon(sdata, &params->beacon_csa);
		if (err < 0) {
+1 −1
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata,
		*pos++ = csa_settings->block_tx ? 1 : 0;
		*pos++ = ieee80211_frequency_to_channel(
				csa_settings->chandef.chan->center_freq);
		sdata->csa_counter_offset_beacon = (pos - presp->head);
		sdata->csa_counter_offset_beacon[0] = (pos - presp->head);
		*pos++ = csa_settings->count;
	}

+4 −2
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ struct ieee80211_local;

#define IEEE80211_DEAUTH_FRAME_LEN	(24 /* hdr */ + 2 /* reason */)

#define IEEE80211_MAX_CSA_COUNTERS_NUM 2

struct ieee80211_fragment_entry {
	unsigned long first_frag_time;
	unsigned int seq;
@@ -753,8 +755,8 @@ struct ieee80211_sub_if_data {
	struct mac80211_qos_map __rcu *qos_map;

	struct work_struct csa_finalize_work;
	int csa_counter_offset_beacon;
	int csa_counter_offset_presp;
	u16 csa_counter_offset_beacon[IEEE80211_MAX_CSA_COUNTERS_NUM];
	u16 csa_counter_offset_presp[IEEE80211_MAX_CSA_COUNTERS_NUM];
	bool csa_radar_required;
	bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */
	struct cfg80211_chan_def csa_chandef;
+2 −0
Original line number Diff line number Diff line
@@ -954,6 +954,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
	if (local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)
		local->hw.wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP;

	local->hw.wiphy->max_num_csa_counters = IEEE80211_MAX_CSA_COUNTERS_NUM;

	result = wiphy_register(local->hw.wiphy);
	if (result < 0)
		goto fail_wiphy_register;
+1 −1
Original line number Diff line number Diff line
@@ -679,7 +679,7 @@ ieee80211_mesh_build_beacon(struct ieee80211_if_mesh *ifmsh)
		*pos++ = 0x0;
		*pos++ = ieee80211_frequency_to_channel(
				csa->settings.chandef.chan->center_freq);
		sdata->csa_counter_offset_beacon = hdr_len + 6;
		sdata->csa_counter_offset_beacon[0] = hdr_len + 6;
		*pos++ = csa->settings.count;
		*pos++ = WLAN_EID_CHAN_SWITCH_PARAM;
		*pos++ = 6;
Loading