All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: P Praneesh <ppranees@codeaurora.org>, johannes@sipsolutions.net
Cc: kbuild-all@lists.01.org, linux-wireless@vger.kernel.org,
	P Praneesh <ppranees@codeaurora.org>
Subject: Re: [PATCH v2] mac80211: avoid bss color setting in non-he mode
Date: Tue, 7 Jul 2020 20:25:07 +0800	[thread overview]
Message-ID: <202007072025.kYVTuB61%lkp@intel.com> (raw)
In-Reply-To: <1594114572-26168-1-git-send-email-ppranees@codeaurora.org>

[-- Attachment #1: Type: text/plain, Size: 15596 bytes --]

Hi Praneesh,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on mac80211-next/master]
[also build test ERROR on mac80211/master v5.8-rc4 next-20200707]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/P-Praneesh/mac80211-avoid-bss-color-setting-in-non-he-mode/20200707-173732
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git master
config: nios2-allyesconfig (attached as .config)
compiler: nios2-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=nios2 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   net/mac80211/mlme.c: In function 'ieee80211_assoc_success':
>> net/mac80211/mlme.c:3465:8: error: 'params' undeclared (first use in this function); did you mean 'parameq'?
    3465 |   if (!params->he_bss_color.disabled)
         |        ^~~~~~
         |        parameq
   net/mac80211/mlme.c:3465:8: note: each undeclared identifier is reported only once for each function it appears in

