DFS offload: Use hostapd_is_dfs_required() to check if DFS required
hostapd_handle_dfs_offload() is the DFS handler for the offloaded case,
in which ieee80211_is_dfs() is used to check if the configured frequency
requires DFS or not.
When the configured channel width is not 20 (e.g., 160),
ieee80211_is_dfs() will not checked adjacent freqs, so it possibly makes
wrong conclusion for whether DFS is required.
hostapd_is_dfs_required() does similar thing with ieee80211_is_dfs()
except it supports checking whether the configured frequency and its
adjacent frequencies require DFS. So hostapd_is_dfs_required() is a more
robust and better option than ieee80211_is_dfs() to check DFS.
The issue is hostapd_is_dfs_required() is for non-offload case due to
the check of the configuration parameter ieee80211h. Add a check for
WPA_DRIVER_FLAGS_DFS_OFFLOAD to make it support the DFS offload case
(i.e., ieee80211h=0) as well.
For example, configuring the AP to start at freq=5240 with channel width
160:
- Existing hostapd checks freq=5240 is non-DFS, hence skip DFS CAC and
  transition to AP-Enabled which volatiles DFS-RADAR detection.
  LOG: "hostapd : hostapd_handle_dfs_offload: freq 5240 MHz does not
        require DFS. Continue channel/AP setup"
- This commit checks freq=5240 and its adjacent freqs are DFS required,
  hence remains in DFS state until DFS CAC completed.
  LOG: "hostapd : hostapd_handle_dfs_offload: freq 5240 MHz requires
        DFS for 4 chans"
Signed-off-by: Hu Wang <huw@codeaurora.org>
			
			
This commit is contained in:
		
							parent
							
								
									e8662e9d44
								
							
						
					
					
						commit
						09fb9b0cb0
					
				
					 1 changed files with 10 additions and 5 deletions
				
			
		
							
								
								
									
										15
									
								
								src/ap/dfs.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								src/ap/dfs.c
									
									
									
									
									
								
							|  | @ -1228,7 +1228,9 @@ int hostapd_is_dfs_required(struct hostapd_iface *iface) | |||
| { | ||||
| 	int n_chans, n_chans1, start_chan_idx, start_chan_idx1, res; | ||||
| 
 | ||||
| 	if (!iface->conf->ieee80211h || !iface->current_mode || | ||||
| 	if ((!(iface->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) && | ||||
| 	     !iface->conf->ieee80211h) || | ||||
| 	    !iface->current_mode || | ||||
| 	    iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A) | ||||
| 		return 0; | ||||
| 
 | ||||
|  | @ -1279,6 +1281,8 @@ int hostapd_dfs_start_cac(struct hostapd_iface *iface, int freq, | |||
|  */ | ||||
| int hostapd_handle_dfs_offload(struct hostapd_iface *iface) | ||||
| { | ||||
| 	int dfs_res; | ||||
| 
 | ||||
| 	wpa_printf(MSG_DEBUG, "%s: iface->cac_started: %d", | ||||
| 		   __func__, iface->cac_started); | ||||
| 
 | ||||
|  | @ -1294,10 +1298,11 @@ int hostapd_handle_dfs_offload(struct hostapd_iface *iface) | |||
| 		return 1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (ieee80211_is_dfs(iface->freq, iface->hw_features, | ||||
| 			     iface->num_hw_features)) { | ||||
| 		wpa_printf(MSG_DEBUG, "%s: freq %d MHz requires DFS", | ||||
| 			   __func__, iface->freq); | ||||
| 	dfs_res = hostapd_is_dfs_required(iface); | ||||
| 	if (dfs_res > 0) { | ||||
| 		wpa_printf(MSG_DEBUG, | ||||
| 			   "%s: freq %d MHz requires DFS for %d chans", | ||||
| 			   __func__, iface->freq, dfs_res); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Hu Wang
						Hu Wang