aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/rate.c25
-rw-r--r--net/mac80211/tx.c24
2 files changed, 38 insertions, 11 deletions
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c
index b9007f80cb92..6349e7f4dcae 100644
--- a/net/mac80211/rate.c
+++ b/net/mac80211/rate.c
@@ -207,6 +207,27 @@ static bool rc_no_data_or_no_ack(struct ieee80211_tx_rate_control *txrc)
207 return ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !ieee80211_is_data(fc)); 207 return ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !ieee80211_is_data(fc));
208} 208}
209 209
210static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, u8 max_rate_idx)
211{
212 u8 i;
213
214 if (basic_rates == 0)
215 return; /* assume basic rates unknown and accept rate */
216 if (*idx < 0)
217 return;
218 if (basic_rates & (1 << *idx))
219 return; /* selected rate is a basic rate */
220
221 for (i = *idx + 1; i <= max_rate_idx; i++) {
222 if (basic_rates & (1 << i)) {
223 *idx = i;
224 return;
225 }
226 }
227
228 /* could not find a basic rate; use original selection */
229}
230
210bool rate_control_send_low(struct ieee80211_sta *sta, 231bool rate_control_send_low(struct ieee80211_sta *sta,
211 void *priv_sta, 232 void *priv_sta,
212 struct ieee80211_tx_rate_control *txrc) 233 struct ieee80211_tx_rate_control *txrc)
@@ -218,6 +239,10 @@ bool rate_control_send_low(struct ieee80211_sta *sta,
218 info->control.rates[0].count = 239 info->control.rates[0].count =
219 (info->flags & IEEE80211_TX_CTL_NO_ACK) ? 240 (info->flags & IEEE80211_TX_CTL_NO_ACK) ?
220 1 : txrc->hw->max_rate_tries; 241 1 : txrc->hw->max_rate_tries;
242 if (!sta && txrc->ap)
243 rc_send_low_broadcast(&info->control.rates[0].idx,
244 txrc->bss_conf->basic_rates,
245 txrc->sband->n_bitrates);
221 return true; 246 return true;
222 } 247 }
223 return false; 248 return false;
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 140da4a7f13d..4961168f5091 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -520,6 +520,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
520 txrc.skb = tx->skb; 520 txrc.skb = tx->skb;
521 txrc.reported_rate.idx = -1; 521 txrc.reported_rate.idx = -1;
522 txrc.max_rate_idx = tx->sdata->max_ratectrl_rateidx; 522 txrc.max_rate_idx = tx->sdata->max_ratectrl_rateidx;
523 txrc.ap = tx->sdata->vif.type == NL80211_IFTYPE_AP;
523 524
524 /* set up RTS protection if desired */ 525 /* set up RTS protection if desired */
525 if (len > tx->local->hw.wiphy->rts_threshold) { 526 if (len > tx->local->hw.wiphy->rts_threshold) {
@@ -2060,6 +2061,7 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
2060 struct beacon_data *beacon; 2061 struct beacon_data *beacon;
2061 struct ieee80211_supported_band *sband; 2062 struct ieee80211_supported_band *sband;
2062 enum ieee80211_band band = local->hw.conf.channel->band; 2063 enum ieee80211_band band = local->hw.conf.channel->band;
2064 struct ieee80211_tx_rate_control txrc;
2063 2065
2064 sband = local->hw.wiphy->bands[band]; 2066 sband = local->hw.wiphy->bands[band];
2065 2067
@@ -2167,21 +2169,21 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
2167 info = IEEE80211_SKB_CB(skb); 2169 info = IEEE80211_SKB_CB(skb);
2168 2170
2169 info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 2171 info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
2172 info->flags |= IEEE80211_TX_CTL_NO_ACK;
2170 info->band = band; 2173 info->band = band;
2171 /* 2174
2172 * XXX: For now, always use the lowest rate 2175 memset(&txrc, 0, sizeof(txrc));
2173 */ 2176 txrc.hw = hw;
2174 info->control.rates[0].idx = 0; 2177 txrc.sband = sband;
2175 info->control.rates[0].count = 1; 2178 txrc.bss_conf = &sdata->vif.bss_conf;
2176 info->control.rates[1].idx = -1; 2179 txrc.skb = skb;
2177 info->control.rates[2].idx = -1; 2180 txrc.reported_rate.idx = -1;
2178 info->control.rates[3].idx = -1; 2181 txrc.max_rate_idx = sdata->max_ratectrl_rateidx;
2179 info->control.rates[4].idx = -1; 2182 txrc.ap = true;
2180 BUILD_BUG_ON(IEEE80211_TX_MAX_RATES != 5); 2183 rate_control_get_rate(sdata, NULL, &txrc);
2181 2184
2182 info->control.vif = vif; 2185 info->control.vif = vif;
2183 2186
2184 info->flags |= IEEE80211_TX_CTL_NO_ACK;
2185 info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; 2187 info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
2186 info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; 2188 info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
2187 out: 2189 out: