mac80211: Early detection of broken mesh paths when using minstrel.
authorJavier Cardona <javier@cozybit.com>
Mon, 10 Aug 2009 19:15:50 +0000 (12:15 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 14 Aug 2009 13:14:01 +0000 (09:14 -0400)
This change triggers a path discovery as soon as the link quality degrades
below a certain threshold.  This results in a faster path recovery time than
by simply relying on the periodic path refresh mechanism to detect broken
links.

Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/rc80211_minstrel.c

index 3ea9740..0071649 100644 (file)
@@ -51,6 +51,7 @@
 #include <linux/random.h>
 #include <linux/ieee80211.h>
 #include <net/mac80211.h>
 #include <linux/random.h>
 #include <linux/ieee80211.h>
 #include <net/mac80211.h>
+#include "mesh.h"
 #include "rate.h"
 #include "rc80211_minstrel.h"
 
 #include "rate.h"
 #include "rc80211_minstrel.h"
 
@@ -178,9 +179,14 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
 
                if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0)) {
                        mi->r[ndx].success += success;
 
                if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0)) {
                        mi->r[ndx].success += success;
-                       if (si)
+                       if (si) {
                                si->fail_avg = (18050 - mi->r[ndx].probability)
                                        / 180;
                                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);
+                       }
                }
        }
 
                }
        }