Skip to content

Commit

Permalink
mac80211: Update CSA counters in mgmt frames
Browse files Browse the repository at this point in the history
Track current csa counter value and use it
to update mgmt frames at the provided offsets.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Andrei Otcheretianski authored and Johannes Berg committed May 15, 2014
1 parent 34d22ce commit 387910c
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 3 deletions.
17 changes: 16 additions & 1 deletion net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -3338,6 +3338,7 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
sdata->csa_radar_required = params->radar_required;
sdata->csa_chandef = params->chandef;
sdata->csa_block_tx = params->block_tx;
sdata->csa_current_counter = params->count;
sdata->vif.csa_active = true;

if (sdata->csa_block_tx)
Expand Down Expand Up @@ -3382,6 +3383,7 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
bool need_offchan = false;
u32 flags;
int ret;
u8 *data;

if (params->dont_wait_for_ack)
flags = IEEE80211_TX_CTL_NO_ACK;
Expand Down Expand Up @@ -3475,7 +3477,20 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
}
skb_reserve(skb, local->hw.extra_tx_headroom);

memcpy(skb_put(skb, params->len), params->buf, params->len);
data = skb_put(skb, params->len);
memcpy(data, params->buf, params->len);

/* Update CSA counters */
if (sdata->vif.csa_active &&
(sdata->vif.type == NL80211_IFTYPE_AP ||
sdata->vif.type == NL80211_IFTYPE_ADHOC) &&
params->n_csa_offsets) {
int i;

for (i = 0; i < params->n_csa_offsets; i++)
data[params->csa_offsets[i]] =
sdata->csa_current_counter;
}

IEEE80211_SKB_CB(skb)->flags = flags;

Expand Down
1 change: 1 addition & 0 deletions net/mac80211/ieee80211_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -766,6 +766,7 @@ struct ieee80211_sub_if_data {
struct ieee80211_chanctx *reserved_chanctx;
struct cfg80211_chan_def reserved_chandef;
bool reserved_radar_required;
u8 csa_current_counter;

/* used to reconfigure hardware SM PS */
struct work_struct recalc_smps;
Expand Down
5 changes: 3 additions & 2 deletions net/mac80211/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2449,7 +2449,8 @@ static void ieee80211_update_csa(struct ieee80211_sub_if_data *sdata,
if (WARN_ON(beacon_data[counter_offset_beacon] == 1))
return;

beacon_data[counter_offset_beacon]--;
sdata->csa_current_counter--;
beacon_data[counter_offset_beacon] = sdata->csa_current_counter;

if (sdata->vif.type == NL80211_IFTYPE_AP && counter_offset_presp) {
rcu_read_lock();
Expand All @@ -2460,7 +2461,7 @@ static void ieee80211_update_csa(struct ieee80211_sub_if_data *sdata,
rcu_read_unlock();
return;
}
resp->data[counter_offset_presp]--;
resp->data[counter_offset_presp] = sdata->csa_current_counter;
rcu_read_unlock();
}
}
Expand Down

0 comments on commit 387910c

Please sign in to comment.