mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-31 02:17:58 +00:00 
			
		
		
		
	Compare commits
	
		
			90 Commits
		
	
	
		
			v3.1.0
			...
			v3.2.0-rc2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | cb5b8a2627 | ||
|   | d2b6fc73f7 | ||
|   | 621e9a4551 | ||
|   | d518e5988d | ||
|   | 911da1bb41 | ||
|   | b2e778221e | ||
|   | 34b0405238 | ||
|   | 0d6245fbcf | ||
|   | 207dba8af6 | ||
|   | 09e6ea31a5 | ||
|   | 81e38dec0d | ||
|   | c9c2137a54 | ||
|   | ddbf50b673 | ||
|   | cf599560e7 | ||
|   | 83a6710095 | ||
|   | ecff108ac9 | ||
|   | 18f357a06b | ||
|   | aedbf9794e | ||
|   | c235143c16 | ||
|   | 17a97e5060 | ||
|   | b5d5af41f0 | ||
|   | 2a4d4f6a2e | ||
|   | 8cd635c895 | ||
|   | 249b24c3c6 | ||
|   | e479001b36 | ||
|   | c312d45e21 | ||
|   | 1f5f5a1a06 | ||
|   | 9ac52bd77a | ||
|   | ba5074c57f | ||
|   | 67c62ce445 | ||
|   | ef9a22bec7 | ||
|   | 347b12e4dd | ||
|   | 06e3d3678d | ||
|   | 3357f668ee | ||
|   | ed82b878c0 | ||
|   | 308c83263c | ||
|   | 06b8b32623 | ||
|   | 16ebaf4fa3 | ||
|   | 7d336070d7 | ||
|   | 18889cfb54 | ||
|   | 9a3337c49e | ||
|   | b8a4373e56 | ||
|   | d5feaf2d4b | ||
|   | e6ca8a30d5 | ||
|   | ebe0b3ea52 | ||
|   | 93b4735ca5 | ||
|   | 6d4f5b961e | ||
|   | 63899e09ce | ||
|   | 028b96ee88 | ||
|   | b5eef3e284 | ||
|   | 51437a78c0 | ||
|   | a619e59c1d | ||
|   | 06cfa19b79 | ||
|   | c82e67b45b | ||
|   | d603ecd10a | ||
|   | 0c19ddddca | ||
|   | c128391b58 | ||
|   | 4996cbd313 | ||
|   | c48d145889 | ||
|   | bbc78828fc | ||
|   | 51a71c2224 | ||
|   | b99e374fae | ||
|   | 03e06c52d8 | ||
|   | 273bce6f76 | ||
|   | 0a21b9d254 | ||
|   | a5b132fc72 | ||
|   | 644f6ebcd6 | ||
|   | a0c0abb6ac | ||
|   | ed8311e4e4 | ||
|   | 3085bf3ccc | ||
|   | 27ad029ceb | ||
|   | 92dbb0e408 | ||
|   | 5eb9df2df6 | ||
|   | 6f2bd226f8 | ||
|   | 65eca97d16 | ||
|   | 9596f15742 | ||
|   | 131a26bcc0 | ||
|   | 4b50ff9798 | ||
|   | 0b0de111e2 | ||
|   | 0f999a54c1 | ||
|   | 4b0297ba07 | ||
|   | a438d39486 | ||
|   | 33f8f22375 | ||
|   | 6afc11838e | ||
|   | b5048d8305 | ||
|   | 03d14daf20 | ||
|   | 76c16ccc96 | ||
|   | 8b6e73477b | ||
|   | c51a24db43 | ||
|   | 45eb5c9a6b | 
							
								
								
									
										2
									
								
								.github/workflows/build-dev.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-dev.yml
									
									
									
									
										vendored
									
									
								
							| @@ -21,7 +21,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf196', 'cig_wf189', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_ecw5211', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'sercomm_ap72tip', 'udaya_a5-id2', 'udaya_a6-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018-v4', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ] | ||||
|         target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf196', 'cig_wf189', 'cybertan_eww631-a1', 'cybertan_eww631-b1','sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'sercomm_ap72tip', 'udaya_a6-id2', 'wallys_dr5018', 'wallys_dr6018', 'wallys_dr6018-v4', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ] | ||||
|  | ||||
|     steps: | ||||
|     - uses: actions/checkout@v3 | ||||
|   | ||||
| @@ -47,8 +47,8 @@ hostapd_append_wpa_key_mgmt() { | ||||
| 			[ "${ieee80211w:-0}" -gt 0 ] && append wpa_key_mgmt "WPA-${auth_type_l}-SHA256" | ||||
| 		;; | ||||
| 		eap192) | ||||
| 			append wpa_key_mgmt "WPA-EAP-SUITE-B-192" | ||||
| 			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP" | ||||
| 			[ "${ieee80211r:-0}" -gt 0 ] || append wpa_key_mgmt "WPA-EAP-SUITE-B-192" | ||||
| 			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP-SHA384" | ||||
| 		;; | ||||
| 		eap-eap2) | ||||
| 			append wpa_key_mgmt "WPA-EAP" | ||||
| @@ -73,6 +73,10 @@ hostapd_append_wpa_key_mgmt() { | ||||
| 		owe) | ||||
| 			append wpa_key_mgmt "OWE" | ||||
| 		;; | ||||
| 		psk2-radius) | ||||
| 			append wpa_key_mgmt "WPA-PSK" | ||||
| 			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-PSK" | ||||
| 		;; | ||||
| 	esac | ||||
| 
 | ||||
