|
@@ -1364,3 +1364,60 @@ void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif)
|
|
|
_ieee80211_enable_rssi_reports(sdata, 0, 0);
|
|
|
}
|
|
|
EXPORT_SYMBOL(ieee80211_disable_rssi_reports);
|
|
|
+
|
|
|
+int ieee80211_add_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb)
|
|
|
+{
|
|
|
+ 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;
|
|
|
+
|
|
|
+ sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
|
|
|
+ rates = sband->n_bitrates;
|
|
|
+ if (rates > 8)
|
|
|
+ rates = 8;
|
|
|
+
|
|
|
+ if (skb_tailroom(skb) < rates + 2)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ pos = skb_put(skb, rates + 2);
|
|
|
+ *pos++ = WLAN_EID_SUPP_RATES;
|
|
|
+ *pos++ = rates;
|
|
|
+ for (i = 0; i < rates; i++) {
|
|
|
+ rate = sband->bitrates[i].bitrate;
|
|
|
+ *pos++ = (u8) (rate / 5);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int ieee80211_add_ext_srates_ie(struct ieee80211_vif *vif, struct sk_buff *skb)
|
|
|
+{
|
|
|
+ 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;
|
|
|
+
|
|
|
+ sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
|
|
|
+ exrates = sband->n_bitrates;
|
|
|
+ if (exrates > 8)
|
|
|
+ exrates -= 8;
|
|
|
+ else
|
|
|
+ exrates = 0;
|
|
|
+
|
|
|
+ if (skb_tailroom(skb) < exrates + 2)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ if (exrates) {
|
|
|
+ pos = skb_put(skb, exrates + 2);
|
|
|
+ *pos++ = WLAN_EID_EXT_SUPP_RATES;
|
|
|
+ *pos++ = exrates;
|
|
|
+ for (i = 8; i < sband->n_bitrates; i++) {
|
|
|
+ rate = sband->bitrates[i].bitrate;
|
|
|
+ *pos++ = (u8) (rate / 5);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|