Browse Source

madwifi: don't crash if the static rate is not in a per-node rateset

SVN-Revision: 12713
Felix Fietkau 17 years ago
parent
commit
2e91cf283b
1 changed files with 200 additions and 0 deletions
  1. 200 0
      package/madwifi/patches/379-invalid_rate_fix.patch

+ 200 - 0
package/madwifi/patches/379-invalid_rate_fix.patch

@@ -0,0 +1,200 @@
+--- a/ath_rate/minstrel/minstrel.c
++++ b/ath_rate/minstrel/minstrel.c
+@@ -111,27 +111,13 @@
+ #include <net80211/ieee80211_var.h>
+ #include <net80211/ieee80211_rate.h>
+ 
++#include "if_ath_debug.h"
+ #include "if_athvar.h"
+ #include "if_ath_hal.h"
+ #include "ah_desc.h"
+ 
+ #include "minstrel.h"
+ 
+-#ifdef AR_DEBUG
+-#define	MINSTREL_DEBUG
+-#endif
+-#ifdef MINSTREL_DEBUG
+-enum {
+-		ATH_DEBUG_RATE		= 0x00000010	/* rate control */
+-};
+-#define	DPRINTF(sc, _fmt, ...) do {		\
+-		if (sc->sc_debug & ATH_DEBUG_RATE)	\
+-			printk(_fmt, __VA_ARGS__);		\
+-} while (0)
+-#else
+-#define	DPRINTF(sc, _fmt, ...)
+-#endif
+-
+ #define ONE_SECOND (1000 * 1000)  /* 1 second, or 1000 milliseconds; eternity, in other words */
+ 
+ #include "release.h"
+@@ -689,17 +675,17 @@
+ 			 * the node.  We know the rate is there because the
+ 			 * rate set is checked when the station associates. */
+ 			/* NB: the rate set is assumed sorted */
+-			for (; (srate >= 0) && (ni->ni_rates.rs_rates[srate] & IEEE80211_RATE_VAL) != vap->iv_fixed_rate; srate--);
+-
+-			KASSERT(srate >= 0,
+-				("fixed rate %d not in rate set", vap->iv_fixed_rate));
++			for (; (srate > 0) && (ni->ni_rates.rs_rates[srate] & IEEE80211_RATE_VAL) != vap->iv_fixed_rate; srate--);
+ 
+ 			sn->static_rate_ndx = srate;
+ 			ni->ni_txrate = srate;
+-			DPRINTF(sc, "%s: %s " MAC_FMT " fixed rate %d%sMbps\n",
+-				dev_info, __func__, MAC_ADDR(ni->ni_macaddr),
+-				sn->rates[srate].rate / 2,
+-				(sn->rates[srate].rate % 2) ? ".5 " : " ");
++			if ((ni->ni_rates.rs_rates[srate] & IEEE80211_RATE_VAL) != vap->iv_fixed_rate)
++				EPRINTF(sc, "Invalid static rate, falling back to basic rate\n");
++			else
++				DPRINTF(sc, "%s: %s " MAC_FMT " fixed rate %d%sMbps\n",
++					dev_info, __func__, MAC_ADDR(ni->ni_macaddr),
++					sn->rates[srate].rate / 2,
++					(sn->rates[srate].rate % 2) ? ".5 " : " ");
+ 			return;
+ 		}
+ 
+--- a/ath_rate/amrr/amrr.c
++++ b/ath_rate/amrr/amrr.c
+@@ -64,24 +64,13 @@
+ #include <net80211/ieee80211_var.h>
+ #include <net80211/ieee80211_rate.h>
+ 
++#include "if_ath_debug.h"
+ #include "if_athvar.h"
+ #include "if_ath_hal.h"
+ #include "ah_desc.h"
+ 
+ #include "amrr.h"
+ 
+-#ifdef AR_DEBUG
+-#define	AMRR_DEBUG
+-#endif
+-#ifdef AMRR_DEBUG
+-#define	DPRINTF(sc, _fmt, ...) do {					\
+-	if (sc->sc_debug & 0x10)					\
+-		printk(_fmt, __VA_ARGS__);				\
+-} while (0)
+-#else
+-#define	DPRINTF(sc, _fmt, ...)
+-#endif
+-
+ static int ath_rateinterval = 1000;		/* rate ctl interval (ms)  */
+ static int ath_rate_max_success_threshold = 10;
+ static int ath_rate_min_success_threshold = 1;
+@@ -297,9 +286,9 @@
+ 		 * rate set is checked when the station associates.
+ 		 */
+ 		srate = ni->ni_rates.rs_nrates - 1;
+-		for (; srate >= 0 && RATE(srate) != vap->iv_fixed_rate; srate--);
+-		KASSERT(srate >= 0,
+-			("fixed rate %d not in rate set", vap->iv_fixed_rate));
++		for (; srate > 0 && RATE(srate) != vap->iv_fixed_rate; srate--);
++		if (RATE(srate) != vap->iv_fixed_rate)
++			EPRINTF(sc, "Invalid static rate, falling back to basic rate\n");
+ 	}
+ 	ath_rate_update(sc, ni, srate);
+ #undef RATE
+--- a/ath_rate/onoe/onoe.c
++++ b/ath_rate/onoe/onoe.c
+@@ -60,27 +60,13 @@
+ #include <net80211/ieee80211_var.h>
+ #include <net80211/ieee80211_rate.h>
+ 
++#include "if_ath_debug.h"
+ #include "if_athvar.h"
+ #include "if_ath_hal.h"
+ #include "ah_desc.h"
+ 
+ #include "onoe.h"
+ 
+-#ifdef AR_DEBUG
+-#define	ONOE_DEBUG
+-#endif
+-#ifdef ONOE_DEBUG
+-enum {
+-	ATH_DEBUG_RATE	= 0x00000010,	/* rate control */
+-};
+-#define	DPRINTF(sc, _fmt, ...) do {				\
+-	if (sc->sc_debug & ATH_DEBUG_RATE)			\
+-		printk(_fmt, __VA_ARGS__);			\
+-} while (0)
+-#else
+-#define	DPRINTF(sc, _fmt, ...)
+-#endif
+-
+ /*
+  * Default parameters for the rate control algorithm.  These are
+  * all tunable with sysctls.  The rate controller runs periodically
+@@ -283,9 +269,9 @@
+ 		 */
+ 		/* NB: the rate set is assumed sorted */
+ 		srate = ni->ni_rates.rs_nrates - 1;
+-		for (; srate >= 0 && RATE(srate) != vap->iv_fixed_rate; srate--);
+-		KASSERT(srate >= 0,
+-			("fixed rate %d not in rate set", vap->iv_fixed_rate));
++		for (; srate > 0 && RATE(srate) != vap->iv_fixed_rate; srate--);
++		if (RATE(srate) != vap->iv_fixed_rate)
++			EPRINTF(sc, "Invalid static rate, falling back to basic rate\n");
+ 	}
+ 	ath_rate_update(sc, ni, srate);
+ #undef RATE
+--- a/ath_rate/sample/sample.c
++++ b/ath_rate/sample/sample.c
+@@ -62,30 +62,13 @@
+ #include <net80211/ieee80211_var.h>
+ #include <net80211/ieee80211_rate.h>
+ 
++#include "if_ath_debug.h"
+ #include "if_athvar.h"
+ #include "if_ath_hal.h"
+ #include "ah_desc.h"
+ 
+ #include "sample.h"
+ 
+-#ifdef AR_DEBUG
+-#define SAMPLE_DEBUG
+-#endif
+-#ifdef SAMPLE_DEBUG
+-enum {
+-	ATH_DEBUG_RATE		= 0x00000010,	/* rate control */
+-	ATH_DEBUG_ANY		= 0xffffffff
+-};
+-#define	DPRINTF(sc, m, fmt, ...) do {				\
+-	if (sc->sc_debug & (m))					\
+-		printk(fmt, __VA_ARGS__);			\
+-} while (0)
+-#else
+-#define	DPRINTF(sc, m, fmt, ...) do {				\
+-	(void) sc;						\
+-} while (0)
+-#endif
+-
+ /*
+  * This file is an implementation of the SampleRate algorithm
+  * in "Bit-rate Selection in Wireless Networks"
+@@ -886,15 +869,16 @@
+ 			if ((ni->ni_rates.rs_rates[x] & IEEE80211_RATE_VAL) == vap->iv_fixed_rate)
+ 				srate = x;
+ 
+-		KASSERT(((ni->ni_rates.rs_rates[srate] & IEEE80211_RATE_VAL) == vap->iv_fixed_rate),
+-			("fixed rate %u not in rate set", vap->iv_fixed_rate));
+-
+ 		sn->static_rate_ndx = srate;
+ 		ni->ni_txrate = srate;
+-		DPRINTF(sc, ATH_DEBUG_RATE, "%s: %s " MAC_FMT " fixed rate %u%sMbps\n",
+-			dev_info, __func__, MAC_ADDR(ni->ni_macaddr),
+-			sn->rates[srate].rate / 2,
+-			(sn->rates[srate].rate % 0x1) ? ".5" : " ");
++
++		if ((ni->ni_rates.rs_rates[srate] & IEEE80211_RATE_VAL) != vap->iv_fixed_rate)
++			EPRINTF(sc, "Invalid static rate, falling back to basic rate\n");
++		else
++			DPRINTF(sc, ATH_DEBUG_RATE, "%s: %s " MAC_FMT " fixed rate %u%sMbps\n",
++				dev_info, __func__, MAC_ADDR(ni->ni_macaddr),
++				sn->rates[srate].rate / 2,
++				(sn->rates[srate].rate % 0x1) ? ".5" : " ");
+ 		return;
+ 	}
+