guard against 0 rates which can be caused by wrong received frames.
authorbr1 <br1@0192ed92-7a03-0410-a25b-9323aeb14dbd>
Mon, 10 Dec 2007 13:15:06 +0000 (13:15 +0000)
committerbr1 <br1@0192ed92-7a03-0410-a25b-9323aeb14dbd>
Mon, 10 Dec 2007 13:15:06 +0000 (13:15 +0000)
git-svn-id: http://madwifi-project.org/svn/madwifi/trunk@3013 0192ed92-7a03-0410-a25b-9323aeb14dbd

ath/if_ath.c
net80211/ieee80211_input.c
net80211/ieee80211_proto.c

index 039f40cb1cdf203b0af5b7ae20698516061b5a13..3bd7ab8f383da85fb8072d95ba9bafbed6fdd11f 100644 (file)
@@ -7520,6 +7520,17 @@ ath_tx_start(struct net_device *dev, struct ieee80211_node *ni,
        } else
                antenna = sc->sc_txantenna;
 
+       /* should be ok, but just to be sure */
+       if (txrate == 0)
+               return -EIO;
+
+       DPRINTF(sc, ATH_DEBUG_XMIT, "%s: set up txdesc: pktlen %d hdrlen %d "
+               "atype %d txpower %d txrate %d try0 %d keyix %d ant %d flags %x "
+               "ctsrate %d ctsdur %d icvlen %d ivlen %d comp %d\n",
+               __func__, pktlen, hdrlen, atype, MIN(ni->ni_txpower, 60), txrate,
+               try0, keyix, antenna, flags, ctsrate, ctsduration, icvlen, ivlen,
+               comp);
+
        /*
         * Formulate first tx descriptor with tx controls.
         */
@@ -7551,6 +7562,20 @@ ath_tx_start(struct net_device *dev, struct ieee80211_node *ni,
        if (try0 != ATH_TXMAXTRY) {
                sc->sc_rc->ops->get_mrr(sc, an, shortPreamble, skb->len, rix,
                                        &mrr);
+               /*
+                * if rate module fucks up and gives us 0 rates we disable the
+                * multi rate retries. this is important since 0 rates can lead
+                * to a card continously sending noise (in A band at least)
+                */
+               if (!mrr.rate1) mrr.retries1 = 0;
+               if (!mrr.rate2) mrr.retries2 = 0;
+               if (!mrr.rate3) mrr.retries3 = 0;
+
+               DPRINTF(sc, ATH_DEBUG_XMIT, "%s: set up multi rate/retry "
+                       "1:%d/%d 2:%d/%d 3:%d/%d\n", __func__,
+                       mrr.rate1, mrr.retries1, mrr.rate2, mrr.retries2,
+                       mrr.rate3, mrr.retries3);
+
                ath_hal_setupxtxdesc(sc->sc_ah, ds, mrr.rate1, mrr.retries1,
                                     mrr.rate2, mrr.retries2,
                                     mrr.rate3, mrr.retries3);
index 5b6074f6b07a6dc4782295af5350c822783ae889..ecf76509bd81ec84da05decc9182b65881727258 100644 (file)
@@ -2765,6 +2765,7 @@ ieee80211_recv_mgmt(struct ieee80211_node *ni, struct sk_buff *skb,
                if (frm > efrm)
                        return;
                IEEE80211_VERIFY_ELEMENT(scan.rates, IEEE80211_RATE_MAXSIZE);
+               IEEE80211_VERIFY_ELEMENT(scan.xrates, IEEE80211_RATE_MAXSIZE);
                IEEE80211_VERIFY_ELEMENT(scan.ssid, IEEE80211_NWID_LEN);
 #if IEEE80211_CHAN_MAX < 255
                if (scan.chan > IEEE80211_CHAN_MAX) {
index 292906a68f83bb3498a6e18b9656248695f83278..106166e57d26f24060b52ee053f29ac9b364dd8f 100644 (file)
@@ -425,6 +425,20 @@ ieee80211_fix_rate(struct ieee80211_node *ni, int flags)
                }
                r = nrs->rs_rates[i] & IEEE80211_RATE_VAL;
                badrate = r;
+
+               /*
+                * remove 0 rates
+                * they don't make sense and can lead to trouble later
+                */
+               if (r == 0) {
+                       nrs->rs_nrates--;
+                       nrs->rs_nrates--;
+                       for (j = i; j < nrs->rs_nrates; j++)
+                               nrs->rs_rates[j] = nrs->rs_rates[j + 1];
+                       nrs->rs_rates[j] = 0;
+                       continue;
+               }
+
                /*
                 * Check for fixed rate. 
                 */