mac80211: support HT notify channel width action

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>
This commit is contained in:
Johannes Berg 2012-12-28 12:12:10 +01:00
parent 598a5938e0
commit ec61cd63dd
2 changed files with 39 additions and 1 deletions

View File

@ -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 {
@ -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;

View File

@ -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;
@ -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;
}