vim +3465 net/mac80211/mlme.c

  3250	
  3251	static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
  3252					    struct cfg80211_bss *cbss,
  3253					    struct ieee80211_mgmt *mgmt, size_t len,
  3254					    struct ieee802_11_elems *elems)
  3255	{
  3256		struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
  3257		struct ieee80211_local *local = sdata->local;
  3258		struct ieee80211_supported_band *sband;
  3259		struct sta_info *sta;
  3260		u16 capab_info, aid;
  3261		struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
  3262		const struct cfg80211_bss_ies *bss_ies = NULL;
  3263		struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
  3264		bool is_6ghz = cbss->channel->band == NL80211_BAND_6GHZ;
  3265		u32 changed = 0;
  3266		int err;
  3267		bool ret;
  3268	
  3269		/* AssocResp and ReassocResp have identical structure */
  3270	
  3271		aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
  3272		capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
  3273	
  3274		/*
  3275		 * The 5 MSB of the AID field are reserved
  3276		 * (802.11-2016 9.4.1.8 AID field)
  3277		 */
  3278		aid &= 0x7ff;
  3279	
  3280		ifmgd->broken_ap = false;
  3281	
  3282		if (aid == 0 || aid > IEEE80211_MAX_AID) {
  3283			sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n",
  3284				   aid);
  3285			aid = 0;
  3286			ifmgd->broken_ap = true;
  3287		}
  3288	
  3289		if (!elems->supp_rates) {
  3290			sdata_info(sdata, "no SuppRates element in AssocResp\n");
  3291			return false;
  3292		}
  3293	
  3294		sdata->vif.bss_conf.aid = aid;
  3295		ifmgd->tdls_chan_switch_prohibited =
  3296			elems->ext_capab && elems->ext_capab_len >= 5 &&
  3297			(elems->ext_capab[4] & WLAN_EXT_CAPA5_TDLS_CH_SW_PROHIBITED);
  3298	
  3299		/*
  3300		 * Some APs are erroneously not including some information in their
  3301		 * (re)association response frames. Try to recover by using the data
  3302		 * from the beacon or probe response. This seems to afflict mobile
  3303		 * 2G/3G/4G wifi routers, reported models include the "Onda PN51T",
  3304		 * "Vodafone PocketWiFi 2", "ZTE MF60" and a similar T-Mobile device.
  3305		 */
  3306		if (!is_6ghz &&
  3307		    ((assoc_data->wmm && !elems->wmm_param) ||
  3308		     (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
  3309		      (!elems->ht_cap_elem || !elems->ht_operation)) ||
  3310		     (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
  3311		      (!elems->vht_cap_elem || !elems->vht_operation)))) {
  3312			const struct cfg80211_bss_ies *ies;
  3313			struct ieee802_11_elems bss_elems;
  3314	
  3315			rcu_read_lock();
  3316			ies = rcu_dereference(cbss->ies);
  3317			if (ies)
  3318				bss_ies = kmemdup(ies, sizeof(*ies) + ies->len,
  3319						  GFP_ATOMIC);
  3320			rcu_read_unlock();
  3321			if (!bss_ies)
  3322				return false;
  3323	
  3324			ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
  3325					       false, &bss_elems,
  3326					       mgmt->bssid,
  3327					       assoc_data->bss->bssid);
  3328			if (assoc_data->wmm &&
  3329			    !elems->wmm_param && bss_elems.wmm_param) {
  3330				elems->wmm_param = bss_elems.wmm_param;
  3331				sdata_info(sdata,
  3332					   "AP bug: WMM param missing from AssocResp\n");
  3333			}
  3334	
  3335			/*
  3336			 * Also check if we requested HT/VHT, otherwise the AP doesn't
  3337			 * have to include the IEs in the (re)association response.
  3338			 */
  3339			if (!elems->ht_cap_elem && bss_elems.ht_cap_elem &&
  3340			    !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
  3341				elems->ht_cap_elem = bss_elems.ht_cap_elem;
  3342				sdata_info(sdata,
  3343					   "AP bug: HT capability missing from AssocResp\n");
  3344			}
  3345			if (!elems->ht_operation && bss_elems.ht_operation &&
  3346			    !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
  3347				elems->ht_operation = bss_elems.ht_operation;
  3348				sdata_info(sdata,
  3349					   "AP bug: HT operation missing from AssocResp\n");
  3350			}
  3351			if (!elems->vht_cap_elem && bss_elems.vht_cap_elem &&
  3352			    !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
  3353				elems->vht_cap_elem = bss_elems.vht_cap_elem;
  3354				sdata_info(sdata,
  3355					   "AP bug: VHT capa missing from AssocResp\n");
  3356			}
  3357			if (!elems->vht_operation && bss_elems.vht_operation &&
  3358			    !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
  3359				elems->vht_operation = bss_elems.vht_operation;
  3360				sdata_info(sdata,
  3361					   "AP bug: VHT operation missing from AssocResp\n");
  3362			}
  3363		}
  3364	
  3365		/*
  3366		 * We previously checked these in the beacon/probe response, so
  3367		 * they should be present here. This is just a safety net.
  3368		 */
  3369		if (!is_6ghz && !(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
  3370		    (!elems->wmm_param || !elems->ht_cap_elem || !elems->ht_operation)) {
  3371			sdata_info(sdata,
  3372				   "HT AP is missing WMM params or HT capability/operation\n");
  3373			ret = false;
  3374			goto out;
  3375		}
  3376	
  3377		if (!is_6ghz && !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
  3378		    (!elems->vht_cap_elem || !elems->vht_operation)) {
  3379			sdata_info(sdata,
  3380				   "VHT AP is missing VHT capability/operation\n");
  3381			ret = false;
  3382			goto out;
  3383		}
  3384	
  3385		if (is_6ghz && !(ifmgd->flags & IEEE80211_STA_DISABLE_HE) &&
  3386		    !elems->he_6ghz_capa) {
  3387			sdata_info(sdata,
  3388				   "HE 6 GHz AP is missing HE 6 GHz band capability\n");
  3389			ret = false;
  3390			goto out;
  3391		}
  3392	
  3393		mutex_lock(&sdata->local->sta_mtx);
  3394		/*
  3395		 * station info was already allocated and inserted before
  3396		 * the association and should be available to us
  3397		 */
  3398		sta = sta_info_get(sdata, cbss->bssid);
  3399		if (WARN_ON(!sta)) {
  3400			mutex_unlock(&sdata->local->sta_mtx);
  3401			ret = false;
  3402			goto out;
  3403		}
  3404	
  3405		sband = ieee80211_get_sband(sdata);
  3406		if (!sband) {
  3407			mutex_unlock(&sdata->local->sta_mtx);
  3408			ret = false;
  3409			goto out;
  3410		}
  3411	
  3412		if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HE) &&
  3413		    (!elems->he_cap || !elems->he_operation)) {
  3414			mutex_unlock(&sdata->local->sta_mtx);
  3415			sdata_info(sdata,
  3416				   "HE AP is missing HE capability/operation\n");
  3417			ret = false;
  3418			goto out;
  3419		}
  3420	
  3421		/* Set up internal HT/VHT capabilities */
  3422		if (elems->ht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_HT))
  3423			ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
  3424							  elems->ht_cap_elem, sta);
  3425	
  3426		if (elems->vht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
  3427			ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
  3428							    elems->vht_cap_elem, sta);
  3429	
  3430		if (elems->he_operation && !(ifmgd->flags & IEEE80211_STA_DISABLE_HE) &&
  3431		    elems->he_cap) {
  3432			ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband,
  3433							  elems->he_cap,
  3434							  elems->he_cap_len,
  3435							  elems->he_6ghz_capa,
  3436							  sta);
  3437	
  3438			bss_conf->he_support = sta->sta.he_cap.has_he;
  3439			if (elems->rsnx && elems->rsnx_len &&
  3440			    (elems->rsnx[0] & WLAN_RSNX_CAPA_PROTECTED_TWT) &&
  3441			    wiphy_ext_feature_isset(local->hw.wiphy,
  3442						    NL80211_EXT_FEATURE_PROTECTED_TWT))
  3443				bss_conf->twt_protected = true;
  3444			else
  3445				bss_conf->twt_protected = false;
  3446	
  3447			changed |= ieee80211_recalc_twt_req(sdata, sta, elems);
  3448		} else {
  3449			bss_conf->he_support = false;
  3450			bss_conf->twt_requester = false;
  3451			bss_conf->twt_protected = false;
  3452		}
  3453	
  3454		if (bss_conf->he_support) {
  3455			bss_conf->he_bss_color.color =
  3456				le32_get_bits(elems->he_operation->he_oper_params,
  3457					      IEEE80211_HE_OPERATION_BSS_COLOR_MASK);
  3458			bss_conf->he_bss_color.partial =
  3459				le32_get_bits(elems->he_operation->he_oper_params,
  3460					      IEEE80211_HE_OPERATION_PARTIAL_BSS_COLOR);
  3461			bss_conf->he_bss_color.disabled =
  3462				le32_get_bits(elems->he_operation->he_oper_params,
  3463					      IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED);
  3464	
> 3465			if (!params->he_bss_color.disabled)
  3466				changed |= BSS_CHANGED_HE_BSS_COLOR;
  3467	
  3468			bss_conf->htc_trig_based_pkt_ext =
  3469				le32_get_bits(elems->he_operation->he_oper_params,
  3470				      IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK);
  3471			bss_conf->frame_time_rts_th =
  3472				le32_get_bits(elems->he_operation->he_oper_params,
  3473				      IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
  3474	
  3475			bss_conf->multi_sta_back_32bit =
  3476				sta->sta.he_cap.he_cap_elem.mac_cap_info[2] &
  3477				IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP;
  3478	
  3479			bss_conf->ack_enabled =
  3480				sta->sta.he_cap.he_cap_elem.mac_cap_info[2] &
  3481				IEEE80211_HE_MAC_CAP2_ACK_EN;
  3482	
  3483			bss_conf->uora_exists = !!elems->uora_element;
  3484			if (elems->uora_element)
  3485				bss_conf->uora_ocw_range = elems->uora_element[0];
  3486	
  3487			ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems->he_operation);
  3488			ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems->he_spr);
  3489			/* TODO: OPEN: what happens if BSS color disable is set? */
  3490		}
  3491	
  3492		if (cbss->transmitted_bss) {
  3493			bss_conf->nontransmitted = true;
  3494			ether_addr_copy(bss_conf->transmitter_bssid,
  3495					cbss->transmitted_bss->bssid);
  3496			bss_conf->bssid_indicator = cbss->max_bssid_indicator;
  3497			bss_conf->bssid_index = cbss->bssid_index;
  3498		}
  3499	
  3500		/*
  3501		 * Some APs, e.g. Netgear WNDR3700, report invalid HT operation data
  3502		 * in their association response, so ignore that data for our own
  3503		 * configuration. If it changed since the last beacon, we'll get the
  3504		 * next beacon and update then.
  3505		 */
  3506	
  3507		/*
  3508		 * If an operating mode notification IE is present, override the
  3509		 * NSS calculation (that would be done in rate_control_rate_init())
  3510		 * and use the # of streams from that element.
  3511		 */
  3512		if (elems->opmode_notif &&
  3513		    !(*elems->opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF)) {
  3514			u8 nss;
  3515	
  3516			nss = *elems->opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK;
  3517			nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
  3518			nss += 1;
  3519			sta->sta.rx_nss = nss;
  3520		}
  3521	
  3522		rate_control_rate_init(sta);
  3523	
  3524		if (ifmgd->flags & IEEE80211_STA_MFP_ENABLED) {
  3525			set_sta_flag(sta, WLAN_STA_MFP);
  3526			sta->sta.mfp = true;
  3527		} else {
  3528			sta->sta.mfp = false;
  3529		}
  3530	
  3531		sta->sta.wme = elems->wmm_param && local->hw.queues >= IEEE80211_NUM_ACS;
  3532	
  3533		err = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
  3534		if (!err && !(ifmgd->flags & IEEE80211_STA_CONTROL_PORT))
  3535			err = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
  3536		if (err) {
  3537			sdata_info(sdata,
  3538				   "failed to move station %pM to desired state\n",
  3539				   sta->sta.addr);
  3540			WARN_ON(__sta_info_destroy(sta));
  3541			mutex_unlock(&sdata->local->sta_mtx);
  3542			ret = false;
  3543			goto out;
  3544		}
  3545	
  3546		mutex_unlock(&sdata->local->sta_mtx);
  3547	
  3548		/*
  3549		 * Always handle WMM once after association regardless
  3550		 * of the first value the AP uses. Setting -1 here has
  3551		 * that effect because the AP values is an unsigned
  3552		 * 4-bit value.
  3553		 */
  3554		ifmgd->wmm_last_param_set = -1;
  3555		ifmgd->mu_edca_last_param_set = -1;
  3556	
  3557		if (ifmgd->flags & IEEE80211_STA_DISABLE_WMM) {
  3558			ieee80211_set_wmm_default(sdata, false, false);
  3559		} else if (!ieee80211_sta_wmm_params(local, sdata, elems->wmm_param,
  3560						     elems->wmm_param_len,
  3561						     elems->mu_edca_param_set)) {
  3562			/* still enable QoS since we might have HT/VHT */
  3563			ieee80211_set_wmm_default(sdata, false, true);
  3564			/* set the disable-WMM flag in this case to disable
  3565			 * tracking WMM parameter changes in the beacon if
  3566			 * the parameters weren't actually valid. Doing so
  3567			 * avoids changing parameters very strangely when
  3568			 * the AP is going back and forth between valid and
  3569			 * invalid parameters.
  3570			 */
  3571			ifmgd->flags |= IEEE80211_STA_DISABLE_WMM;
  3572		}
  3573		changed |= BSS_CHANGED_QOS;
  3574	
  3575		if (elems->max_idle_period_ie) {
  3576			bss_conf->max_idle_period =
  3577				le16_to_cpu(elems->max_idle_period_ie->max_idle_period);
  3578			bss_conf->protected_keep_alive =
  3579				!!(elems->max_idle_period_ie->idle_options &
  3580				   WLAN_IDLE_OPTIONS_PROTECTED_KEEP_ALIVE);
  3581			changed |= BSS_CHANGED_KEEP_ALIVE;
  3582		} else {
  3583			bss_conf->max_idle_period = 0;
  3584			bss_conf->protected_keep_alive = false;
  3585		}
  3586	
  3587		/* set assoc capability (AID was already set earlier),
  3588		 * ieee80211_set_associated() will tell the driver */
  3589		bss_conf->assoc_capability = capab_info;
  3590		ieee80211_set_associated(sdata, cbss, changed);
  3591	
  3592		/*
  3593		 * If we're using 4-addr mode, let the AP know that we're
  3594		 * doing so, so that it can create the STA VLAN on its side
  3595		 */
  3596		if (ifmgd->use_4addr)
  3597			ieee80211_send_4addr_nullfunc(local, sdata);
  3598	
  3599		/*
  3600		 * Start timer to probe the connection to the AP now.
  3601		 * Also start the timer that will detect beacon loss.
  3602		 */
  3603		ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt);
  3604		ieee80211_sta_reset_beacon_monitor(sdata);
  3605	
  3606		ret = true;
  3607	 out:
  3608		kfree(bss_ies);
  3609		return ret;
  3610	}
  3611	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 55891 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH v2] mac80211: avoid bss color setting in non-he mode
Date: Tue, 07 Jul 2020 20:25:07 +0800	[thread overview]
Message-ID: <202007072025.kYVTuB61%lkp@intel.com> (raw)
In-Reply-To: <1594114572-26168-1-git-send-email-ppranees@codeaurora.org>

[-- Attachment #1: Type: text/plain, Size: 15998 bytes --]

Hi Praneesh,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on mac80211-next/master]
[also build test ERROR on mac80211/master v5.8-rc4 next-20200707]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/P-Praneesh/mac80211-avoid-bss-color-setting-in-non-he-mode/20200707-173732
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git master
config: nios2-allyesconfig (attached as .config)
compiler: nios2-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=nios2 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   net/mac80211/mlme.c: In function 'ieee80211_assoc_success':
>> net/mac80211/mlme.c:3465:8: error: 'params' undeclared (first use in this function); did you mean 'parameq'?
    3465 |   if (!params->he_bss_color.disabled)
         |        ^~~~~~
         |        parameq
   net/mac80211/mlme.c:3465:8: note: each undeclared identifier is reported only once for each function it appears in

vim +3465 net/mac80211/mlme.c

  3250	
  3251	static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
  3252					    struct cfg80211_bss *cbss,
  3253					    struct ieee80211_mgmt *mgmt, size_t len,
  3254					    struct ieee802_11_elems *elems)
  3255	{
  3256		struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
  3257		struct ieee80211_local *local = sdata->local;
  3258		struct ieee80211_supported_band *sband;
  3259		struct sta_info *sta;
  3260		u16 capab_info, aid;
  3261		struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
  3262		const struct cfg80211_bss_ies *bss_ies = NULL;
  3263		struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
  3264		bool is_6ghz = cbss->channel->band == NL80211_BAND_6GHZ;
  3265		u32 changed = 0;
  3266		int err;
  3267		bool ret;
  3268	
  3269		/* AssocResp and ReassocResp have identical structure */
  3270	
  3271		aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
  3272		capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
  3273	
  3274		/*
  3275		 * The 5 MSB of the AID field are reserved
  3276		 * (802.11-2016 9.4.1.8 AID field)
  3277		 */
  3278		aid &= 0x7ff;
  3279	
  3280		ifmgd->broken_ap = false;
  3281	
  3282		if (aid == 0 || aid > IEEE80211_MAX_AID) {
  3283			sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n",
  3284				   aid);
  3285			aid = 0;
  3286			ifmgd->broken_ap = true;
  3287		}
  3288	
  3289		if (!elems->supp_rates) {
  3290			sdata_info(sdata, "no SuppRates element in AssocResp\n");
  3291			return false;
  3292		}
  3293	
  3294		sdata->vif.bss_conf.aid = aid;
  3295		ifmgd->tdls_chan_switch_prohibited =
  3296			elems->ext_capab && elems->ext_capab_len >= 5 &&
  3297			(elems->ext_capab[4] & WLAN_EXT_CAPA5_TDLS_CH_SW_PROHIBITED);
  3298	
  3299		/*
  3300		 * Some APs are erroneously not including some information in their
  3301		 * (re)association response frames. Try to recover by using the data
  3302		 * from the beacon or probe response. This seems to afflict mobile
  3303		 * 2G/3G/4G wifi routers, reported models include the "Onda PN51T",
  3304		 * "Vodafone PocketWiFi 2", "ZTE MF60" and a similar T-Mobile device.
  3305		 */
  3306		if (!is_6ghz &&
  3307		    ((assoc_data->wmm && !elems->wmm_param) ||
  3308		     (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
  3309		      (!elems->ht_cap_elem || !elems->ht_operation)) ||
  3310		     (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
  3311		      (!elems->vht_cap_elem || !elems->vht_operation)))) {
  3312			const struct cfg80211_bss_ies *ies;
  3313			struct ieee802_11_elems bss_elems;
  3314	
  3315			rcu_read_lock();
  3316			ies = rcu_dereference(cbss->ies);
  3317			if (ies)
  3318				bss_ies = kmemdup(ies, sizeof(*ies) + ies->len,
  3319						  GFP_ATOMIC);
  3320			rcu_read_unlock();
  3321			if (!bss_ies)
  3322				return false;
  3323	
  3324			ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
  3325					       false, &bss_elems,
  3326					       mgmt->bssid,
  3327					       assoc_data->bss->bssid);
  3328			if (assoc_data->wmm &&
  3329			    !elems->wmm_param && bss_elems.wmm_param) {
  3330				elems->wmm_param = bss_elems.wmm_param;
  3331				sdata_info(sdata,
  3332					   "AP bug: WMM param missing from AssocResp\n");
  3333			}
  3334	
  3335			/*
  3336			 * Also check if we requested HT/VHT, otherwise the AP doesn't
  3337			 * have to include the IEs in the (re)association response.
  3338			 */
  3339			if (!elems->ht_cap_elem && bss_elems.ht_cap_elem &&
  3340			    !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
  3341				elems->ht_cap_elem = bss_elems.ht_cap_elem;
  3342				sdata_info(sdata,
  3343					   "AP bug: HT capability missing from AssocResp\n");
  3344			}
  3345			if (!elems->ht_operation && bss_elems.ht_operation &&
  3346			    !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
  3347				elems->ht_operation = bss_elems.ht_operation;
  3348				sdata_info(sdata,
  3349					   "AP bug: HT operation missing from AssocResp\n");
  3350			}
  3351			if (!elems->vht_cap_elem && bss_elems.vht_cap_elem &&
  3352			    !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
  3353				elems->vht_cap_elem = bss_elems.vht_cap_elem;
  3354				sdata_info(sdata,
  3355					   "AP bug: VHT capa missing from AssocResp\n");
  3356			}
  3357			if (!elems->vht_operation && bss_elems.vht_operation &&
  3358			    !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
  3359				elems->vht_operation = bss_elems.vht_operation;
  3360				sdata_info(sdata,
  3361					   "AP bug: VHT operation missing from AssocResp\n");
  3362			}
  3363		}
  3364	
  3365		/*
  3366		 * We previously checked these in the beacon/probe response, so
  3367		 * they should be present here. This is just a safety net.
  3368		 */
  3369		if (!is_6ghz && !(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
  3370		    (!elems->wmm_param || !elems->ht_cap_elem || !elems->ht_operation)) {
  3371			sdata_info(sdata,
  3372				   "HT AP is missing WMM params or HT capability/operation\n");
  3373			ret = false;
  3374			goto out;
  3375		}
  3376	
  3377		if (!is_6ghz && !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
  3378		    (!elems->vht_cap_elem || !elems->vht_operation)) {
  3379			sdata_info(sdata,
  3380				   "VHT AP is missing VHT capability/operation\n");
  3381			ret = false;
  3382			goto out;
  3383		}
  3384	
  3385		if (is_6ghz && !(ifmgd->flags & IEEE80211_STA_DISABLE_HE) &&
  3386		    !elems->he_6ghz_capa) {
  3387			sdata_info(sdata,
  3388				   "HE 6 GHz AP is missing HE 6 GHz band capability\n");
  3389			ret = false;
  3390			goto out;
  3391		}
  3392	
  3393		mutex_lock(&sdata->local->sta_mtx);
  3394		/*
  3395		 * station info was already allocated and inserted before
  3396		 * the association and should be available to us
  3397		 */
  3398		sta = sta_info_get(sdata, cbss->bssid);
  3399		if (WARN_ON(!sta)) {
  3400			mutex_unlock(&sdata->local->sta_mtx);
  3401			ret = false;
  3402			goto out;
  3403		}
  3404	
  3405		sband = ieee80211_get_sband(sdata);
  3406		if (!sband) {
  3407			mutex_unlock(&sdata->local->sta_mtx);
  3408			ret = false;
  3409			goto out;
  3410		}
  3411	
  3412		if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HE) &&
  3413		    (!elems->he_cap || !elems->he_operation)) {
  3414			mutex_unlock(&sdata->local->sta_mtx);
  3415			sdata_info(sdata,
  3416				   "HE AP is missing HE capability/operation\n");
  3417			ret = false;
  3418			goto out;
  3419		}
  3420	
  3421		/* Set up internal HT/VHT capabilities */
  3422		if (elems->ht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_HT))
  3423			ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
  3424							  elems->ht_cap_elem, sta);
  3425	
  3426		if (elems->vht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
  3427			ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
  3428							    elems->vht_cap_elem, sta);
  3429	
  3430		if (elems->he_operation && !(ifmgd->flags & IEEE80211_STA_DISABLE_HE) &&
  3431		    elems->he_cap) {
  3432			ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband,
  3433							  elems->he_cap,
  3434							  elems->he_cap_len,
  3435							  elems->he_6ghz_capa,
  3436							  sta);
  3437	
  3438			bss_conf->he_support = sta->sta.he_cap.has_he;
  3439			if (elems->rsnx && elems->rsnx_len &&
  3440			    (elems->rsnx[0] & WLAN_RSNX_CAPA_PROTECTED_TWT) &&
  3441			    wiphy_ext_feature_isset(local->hw.wiphy,
  3442						    NL80211_EXT_FEATURE_PROTECTED_TWT))
  3443				bss_conf->twt_protected = true;
  3444			else
  3445				bss_conf->twt_protected = false;
  3446	
  3447			changed |= ieee80211_recalc_twt_req(sdata, sta, elems);
  3448		} else {
  3449			bss_conf->he_support = false;
  3450			bss_conf->twt_requester = false;
  3451			bss_conf->twt_protected = false;
  3452		}
  3453	
  3454		if (bss_conf->he_support) {
  3455			bss_conf->he_bss_color.color =
  3456				le32_get_bits(elems->he_operation->he_oper_params,
  3457					      IEEE80211_HE_OPERATION_BSS_COLOR_MASK);
  3458			bss_conf->he_bss_color.partial =
  3459				le32_get_bits(elems->he_operation->he_oper_params,
  3460					      IEEE80211_HE_OPERATION_PARTIAL_BSS_COLOR);
  3461			bss_conf->he_bss_color.disabled =
  3462				le32_get_bits(elems->he_operation->he_oper_params,
  3463					      IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED);
  3464	
> 3465			if (!params->he_bss_color.disabled)
  3466				changed |= BSS_CHANGED_HE_BSS_COLOR;
  3467	
  3468			bss_conf->htc_trig_based_pkt_ext =
  3469				le32_get_bits(elems->he_operation->he_oper_params,
  3470				      IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK);
  3471			bss_conf->frame_time_rts_th =
  3472				le32_get_bits(elems->he_operation->he_oper_params,
  3473				      IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
  3474	
  3475			bss_conf->multi_sta_back_32bit =
  3476				sta->sta.he_cap.he_cap_elem.mac_cap_info[2] &
  3477				IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP;
  3478	
  3479			bss_conf->ack_enabled =
  3480				sta->sta.he_cap.he_cap_elem.mac_cap_info[2] &
  3481				IEEE80211_HE_MAC_CAP2_ACK_EN;
  3482	
  3483			bss_conf->uora_exists = !!elems->uora_element;
  3484			if (elems->uora_element)
  3485				bss_conf->uora_ocw_range = elems->uora_element[0];
  3486	
  3487			ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems->he_operation);
  3488			ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems->he_spr);
  3489			/* TODO: OPEN: what happens if BSS color disable is set? */
  3490		}
  3491	
  3492		if (cbss->transmitted_bss) {
  3493			bss_conf->nontransmitted = true;
  3494			ether_addr_copy(bss_conf->transmitter_bssid,
  3495					cbss->transmitted_bss->bssid);
  3496			bss_conf->bssid_indicator = cbss->max_bssid_indicator;
  3497			bss_conf->bssid_index = cbss->bssid_index;
  3498		}
  3499	
  3500		/*
  3501		 * Some APs, e.g. Netgear WNDR3700, report invalid HT operation data
  3502		 * in their association response, so ignore that data for our own
  3503		 * configuration. If it changed since the last beacon, we'll get the
  3504		 * next beacon and update then.
  3505		 */
  3506	
  3507		/*
  3508		 * If an operating mode notification IE is present, override the
  3509		 * NSS calculation (that would be done in rate_control_rate_init())
  3510		 * and use the # of streams from that element.
  3511		 */
  3512		if (elems->opmode_notif &&
  3513		    !(*elems->opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF)) {
  3514			u8 nss;
  3515	
  3516			nss = *elems->opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK;
  3517			nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
  3518			nss += 1;
  3519			sta->sta.rx_nss = nss;
  3520		}
  3521	
  3522		rate_control_rate_init(sta);
  3523	
  3524		if (ifmgd->flags & IEEE80211_STA_MFP_ENABLED) {
  3525			set_sta_flag(sta, WLAN_STA_MFP);
  3526			sta->sta.mfp = true;
  3527		} else {
  3528			sta->sta.mfp = false;
  3529		}
  3530	
  3531		sta->sta.wme = elems->wmm_param && local->hw.queues >= IEEE80211_NUM_ACS;
  3532	
  3533		err = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
  3534		if (!err && !(ifmgd->flags & IEEE80211_STA_CONTROL_PORT))
  3535			err = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
  3536		if (err) {
  3537			sdata_info(sdata,
  3538				   "failed to move station %pM to desired state\n",
  3539				   sta->sta.addr);
  3540			WARN_ON(__sta_info_destroy(sta));
  3541			mutex_unlock(&sdata->local->sta_mtx);
  3542			ret = false;
  3543			goto out;
  3544		}
  3545	
  3546		mutex_unlock(&sdata->local->sta_mtx);
  3547	
  3548		/*
  3549		 * Always handle WMM once after association regardless
  3550		 * of the first value the AP uses. Setting -1 here has
  3551		 * that effect because the AP values is an unsigned
  3552		 * 4-bit value.
  3553		 */
  3554		ifmgd->wmm_last_param_set = -1;
  3555		ifmgd->mu_edca_last_param_set = -1;
  3556	
  3557		if (ifmgd->flags & IEEE80211_STA_DISABLE_WMM) {
  3558			ieee80211_set_wmm_default(sdata, false, false);
  3559		} else if (!ieee80211_sta_wmm_params(local, sdata, elems->wmm_param,
  3560						     elems->wmm_param_len,
  3561						     elems->mu_edca_param_set)) {
  3562			/* still enable QoS since we might have HT/VHT */
  3563			ieee80211_set_wmm_default(sdata, false, true);
  3564			/* set the disable-WMM flag in this case to disable
  3565			 * tracking WMM parameter changes in the beacon if
  3566			 * the parameters weren't actually valid. Doing so
  3567			 * avoids changing parameters very strangely when
  3568			 * the AP is going back and forth between valid and
  3569			 * invalid parameters.
  3570			 */
  3571			ifmgd->flags |= IEEE80211_STA_DISABLE_WMM;
  3572		}
  3573		changed |= BSS_CHANGED_QOS;
  3574	
  3575		if (elems->max_idle_period_ie) {
  3576			bss_conf->max_idle_period =
  3577				le16_to_cpu(elems->max_idle_period_ie->max_idle_period);
  3578			bss_conf->protected_keep_alive =
  3579				!!(elems->max_idle_period_ie->idle_options &
  3580				   WLAN_IDLE_OPTIONS_PROTECTED_KEEP_ALIVE);
  3581			changed |= BSS_CHANGED_KEEP_ALIVE;
  3582		} else {
  3583			bss_conf->max_idle_period = 0;
  3584			bss_conf->protected_keep_alive = false;
  3585		}
  3586	
  3587		/* set assoc capability (AID was already set earlier),
  3588		 * ieee80211_set_associated() will tell the driver */
  3589		bss_conf->assoc_capability = capab_info;
  3590		ieee80211_set_associated(sdata, cbss, changed);
  3591	
  3592		/*
  3593		 * If we're using 4-addr mode, let the AP know that we're
  3594		 * doing so, so that it can create the STA VLAN on its side
  3595		 */
  3596		if (ifmgd->use_4addr)
  3597			ieee80211_send_4addr_nullfunc(local, sdata);
  3598	
  3599		/*
  3600		 * Start timer to probe the connection to the AP now.
  3601		 * Also start the timer that will detect beacon loss.
  3602		 */
  3603		ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt);
  3604		ieee80211_sta_reset_beacon_monitor(sdata);
  3605	
  3606		ret = true;
  3607	 out:
  3608		kfree(bss_ies);
  3609		return ret;
  3610	}
  3611	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 55891 bytes --]

  reply	other threads:[~2020-07-07 12:56 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-07  9:36 [PATCH v2] mac80211: avoid bss color setting in non-he mode P Praneesh
2020-07-07 12:25 ` kernel test robot [this message]
2020-07-07 12:25   ` kernel test robot
2020-07-07 13:39 ` kernel test robot
2020-07-07 13:39   ` kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202007072025.kYVTuB61%lkp@intel.com \
    --to=lkp@intel.com \
    --cc=johannes@sipsolutions.net \
    --cc=kbuild-all@lists.01.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=ppranees@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.