Please note: This project is no longer active. The website is kept online for historic purposes only.
If you´re looking for a Linux driver for your Atheros WLAN device, you should continue here .

Ticket #1270: beacon_interval_range-fix.patch

File beacon_interval_range-fix.patch, 4.8 kB (added by mrenzmann, 12 years ago)

Third approach, extending mentor's patch with suggestions from scottr

  • net80211/ieee80211_node.c

    old new  
    660660        memcpy(ni->ni_essid, se->se_ssid + 2, ni->ni_esslen); 
    661661        ni->ni_rstamp = se->se_rstamp; 
    662662        ni->ni_tstamp.tsf = se->se_tstamp.tsf; 
    663         ni->ni_intval = se->se_intval
     663        ni->ni_intval = IEEE80211_BINTVAL_SANITISE(se->se_intval)
    664664        ni->ni_capinfo = se->se_capinfo; 
    665665        ni->ni_chan = se->se_chan; 
    666666        ni->ni_timoff = se->se_timoff; 
     
    12151215                memcpy(ni->ni_essid, sp->ssid + 2, sp->ssid[1]); 
    12161216                IEEE80211_ADDR_COPY(ni->ni_bssid, wh->i_addr3); 
    12171217                memcpy(ni->ni_tstamp.data, sp->tstamp, sizeof(ni->ni_tstamp)); 
    1218                 ni->ni_intval = sp->bintval
     1218                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(sp->bintval)
    12191219                ni->ni_capinfo = sp->capinfo; 
    12201220                ni->ni_chan = ic->ic_curchan; 
    12211221                ni->ni_fhdwell = sp->fhdwell; 
  • net80211/ieee80211_scan.h

    old new  
    130130        u_int8_t bchan; 
    131131        u_int8_t fhindex; 
    132132        u_int8_t erp; 
    133         u_int8_t bintval; 
     133        u_int16_t bintval; 
    134134        u_int8_t timoff; 
    135135        u_int8_t *tim; 
    136136        u_int8_t *tstamp; 
  • net80211/ieee80211_wireless.c

    old new  
    12731273                case IW_POWER_UNICAST_R: 
    12741274                case IW_POWER_ALL_R: 
    12751275                case IW_POWER_ON: 
    1276                         ic->ic_flags |= IEEE80211_F_PMGTON; 
    1277                          
     1276                        if (wrq->flags & IW_POWER_PERIOD) { 
     1277                                if (IEEE80211_BINTVAL_VALID(wrq->value)) 
     1278                                        ic->ic_lintval = IEEE80211_MS_TO_TU(wrq->value); 
     1279                                else 
     1280                                        return -EINVAL; 
     1281                        } 
    12781282                        if (wrq->flags & IW_POWER_TIMEOUT) 
    12791283                                ic->ic_holdover = IEEE80211_MS_TO_TU(wrq->value); 
    1280                         if (wrq->flags & IW_POWER_PERIOD) 
    1281                                ic->ic_lintval = IEEE80211_MS_TO_TU(wrq->value)
     1284                         
     1285                        ic->ic_flags |= IEEE80211_F_PMGTON
    12821286                        break; 
    12831287                default: 
    12841288                        return -EINVAL; 
     
    23652369                if (vap->iv_opmode != IEEE80211_M_HOSTAP && 
    23662370                    vap->iv_opmode != IEEE80211_M_IBSS) 
    23672371                        return -EINVAL; 
    2368                 if (IEEE80211_BINTVAL_MIN <= value && 
    2369                     value <= IEEE80211_BINTVAL_MAX) { 
     2372                if (IEEE80211_BINTVAL_VALID(value)) { 
    23702373                        ic->ic_lintval = value;         /* XXX multi-bss */ 
    23712374                        retv = ENETRESET;               /* requires restart */ 
    23722375                } else 
  • net80211/ieee80211_input.c

    old new  
    27482748                        vap->iv_stats.is_rx_chanmismatch++; 
    27492749                        return; 
    27502750                } 
    2751  
     2751                 
     2752                /* IEEE802.11 does not specify the allowed range for  
     2753                 * beacon interval. We discard any beacons with a  
     2754                 * beacon interval outside of an arbitrary range in 
     2755                 * order to protect against attack. 
     2756                 */ 
     2757                if (!(IEEE80211_BINTVAL_MIN <= scan.bintval &&  
     2758                     scan.bintval <= IEEE80211_BINTVAL_MAX)) { 
     2759                        IEEE80211_DISCARD(vap, IEEE80211_MSG_SCAN, 
     2760                                wh, "beacon", "invalid beacon interval (%u)",  
     2761                                scan.bintval); 
     2762                        return; 
     2763                } 
     2764                 
    27522765                /* 
    27532766                 * Count frame now that we know it's to be processed. 
    27542767                 */ 
     
    28762889                                IEEE80211_ADDR_COPY(ni->ni_bssid, wh->i_addr3); 
    28772890                                memcpy(ni->ni_tstamp.data, scan.tstamp, 
    28782891                                        sizeof(ni->ni_tstamp)); 
    2879                                 ni->ni_intval = scan.bintval
     2892                                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(scan.bintval)
    28802893                                ni->ni_capinfo = scan.capinfo; 
    28812894                                ni->ni_chan = ic->ic_curchan; 
    28822895                                ni->ni_fhdwell = scan.fhdwell; 
     
    33003313                ni->ni_rssi = rssi; 
    33013314                ni->ni_rstamp = rstamp; 
    33023315                ni->ni_last_rx = jiffies; 
    3303                 ni->ni_intval = bintval
     3316                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(bintval)
    33043317                ni->ni_capinfo = capinfo; 
    33053318                ni->ni_chan = ic->ic_curchan; 
    33063319                ni->ni_fhdwell = vap->iv_bss->ni_fhdwell; 
  • net80211/ieee80211_var.h

    old new  
    6060#define IEEE80211_DTIM_MIN      1       /* min DTIM period */ 
    6161#define IEEE80211_DTIM_DEFAULT  1       /* default DTIM period */ 
    6262 
    63 #define IEEE80211_BINTVAL_MAX   500   /* max beacon interval (TU's) */ 
     63#define IEEE80211_BINTVAL_MAX   1000  /* max beacon interval (TU's) */ 
    6464#define IEEE80211_BINTVAL_MIN   25      /* min beacon interval (TU's) */ 
    6565#define IEEE80211_BINTVAL_DEFAULT 100   /* default beacon interval (TU's) */ 
     66#define IEEE80211_BINTVAL_VALID(_bi) \ 
     67        ((IEEE80211_BINTVAL_MIN <= (_bi)) && \ 
     68         ((_bi) <= IEEE80211_BINTVAL_MAX)) 
     69#define IEEE80211_BINTVAL_SANITISE(_bi) \ 
     70        (IEEE80211_BINTVAL_VALID(_bi) ? \ 
     71         (_bi) : IEEE80211_BINTVAL_DEFAULT) 
    6672 
    6773#define IEEE80211_BGSCAN_INTVAL_MIN     15      /* min bg scan intvl (secs) */ 
    6874#define IEEE80211_BGSCAN_INTVAL_DEFAULT (5*60)  /* default bg scan intvl */