Commit 9ebb61a2 authored by Ashok Nagarajan's avatar Ashok Nagarajan Committed by John W. Linville

mac80211: Modify sta_get_rates to give basic rates

Signed-off-by: default avatarAshok Nagarajan <ashok@cozybit.com>
Signed-off-by: default avatarThomas Pedersen <thomas@cozybit.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 657c3e0c
...@@ -408,7 +408,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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, ...@@ -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, ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment