diff options
Diffstat (limited to 'net/mac80211/util.c')
| -rw-r--r-- | net/mac80211/util.c | 34 | 
1 files changed, 26 insertions, 8 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 32a7a53833c0..decd46b38393 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -1063,16 +1063,22 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,  				elem_parse_failed = true;  			break;  		case WLAN_EID_VHT_OPERATION: -			if (elen >= sizeof(struct ieee80211_vht_operation)) +			if (elen >= sizeof(struct ieee80211_vht_operation)) {  				elems->vht_operation = (void *)pos; -			else -				elem_parse_failed = true; +				if (calc_crc) +					crc = crc32_be(crc, pos - 2, elen + 2); +				break; +			} +			elem_parse_failed = true;  			break;  		case WLAN_EID_OPMODE_NOTIF: -			if (elen > 0) +			if (elen > 0) {  				elems->opmode_notif = pos; -			else -				elem_parse_failed = true; +				if (calc_crc) +					crc = crc32_be(crc, pos - 2, elen + 2); +				break; +			} +			elem_parse_failed = true;  			break;  		case WLAN_EID_MESH_ID:  			elems->mesh_id = pos; @@ -2987,10 +2993,22 @@ bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,  	int cf0, cf1;  	int ccfs0, ccfs1, ccfs2;  	int ccf0, ccf1; +	u32 vht_cap; +	bool support_80_80 = false; +	bool support_160 = false;  	if (!oper || !htop)  		return false; +	vht_cap = hw->wiphy->bands[chandef->chan->band]->vht_cap.cap; +	support_160 = (vht_cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK | +				  IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)); +	support_80_80 = ((vht_cap & +			 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) || +			(vht_cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ && +			 vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) || +			((vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >> +				    IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT > 1));  	ccfs0 = oper->center_freq_seg0_idx;  	ccfs1 = oper->center_freq_seg1_idx;  	ccfs2 = (le16_to_cpu(htop->operation_mode) & @@ -3018,10 +3036,10 @@ bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,  			unsigned int diff;  			diff = abs(ccf1 - ccf0); -			if (diff == 8) { +			if ((diff == 8) && support_160) {  				new.width = NL80211_CHAN_WIDTH_160;  				new.center_freq1 = cf1; -			} else if (diff > 8) { +			} else if ((diff > 8) && support_80_80) {  				new.width = NL80211_CHAN_WIDTH_80P80;  				new.center_freq2 = cf1;  			}  |