wireless: restrict to 32 legacy rates
Since the standards only define 12 legacy rates, 32 is certainly a sane upper limit and we don't need to use u64 everywhere. Add sanity checking that no more than 32 rates are registered and change the variables to u32 throughout. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
369391db1a
commit
881d948c23
|
@ -3398,7 +3398,7 @@ out_unlock_mutex:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void b43_update_basic_rates(struct b43_wldev *dev, u64 brates)
|
static void b43_update_basic_rates(struct b43_wldev *dev, u32 brates)
|
||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband =
|
struct ieee80211_supported_band *sband =
|
||||||
dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)];
|
dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)];
|
||||||
|
|
|
@ -2650,7 +2650,7 @@ out_unlock_mutex:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void b43legacy_update_basic_rates(struct b43legacy_wldev *dev, u64 brates)
|
static void b43legacy_update_basic_rates(struct b43legacy_wldev *dev, u32 brates)
|
||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband =
|
struct ieee80211_supported_band *sband =
|
||||||
dev->wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ];
|
dev->wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ];
|
||||||
|
|
|
@ -144,7 +144,7 @@ struct p54_common {
|
||||||
unsigned int output_power;
|
unsigned int output_power;
|
||||||
u32 tsf_low32;
|
u32 tsf_low32;
|
||||||
u32 tsf_high32;
|
u32 tsf_high32;
|
||||||
u64 basic_rate_mask;
|
u32 basic_rate_mask;
|
||||||
u16 wakeup_timer;
|
u16 wakeup_timer;
|
||||||
u16 aid;
|
u16 aid;
|
||||||
struct ieee80211_tx_queue_stats tx_stats[8];
|
struct ieee80211_tx_queue_stats tx_stats[8];
|
||||||
|
|
|
@ -396,7 +396,7 @@ struct rt2x00lib_erp {
|
||||||
int ack_timeout;
|
int ack_timeout;
|
||||||
int ack_consume_time;
|
int ack_consume_time;
|
||||||
|
|
||||||
u64 basic_rates;
|
u32 basic_rates;
|
||||||
|
|
||||||
int slot_time;
|
int slot_time;
|
||||||
|
|
||||||
|
|
|
@ -207,7 +207,7 @@ struct ieee80211_bss_conf {
|
||||||
u16 beacon_int;
|
u16 beacon_int;
|
||||||
u16 assoc_capability;
|
u16 assoc_capability;
|
||||||
u64 timestamp;
|
u64 timestamp;
|
||||||
u64 basic_rates;
|
u32 basic_rates;
|
||||||
struct ieee80211_bss_ht_conf ht;
|
struct ieee80211_bss_ht_conf ht;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -761,7 +761,7 @@ enum set_key_cmd {
|
||||||
* sizeof(void *), size is determined in hw information.
|
* sizeof(void *), size is determined in hw information.
|
||||||
*/
|
*/
|
||||||
struct ieee80211_sta {
|
struct ieee80211_sta {
|
||||||
u64 supp_rates[IEEE80211_NUM_BANDS];
|
u32 supp_rates[IEEE80211_NUM_BANDS];
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
u16 aid;
|
u16 aid;
|
||||||
struct ieee80211_sta_ht_cap ht_cap;
|
struct ieee80211_sta_ht_cap ht_cap;
|
||||||
|
|
|
@ -367,7 +367,7 @@ ieee80211_get_channel(struct wiphy *wiphy, int freq)
|
||||||
*/
|
*/
|
||||||
struct ieee80211_rate *
|
struct ieee80211_rate *
|
||||||
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
||||||
u64 basic_rates, int bitrate);
|
u32 basic_rates, int bitrate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* regulatory_hint - driver hint to the wireless core a regulatory domain
|
* regulatory_hint - driver hint to the wireless core a regulatory domain
|
||||||
|
|
|
@ -909,11 +909,11 @@ int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid);
|
||||||
void ieee80211_sta_req_auth(struct ieee80211_sub_if_data *sdata,
|
void ieee80211_sta_req_auth(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_if_sta *ifsta);
|
struct ieee80211_if_sta *ifsta);
|
||||||
struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
|
struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
|
||||||
u8 *bssid, u8 *addr, u64 supp_rates);
|
u8 *bssid, u8 *addr, u32 supp_rates);
|
||||||
int ieee80211_sta_deauthenticate(struct ieee80211_sub_if_data *sdata, u16 reason);
|
int ieee80211_sta_deauthenticate(struct ieee80211_sub_if_data *sdata, u16 reason);
|
||||||
int ieee80211_sta_disassociate(struct ieee80211_sub_if_data *sdata, u16 reason);
|
int ieee80211_sta_disassociate(struct ieee80211_sub_if_data *sdata, u16 reason);
|
||||||
u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata);
|
u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata);
|
||||||
u64 ieee80211_sta_get_rates(struct ieee80211_local *local,
|
u32 ieee80211_sta_get_rates(struct ieee80211_local *local,
|
||||||
struct ieee802_11_elems *elems,
|
struct ieee802_11_elems *elems,
|
||||||
enum ieee80211_band band);
|
enum ieee80211_band band);
|
||||||
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
||||||
|
@ -1026,7 +1026,7 @@ void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
|
||||||
void ieee802_11_parse_elems(u8 *start, size_t len,
|
void ieee802_11_parse_elems(u8 *start, size_t len,
|
||||||
struct ieee802_11_elems *elems);
|
struct ieee802_11_elems *elems);
|
||||||
int ieee80211_set_freq(struct ieee80211_sub_if_data *sdata, int freq);
|
int ieee80211_set_freq(struct ieee80211_sub_if_data *sdata, int freq);
|
||||||
u64 ieee80211_mandatory_rates(struct ieee80211_local *local,
|
u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
|
||||||
enum ieee80211_band band);
|
enum ieee80211_band band);
|
||||||
|
|
||||||
void ieee80211_dynamic_ps_enable_work(struct work_struct *work);
|
void ieee80211_dynamic_ps_enable_work(struct work_struct *work);
|
||||||
|
|
|
@ -476,7 +476,7 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct ieee802_11_elems elems;
|
struct ieee802_11_elems elems;
|
||||||
struct ieee80211_channel *channel;
|
struct ieee80211_channel *channel;
|
||||||
u64 supp_rates = 0;
|
u32 supp_rates = 0;
|
||||||
size_t baselen;
|
size_t baselen;
|
||||||
int freq;
|
int freq;
|
||||||
enum ieee80211_band band = rx_status->band;
|
enum ieee80211_band band = rx_status->band;
|
||||||
|
|
|
@ -236,7 +236,7 @@ void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_mgmt *mgmt, size_t len);
|
struct ieee80211_mgmt *mgmt, size_t len);
|
||||||
int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata);
|
int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata);
|
||||||
/* Mesh plinks */
|
/* Mesh plinks */
|
||||||
void mesh_neighbour_update(u8 *hw_addr, u64 rates,
|
void mesh_neighbour_update(u8 *hw_addr, u32 rates,
|
||||||
struct ieee80211_sub_if_data *sdata, bool add);
|
struct ieee80211_sub_if_data *sdata, bool add);
|
||||||
bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie);
|
bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie);
|
||||||
void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata);
|
void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata);
|
||||||
|
|
|
@ -93,7 +93,7 @@ static inline void mesh_plink_fsm_restart(struct sta_info *sta)
|
||||||
* on it in the lifecycle management section!
|
* on it in the lifecycle management section!
|
||||||
*/
|
*/
|
||||||
static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
|
static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
|
||||||
u8 *hw_addr, u64 rates)
|
u8 *hw_addr, u32 rates)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
|
@ -222,7 +222,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mesh_neighbour_update(u8 *hw_addr, u64 rates, struct ieee80211_sub_if_data *sdata,
|
void mesh_neighbour_update(u8 *hw_addr, u32 rates, struct ieee80211_sub_if_data *sdata,
|
||||||
bool peer_accepting_plinks)
|
bool peer_accepting_plinks)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
@ -447,7 +447,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
||||||
spin_lock_bh(&sta->lock);
|
spin_lock_bh(&sta->lock);
|
||||||
} else if (!sta) {
|
} else if (!sta) {
|
||||||
/* ftype == PLINK_OPEN */
|
/* ftype == PLINK_OPEN */
|
||||||
u64 rates;
|
u32 rates;
|
||||||
if (!mesh_plink_free_count(sdata)) {
|
if (!mesh_plink_free_count(sdata)) {
|
||||||
mpl_dbg("Mesh plink error: no more free plinks\n");
|
mpl_dbg("Mesh plink error: no more free plinks\n");
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
|
@ -73,7 +73,7 @@ static u8 *ieee80211_bss_get_ie(struct ieee80211_bss *bss, u8 ie)
|
||||||
|
|
||||||
static int ieee80211_compatible_rates(struct ieee80211_bss *bss,
|
static int ieee80211_compatible_rates(struct ieee80211_bss *bss,
|
||||||
struct ieee80211_supported_band *sband,
|
struct ieee80211_supported_band *sband,
|
||||||
u64 *rates)
|
u32 *rates)
|
||||||
{
|
{
|
||||||
int i, j, count;
|
int i, j, count;
|
||||||
*rates = 0;
|
*rates = 0;
|
||||||
|
@ -93,14 +93,14 @@ static int ieee80211_compatible_rates(struct ieee80211_bss *bss,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* also used by mesh code */
|
/* also used by mesh code */
|
||||||
u64 ieee80211_sta_get_rates(struct ieee80211_local *local,
|
u32 ieee80211_sta_get_rates(struct ieee80211_local *local,
|
||||||
struct ieee802_11_elems *elems,
|
struct ieee802_11_elems *elems,
|
||||||
enum ieee80211_band band)
|
enum ieee80211_band band)
|
||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
struct ieee80211_rate *bitrates;
|
struct ieee80211_rate *bitrates;
|
||||||
size_t num_rates;
|
size_t num_rates;
|
||||||
u64 supp_rates;
|
u32 supp_rates;
|
||||||
int i, j;
|
int i, j;
|
||||||
sband = local->hw.wiphy->bands[band];
|
sband = local->hw.wiphy->bands[band];
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_bss *bss;
|
struct ieee80211_bss *bss;
|
||||||
int wmm = 0;
|
int wmm = 0;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
u64 rates = 0;
|
u32 rates = 0;
|
||||||
size_t e_ies_len;
|
size_t e_ies_len;
|
||||||
|
|
||||||
if (ifsta->flags & IEEE80211_STA_PREV_BSSID_SET) {
|
if (ifsta->flags & IEEE80211_STA_PREV_BSSID_SET) {
|
||||||
|
@ -1282,7 +1282,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
u64 rates, basic_rates;
|
u32 rates, basic_rates;
|
||||||
u16 capab_info, status_code, aid;
|
u16 capab_info, status_code, aid;
|
||||||
struct ieee802_11_elems elems;
|
struct ieee802_11_elems elems;
|
||||||
struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
|
struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
|
||||||
|
@ -1639,7 +1639,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
struct ieee80211_channel *channel;
|
struct ieee80211_channel *channel;
|
||||||
u64 beacon_timestamp, rx_timestamp;
|
u64 beacon_timestamp, rx_timestamp;
|
||||||
u64 supp_rates = 0;
|
u32 supp_rates = 0;
|
||||||
enum ieee80211_band band = rx_status->band;
|
enum ieee80211_band band = rx_status->band;
|
||||||
|
|
||||||
if (elems->ds_params && elems->ds_params_len == 1)
|
if (elems->ds_params && elems->ds_params_len == 1)
|
||||||
|
@ -1660,7 +1660,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
sta = sta_info_get(local, mgmt->sa);
|
sta = sta_info_get(local, mgmt->sa);
|
||||||
if (sta) {
|
if (sta) {
|
||||||
u64 prev_rates;
|
u32 prev_rates;
|
||||||
|
|
||||||
prev_rates = sta->sta.supp_rates[band];
|
prev_rates = sta->sta.supp_rates[band];
|
||||||
/* make sure mandatory rates are always added */
|
/* make sure mandatory rates are always added */
|
||||||
|
@ -2526,7 +2526,7 @@ void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
|
||||||
* must be callable in atomic context.
|
* must be callable in atomic context.
|
||||||
*/
|
*/
|
||||||
struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
|
struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
|
||||||
u8 *bssid,u8 *addr, u64 supp_rates)
|
u8 *bssid,u8 *addr, u32 supp_rates)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
|
|
|
@ -731,12 +731,12 @@ int ieee80211_set_freq(struct ieee80211_sub_if_data *sdata, int freqMHz)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 ieee80211_mandatory_rates(struct ieee80211_local *local,
|
u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
|
||||||
enum ieee80211_band band)
|
enum ieee80211_band band)
|
||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
struct ieee80211_rate *bitrates;
|
struct ieee80211_rate *bitrates;
|
||||||
u64 mandatory_rates;
|
u32 mandatory_rates;
|
||||||
enum ieee80211_rate_flags mandatory_flag;
|
enum ieee80211_rate_flags mandatory_flag;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
|
@ -273,10 +273,16 @@ int wiphy_register(struct wiphy *wiphy)
|
||||||
|
|
||||||
sband->band = band;
|
sband->band = band;
|
||||||
|
|
||||||
if (!sband->n_channels || !sband->n_bitrates) {
|
if (WARN_ON(!sband->n_channels || !sband->n_bitrates))
|
||||||
WARN_ON(1);
|
return -EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Since we use a u32 for rate bitmaps in
|
||||||
|
* ieee80211_get_response_rate, we cannot
|
||||||
|
* have more than 32 legacy rates.
|
||||||
|
*/
|
||||||
|
if (WARN_ON(sband->n_bitrates > 32))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < sband->n_channels; i++) {
|
for (i = 0; i < sband->n_channels; i++) {
|
||||||
sband->channels[i].orig_flags =
|
sband->channels[i].orig_flags =
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
struct ieee80211_rate *
|
struct ieee80211_rate *
|
||||||
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
||||||
u64 basic_rates, int bitrate)
|
u32 basic_rates, int bitrate)
|
||||||
{
|
{
|
||||||
struct ieee80211_rate *result = &sband->bitrates[0];
|
struct ieee80211_rate *result = &sband->bitrates[0];
|
||||||
int i;
|
int i;
|
||||||
|
|
Loading…
Reference in New Issue