Skip to content

Commit

Permalink
mac80211: support HT notify channel width action
Browse files Browse the repository at this point in the history
Support the HT notify channel width action frame
to update the rate scaling about the bandwidth
the peer can receive in.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Johannes Berg committed Jan 3, 2013
1 parent 598a593 commit ec61cd6
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
9 changes: 9 additions & 0 deletions include/linux/ieee80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -701,6 +701,11 @@ enum ieee80211_rann_flags {
RANN_FLAG_IS_GATE = 1 << 0,
};

enum ieee80211_ht_chanwidth_values {
IEEE80211_HT_CHANWIDTH_20MHZ = 0,
IEEE80211_HT_CHANWIDTH_ANY = 1,
};

#define WLAN_SA_QUERY_TR_ID_LEN 2

struct ieee80211_mgmt {
Expand Down Expand Up @@ -821,6 +826,10 @@ struct ieee80211_mgmt {
u8 action;
u8 smps_control;
} __packed ht_smps;
struct {
u8 action_code;
u8 chanwidth;
} __packed ht_notify_cw;
struct {
u8 action_code;
u8 dialog_token;
Expand Down
31 changes: 30 additions & 1 deletion net/mac80211/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2353,7 +2353,7 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
sdata->vif.type != NL80211_IFTYPE_ADHOC)
break;

/* verify action & smps_control are present */
/* verify action & smps_control/chanwidth are present */
if (len < IEEE80211_MIN_ACTION_SIZE + 2)
goto invalid;

Expand Down Expand Up @@ -2392,6 +2392,35 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
IEEE80211_RC_SMPS_CHANGED);
goto handled;
}
case WLAN_HT_ACTION_NOTIFY_CHANWIDTH: {
struct ieee80211_supported_band *sband;
u8 chanwidth = mgmt->u.action.u.ht_notify_cw.chanwidth;
bool old_40mhz, new_40mhz;

/* If it doesn't support 40 MHz it can't change ... */
if (!rx->sta->supports_40mhz)
goto handled;

old_40mhz = rx->sta->sta.ht_cap.cap &
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
new_40mhz = chanwidth == IEEE80211_HT_CHANWIDTH_ANY;

if (old_40mhz == new_40mhz)
goto handled;

if (new_40mhz)
rx->sta->sta.ht_cap.cap |=
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
else
rx->sta->sta.ht_cap.cap &=
~IEEE80211_HT_CAP_SUP_WIDTH_20_40;

sband = rx->local->hw.wiphy->bands[status->band];

rate_control_rate_update(local, sband, rx->sta,
IEEE80211_RC_BW_CHANGED);
goto handled;
}
default:
goto invalid;
}
Expand Down

0 comments on commit ec61cd6

Please sign in to comment.