From c0036b1ceb946e82125f523cd978380caae429df Mon Sep 17 00:00:00 2001 From: nbd Date: Thu, 25 Sep 2008 23:55:47 +0000 Subject: madwifi: don't crash if the static rate is not in a per-node rateset git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12713 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/madwifi/patches/379-invalid_rate_fix.patch | 200 +++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 package/madwifi/patches/379-invalid_rate_fix.patch (limited to 'package/madwifi/patches') diff --git a/package/madwifi/patches/379-invalid_rate_fix.patch b/package/madwifi/patches/379-invalid_rate_fix.patch new file mode 100644 index 000000000..0128ca269 --- /dev/null +++ b/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 + #include + ++#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 + #include + ++#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 + #include + ++#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 + #include + ++#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; + } + -- cgit v1.2.3