mac80211: Decouple fail_avg stats used by mesh from rate control algorithm.
Mesh uses the tx failure average to compute the (m)path metric. This used to be done inside the rate control module. This patch breaks the dependency between the mesh stack and the rate control algorithm. Mesh will now work independently of the chosen rate control algorithm. The mesh stack keeps a moving average of the average transmission losses for each mesh peer station. If the fail average exceeds a certain threshold, the peer link is marked as broken. Signed-off-by: Javier Cardona <javier@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
92ed48e523
commit
bfc32e6a95
@@ -51,7 +51,6 @@
|
||||
#include <linux/random.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include <net/mac80211.h>
|
||||
#include "mesh.h"
|
||||
#include "rate.h"
|
||||
#include "rc80211_minstrel.h"
|
||||
|
||||
@@ -156,16 +155,12 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct minstrel_sta_info *mi = priv_sta;
|
||||
struct minstrel_priv *mp = (struct minstrel_priv *)priv;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_tx_rate *ar = info->status.rates;
|
||||
struct ieee80211_local *local = hw_to_local(mp->hw);
|
||||
struct sta_info *si;
|
||||
int i, ndx;
|
||||
int success;
|
||||
|
||||
success = !!(info->flags & IEEE80211_TX_STAT_ACK);
|
||||
si = sta_info_get(local, sta->addr);
|
||||
|
||||
for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
|
||||
if (ar[i].idx < 0)
|
||||
@@ -177,17 +172,8 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
|
||||
|
||||
mi->r[ndx].attempts += ar[i].count;
|
||||
|
||||
if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0)) {
|
||||
if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0))
|
||||
mi->r[ndx].success += success;
|
||||
if (si) {
|
||||
si->fail_avg = (18050 - mi->r[ndx].probability)
|
||||
/ 180;
|
||||
WARN_ON(si->fail_avg > 100);
|
||||
if (si->fail_avg == 100 &&
|
||||
ieee80211_vif_is_mesh(&si->sdata->vif))
|
||||
mesh_plink_broken(si);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && (i >= 0))
|
||||
|
Reference in New Issue
Block a user