mac80211: Modify sta_get_rates to give basic rates
Signed-off-by: Ashok Nagarajan <ashok@cozybit.com> Signed-off-by: Thomas Pedersen <thomas@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
657c3e0c41
commit
9ebb61a23d
@ -408,7 +408,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
if (elems->supp_rates) {
|
if (elems->supp_rates) {
|
||||||
supp_rates = ieee80211_sta_get_rates(local, elems,
|
supp_rates = ieee80211_sta_get_rates(local, elems,
|
||||||
band);
|
band, NULL);
|
||||||
if (sta) {
|
if (sta) {
|
||||||
u32 prev_rates;
|
u32 prev_rates;
|
||||||
|
|
||||||
@ -558,7 +558,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
|||||||
sdata->name, mgmt->bssid);
|
sdata->name, mgmt->bssid);
|
||||||
#endif
|
#endif
|
||||||
ieee80211_sta_join_ibss(sdata, bss);
|
ieee80211_sta_join_ibss(sdata, bss);
|
||||||
supp_rates = ieee80211_sta_get_rates(local, elems, band);
|
supp_rates = ieee80211_sta_get_rates(local, elems, band, NULL);
|
||||||
ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
|
ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
|
||||||
supp_rates, true);
|
supp_rates, true);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
@ -1480,7 +1480,7 @@ void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
|
|||||||
const u8 *supp_rates);
|
const u8 *supp_rates);
|
||||||
u32 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, u32 *basic_rates);
|
||||||
int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
|
int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
|
||||||
enum ieee80211_smps_mode smps_mode);
|
enum ieee80211_smps_mode smps_mode);
|
||||||
void ieee80211_recalc_smps(struct ieee80211_local *local);
|
void ieee80211_recalc_smps(struct ieee80211_local *local);
|
||||||
|
@ -625,7 +625,7 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
|
|||||||
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
||||||
struct ieee802_11_elems elems;
|
struct ieee802_11_elems elems;
|
||||||
struct ieee80211_channel *channel;
|
struct ieee80211_channel *channel;
|
||||||
u32 supp_rates = 0;
|
u32 supp_rates = 0, basic_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;
|
||||||
@ -658,7 +658,8 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
if (elems.mesh_id && elems.mesh_config &&
|
if (elems.mesh_id && elems.mesh_config &&
|
||||||
mesh_matches_local(&elems, sdata)) {
|
mesh_matches_local(&elems, sdata)) {
|
||||||
supp_rates = ieee80211_sta_get_rates(local, &elems, band);
|
supp_rates = ieee80211_sta_get_rates(local, &elems,
|
||||||
|
band, &basic_rates);
|
||||||
mesh_neighbour_update(mgmt->sa, supp_rates, sdata, &elems);
|
mesh_neighbour_update(mgmt->sa, supp_rates, sdata, &elems);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,6 +465,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
|||||||
bool deactivated, matches_local = true;
|
bool deactivated, matches_local = true;
|
||||||
u8 ie_len;
|
u8 ie_len;
|
||||||
u8 *baseaddr;
|
u8 *baseaddr;
|
||||||
|
u32 rates, basic_rates = 0;
|
||||||
__le16 plid, llid, reason;
|
__le16 plid, llid, reason;
|
||||||
#ifdef CONFIG_MAC80211_VERBOSE_MPL_DEBUG
|
#ifdef CONFIG_MAC80211_VERBOSE_MPL_DEBUG
|
||||||
static const char *mplstates[] = {
|
static const char *mplstates[] = {
|
||||||
@ -559,6 +560,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
|||||||
|
|
||||||
/* Now we will figure out the appropriate event... */
|
/* Now we will figure out the appropriate event... */
|
||||||
event = PLINK_UNDEFINED;
|
event = PLINK_UNDEFINED;
|
||||||
|
rates = ieee80211_sta_get_rates(local, &elems,
|
||||||
|
rx_status->band, &basic_rates);
|
||||||
|
|
||||||
if (ftype != WLAN_SP_MESH_PEERING_CLOSE &&
|
if (ftype != WLAN_SP_MESH_PEERING_CLOSE &&
|
||||||
(!mesh_matches_local(&elems, sdata))) {
|
(!mesh_matches_local(&elems, sdata))) {
|
||||||
matches_local = false;
|
matches_local = false;
|
||||||
@ -583,7 +587,6 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
|||||||
return;
|
return;
|
||||||
} else if (!sta) {
|
} else if (!sta) {
|
||||||
/* ftype == WLAN_SP_MESH_PEERING_OPEN */
|
/* ftype == WLAN_SP_MESH_PEERING_OPEN */
|
||||||
u32 rates;
|
|
||||||
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
@ -591,8 +594,6 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
|||||||
mpl_dbg("Mesh plink error: no more free plinks\n");
|
mpl_dbg("Mesh plink error: no more free plinks\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rates = ieee80211_sta_get_rates(local, &elems, rx_status->band);
|
|
||||||
sta = mesh_plink_alloc(sdata, mgmt->sa, rates, &elems);
|
sta = mesh_plink_alloc(sdata, mgmt->sa, rates, &elems);
|
||||||
if (!sta) {
|
if (!sta) {
|
||||||
mpl_dbg("Mesh plink error: plink table full\n");
|
mpl_dbg("Mesh plink error: plink table full\n");
|
||||||
|
@ -1109,7 +1109,7 @@ void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
|||||||
|
|
||||||
u32 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, u32 *basic_rates)
|
||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
struct ieee80211_rate *bitrates;
|
struct ieee80211_rate *bitrates;
|
||||||
@ -1130,15 +1130,25 @@ u32 ieee80211_sta_get_rates(struct ieee80211_local *local,
|
|||||||
elems->ext_supp_rates_len; i++) {
|
elems->ext_supp_rates_len; i++) {
|
||||||
u8 rate = 0;
|
u8 rate = 0;
|
||||||
int own_rate;
|
int own_rate;
|
||||||
|
bool is_basic;
|
||||||
if (i < elems->supp_rates_len)
|
if (i < elems->supp_rates_len)
|
||||||
rate = elems->supp_rates[i];
|
rate = elems->supp_rates[i];
|
||||||
else if (elems->ext_supp_rates)
|
else if (elems->ext_supp_rates)
|
||||||
rate = elems->ext_supp_rates
|
rate = elems->ext_supp_rates
|
||||||
[i - elems->supp_rates_len];
|
[i - elems->supp_rates_len];
|
||||||
own_rate = 5 * (rate & 0x7f);
|
own_rate = 5 * (rate & 0x7f);
|
||||||
for (j = 0; j < num_rates; j++)
|
is_basic = !!(rate & 0x80);
|
||||||
if (bitrates[j].bitrate == own_rate)
|
|
||||||
|
if (is_basic && (rate & 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (j = 0; j < num_rates; j++) {
|
||||||
|
if (bitrates[j].bitrate == own_rate) {
|
||||||
supp_rates |= BIT(j);
|
supp_rates |= BIT(j);
|
||||||
|
if (basic_rates && is_basic)
|
||||||
|
*basic_rates |= BIT(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return supp_rates;
|
return supp_rates;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user