diff options
author | Thomas Pedersen <thomas@cozybit.com> | 2012-03-05 18:31:48 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-03-06 15:16:17 -0500 |
commit | 6b62bf326393deede630731a933713de9d574128 (patch) | |
tree | 73d17abe9a0c55938dae6378bab61dc82343881a /net | |
parent | 8097e1494459a4f9cdbaba7440334d9bd11a39f0 (diff) |
mac80211: fix mesh airtime link metric estimating
Airtime link metric estimation was broken in HT mesh, use
cfg80211_calculate_bitrate to get the right rate value.
Also factor out tx rate copying from sta_set_sinfo().
Signed-off-by: Thomas Pedersen <thomas@cozybit.com>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/cfg.c | 23 | ||||
-rw-r--r-- | net/mac80211/mesh_hwmp.c | 6 | ||||
-rw-r--r-- | net/mac80211/sta_info.h | 3 |
3 files changed, 22 insertions, 10 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index ab31cc56a2fb..677d65929780 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -336,6 +336,20 @@ static void rate_idx_to_bitrate(struct rate_info *rate, struct sta_info *sta, in | |||
336 | rate->mcs = idx; | 336 | rate->mcs = idx; |
337 | } | 337 | } |
338 | 338 | ||
339 | void sta_set_rate_info_tx(struct sta_info *sta, | ||
340 | const struct ieee80211_tx_rate *rate, | ||
341 | struct rate_info *rinfo) | ||
342 | { | ||
343 | rinfo->flags = 0; | ||
344 | if (rate->flags & IEEE80211_TX_RC_MCS) | ||
345 | rinfo->flags |= RATE_INFO_FLAGS_MCS; | ||
346 | if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) | ||
347 | rinfo->flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; | ||
348 | if (rate->flags & IEEE80211_TX_RC_SHORT_GI) | ||
349 | rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; | ||
350 | rate_idx_to_bitrate(rinfo, sta, rate->idx); | ||
351 | } | ||
352 | |||
339 | static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) | 353 | static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) |
340 | { | 354 | { |
341 | struct ieee80211_sub_if_data *sdata = sta->sdata; | 355 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
@@ -378,14 +392,7 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) | |||
378 | sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal); | 392 | sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal); |
379 | } | 393 | } |
380 | 394 | ||
381 | sinfo->txrate.flags = 0; | 395 | sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate); |
382 | if (sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS) | ||
383 | sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; | ||
384 | if (sta->last_tx_rate.flags & IEEE80211_TX_RC_40_MHZ_WIDTH) | ||
385 | sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; | ||
386 | if (sta->last_tx_rate.flags & IEEE80211_TX_RC_SHORT_GI) | ||
387 | sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; | ||
388 | rate_idx_to_bitrate(&sinfo->txrate, sta, sta->last_tx_rate.idx); | ||
389 | 396 | ||
390 | sinfo->rxrate.flags = 0; | 397 | sinfo->rxrate.flags = 0; |
391 | if (sta->last_rx_rate_flag & RX_FLAG_HT) | 398 | if (sta->last_rx_rate_flag & RX_FLAG_HT) |
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 4a993f2d1ae1..1c6f3d02aebf 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
@@ -324,6 +324,7 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local, | |||
324 | struct sta_info *sta) | 324 | struct sta_info *sta) |
325 | { | 325 | { |
326 | struct ieee80211_supported_band *sband; | 326 | struct ieee80211_supported_band *sband; |
327 | struct rate_info rinfo; | ||
327 | /* This should be adjusted for each device */ | 328 | /* This should be adjusted for each device */ |
328 | int device_constant = 1 << ARITH_SHIFT; | 329 | int device_constant = 1 << ARITH_SHIFT; |
329 | int test_frame_len = TEST_FRAME_LEN << ARITH_SHIFT; | 330 | int test_frame_len = TEST_FRAME_LEN << ARITH_SHIFT; |
@@ -337,7 +338,9 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local, | |||
337 | if (sta->fail_avg >= 100) | 338 | if (sta->fail_avg >= 100) |
338 | return MAX_METRIC; | 339 | return MAX_METRIC; |
339 | 340 | ||
340 | if (sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS) | 341 | sta_set_rate_info_tx(sta, &sta->last_tx_rate, &rinfo); |
342 | rate = cfg80211_calculate_bitrate(&rinfo); | ||
343 | if (WARN_ON(!rate)) | ||
341 | return MAX_METRIC; | 344 | return MAX_METRIC; |
342 | 345 | ||
343 | err = (sta->fail_avg << ARITH_SHIFT) / 100; | 346 | err = (sta->fail_avg << ARITH_SHIFT) / 100; |
@@ -345,7 +348,6 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local, | |||
345 | /* bitrate is in units of 100 Kbps, while we need rate in units of | 348 | /* bitrate is in units of 100 Kbps, while we need rate in units of |
346 | * 1Mbps. This will be corrected on tx_time computation. | 349 | * 1Mbps. This will be corrected on tx_time computation. |
347 | */ | 350 | */ |
348 | rate = sband->bitrates[sta->last_tx_rate.idx].bitrate; | ||
349 | tx_time = (device_constant + 10 * test_frame_len / rate); | 351 | tx_time = (device_constant + 10 * test_frame_len / rate); |
350 | estimated_retx = ((1 << (2 * ARITH_SHIFT)) / (s_unit - err)); | 352 | estimated_retx = ((1 << (2 * ARITH_SHIFT)) / (s_unit - err)); |
351 | result = (tx_time * estimated_retx) >> (2 * ARITH_SHIFT) ; | 353 | result = (tx_time * estimated_retx) >> (2 * ARITH_SHIFT) ; |
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 3336d54e5558..ab0576827baf 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
@@ -529,6 +529,9 @@ void sta_info_init(struct ieee80211_local *local); | |||
529 | void sta_info_stop(struct ieee80211_local *local); | 529 | void sta_info_stop(struct ieee80211_local *local); |
530 | int sta_info_flush(struct ieee80211_local *local, | 530 | int sta_info_flush(struct ieee80211_local *local, |
531 | struct ieee80211_sub_if_data *sdata); | 531 | struct ieee80211_sub_if_data *sdata); |
532 | void sta_set_rate_info_tx(struct sta_info *sta, | ||
533 | const struct ieee80211_tx_rate *rate, | ||
534 | struct rate_info *rinfo); | ||
532 | void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata, | 535 | void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata, |
533 | unsigned long exp_time); | 536 | unsigned long exp_time); |
534 | 537 | ||