source: trunk/package/madwifi/patches/305-pureg_fix.patch @ 11316

Last change on this file since 11316 was 11316, checked in by nbd, 8 years ago

madwifi: refresh patches

File size: 5.8 KB
  • madwifi-trunk-r3314

    old new  
    41494149                rfilt |= HAL_RX_FILTER_PROM; 
    41504150        if (ic->ic_opmode == IEEE80211_M_STA || 
    41514151            sc->sc_opmode == HAL_M_IBSS ||      /* NB: AHDEMO too */ 
    4152             (sc->sc_nostabeacons) || sc->sc_scanning) 
     4152            (sc->sc_nostabeacons) || sc->sc_scanning || 
     4153                ((ic->ic_opmode == IEEE80211_M_HOSTAP) && 
     4154                 (ic->ic_protmode != IEEE80211_PROT_NONE))) 
    41534155                rfilt |= HAL_RX_FILTER_BEACON; 
    41544156        if (sc->sc_nmonvaps > 0) 
    41554157                rfilt |= (HAL_RX_FILTER_CONTROL | HAL_RX_FILTER_BEACON | 
  • net80211/ieee80211_input.c

    old new  
    346346                                bssid = wh->i_addr3; 
    347347                        } 
    348348                        /* 
    349                          * Validate the bssid. 
     349                         * Validate the bssid. Let beacons get through though for 11g protection mode. 
    350350                         */ 
    351 #ifdef ATH_SUPERG_XR 
    352351                        if (!IEEE80211_ADDR_EQ(bssid, vap->iv_bssid) && 
    353                             !IEEE80211_ADDR_EQ(bssid, dev->broadcast)) { 
     352                            !IEEE80211_ADDR_EQ(bssid, dev->broadcast) && 
     353                                (subtype != IEEE80211_FC0_SUBTYPE_BEACON)) { 
     354#ifdef ATH_SUPERG_XR 
    354355                                /* 
    355356                                 * allow MGT frames to vap->iv_xrvap. 
    356357                                 * this will allow roaming between  XR and normal vaps 
     
    366367                                        vap->iv_stats.is_rx_wrongbss++; 
    367368                                        goto out; 
    368369                                } 
    369                         } 
    370370#else 
    371                         if (!IEEE80211_ADDR_EQ(bssid, vap->iv_bssid) && 
    372                             !IEEE80211_ADDR_EQ(bssid, dev->broadcast)) { 
    373371                                /* not interested in */ 
    374372                                IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT, 
    375373                                        bssid, NULL, "%s", "not to bss"); 
    376374                                vap->iv_stats.is_rx_wrongbss++; 
    377375                                goto out; 
    378                         } 
    379  
    380376#endif 
     377                        } 
    381378                        break; 
    382379                case IEEE80211_M_WDS: 
    383380                        if (skb->len < sizeof(struct ieee80211_frame_addr4)) { 
     
    30663063        u_int8_t *frm, *efrm; 
    30673064        u_int8_t *ssid, *rates, *xrates, *suppchan, *wpa, *rsn, *wme, *ath; 
    30683065        u_int8_t rate; 
    3069         int reassoc, resp, allocbs = 0; 
     3066        int reassoc, resp, allocbs = 0, has_erp = 0; 
    30703067        u_int8_t qosinfo; 
    30713068 
    30723069        if (ni_or_null == NULL) 
     
    30963093                 *    o station mode when associated (to collect state 
    30973094                 *      updates such as 802.11g slot time), or 
    30983095                 *    o adhoc mode (to discover neighbors) 
     3096                 *    o ap mode in protection mode (beacons only) 
    30993097                 * Frames otherwise received are discarded. 
    31003098                 */ 
    31013099                if (!((ic->ic_flags & IEEE80211_F_SCAN) || 
    31023100                    (vap->iv_opmode == IEEE80211_M_STA && ni->ni_associd) || 
    3103                     vap->iv_opmode == IEEE80211_M_IBSS)) { 
     3101                    (vap->iv_opmode == IEEE80211_M_IBSS) || 
     3102                        ((subtype == IEEE80211_FC0_SUBTYPE_BEACON) && 
     3103                         (vap->iv_opmode == IEEE80211_M_HOSTAP) && 
     3104                         (ic->ic_protmode != IEEE80211_PROT_NONE)))) { 
    31043105                        vap->iv_stats.is_rx_mgtdiscard++; 
    31053106                        return; 
    31063107                } 
     
    31843185                                        break; 
    31853186                                } 
    31863187                                scan.erp = frm[2]; 
     3188                                has_erp = 1; 
    31873189                                break; 
    31883190                        case IEEE80211_ELEMID_RSN: 
    31893191                                scan.rsn = frm; 
     
    34213423                                ieee80211_bg_scan(vap); 
    34223424                        return; 
    34233425                } 
     3426 
     3427                /* Update AP protection mode when in 11G mode */ 
     3428                if ((vap->iv_opmode == IEEE80211_M_HOSTAP) && 
     3429                        IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) { 
     3430 
     3431                        /* Assume no ERP IE == 11b AP */ 
     3432                        if ((!has_erp || (has_erp && (scan.erp & IEEE80211_ERP_NON_ERP_PRESENT))) && 
     3433                                !(ic->ic_flags & IEEE80211_F_USEPROT)) { 
     3434 
     3435                                ic->ic_flags |= IEEE80211_F_USEPROT; 
     3436                                ic->ic_flags_ext |= IEEE80211_FEXT_ERPUPDATE; 
     3437                        } 
     3438                } 
     3439 
    34243440                /* 
    34253441                 * If scanning, just pass information to the scan module. 
    34263442                 */ 
  • net80211/ieee80211_node.c

    old new  
    383383        /* Update country ie information */ 
    384384        ieee80211_build_countryie(ic); 
    385385 
    386         if (IEEE80211_IS_CHAN_HALF(chan)) 
     386        if (IEEE80211_IS_CHAN_HALF(chan)) { 
    387387                ni->ni_rates = ic->ic_sup_half_rates; 
    388         else if (IEEE80211_IS_CHAN_QUARTER(chan)) 
     388        } else if (IEEE80211_IS_CHAN_QUARTER(chan)) { 
    389389                ni->ni_rates = ic->ic_sup_quarter_rates; 
     390        } 
     391 
     392        if ((vap->iv_flags & IEEE80211_F_PUREG) && 
     393                IEEE80211_IS_CHAN_ANYG(chan)) { 
     394                ieee80211_setpuregbasicrates(&ni->ni_rates); 
     395        } 
    390396 
    391397        (void) ieee80211_sta_join1(PASS_NODE(ni)); 
    392398} 
  • net80211/ieee80211_proto.c

    old new  
    595595        { 4, { 2, 4, 11, 22 } },        /* IEEE80211_MODE_TURBO_G (mixed b/g) */ 
    596596}; 
    597597 
     598static const struct ieee80211_rateset basicpureg[] = { 
     599    { 7, {2, 4, 11, 22, 12, 24, 48 } }, 
     600}; 
     601 
     602/* 
     603 * Mark basic rates for the 11g rate table based on the pureg setting 
     604 */ 
     605void 
     606ieee80211_setpuregbasicrates(struct ieee80211_rateset *rs) 
     607{ 
     608        int i, j; 
     609 
     610        for (i = 0; i < rs->rs_nrates; i++) { 
     611                rs->rs_rates[i] &= IEEE80211_RATE_VAL; 
     612                for (j = 0; j < basicpureg[0].rs_nrates; j++) 
     613                        if (basicpureg[0].rs_rates[j] == rs->rs_rates[i]) { 
     614                                rs->rs_rates[i] |= IEEE80211_RATE_BASIC; 
     615                                break; 
     616                        } 
     617        } 
     618} 
     619 
    598620/* 
    599621 * Mark the basic rates for the 11g rate table based on the 
    600622 * specified mode.  For 11b compatibility we mark only 11b 
  • net80211/ieee80211_var.h

    old new  
    708708void ieee80211_build_sc_ie(struct ieee80211com *); 
    709709void ieee80211_dfs_action(struct ieee80211com *); 
    710710void ieee80211_expire_channel_excl_restrictions(struct ieee80211com *); 
     711void ieee80211_setpuregbasicrates(struct ieee80211_rateset *rs); 
    711712 
    712713/* 
    713714 * Iterate through ic_channels to enumerate all distinct ic_ieee channel numbers. 
Note: See TracBrowser for help on using the repository browser.