Skip to content

Commit

Permalink
mac80211: Indicate basic rates when adding rate IEs
Browse files Browse the repository at this point in the history
Basic rates are added with supported rates IE and extended supported
rates IE.

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>
  • Loading branch information
Ashok Nagarajan authored and John W. Linville committed Apr 11, 2012
1 parent d934f7d commit 657c3e0
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 16 deletions.
5 changes: 3 additions & 2 deletions include/net/mac80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -3717,8 +3717,9 @@ void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif,

void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif);

int ieee80211_add_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb);
int ieee80211_add_srates_ie(struct ieee80211_vif *vif,
struct sk_buff *skb, bool need_basic);

int ieee80211_add_ext_srates_ie(struct ieee80211_vif *vif,
struct sk_buff *skb);
struct sk_buff *skb, bool need_basic);
#endif /* MAC80211_H */
12 changes: 6 additions & 6 deletions net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -2358,8 +2358,8 @@ ieee80211_prep_tdls_encap_data(struct wiphy *wiphy, struct net_device *dev,
tf->u.setup_req.capability =
cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata));

ieee80211_add_srates_ie(&sdata->vif, skb);
ieee80211_add_ext_srates_ie(&sdata->vif, skb);
ieee80211_add_srates_ie(&sdata->vif, skb, false);
ieee80211_add_ext_srates_ie(&sdata->vif, skb, false);
ieee80211_tdls_add_ext_capab(skb);
break;
case WLAN_TDLS_SETUP_RESPONSE:
Expand All @@ -2372,8 +2372,8 @@ ieee80211_prep_tdls_encap_data(struct wiphy *wiphy, struct net_device *dev,
tf->u.setup_resp.capability =
cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata));

ieee80211_add_srates_ie(&sdata->vif, skb);
ieee80211_add_ext_srates_ie(&sdata->vif, skb);
ieee80211_add_srates_ie(&sdata->vif, skb, false);
ieee80211_add_ext_srates_ie(&sdata->vif, skb, false);
ieee80211_tdls_add_ext_capab(skb);
break;
case WLAN_TDLS_SETUP_CONFIRM:
Expand Down Expand Up @@ -2433,8 +2433,8 @@ ieee80211_prep_tdls_direct(struct wiphy *wiphy, struct net_device *dev,
mgmt->u.action.u.tdls_discover_resp.capability =
cpu_to_le16(ieee80211_get_tdls_sta_capab(sdata));

ieee80211_add_srates_ie(&sdata->vif, skb);
ieee80211_add_ext_srates_ie(&sdata->vif, skb);
ieee80211_add_srates_ie(&sdata->vif, skb, false);
ieee80211_add_ext_srates_ie(&sdata->vif, skb, false);
ieee80211_tdls_add_ext_capab(skb);
break;
default:
Expand Down
4 changes: 2 additions & 2 deletions net/mac80211/mesh_plink.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,8 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
pos = skb_put(skb, 2);
memcpy(pos + 2, &plid, 2);
}
if (ieee80211_add_srates_ie(&sdata->vif, skb) ||
ieee80211_add_ext_srates_ie(&sdata->vif, skb) ||
if (ieee80211_add_srates_ie(&sdata->vif, skb, true) ||
ieee80211_add_ext_srates_ie(&sdata->vif, skb, true) ||
mesh_add_rsn_ie(skb, sdata) ||
mesh_add_meshid_ie(skb, sdata) ||
mesh_add_meshconf_ie(skb, sdata))
Expand Down
4 changes: 2 additions & 2 deletions net/mac80211/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2418,9 +2418,9 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
*pos++ = WLAN_EID_SSID;
*pos++ = 0x0;

if (ieee80211_add_srates_ie(&sdata->vif, skb) ||
if (ieee80211_add_srates_ie(&sdata->vif, skb, true) ||
mesh_add_ds_params_ie(skb, sdata) ||
ieee80211_add_ext_srates_ie(&sdata->vif, skb) ||
ieee80211_add_ext_srates_ie(&sdata->vif, skb, true) ||
mesh_add_rsn_ie(skb, sdata) ||
mesh_add_ht_cap_ie(skb, sdata) ||
mesh_add_ht_oper_ie(skb, sdata) ||
Expand Down
18 changes: 14 additions & 4 deletions net/mac80211/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1683,13 +1683,15 @@ ieee80211_ht_oper_to_channel_type(struct ieee80211_ht_operation *ht_oper)
return channel_type;
}

int ieee80211_add_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb)
int ieee80211_add_srates_ie(struct ieee80211_vif *vif,
struct sk_buff *skb, bool need_basic)
{
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
struct ieee80211_local *local = sdata->local;
struct ieee80211_supported_band *sband;
int rate;
u8 i, rates, *pos;
u32 basic_rates = vif->bss_conf.basic_rates;

sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
rates = sband->n_bitrates;
Expand All @@ -1703,20 +1705,25 @@ int ieee80211_add_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb)
*pos++ = WLAN_EID_SUPP_RATES;
*pos++ = rates;
for (i = 0; i < rates; i++) {
u8 basic = 0;
if (need_basic && basic_rates & BIT(i))
basic = 0x80;
rate = sband->bitrates[i].bitrate;
*pos++ = (u8) (rate / 5);
*pos++ = basic | (u8) (rate / 5);
}

return 0;
}

int ieee80211_add_ext_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb)
int ieee80211_add_ext_srates_ie(struct ieee80211_vif *vif,
struct sk_buff *skb, bool need_basic)
{
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
struct ieee80211_local *local = sdata->local;
struct ieee80211_supported_band *sband;
int rate;
u8 i, exrates, *pos;
u32 basic_rates = vif->bss_conf.basic_rates;

sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
exrates = sband->n_bitrates;
Expand All @@ -1733,8 +1740,11 @@ int ieee80211_add_ext_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb)
*pos++ = WLAN_EID_EXT_SUPP_RATES;
*pos++ = exrates;
for (i = 8; i < sband->n_bitrates; i++) {
u8 basic = 0;
if (need_basic && basic_rates & BIT(i))
basic = 0x80;
rate = sband->bitrates[i].bitrate;
*pos++ = (u8) (rate / 5);
*pos++ = basic | (u8) (rate / 5);
}
}
return 0;
Expand Down

0 comments on commit 657c3e0

Please sign in to comment.