forked from mirrors/linux
		
	mac80211: allow AP_VLAN operation on crypto controlled devices
In the current implementation, mac80211 advertises the support of AP_VLANs based on the driver's support for AP mode; it also blocks encrypted AP_VLAN operation on devices advertising SW_CRYPTO_CONTROL. The implementation seems weird in it's current form and could be often confusing, this is because there can be drivers advertising both SW_CRYPTO_CONTROL and AP mode support (ex: ath10k) in which case AP_VLAN will still be supported but only in open BSS and not in secured BSS. When SW_CRYPTO_CONTROL is enabled, it makes more sense if the decision to support AP_VLANs is left to the driver. Mac80211 can then allow AP_VLAN operations depending on the driver support. Signed-off-by: Manikanta Pubbisetty <mpubbise@codeaurora.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
		
							parent
							
								
									19d3577e35
								
							
						
					
					
						commit
						db3bdcb9c3
					
				
					 2 changed files with 11 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -126,7 +126,7 @@ static void decrease_tailroom_need_count(struct ieee80211_sub_if_data *sdata,
 | 
			
		|||
 | 
			
		||||
static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = key->sdata;
 | 
			
		||||
	struct sta_info *sta;
 | 
			
		||||
	int ret = -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -162,7 +162,6 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
 | 
			
		|||
	if (sta && !sta->uploaded)
 | 
			
		||||
		goto out_unsupported;
 | 
			
		||||
 | 
			
		||||
	sdata = key->sdata;
 | 
			
		||||
	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * The driver doesn't know anything about VLAN interfaces.
 | 
			
		||||
| 
						 | 
				
			
			@ -214,8 +213,11 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
 | 
			
		|||
		/* all of these we can do in software - if driver can */
 | 
			
		||||
		if (ret == 1)
 | 
			
		||||
			return 0;
 | 
			
		||||
		if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL))
 | 
			
		||||
		if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL)) {
 | 
			
		||||
			if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
 | 
			
		||||
				return 0;
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		}
 | 
			
		||||
		return 0;
 | 
			
		||||
	default:
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -930,8 +930,12 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
 | 
			
		|||
			             IEEE80211_HT_CAP_SM_PS_SHIFT;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* if low-level driver supports AP, we also support VLAN */
 | 
			
		||||
	if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) {
 | 
			
		||||
	/* if low-level driver supports AP, we also support VLAN.
 | 
			
		||||
	 * drivers advertising SW_CRYPTO_CONTROL should enable AP_VLAN
 | 
			
		||||
	 * based on their support to transmit SW encrypted packets.
 | 
			
		||||
	 */
 | 
			
		||||
	if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_AP) &&
 | 
			
		||||
	    !ieee80211_hw_check(&local->hw, SW_CRYPTO_CONTROL)) {
 | 
			
		||||
		hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN);
 | 
			
		||||
		hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue