mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-31 18:38:10 +00:00 
			
		
		
		
	hostapd: ubus: add DFS channels support during CSA
Add options to trigger CSA with DFS channels, without
this patch ubus request was rejected:
ubus call hostapd.wlan0 switch_chan '{"freq":5260,"bcn_count":10}'
Command failed: Operation not supported
Fixes: WIFI-13385
Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
			
			
This commit is contained in:
		 Marek Kwaczynski
					Marek Kwaczynski
				
			
				
					committed by
					
						 John Crispin
						John Crispin
					
				
			
			
				
	
			
			
			 John Crispin
						John Crispin
					
				
			
						parent
						
							1ca8f18b9d
						
					
				
				
					commit
					4b5eeb48cc
				
			| @@ -0,0 +1,54 @@ | |||||||
|  | Index: hostapd-2021-02-20-59e9794c/src/ap/ubus.c | ||||||
|  | =================================================================== | ||||||
|  | --- hostapd-2021-02-20-59e9794c.orig/src/ap/ubus.c | ||||||
|  | +++ hostapd-2021-02-20-59e9794c/src/ap/ubus.c | ||||||
|  | @@ -25,6 +25,7 @@ | ||||||
|  |  #include "airtime_policy.h" | ||||||
|  |  #include "hw_features.h" | ||||||
|  |  #include "radius_client.h" | ||||||
|  | +#include "dfs.h" | ||||||
|  |   | ||||||
|  |  static struct ubus_context *ctx; | ||||||
|  |  static struct blob_buf b; | ||||||
|  | @@ -857,6 +858,7 @@ hostapd_switch_chan(struct ubus_context | ||||||
|  |  	u8 seg0 = 0, seg1 = 0; | ||||||
|  |  	int ret = UBUS_STATUS_OK; | ||||||
|  |  	int i; | ||||||
|  | +	int dfs_range = 0; | ||||||
|  |   | ||||||
|  |  	blobmsg_parse(csa_policy, __CSA_MAX, tb, blob_data(msg), blob_len(msg)); | ||||||
|  |   | ||||||
|  | @@ -912,6 +914,17 @@ hostapd_switch_chan(struct ubus_context | ||||||
|  |  		break; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +	if (css.freq_params.center_freq1) | ||||||
|  | +		dfs_range += hostapd_is_dfs_overlap( | ||||||
|  | +			hapd->iface, chwidth, css.freq_params.center_freq1); | ||||||
|  | +	else | ||||||
|  | +		dfs_range += hostapd_is_dfs_overlap( | ||||||
|  | +			hapd->iface, chwidth, css.freq_params.freq); | ||||||
|  | + | ||||||
|  | +	if (css.freq_params.center_freq2) | ||||||
|  | +		dfs_range += hostapd_is_dfs_overlap( | ||||||
|  | +			hapd->iface, chwidth, css.freq_params.center_freq2); | ||||||
|  | + | ||||||
|  |  	hostapd_set_freq_params(&css.freq_params, iconf->hw_mode, | ||||||
|  |  				css.freq_params.freq, | ||||||
|  |  				css.freq_params.channel, iconf->enable_edmg, | ||||||
|  | @@ -925,6 +938,15 @@ hostapd_switch_chan(struct ubus_context | ||||||
|  |  				mode ? &mode->he_capab[IEEE80211_MODE_AP] : | ||||||
|  |  				NULL); | ||||||
|  |   | ||||||
|  | +	if (dfs_range) { | ||||||
|  | +		/* Perform CAC and switch channel */ | ||||||
|  | +		freq_params = malloc(sizeof(*freq_params)); | ||||||
|  | +		memcpy(freq_params, &css.freq_params, sizeof(*freq_params)); | ||||||
|  | +		eloop_register_timeout(0, 1, switch_chan_fallback_cb, | ||||||
|  | +				       hapd->iface, freq_params); | ||||||
|  | +		return 0; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  |  	for (i = 0; i < hapd->iface->num_bss; i++) { | ||||||
|  |  		struct hostapd_data *bss = hapd->iface->bss[i]; | ||||||
|  |   | ||||||
		Reference in New Issue
	
	Block a user