| 	[ "$fils" -gt 0 ] && { | ||||
| @@ -126,9 +130,30 @@ hostapd_common_add_device_config() { | ||||
| 
 | ||||
| 	config_add_boolean multiple_bssid rnr_beacon he_co_locate ema | ||||
| 
 | ||||
| 	config_add_boolean afc | ||||
| 	config_add_string \ | ||||
| 		afc_request_version afc_request_id afc_serial_number \ | ||||
| 		afc_location_type afc_location afc_height afc_height_type | ||||
| 	config_add_array afc_cert_ids afc_freq_range afc_op_class | ||||
| 	config_add_int \ | ||||
| 		afc_min_power afc_major_axis afc_minor_axis afc_orientation \ | ||||
| 		afc_vertical_tolerance | ||||
| 
 | ||||
| 	hostapd_add_log_config | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| hostapd_get_list() { | ||||
| 	local var="$1" | ||||
| 	local field="$2" | ||||
| 
 | ||||
| 	local cur __val_list | ||||
| 	json_get_values __val_list "$field" | ||||
| 	for cur in $__val_list; do | ||||
| 		append "$var" "$cur" "," | ||||
| 	done | ||||
| } | ||||
| 
 | ||||
| hostapd_prepare_device_config() { | ||||
| 	local config="$1" | ||||
| 	local driver="$2" | ||||
| @@ -139,7 +164,7 @@ hostapd_prepare_device_config() { | ||||
| 		acs_chan_bias local_pwr_constraint spectrum_mgmt_required airtime_mode cell_density \ | ||||
| 		rts_threshold beacon_rate rssi_reject_assoc_rssi rssi_ignore_probe_request maxassoc \ | ||||
| 		multiple_bssid he_co_locate rnr_beacon ema acs_exclude_dfs \ | ||||
| 		maxassoc_ignore_probe | ||||
| 		maxassoc_ignore_probe band | ||||
| 
 | ||||
| 	hostapd_set_log_options base_cfg | ||||
| 
 | ||||
| @@ -252,6 +277,45 @@ hostapd_prepare_device_config() { | ||||
| 	[ "$multiple_bssid" -gt 0 ] && append base_cfg "multiple_bssid=$multiple_bssid" "$N" | ||||
| 	[ "$ema" -gt 0 ] && append base_cfg "ema=$ema" "$N" | ||||
| 	[ "$acs_exclude_dfs" -gt 0 ] && append base_cfg "acs_exclude_dfs=$acs_exclude_dfs" "$N" | ||||
| 	if [ "$band" = "6g" ]; then | ||||
| 		json_get_vars afc he_6ghz_reg_pwr_type | ||||
| 	else | ||||
| 		afc=0 | ||||
| 		he_6ghz_reg_pwr_type= | ||||
| 	fi | ||||
| 	set_default afc 0 | ||||
| 	[ "$afc" -gt 0 ] && { | ||||
| 		for v in afc_request_version afc_request_id afc_serial_number afc_min_power afc_height afc_height_type afc_vertical_tolerance \ | ||||
| 				 afc_major_axis afc_minor_axis afc_orientation; do | ||||
| 			json_get_var val $v | ||||
| 			append base_cfg "$v=$val" "$N" | ||||
| 		done | ||||
| 
 | ||||
| 		for v in afc_cert_ids afc_op_class afc_freq_range; do | ||||
| 			val= | ||||
| 			hostapd_get_list val $v | ||||
| 			append base_cfg "$v=$val" "$N" | ||||
| 		done | ||||
| 
 | ||||
| 		json_get_vars afc_location_type afc_location | ||||
| 		case "$afc_location_type" in | ||||
| 			ellipse) | ||||
| 				append base_cfg "afc_location_type=0" "$N" | ||||
| 				append base_cfg "afc_linear_polygon=$afc_location" "$N" | ||||
| 			;; | ||||
| 			linear_polygon) | ||||
| 				append base_cfg "afc_location_type=1" "$N" | ||||
| 				append base_cfg "afc_linear_polygon=$afc_location" "$N" | ||||
| 			;; | ||||
| 			radial_polygon) | ||||
| 				append base_cfg "afc_location_type=2" "$N" | ||||
| 				append base_cfg "afc_radial_polygon=$afc_location" "$N" | ||||
| 			;; | ||||
| 		esac | ||||
| 
 | ||||
| 		he_6ghz_reg_pwr_type=1 | ||||
| 	} | ||||
| 	[ -n "$he_6ghz_reg_pwr_type" ] && append base_cfg "he_6ghz_reg_pwr_type=$he_6ghz_reg_pwr_type" "$N" | ||||
| 
 | ||||
| 	json_get_values opts hostapd_options | ||||
| 	for val in $opts; do | ||||
| @@ -344,8 +408,8 @@ hostapd_common_add_bss_config() { | ||||
| 	config_add_string lci civic | ||||
| 
 | ||||
| 	config_add_boolean ieee80211r pmk_r1_push ft_psk_generate_local ft_over_ds | ||||
| 	config_add_int r0_key_lifetime reassociation_deadline | ||||
| 	config_add_string mobility_domain r1_key_holder | ||||
| 	config_add_int r0_key_lifetime reassociation_deadline ft_l2_refresh | ||||
| 	config_add_string mobility_domain r1_key_holder ft_key | ||||
| 	config_add_array r0kh r1kh | ||||
| 
 | ||||
| 	config_add_int ieee80211w_max_timeout ieee80211w_retry_timeout | ||||
| @@ -439,6 +503,7 @@ hostapd_set_psk() { | ||||
| 	local ifname="$1" | ||||
| 
 | ||||
| 	rm -f /var/run/hostapd-${ifname}.psk | ||||
| 	touch /var/run/hostapd-${ifname}.psk | ||||
| 	for_each_station hostapd_set_psk_file ${ifname} | ||||
| } | ||||
| 
 | ||||
| @@ -602,7 +667,7 @@ append_radius_server() { | ||||
| 	set_default dae_port 3799 | ||||
| 	set_default request_cui 0 | ||||
| 
 | ||||
| 	[ "$eap_server" -eq 0 ] && { | ||||
| 	[ "$eap_server" -eq 0  -a -n "$auth_server" ] && { | ||||
| 		append bss_conf "auth_server_addr=$auth_server" "$N" | ||||
| 		append bss_conf "auth_server_port=$auth_port" "$N" | ||||
| 		append bss_conf "auth_server_shared_secret=$auth_secret" "$N" | ||||
| @@ -724,8 +789,7 @@ hostapd_set_bss_options() { | ||||
| 		[ -n "$wpa_strict_rekey" ] && append bss_conf "wpa_strict_rekey=$wpa_strict_rekey" "$N" | ||||
| 	} | ||||
| 
 | ||||
| 	set_default nasid "${macaddr//\:}" | ||||
| 	append bss_conf "nas_identifier=$nasid" "$N" | ||||
| 	[ -n "$nasid" ] && append bss_conf "nas_identifier=$nasid" "$N" | ||||
| 
 | ||||
| 	[ -n "$acct_server" ] && { | ||||
| 		append bss_conf "acct_server_addr=$acct_server" "$N" | ||||
| @@ -772,9 +836,7 @@ hostapd_set_bss_options() { | ||||
| 			# with WPS enabled, we got to be in unconfigured state. | ||||
| 			wps_not_configured=1 | ||||
| 			vlan_possible=1 | ||||
| 			[ "$macfilter" = radius ] && { | ||||
| 			append_radius_server | ||||
| 			} | ||||
| 		;; | ||||
| 		psk|sae|psk-sae) | ||||
| 			json_get_vars key wpa_psk_file | ||||
| @@ -793,6 +855,7 @@ hostapd_set_bss_options() { | ||||
| 			} | ||||
| 			[ "$eapol_version" -ge "1" -a "$eapol_version" -le "2" ] && append bss_conf "eapol_version=$eapol_version" "$N" | ||||
| 
 | ||||
| 			append_radius_server | ||||
| 			set_default dynamic_vlan 0 | ||||
| 			vlan_possible=1 | ||||
| 			wps_possible=1 | ||||
| @@ -925,10 +988,11 @@ hostapd_set_bss_options() { | ||||
| 		set_default ieee80211r 0 | ||||
| 
 | ||||
| 		if [ "$ieee80211r" -gt "0" ]; then | ||||
| 			json_get_vars mobility_domain ft_psk_generate_local ft_over_ds reassociation_deadline | ||||
| 			json_get_vars mobility_domain ft_psk_generate_local ft_over_ds reassociation_deadline ft_l2_refresh | ||||
| 
 | ||||
| 			set_default mobility_domain "$(echo "$ssid" | md5sum | head -c 4)" | ||||
| 			set_default ft_over_ds 1 | ||||
| 			set_default ft_l2_refresh 30 | ||||
| 			set_default reassociation_deadline 1000 | ||||
| 			skip_kh_setup=0 | ||||
| 
 | ||||
| @@ -951,9 +1015,10 @@ hostapd_set_bss_options() { | ||||
| 			append bss_conf "ft_psk_generate_local=$ft_psk_generate_local" "$N" | ||||
| 			append bss_conf "ft_over_ds=$ft_over_ds" "$N" | ||||
| 			append bss_conf "reassociation_deadline=$reassociation_deadline" "$N" | ||||
| 			[ -n "$ft_l2_refresh" ] && append bss_conf "ft_l2_refresh=$ft_l2_refresh" "$N" | ||||
| 
 | ||||
| 			if [ "$skip_kh_setup" -eq "0" ]; then | ||||
| 				json_get_vars r0_key_lifetime r1_key_holder pmk_r1_push | ||||
| 				json_get_vars r0_key_lifetime r1_key_holder pmk_r1_push ft_key | ||||
| 				json_get_values r0kh r0kh | ||||
| 				json_get_values r1kh r1kh | ||||
| 
 | ||||
| @@ -961,12 +1026,15 @@ hostapd_set_bss_options() { | ||||
| 				set_default pmk_r1_push 0 | ||||
| 
 | ||||
| 				[ -n "$r0kh" -a -n "$r1kh" ] || { | ||||
| 					[ -z "$ft_key" ] && { | ||||
| 						key=`echo -n "$mobility_domain/$auth_secret" | md5sum | awk '{print $1}'` | ||||
| 
 | ||||
| 						set_default r0kh "ff:ff:ff:ff:ff:ff,*,$key" | ||||
| 						set_default r1kh "00:00:00:00:00:00,00:00:00:00:00:00,$key" | ||||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| 				[ -n "$ft_key" ] && append bss_conf "ft_key=$ft_key" "$N" | ||||
| 				[ -n "$r1_key_holder" ] && append bss_conf "r1_key_holder=$r1_key_holder" "$N" | ||||
| 				append bss_conf "r0_key_lifetime=$r0_key_lifetime" "$N" | ||||
| 				append bss_conf "pmk_r1_push=$pmk_r1_push" "$N" | ||||
| @@ -292,7 +292,7 @@ | ||||
|   | ||||
| -		wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s",
 | ||||
| -			buf, ip_addr, keyid_buf, dpp_pkhash_buf);
 | ||||
| +		hostapd_ubus_notify_authorized(hapd, sta, auth_alg);
 | ||||
| +		hostapd_ubus_notify_authorized(hapd, sta);
 | ||||
| +		wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s%s",
 | ||||
| +			buf, ip_addr, keyid_buf, dpp_pkhash_buf, alg_buf);
 | ||||
|   | ||||
| @@ -458,16 +458,6 @@ | ||||
|  } | ||||
|   | ||||
|   | ||||
| @@ -352,6 +355,9 @@ void hostapd_handle_radio_measurement(st
 | ||||
|  		   mgmt->u.action.u.rrm.action, MAC2STR(mgmt->sa)); | ||||
|   | ||||
|  	switch (mgmt->u.action.u.rrm.action) { | ||||
| +	case WLAN_RRM_LINK_MEASUREMENT_REPORT:
 | ||||
| +		hostapd_ubus_handle_link_measurement(hapd, buf, len);
 | ||||
| +		break;
 | ||||
|  	case WLAN_RRM_RADIO_MEASUREMENT_REPORT: | ||||
|  		hostapd_handle_radio_msmt_report(hapd, buf, len); | ||||
|  		break; | ||||
| --- a/src/ap/vlan_init.c
 | ||||
| +++ b/src/ap/vlan_init.c
 | ||||
| @@ -22,6 +22,7 @@
 | ||||
| @@ -88,6 +88,14 @@ | ||||
|  void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, | ||||
|  			   int reassoc); | ||||
|  void hostapd_interface_deinit_free(struct hostapd_iface *iface); | ||||
| @@ -732,6 +741,7 @@ hostapd_switch_channel_fallback(struct h
 | ||||
|  void hostapd_cleanup_cs_params(struct hostapd_data *hapd); | ||||
|  void hostapd_periodic_iface(struct hostapd_iface *iface); | ||||
|  int hostapd_owe_trans_get_info(struct hostapd_data *hapd); | ||||
| +void hostapd_owe_update_trans(struct hostapd_iface *iface);
 | ||||
|  void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx); | ||||
|   | ||||
|  void hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap); | ||||
| --- a/src/ap/hostapd.c
 | ||||
| +++ b/src/ap/hostapd.c
 | ||||
| @@ -252,6 +252,8 @@ int hostapd_reload_config(struct hostapd
 | ||||
| @@ -107,6 +115,15 @@ | ||||
|  	hostapd_ubus_free_bss(hapd); | ||||
|  	accounting_deinit(hapd); | ||||
|  	hostapd_deinit_wpa(hapd); | ||||
| @@ -538,7 +541,7 @@ void hostapd_free_hapd_data(struct hosta
 | ||||
|   * Most of the modules that are initialized in hostapd_setup_bss() are | ||||
|   * deinitialized here. | ||||
|   */ | ||||
| -static void hostapd_cleanup(struct hostapd_data *hapd)
 | ||||
| +void hostapd_cleanup(struct hostapd_data *hapd)
 | ||||
|  { | ||||
|  	wpa_printf(MSG_DEBUG, "%s(hapd=%p (%s))", __func__, hapd, | ||||
|  		   hapd->conf ? hapd->conf->iface : "N/A"); | ||||
| @@ -600,6 +603,7 @@ void hostapd_cleanup_iface_partial(struc
 | ||||
|  static void hostapd_cleanup_iface(struct hostapd_iface *iface) | ||||
|  { | ||||
| @@ -123,17 +140,25 @@ | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -1211,8 +1216,7 @@ static int hostapd_start_beacon(struct h
 | ||||
| @@ -1211,7 +1216,7 @@ static int hostapd_start_beacon(struct h
 | ||||
|   * initialized. Most of the modules that are initialized here will be | ||||
|   * deinitialized in hostapd_cleanup(). | ||||
|   */ | ||||
| -static int hostapd_setup_bss(struct hostapd_data *hapd, int first,
 | ||||
| -			     bool start_beacon)
 | ||||
| +int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool start_beacon)
 | ||||
| +int hostapd_setup_bss(struct hostapd_data *hapd, int first,
 | ||||
|  			     bool start_beacon) | ||||
|  { | ||||
|  	struct hostapd_bss_config *conf = hapd->conf; | ||||
|  	u8 ssid[SSID_MAX_LEN + 1]; | ||||
| @@ -2698,7 +2702,7 @@ hostapd_alloc_bss_data(struct hostapd_if
 | ||||
| @@ -2237,7 +2242,7 @@ static int hostapd_owe_iface_iter2(struc
 | ||||
|  #endif /* CONFIG_OWE */ | ||||
|   | ||||
|   | ||||
| -static void hostapd_owe_update_trans(struct hostapd_iface *iface)
 | ||||
| +void hostapd_owe_update_trans(struct hostapd_iface *iface)
 | ||||
|  { | ||||
|  #ifdef CONFIG_OWE | ||||
|  	/* Check whether the enabled BSS can complete OWE transition mode | ||||
| @@ -2698,7 +2703,7 @@ hostapd_alloc_bss_data(struct hostapd_if
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| @@ -142,7 +167,7 @@ | ||||
|  { | ||||
|  	if (!hapd) | ||||
|  		return; | ||||
| @@ -3491,7 +3495,8 @@ int hostapd_remove_iface(struct hapd_int
 | ||||
| @@ -3491,7 +3496,8 @@ int hostapd_remove_iface(struct hapd_int
 | ||||
|  		hapd_iface = interfaces->iface[i]; | ||||
|  		if (hapd_iface == NULL) | ||||
|  			return -1; | ||||
| @@ -551,3 +576,148 @@ | ||||
|  	.send_mlme = driver_nl80211_send_mlme, | ||||
|  	.get_hw_feature_data = nl80211_get_hw_feature_data, | ||||
|  	.sta_add = wpa_driver_nl80211_sta_add, | ||||
| --- a/src/ap/ieee802_11.c
 | ||||
| +++ b/src/ap/ieee802_11.c
 | ||||
| @@ -547,11 +547,16 @@ static const char * sae_get_password(str
 | ||||
|  				     struct sae_pt **s_pt, | ||||
|  				     const struct sae_pk **s_pk) | ||||
|  { | ||||
| +	struct hostapd_bss_config *conf = hapd->conf;
 | ||||
| +	struct hostapd_ssid *ssid = &conf->ssid;
 | ||||
| +	struct hostapd_sta_wpa_psk_short *psk;
 | ||||
|  	const char *password = NULL; | ||||
| -	struct sae_password_entry *pw;
 | ||||
| -	struct sae_pt *pt = NULL;
 | ||||
| -	const struct sae_pk *pk = NULL;
 | ||||
| -	struct hostapd_sta_wpa_psk_short *psk = NULL;
 | ||||
| +	struct sae_password_entry *pw = NULL;
 | ||||
| + 	struct sae_pt *pt = NULL;
 | ||||
| + 	const struct sae_pk *pk = NULL;
 | ||||
| + 
 | ||||
| +	if (sta && sta->use_sta_psk)
 | ||||
| +		goto use_sta_psk;
 | ||||
|   | ||||
|  	for (pw = hapd->conf->sae_passwords; pw; pw = pw->next) { | ||||
|  		if (!is_broadcast_ether_addr(pw->peer_addr) && | ||||
| @@ -582,6 +587,31 @@ static const char * sae_get_password(str
 | ||||
|  		} | ||||
|  	} | ||||
|   | ||||
| +use_sta_psk:
 | ||||
| +	if (!password && sta) {
 | ||||
| +		for (psk = sta->psk; psk; psk = psk->next) {
 | ||||
| +			if (!psk->is_passphrase)
 | ||||
| +				continue;
 | ||||
| +
 | ||||
| +			password = psk->passphrase;
 | ||||
| +			if (!sta->use_sta_psk)
 | ||||
| +				break;
 | ||||
| +
 | ||||
| +			if (sta->sae_pt) {
 | ||||
| +				pt = sta->sae_pt;
 | ||||
| +				break;
 | ||||
| +			}
 | ||||
| +
 | ||||
| +			pt = sae_derive_pt(conf->sae_groups, ssid->ssid,
 | ||||
| +					   ssid->ssid_len,
 | ||||
| +					   (const u8 *) password,
 | ||||
| +					   os_strlen(password),
 | ||||
| +					   NULL);
 | ||||
| +			sta->sae_pt = pt;
 | ||||
| +			break;
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	if (pw_entry) | ||||
|  		*pw_entry = pw; | ||||
|  	if (s_pt) | ||||
| @@ -3105,6 +3135,12 @@ static void handle_auth(struct hostapd_d
 | ||||
|  		goto fail; | ||||
|  	} | ||||
|   | ||||
| +	res = hostapd_ucode_sta_auth(hapd, sta);
 | ||||
| +	if (res) {
 | ||||
| +		resp = res;
 | ||||
| +		goto fail;
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	sta->flags &= ~WLAN_STA_PREAUTH; | ||||
|  	ieee802_1x_notify_pre_auth(sta->eapol_sm, 0); | ||||
|   | ||||
| --- a/src/ap/sta_info.c
 | ||||
| +++ b/src/ap/sta_info.c
 | ||||
| @@ -425,6 +425,9 @@ void ap_free_sta(struct hostapd_data *ha
 | ||||
|  	forced_memzero(sta->last_tk, WPA_TK_MAX_LEN); | ||||
|  #endif /* CONFIG_TESTING_OPTIONS */ | ||||
|   | ||||
| +	if (sta->sae_pt)
 | ||||
| +		sae_deinit_pt(sta->sae_pt);
 | ||||
| +
 | ||||
|  	os_free(sta); | ||||
|  } | ||||
|   | ||||
| @@ -1326,6 +1329,8 @@ void ap_sta_set_authorized(struct hostap
 | ||||
|  		sta->flags &= ~WLAN_STA_AUTHORIZED; | ||||
|  	} | ||||
|   | ||||
| +	if (authorized)
 | ||||
| +		hostapd_ucode_sta_connected(hapd, sta);
 | ||||
|  #ifdef CONFIG_P2P | ||||
|  	if (hapd->p2p_group == NULL) { | ||||
|  		if (sta->p2p_ie != NULL && | ||||
| --- a/src/ap/sta_info.h
 | ||||
| +++ b/src/ap/sta_info.h
 | ||||
| @@ -198,6 +198,9 @@ struct sta_info {
 | ||||
|  	int vlan_id_bound; /* updated by ap_sta_bind_vlan() */ | ||||
|  	 /* PSKs from RADIUS authentication server */ | ||||
|  	struct hostapd_sta_wpa_psk_short *psk; | ||||
| +	struct sae_pt *sae_pt;
 | ||||
| +	int use_sta_psk;
 | ||||
| +	int psk_idx;
 | ||||
|   | ||||
|  	char *identity; /* User-Name from RADIUS */ | ||||
|  	char *radius_cui; /* Chargeable-User-Identity from RADIUS */ | ||||
| --- a/src/ap/wpa_auth_glue.c
 | ||||
| +++ b/src/ap/wpa_auth_glue.c
 | ||||
| @@ -341,6 +341,7 @@ static const u8 * hostapd_wpa_auth_get_p
 | ||||
|  	struct sta_info *sta = ap_get_sta(hapd, addr); | ||||
|  	const u8 *psk; | ||||
|   | ||||
| +	sta->psk_idx = 0;
 | ||||
|  	if (vlan_id) | ||||
|  		*vlan_id = 0; | ||||
|  	if (psk_len) | ||||
| @@ -387,13 +388,18 @@ static const u8 * hostapd_wpa_auth_get_p
 | ||||
|  	 * returned psk which should not be returned again. | ||||
|  	 * logic list (all hostapd_get_psk; all sta->psk) | ||||
|  	 */ | ||||
| +	if (sta && sta->use_sta_psk)
 | ||||
| +		psk = NULL;
 | ||||
|  	if (sta && sta->psk && !psk) { | ||||
|  		struct hostapd_sta_wpa_psk_short *pos; | ||||
| +		int psk_idx;
 | ||||
|   | ||||
|  		if (vlan_id) | ||||
|  			*vlan_id = 0; | ||||
|  		psk = sta->psk->psk; | ||||
| +		sta->psk_idx = psk_idx = 1;
 | ||||
|  		for (pos = sta->psk; pos; pos = pos->next) { | ||||
| +			psk_idx++;
 | ||||
|  			if (pos->is_passphrase) { | ||||
|  				if (pbkdf2_sha1(pos->passphrase, | ||||
|  						hapd->conf->ssid.ssid, | ||||
| @@ -406,10 +412,14 @@ static const u8 * hostapd_wpa_auth_get_p
 | ||||
|  				pos->is_passphrase = 0; | ||||
|  			} | ||||
|  			if (pos->psk == prev_psk) { | ||||
| +				sta->psk_idx = psk_idx;
 | ||||
|  				psk = pos->next ? pos->next->psk : NULL; | ||||
|  				break; | ||||
|  			} | ||||
|  		} | ||||
| +
 | ||||
| +		if (!psk)
 | ||||
| +			sta->psk_idx = 0;
 | ||||
|  	} | ||||
|  	return psk; | ||||
|  } | ||||
							
								
								
									
										539
									
								
								feeds/hostapd/hostapd/patches/751-wispr-ft.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										539
									
								
								feeds/hostapd/hostapd/patches/751-wispr-ft.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,539 @@ | ||||
| --- a/src/ap/wpa_auth.h | ||||
| +++ b/src/ap/wpa_auth.h | ||||
| @@ -16,7 +16,11 @@ | ||||
|   | ||||
|  struct vlan_description; | ||||
|  struct mld_info; | ||||
| - | ||||
| +struct rate_description { | ||||
| +	u32 rx; | ||||
| +	u32 tx; | ||||
| +}; | ||||
| +  | ||||
|  #define MAX_OWN_IE_OVERRIDE 256 | ||||
|   | ||||
|  #ifdef _MSC_VER | ||||
| @@ -88,6 +92,7 @@ struct ft_rrb_frame { | ||||
|  #define FT_RRB_IDENTITY      15 | ||||
|  #define FT_RRB_RADIUS_CUI    16 | ||||
|  #define FT_RRB_SESSION_TIMEOUT  17 /* le32 seconds */ | ||||
| +#define FT_RRB_RATE_LIMIT	18 | ||||
|   | ||||
|  struct ft_rrb_tlv { | ||||
|  	le16 type; | ||||
| @@ -368,6 +373,10 @@ struct wpa_auth_callbacks { | ||||
|  			struct vlan_description *vlan); | ||||
|  	int (*get_vlan)(void *ctx, const u8 *sta_addr, | ||||
|  			struct vlan_description *vlan); | ||||
| +	int (*set_rate_limit)(void *ctx, const u8 *sta_addr, | ||||
| +			      struct rate_description *rate); | ||||
| +	int (*get_rate_limit)(void *ctx, const u8 *sta_addr, | ||||
| +			      struct rate_description *rate); | ||||
|  	int (*set_identity)(void *ctx, const u8 *sta_addr, | ||||
|  			    const u8 *identity, size_t identity_len); | ||||
|  	size_t (*get_identity)(void *ctx, const u8 *sta_addr, const u8 **buf); | ||||
| @@ -536,7 +545,7 @@ int wpa_ft_fetch_pmk_r1(struct wpa_authe | ||||
|  			struct vlan_description *vlan, | ||||
|  			const u8 **identity, size_t *identity_len, | ||||
|  			const u8 **radius_cui, size_t *radius_cui_len, | ||||
| -			int *session_timeout); | ||||
| +			int *session_timeout, struct rate_description *rate); | ||||
|   | ||||
|  #endif /* CONFIG_IEEE80211R_AP */ | ||||
|   | ||||
| --- a/src/ap/wpa_auth_glue.c | ||||
| +++ b/src/ap/wpa_auth_glue.c | ||||
| @@ -1200,6 +1200,40 @@ static int hostapd_wpa_auth_get_vlan(voi | ||||
|  } | ||||
|   | ||||
|   | ||||
| +static int hostapd_wpa_auth_set_rate_limit(void *ctx, const u8 *sta_addr, | ||||
| +					   struct rate_description *rate) | ||||
| +{ | ||||
| +	struct hostapd_data *hapd = ctx; | ||||
| +	struct sta_info *sta; | ||||
| + | ||||
| +	sta = ap_get_sta(hapd, sta_addr); | ||||
| +	if (!sta || !sta->wpa_sm) | ||||
| +		return -1; | ||||
| + | ||||
| +	memcpy(sta->bandwidth, rate, sizeof(*rate)); | ||||
| +	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, | ||||
| +		       HOSTAPD_LEVEL_INFO, "rate-limit %d %d", sta->bandwidth[0], sta->bandwidth[1]); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| + | ||||
| +static int hostapd_wpa_auth_get_rate_limit(void *ctx, const u8 *sta_addr, | ||||
| +					   struct rate_description *rate) | ||||
| +{ | ||||
| +	struct hostapd_data *hapd = ctx; | ||||
| +	struct sta_info *sta; | ||||
| + | ||||
| +	sta = ap_get_sta(hapd, sta_addr); | ||||
| +	if (!sta) | ||||
| +		return -1; | ||||
| + | ||||
| +	memcpy(rate, sta->bandwidth, sizeof(*rate)); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| + | ||||
|  static int | ||||
|  hostapd_wpa_auth_set_identity(void *ctx, const u8 *sta_addr, | ||||
|  			      const u8 *identity, size_t identity_len) | ||||
| @@ -1640,6 +1674,8 @@ int hostapd_setup_wpa(struct hostapd_dat | ||||
|  		.add_tspec = hostapd_wpa_auth_add_tspec, | ||||
|  		.set_vlan = hostapd_wpa_auth_set_vlan, | ||||
|  		.get_vlan = hostapd_wpa_auth_get_vlan, | ||||
| +		.set_rate_limit = hostapd_wpa_auth_set_rate_limit, | ||||
| +		.get_rate_limit = hostapd_wpa_auth_get_rate_limit, | ||||
|  		.set_identity = hostapd_wpa_auth_set_identity, | ||||
|  		.get_identity = hostapd_wpa_auth_get_identity, | ||||
|  		.set_radius_cui = hostapd_wpa_auth_set_radius_cui, | ||||
| --- a/src/ap/wpa_auth_ft.c | ||||
| +++ b/src/ap/wpa_auth_ft.c | ||||
| @@ -379,6 +379,14 @@ static size_t wpa_ft_vlan_len(const stru | ||||
|  	return tlv_len; | ||||
|  } | ||||
|   | ||||
| +static size_t wpa_ft_rate_limit_len(const struct rate_description *rate) | ||||
| +{ | ||||
| +	if (!rate || (!rate->rx && !rate->tx)) | ||||
| +		return 0; | ||||
| + | ||||
| +	return (sizeof(struct ft_rrb_tlv) + 8); | ||||
| +} | ||||
| + | ||||
|   | ||||
|  static size_t wpa_ft_vlan_lin(const struct vlan_description *vlan, | ||||
|  			      u8 *start, u8 *endpos) | ||||
| @@ -434,10 +442,48 @@ static size_t wpa_ft_vlan_lin(const stru | ||||
|  } | ||||
|   | ||||
|   | ||||
| +static size_t wpa_ft_rate_limit_lin(const struct rate_description *rate, | ||||
| +				    u8 *start, u8 *endpos) | ||||
| +{ | ||||
| +	size_t tlv_len; | ||||
| +	int i, len; | ||||
| +	struct ft_rrb_tlv *hdr; | ||||
| +	u8 *pos = start; | ||||
| + | ||||
| +	if (!rate) | ||||
| +		return 0; | ||||
| + | ||||
| +	tlv_len = 0; | ||||
| +	if (rate->rx || rate->tx) { | ||||
| +		tlv_len += sizeof(*hdr); | ||||
| +		if (start + tlv_len > endpos) | ||||
| +			return tlv_len; | ||||
| +		hdr = (struct ft_rrb_tlv *) pos; | ||||
| +		hdr->type = host_to_le16(FT_RRB_RATE_LIMIT); | ||||
| +		hdr->len = host_to_le16(2 * sizeof(le32)); | ||||
| +		pos = start + tlv_len; | ||||
| + | ||||
| +		tlv_len += sizeof(u32); | ||||
| +		if (start + tlv_len > endpos) | ||||
| +			return tlv_len; | ||||
| +		WPA_PUT_LE32(pos, rate->rx); | ||||
| +		pos = start + tlv_len; | ||||
| +		tlv_len += sizeof(u32); | ||||
| +		if (start + tlv_len > endpos) | ||||
| +			return tlv_len; | ||||
| +		WPA_PUT_LE32(pos, rate->tx); | ||||
| +		pos = start + tlv_len; | ||||
| +	} | ||||
| + | ||||
| +	return tlv_len; | ||||
| +} | ||||
| + | ||||
| + | ||||
|  static int wpa_ft_rrb_lin(const struct tlv_list *tlvs1, | ||||
|  			  const struct tlv_list *tlvs2, | ||||
|  			  const struct vlan_description *vlan, | ||||
| -			  u8 **plain, size_t *plain_len) | ||||
| +			  u8 **plain, size_t *plain_len, | ||||
| +			  const struct rate_description *rate) | ||||
|  { | ||||
|  	u8 *pos, *endpos; | ||||
|  	size_t tlv_len; | ||||
| @@ -445,6 +491,7 @@ static int wpa_ft_rrb_lin(const struct t | ||||
|  	tlv_len = wpa_ft_tlv_len(tlvs1); | ||||
|  	tlv_len += wpa_ft_tlv_len(tlvs2); | ||||
|  	tlv_len += wpa_ft_vlan_len(vlan); | ||||
| +	tlv_len += wpa_ft_rate_limit_len(rate); | ||||
|   | ||||
|  	*plain_len = tlv_len; | ||||
|  	*plain = os_zalloc(tlv_len); | ||||
| @@ -458,6 +505,7 @@ static int wpa_ft_rrb_lin(const struct t | ||||
|  	pos += wpa_ft_tlv_lin(tlvs1, pos, endpos); | ||||
|  	pos += wpa_ft_tlv_lin(tlvs2, pos, endpos); | ||||
|  	pos += wpa_ft_vlan_lin(vlan, pos, endpos); | ||||
| +	pos += wpa_ft_rate_limit_lin(rate, pos, endpos); | ||||
|   | ||||
|  	/* validity check */ | ||||
|  	if (pos != endpos) { | ||||
| @@ -526,7 +574,8 @@ static int wpa_ft_rrb_build(const u8 *ke | ||||
|  			    const struct tlv_list *tlvs_auth, | ||||
|  			    const struct vlan_description *vlan, | ||||
|  			    const u8 *src_addr, u8 type, | ||||
| -			    u8 **packet, size_t *packet_len) | ||||
| +			    u8 **packet, size_t *packet_len, | ||||
| +			    const struct rate_description *rate) | ||||
|  { | ||||
|  	u8 *plain = NULL, *auth = NULL, *pos, *tmp; | ||||
|  	size_t plain_len = 0, auth_len = 0; | ||||
| @@ -534,10 +583,10 @@ static int wpa_ft_rrb_build(const u8 *ke | ||||
|  	size_t pad_len = 0; | ||||
|   | ||||
|  	*packet = NULL; | ||||
| -	if (wpa_ft_rrb_lin(tlvs_enc0, tlvs_enc1, vlan, &plain, &plain_len) < 0) | ||||
| +	if (wpa_ft_rrb_lin(tlvs_enc0, tlvs_enc1, vlan, &plain, &plain_len, rate) < 0) | ||||
|  		goto out; | ||||
|   | ||||
| -	if (wpa_ft_rrb_lin(tlvs_auth, NULL, NULL, &auth, &auth_len) < 0) | ||||
| +	if (wpa_ft_rrb_lin(tlvs_auth, NULL, NULL, &auth, &auth_len, NULL) < 0) | ||||
|  		goto out; | ||||
|   | ||||
|  	*packet_len = sizeof(u16) + auth_len + plain_len; | ||||
| @@ -700,6 +749,24 @@ static int wpa_ft_get_vlan(struct wpa_au | ||||
|  } | ||||
|   | ||||
|   | ||||
| +static int wpa_ft_get_rate_limit(struct wpa_authenticator *wpa_auth, | ||||
| +				 const u8 *sta_addr, struct rate_description *rate) | ||||
| +{ | ||||
| +	if (!wpa_auth->cb->get_rate_limit) | ||||
| +		return -1; | ||||
| +	return wpa_auth->cb->get_rate_limit(wpa_auth->cb_ctx, sta_addr, rate); | ||||
| +} | ||||
| + | ||||
| + | ||||
| +static int wpa_ft_set_rate_limit(struct wpa_authenticator *wpa_auth, | ||||
| +				 const u8 *sta_addr, struct rate_description *rate) | ||||
| +{ | ||||
| +	if (!wpa_auth->cb->set_rate_limit) | ||||
| +		return -1; | ||||
| +	return wpa_auth->cb->set_rate_limit(wpa_auth->cb_ctx, sta_addr, rate); | ||||
| +} | ||||
| + | ||||
| + | ||||
|  static int | ||||
|  wpa_ft_set_identity(struct wpa_authenticator *wpa_auth, const u8 *sta_addr, | ||||
|  		    const u8 *identity, size_t identity_len) | ||||
| @@ -1025,7 +1092,7 @@ wpa_ft_rrb_seq_req(struct wpa_authentica | ||||
|   | ||||
|  	if (wpa_ft_rrb_build(key, key_len, NULL, NULL, seq_req_auth, NULL, | ||||
|  			     wpa_auth->addr, FT_PACKET_R0KH_R1KH_SEQ_REQ, | ||||
| -			     &packet, &packet_len) < 0) { | ||||
| +			     &packet, &packet_len, NULL) < 0) { | ||||
|  		item = NULL; /* some other seq resp might still accept this */ | ||||
|  		goto err; | ||||
|  	} | ||||
| @@ -1208,6 +1275,7 @@ struct wpa_ft_pmk_r0_sa { | ||||
|  	u8 spa[ETH_ALEN]; | ||||
|  	int pairwise; /* Pairwise cipher suite, WPA_CIPHER_* */ | ||||
|  	struct vlan_description *vlan; | ||||
| +	struct rate_description *rate; | ||||
|  	os_time_t expiration; /* 0 for no expiration */ | ||||
|  	u8 *identity; | ||||
|  	size_t identity_len; | ||||
| @@ -1226,6 +1294,7 @@ struct wpa_ft_pmk_r1_sa { | ||||
|  	u8 spa[ETH_ALEN]; | ||||
|  	int pairwise; /* Pairwise cipher suite, WPA_CIPHER_* */ | ||||
|  	struct vlan_description *vlan; | ||||
| +	struct rate_description *rate; | ||||
|  	u8 *identity; | ||||
|  	size_t identity_len; | ||||
|  	u8 *radius_cui; | ||||
| @@ -1254,6 +1323,7 @@ static void wpa_ft_free_pmk_r0(struct wp | ||||
|   | ||||
|  	os_memset(r0->pmk_r0, 0, PMK_LEN_MAX); | ||||
|  	os_free(r0->vlan); | ||||
| +	os_free(r0->rate); | ||||
|  	os_free(r0->identity); | ||||
|  	os_free(r0->radius_cui); | ||||
|  	os_free(r0); | ||||
| @@ -1307,6 +1377,7 @@ static void wpa_ft_free_pmk_r1(struct wp | ||||
|  	eloop_cancel_timeout(wpa_ft_expire_pmk_r1, r1, NULL); | ||||
|   | ||||
|  	os_memset(r1->pmk_r1, 0, PMK_LEN_MAX); | ||||
| +	os_free(r1->rate); | ||||
|  	os_free(r1->vlan); | ||||
|  	os_free(r1->identity); | ||||
|  	os_free(r1->radius_cui); | ||||
| @@ -1360,7 +1431,8 @@ static int wpa_ft_store_pmk_r0(struct wp | ||||
|  			       const struct vlan_description *vlan, | ||||
|  			       int expires_in, int session_timeout, | ||||
|  			       const u8 *identity, size_t identity_len, | ||||
| -			       const u8 *radius_cui, size_t radius_cui_len) | ||||
| +			       const u8 *radius_cui, size_t radius_cui_len, | ||||
| +			       struct rate_description *rate) | ||||
|  { | ||||
|  	struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache; | ||||
|  	struct wpa_ft_pmk_r0_sa *r0; | ||||
| @@ -1388,6 +1460,14 @@ static int wpa_ft_store_pmk_r0(struct wp | ||||
|  		} | ||||
|  		*r0->vlan = *vlan; | ||||
|  	} | ||||
| +	if (rate) { | ||||
| +		r0->rate = os_zalloc(sizeof(*rate)); | ||||
| +		if (!r0->rate) { | ||||
| +			bin_clear_free(r0, sizeof(*r0)); | ||||
| +			return -1; | ||||
| +		} | ||||
| +		*r0->rate = *rate; | ||||
| +	} | ||||
|  	if (identity) { | ||||
|  		r0->identity = os_malloc(identity_len); | ||||
|  		if (r0->identity) { | ||||
| @@ -1447,7 +1527,8 @@ static int wpa_ft_store_pmk_r1(struct wp | ||||
|  			       const struct vlan_description *vlan, | ||||
|  			       int expires_in, int session_timeout, | ||||
|  			       const u8 *identity, size_t identity_len, | ||||
| -			       const u8 *radius_cui, size_t radius_cui_len) | ||||
| +			       const u8 *radius_cui, size_t radius_cui_len, | ||||
| +			       struct rate_description *rate) | ||||
|  { | ||||
|  	struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache; | ||||
|  	int max_expires_in = wpa_auth->conf.r1_max_key_lifetime; | ||||
| @@ -1477,6 +1558,14 @@ static int wpa_ft_store_pmk_r1(struct wp | ||||
|  		} | ||||
|  		*r1->vlan = *vlan; | ||||
|  	} | ||||
| +	if (rate) { | ||||
| +		r1->rate = os_zalloc(sizeof(*rate)); | ||||
| +		if (!r1->rate) { | ||||
| +			bin_clear_free(r1, sizeof(*r1)); | ||||
| +			return -1; | ||||
| +		} | ||||
| +		*r1->rate = *rate; | ||||
| +	} | ||||
|  	if (identity) { | ||||
|  		r1->identity = os_malloc(identity_len); | ||||
|  		if (r1->identity) { | ||||
| @@ -1513,7 +1602,7 @@ int wpa_ft_fetch_pmk_r1(struct wpa_authe | ||||
|  			struct vlan_description *vlan, | ||||
|  			const u8 **identity, size_t *identity_len, | ||||
|  			const u8 **radius_cui, size_t *radius_cui_len, | ||||
| -			int *session_timeout) | ||||
| +			int *session_timeout, struct rate_description *rate) | ||||
|  { | ||||
|  	struct wpa_ft_pmk_cache *cache = wpa_auth->ft_pmk_cache; | ||||
|  	struct wpa_ft_pmk_r1_sa *r1; | ||||
| @@ -1533,6 +1622,12 @@ int wpa_ft_fetch_pmk_r1(struct wpa_authe | ||||
|  				*vlan = *r1->vlan; | ||||
|  			if (vlan && !r1->vlan) | ||||
|  				os_memset(vlan, 0, sizeof(*vlan)); | ||||
| +			if (rate) { | ||||
| +				if (r1->rate) | ||||
| +					*rate = *r1->rate; | ||||
| +				else | ||||
| +					memset(rate, 0, sizeof(*rate)); | ||||
| +			} | ||||
|  			if (identity && identity_len) { | ||||
|  				*identity = r1->identity; | ||||
|  				*identity_len = r1->identity_len; | ||||
| @@ -2059,7 +2154,7 @@ static int wpa_ft_pull_pmk_r1(struct wpa | ||||
|   | ||||
|  	if (wpa_ft_rrb_build(key, key_len, req_enc, NULL, req_auth, NULL, | ||||
|  			     sm->wpa_auth->addr, FT_PACKET_R0KH_R1KH_PULL, | ||||
| -			     &packet, &packet_len) < 0) | ||||
| +			     &packet, &packet_len, NULL) < 0) | ||||
|  		return -1; | ||||
|   | ||||
|  	ft_pending_req_ies = wpabuf_alloc_copy(ies, ies_len); | ||||
| @@ -2088,6 +2183,7 @@ int wpa_ft_store_pmk_fils(struct wpa_sta | ||||
|  { | ||||
|  	int expires_in = sm->wpa_auth->conf.r0_key_lifetime; | ||||
|  	struct vlan_description vlan; | ||||
| +	struct rate_description rate; | ||||
|  	const u8 *identity, *radius_cui; | ||||
|  	size_t identity_len, radius_cui_len; | ||||
|  	int session_timeout; | ||||
| @@ -2099,6 +2195,7 @@ int wpa_ft_store_pmk_fils(struct wpa_sta | ||||
|  			   MAC2STR(sm->addr)); | ||||
|  		return -1; | ||||
|  	} | ||||
| +	wpa_ft_get_rate_limit(sm->wpa_auth, sm->addr, &rate); | ||||
|   | ||||
|  	identity_len = wpa_ft_get_identity(sm->wpa_auth, sm->addr, &identity); | ||||
|  	radius_cui_len = wpa_ft_get_radius_cui(sm->wpa_auth, sm->addr, | ||||
| @@ -2108,7 +2205,7 @@ int wpa_ft_store_pmk_fils(struct wpa_sta | ||||
|  	return wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, pmk_r0_len, | ||||
|  				   pmk_r0_name, sm->pairwise, &vlan, expires_in, | ||||
|  				   session_timeout, identity, identity_len, | ||||
| -				   radius_cui, radius_cui_len); | ||||
| +				   radius_cui, radius_cui_len, &rate); | ||||
|  } | ||||
|   | ||||
|   | ||||
| @@ -2172,6 +2269,7 @@ void wpa_auth_ft_store_keys(struct wpa_s | ||||
|  	int psk_local = sm->wpa_auth->conf.ft_psk_generate_local; | ||||
|  	int expires_in = sm->wpa_auth->conf.r0_key_lifetime; | ||||
|  	struct vlan_description vlan; | ||||
| +	struct rate_description rate; | ||||
|  	const u8 *identity, *radius_cui; | ||||
|  	size_t identity_len, radius_cui_len; | ||||
|  	int session_timeout; | ||||
| @@ -2185,6 +2283,8 @@ void wpa_auth_ft_store_keys(struct wpa_s | ||||
|  		return; | ||||
|  	} | ||||
|   | ||||
| +	wpa_ft_get_rate_limit(sm->wpa_auth, sm->addr, &rate); | ||||
| + | ||||
|  	identity_len = wpa_ft_get_identity(sm->wpa_auth, sm->addr, &identity); | ||||
|  	radius_cui_len = wpa_ft_get_radius_cui(sm->wpa_auth, sm->addr, | ||||
|  					       &radius_cui); | ||||
| @@ -2195,11 +2295,12 @@ void wpa_auth_ft_store_keys(struct wpa_s | ||||
|  			    pmk_r0_name, | ||||
|  			    sm->pairwise, &vlan, expires_in, | ||||
|  			    session_timeout, identity, identity_len, | ||||
| -			    radius_cui, radius_cui_len); | ||||
| +			    radius_cui, radius_cui_len, &rate); | ||||
|  	wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, key_len, | ||||
|  			    sm->pmk_r1_name, sm->pairwise, &vlan, | ||||
|  			    expires_in, session_timeout, identity, | ||||
| -			    identity_len, radius_cui, radius_cui_len); | ||||
| +			    identity_len, radius_cui, radius_cui_len, | ||||
| +			    &rate); | ||||
|  } | ||||
|   | ||||
|   | ||||
| @@ -3100,7 +3201,8 @@ static int wpa_ft_local_derive_pmk_r1(st | ||||
|  				      const u8 **radius_cui, | ||||
|  				      size_t *radius_cui_len, | ||||
|  				      int *out_session_timeout, | ||||
| -				      size_t *pmk_r1_len) | ||||
| +				      size_t *pmk_r1_len, | ||||
| +				      struct rate_description *rate) | ||||
|  { | ||||
|  	struct wpa_auth_config *conf = &wpa_auth->conf; | ||||
|  	const struct wpa_ft_pmk_r0_sa *r0; | ||||
| @@ -3136,7 +3238,8 @@ static int wpa_ft_local_derive_pmk_r1(st | ||||
|  			    out_pmk_r1_name, | ||||
|  			    sm->pairwise, r0->vlan, expires_in, session_timeout, | ||||
|  			    r0->identity, r0->identity_len, | ||||
| -			    r0->radius_cui, r0->radius_cui_len); | ||||
| +			    r0->radius_cui, r0->radius_cui_len, | ||||
| +			    r0->rate); | ||||
|   | ||||
|  	*out_pairwise = sm->pairwise; | ||||
|  	if (vlan) { | ||||
| @@ -3146,6 +3249,13 @@ static int wpa_ft_local_derive_pmk_r1(st | ||||
|  			os_memset(vlan, 0, sizeof(*vlan)); | ||||
|  	} | ||||
|   | ||||
| +	if (rate) { | ||||
| +		if (r0->rate) | ||||
| +			*rate = *r0->rate; | ||||
| +		else | ||||
| +			os_memset(rate, 0, sizeof(*rate)); | ||||
| +	} | ||||
| + | ||||
|  	if (identity && identity_len) { | ||||
|  		*identity = r0->identity; | ||||
|  		*identity_len = r0->identity_len; | ||||
| @@ -3178,6 +3288,7 @@ static int wpa_ft_process_auth_req(struc | ||||
|  	u8 *pos, *end; | ||||
|  	int pairwise, session_timeout = 0; | ||||
|  	struct vlan_description vlan; | ||||
| +	struct rate_description rate = {}; | ||||
|  	const u8 *identity, *radius_cui; | ||||
|  	size_t identity_len = 0, radius_cui_len = 0; | ||||
|  	size_t pmk_r1_len, kdk_len, len; | ||||
| @@ -3274,7 +3385,7 @@ static int wpa_ft_process_auth_req(struc | ||||
|  					pmk_r1, &pmk_r1_len, &pairwise, &vlan, | ||||
|  					&identity, &identity_len, &radius_cui, | ||||
|  					&radius_cui_len, | ||||
| -					&session_timeout) == 0) { | ||||
| +					&session_timeout, &rate) == 0) { | ||||
|  			wpa_printf(MSG_DEBUG, | ||||
|  				   "FT: Found PMKR1Name (using SHA%zu) from local cache", | ||||
|  				   pmk_r1_len * 8); | ||||
| @@ -3290,7 +3401,7 @@ static int wpa_ft_process_auth_req(struc | ||||
|  				       pmk_r1_name, pmk_r1, &pairwise, | ||||
|  				       &vlan, &identity, &identity_len, | ||||
|  				       &radius_cui, &radius_cui_len, | ||||
| -				       &session_timeout, &pmk_r1_len) == 0) { | ||||
| +				       &session_timeout, &pmk_r1_len, &rate) == 0) { | ||||
|  		wpa_printf(MSG_DEBUG, | ||||
|  			   "FT: Generated PMK-R1 based on local PMK-R0"); | ||||
|  		goto pmk_r1_derived; | ||||
| @@ -3392,6 +3503,7 @@ pmk_r1_derived: | ||||
|  		wpa_printf(MSG_DEBUG, "FT: Failed to configure VLAN"); | ||||
|  		goto out; | ||||
|  	} | ||||
| +	wpa_ft_set_rate_limit(sm->wpa_auth, sm->addr, &rate); | ||||
|  	if (wpa_ft_set_identity(sm->wpa_auth, sm->addr, | ||||
|  				identity, identity_len) < 0 || | ||||
|  	    wpa_ft_set_radius_cui(sm->wpa_auth, sm->addr, | ||||
| @@ -3973,7 +4085,7 @@ static int wpa_ft_rrb_build_r0(const u8 | ||||
|   | ||||
|  	ret = wpa_ft_rrb_build(key, key_len, tlvs, sess_tlv, tlv_auth, | ||||
|  			       pmk_r0->vlan, src_addr, type, | ||||
| -			       packet, packet_len); | ||||
| +			       packet, packet_len, pmk_r0->rate); | ||||
|   | ||||
|  	forced_memzero(pmk_r1, sizeof(pmk_r1)); | ||||
|   | ||||
| @@ -4113,7 +4225,7 @@ static int wpa_ft_rrb_rx_pull(struct wpa | ||||
|  		ret = wpa_ft_rrb_build(key, key_len, resp, NULL, resp_auth, | ||||
|  				       NULL, wpa_auth->addr, | ||||
|  				       FT_PACKET_R0KH_R1KH_RESP, | ||||
| -				       &packet, &packet_len); | ||||
| +				       &packet, &packet_len, NULL); | ||||
|  	} else { | ||||
|  		ret = wpa_ft_rrb_build_r0(key, key_len, resp, r0, f_r1kh_id, | ||||
|  					  f_s1kh_id, resp_auth, wpa_auth->addr, | ||||
| @@ -4165,11 +4277,15 @@ static int wpa_ft_rrb_rx_r1(struct wpa_a | ||||
|  	size_t f_expires_in_len; | ||||
|  	size_t f_identity_len, f_radius_cui_len; | ||||
|  	size_t f_session_timeout_len; | ||||
| +	size_t f_rate_len; | ||||
| +	const u8 *f_rate; | ||||
|  	int pairwise; | ||||
|  	int ret = -1; | ||||
|  	int expires_in; | ||||
|  	int session_timeout; | ||||
|  	struct vlan_description vlan; | ||||
| +	struct rate_description rate; | ||||
| +	int has_rate = 0; | ||||
|  	size_t pmk_r1_len; | ||||
|   | ||||
|  	RRB_GET_AUTH(FT_RRB_R0KH_ID, r0kh_id, msgtype, -1); | ||||
| @@ -4279,6 +4395,13 @@ static int wpa_ft_rrb_rx_r1(struct wpa_a | ||||
|  	wpa_printf(MSG_DEBUG, "FT: vlan %d%s", | ||||
|  		   le_to_host16(vlan.untagged), vlan.tagged[0] ? "+" : ""); | ||||
|   | ||||
| +	RRB_GET_OPTIONAL(FT_RRB_RATE_LIMIT, rate, msgtype, 2 * sizeof(le32)); | ||||
| +	if (f_rate) { | ||||
| +		memcpy(&rate, f_rate, sizeof(rate)); | ||||
| +		rate.rx = le_to_host32(rate.rx); | ||||
| +		rate.tx = le_to_host32(rate.tx); | ||||
| +		has_rate = 1; | ||||
| +	}; | ||||
|  	RRB_GET_OPTIONAL(FT_RRB_IDENTITY, identity, msgtype, -1); | ||||
|  	if (f_identity) | ||||
|  		wpa_hexdump_ascii(MSG_DEBUG, "FT: Identity", f_identity, | ||||
| @@ -4301,7 +4424,7 @@ static int wpa_ft_rrb_rx_r1(struct wpa_a | ||||
|  				f_pmk_r1_name, | ||||
|  				pairwise, &vlan, expires_in, session_timeout, | ||||
|  				f_identity, f_identity_len, f_radius_cui, | ||||
| -				f_radius_cui_len) < 0) | ||||
| +				f_radius_cui_len, has_rate ? &rate : 0) < 0) | ||||
|  		goto out; | ||||
|   | ||||
|  	ret = 0; | ||||
| @@ -4614,7 +4737,7 @@ static int wpa_ft_rrb_rx_seq_req(struct | ||||
|   | ||||
|  	if (wpa_ft_rrb_build(key, key_len, NULL, NULL, seq_resp_auth, NULL, | ||||
|  			     wpa_auth->addr, FT_PACKET_R0KH_R1KH_SEQ_RESP, | ||||
| -			     &packet, &packet_len) < 0) | ||||
| +			     &packet, &packet_len, NULL) < 0) | ||||
|  		goto out; | ||||
|   | ||||
|  	wpa_ft_rrb_oui_send(wpa_auth, src_addr, | ||||
							
								
								
									
										10
									
								
								feeds/hostapd/hostapd/patches/999-ft-anonce.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								feeds/hostapd/hostapd/patches/999-ft-anonce.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| --- a/src/ap/wpa_auth_i.h | ||||
| +++ b/src/ap/wpa_auth_i.h | ||||
| @@ -54,6 +54,7 @@ struct wpa_state_machine { | ||||
|  	bool MICVerified; | ||||
|  	bool GUpdateStationKeys; | ||||
|  	u8 ANonce[WPA_NONCE_LEN]; | ||||
| +	struct os_reltime ANonce_time; | ||||
|  	u8 SNonce[WPA_NONCE_LEN]; | ||||
|  	u8 alt_SNonce[WPA_NONCE_LEN]; | ||||
|  	u8 alt_replay_counter[WPA_REPLAY_COUNTER_LEN]; | ||||
							
								
								
									
										147
									
								
								feeds/hostapd/hostapd/patches/999-re-assoc-event.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								feeds/hostapd/hostapd/patches/999-re-assoc-event.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| --- a/src/ap/ieee802_11.c | ||||
| +++ b/src/ap/ieee802_11.c | ||||
| @@ -522,6 +522,7 @@ static void handle_auth_ft_finish(void * | ||||
|   | ||||
|  	hostapd_logger(hapd, dst, HOSTAPD_MODULE_IEEE80211, | ||||
|  		       HOSTAPD_LEVEL_DEBUG, "authentication OK (FT)"); | ||||
| +	hostapd_ubus_notify(hapd, "ft-finish", sta->addr); | ||||
|  	sta->flags |= WLAN_STA_AUTH; | ||||
|  	mlme_authenticate_indication(hapd, sta); | ||||
|  } | ||||
| @@ -5273,6 +5274,8 @@ static void handle_assoc(struct hostapd_ | ||||
|  	} | ||||
|   | ||||
|  	sta = ap_get_sta(hapd, mgmt->sa); | ||||
| +	if (sta && reassoc) | ||||
| +		memcpy(sta->origin_ap, mgmt->u.reassoc_req.current_ap, 6); | ||||
|  #ifdef CONFIG_IEEE80211R_AP | ||||
|  	if (sta && sta->auth_alg == WLAN_AUTH_FT && | ||||
|  	    (sta->flags & WLAN_STA_AUTH) == 0) { | ||||
| @@ -5426,6 +5429,7 @@ static void handle_assoc(struct hostapd_ | ||||
|  		.type = HOSTAPD_UBUS_ASSOC_REQ, | ||||
|  		.mgmt_frame = mgmt, | ||||
|  		.ssi_signal = rssi, | ||||
| +		.reassoc = reassoc, | ||||
|  	}; | ||||
|   | ||||
|  	/* followed by SSID and Supported rates; and HT capabilities if 802.11n | ||||
| @@ -6496,7 +6500,7 @@ static void handle_assoc_cb(struct hosta | ||||
|  		 * Open, static WEP, FT protocol, or FILS; no separate | ||||
|  		 * authorization step. | ||||
|  		 */ | ||||
| -		ap_sta_set_authorized(hapd, sta, 1); | ||||
| +		_ap_sta_set_authorized(hapd, sta, 1, reassoc); | ||||
|  	} | ||||
|   | ||||
|  	if (reassoc) | ||||
| --- a/src/ap/ubus.c | ||||
| +++ b/src/ap/ubus.c | ||||
| @@ -1870,6 +1870,8 @@ int hostapd_ubus_handle_event(struct hos | ||||
|  	if (req->ssi_signal) | ||||
|  		blobmsg_add_u32(&b, "signal", req->ssi_signal); | ||||
|  	blobmsg_add_u32(&b, "freq", hapd->iface->freq); | ||||
| +	if (req->reassoc && req->mgmt_frame) | ||||
| +		blobmsg_add_macaddr(&b, "origin", req->mgmt_frame->u.reassoc_req.current_ap); | ||||
|   | ||||
|  	if (req->elems) { | ||||
|  		if(req->elems->ht_capabilities) | ||||
| @@ -1940,6 +1942,7 @@ void hostapd_ubus_notify(struct hostapd_ | ||||
|  	blob_buf_init(&b, 0); | ||||
|  	blobmsg_add_macaddr(&b, "address", addr); | ||||
|  	blobmsg_add_string(&b, "ifname", hapd->conf->iface); | ||||
| +	blobmsg_printf(&b, "target", MACSTR, MAC2STR(hapd->conf->bssid)); | ||||
|   | ||||
|  	ubus_notify(ctx, &hapd->ubus.obj, type, b.head, -1); | ||||
|  } | ||||
| @@ -1958,7 +1961,7 @@ void hostapd_ubus_notify_csa(struct host | ||||
|  } | ||||
|   | ||||
|   | ||||
| -void hostapd_ubus_notify_authorized(struct hostapd_data *hapd, struct sta_info *sta) | ||||
| +void hostapd_ubus_notify_authorized(struct hostapd_data *hapd, struct sta_info *sta, int reassoc) | ||||
|  { | ||||
|  	if (!hapd->ubus.obj.has_subscribers) | ||||
|  		return; | ||||
| @@ -1975,6 +1978,9 @@ void hostapd_ubus_notify_authorized(stru | ||||
|  		blobmsg_add_u32(&b, "", sta->bandwidth[1]); | ||||
|  		blobmsg_close_array(&b, r); | ||||
|  	} | ||||
| +	if (reassoc) | ||||
| +		blobmsg_add_macaddr(&b, "origin", sta->origin_ap); | ||||
| +	blobmsg_printf(&b, "target", MACSTR, MAC2STR(hapd->conf->bssid)); | ||||
|   | ||||
|  	ubus_notify(ctx, &hapd->ubus.obj, "sta-authorized", b.head, -1); | ||||
|  } | ||||
| --- a/src/ap/ubus.h | ||||
| +++ b/src/ap/ubus.h | ||||
| @@ -22,6 +22,7 @@ struct hostapd_ubus_request { | ||||
|  	const struct ieee802_11_elems *elems; | ||||
|  	int ssi_signal; /* dBm */ | ||||
|  	const u8 *addr; | ||||
| +	int reassoc; | ||||
|  }; | ||||
|   | ||||
|  struct hostapd_iface; | ||||
| @@ -49,7 +50,7 @@ void hostapd_ubus_remove_vlan(struct hos | ||||
|   | ||||
|  int hostapd_ubus_handle_event(struct hostapd_data *hapd, struct hostapd_ubus_request *req); | ||||
|  void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *mac); | ||||
| -void hostapd_ubus_notify_authorized(struct hostapd_data *hapd, struct sta_info *sta); | ||||
| +void hostapd_ubus_notify_authorized(struct hostapd_data *hapd, struct sta_info *sta, int reassoc); | ||||
|  void hostapd_ubus_notify_beacon_report(struct hostapd_data *hapd, | ||||
|  				       const u8 *addr, u8 token, u8 rep_mode, | ||||
|  				       struct rrm_measurement_beacon_report *rep, | ||||
| --- a/src/ap/sta_info.c | ||||
| +++ b/src/ap/sta_info.c | ||||
| @@ -1297,8 +1297,8 @@ const u8 * ap_sta_wpa_get_dpp_pkhash(str | ||||
|  } | ||||
|   | ||||
|   | ||||
| -void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta, | ||||
| -			   int authorized) | ||||
| +void _ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta, | ||||
| +			    int authorized, int reassoc) | ||||
|  { | ||||
|  	const u8 *dev_addr = NULL; | ||||
|  	char buf[100]; | ||||
| @@ -1404,7 +1404,7 @@ void ap_sta_set_authorized(struct hostap | ||||
|  					 dpp_pkhash, SHA256_MAC_LEN); | ||||
|  		} | ||||
|   | ||||
| -		hostapd_ubus_notify_authorized(hapd, sta); | ||||
| +		hostapd_ubus_notify_authorized(hapd, sta, reassoc); | ||||
|  		wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s%s%s", | ||||
|  			buf, ip_addr, keyid_buf, dpp_pkhash_buf, alg_buf); | ||||
|   | ||||
| @@ -1434,6 +1434,11 @@ void ap_sta_set_authorized(struct hostap | ||||
|  	} | ||||
|  #endif /* CONFIG_FST */ | ||||
|  } | ||||
| +void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta, | ||||
| +			   int authorized) | ||||
| +{ | ||||
| +	_ap_sta_set_authorized(hapd, sta, authorized, 0); | ||||
| +} | ||||
|   | ||||
|   | ||||
|  void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta, | ||||
| --- a/src/ap/sta_info.h | ||||
| +++ b/src/ap/sta_info.h | ||||
| @@ -102,6 +102,7 @@ struct sta_info { | ||||
|  	struct sta_info *next; /* next entry in sta list */ | ||||
|  	struct sta_info *hnext; /* next entry in hash table list */ | ||||
|  	u8 addr[6]; | ||||
| +	u8 origin_ap[6]; | ||||
|  	be32 ipaddr; | ||||
|  	struct dl_list ip6addr; /* list head for struct ip6addr */ | ||||
|  	u16 aid; /* STA's unique AID (1 .. 2007) or 0 if not yet assigned */ | ||||
| @@ -398,6 +399,9 @@ const u8 * ap_sta_wpa_get_dpp_pkhash(str | ||||
|  void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta, | ||||
|  		       const u8 *addr, u16 reason); | ||||
|   | ||||
| +void _ap_sta_set_authorized(struct hostapd_data *hapd, | ||||
| +			    struct sta_info *sta, int authorized, | ||||
| +			    int reassoc); | ||||
|  void ap_sta_set_authorized(struct hostapd_data *hapd, | ||||
|  			   struct sta_info *sta, int authorized); | ||||
|  static inline int ap_sta_is_authorized(struct sta_info *sta) | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user