diff options
Diffstat (limited to 'src/ap/ap_config.c')
| -rw-r--r-- | src/ap/ap_config.c | 147 | 
1 files changed, 137 insertions, 10 deletions
| diff --git a/src/ap/ap_config.c b/src/ap/ap_config.c index e640e9984b70e..90348e1ddb971 100644 --- a/src/ap/ap_config.c +++ b/src/ap/ap_config.c @@ -13,12 +13,14 @@  #include "crypto/tls.h"  #include "radius/radius_client.h"  #include "common/ieee802_11_defs.h" +#include "common/ieee802_1x_defs.h"  #include "common/eapol_common.h"  #include "common/dhcp.h"  #include "eap_common/eap_wsc_common.h"  #include "eap_server/eap.h"  #include "wpa_auth.h"  #include "sta_info.h" +#include "airtime_policy.h"  #include "ap_config.h" @@ -76,6 +78,7 @@ void hostapd_config_defaults_bss(struct hostapd_bss_config *bss)  	bss->radius_server_auth_port = 1812;  	bss->eap_sim_db_timeout = 1; +	bss->eap_sim_id = 3;  	bss->ap_max_inactivity = AP_MAX_INACTIVITY;  	bss->eapol_version = EAPOL_VERSION; @@ -138,6 +141,11 @@ void hostapd_config_defaults_bss(struct hostapd_bss_config *bss)  	bss->hs20_release = (HS20_VERSION >> 4) + 1;  #endif /* CONFIG_HS20 */ +#ifdef CONFIG_MACSEC +	bss->mka_priority = DEFAULT_PRIO_NOT_KEY_SERVER; +	bss->macsec_port = 1; +#endif /* CONFIG_MACSEC */ +  	/* Default to strict CRL checking. */  	bss->check_crl_strict = 1;  } @@ -236,6 +244,13 @@ struct hostapd_config * hostapd_config_defaults(void)  	conf->acs_num_scans = 5;  #endif /* CONFIG_ACS */ +#ifdef CONFIG_IEEE80211AX +	conf->he_op.he_rts_threshold = HE_OPERATION_RTS_THRESHOLD_MASK >> +		HE_OPERATION_RTS_THRESHOLD_OFFSET; +	/* Set default basic MCS/NSS set to single stream MCS 0-7 */ +	conf->he_op.he_basic_mcs_nss_set = 0xfffc; +#endif /* CONFIG_IEEE80211AX */ +  	/* The third octet of the country string uses an ASCII space character  	 * by default to indicate that the regulations encompass all  	 * environments for the current frequency band in the country. */ @@ -244,6 +259,10 @@ struct hostapd_config * hostapd_config_defaults(void)  	conf->rssi_reject_assoc_rssi = 0;  	conf->rssi_reject_assoc_timeout = 30; +#ifdef CONFIG_AIRTIME_POLICY +	conf->airtime_update_interval = AIRTIME_DEFAULT_UPDATE_INTERVAL; +#endif /* CONFIG_AIRTIME_POLICY */ +  	return conf;  } @@ -458,7 +477,76 @@ hostapd_config_get_radius_attr(struct hostapd_radius_attr *attr, u8 type)  } -static void hostapd_config_free_radius_attr(struct hostapd_radius_attr *attr) +struct hostapd_radius_attr * hostapd_parse_radius_attr(const char *value) +{ +	const char *pos; +	char syntax; +	struct hostapd_radius_attr *attr; +	size_t len; + +	attr = os_zalloc(sizeof(*attr)); +	if (!attr) +		return NULL; + +	attr->type = atoi(value); + +	pos = os_strchr(value, ':'); +	if (!pos) { +		attr->val = wpabuf_alloc(1); +		if (!attr->val) { +			os_free(attr); +			return NULL; +		} +		wpabuf_put_u8(attr->val, 0); +		return attr; +	} + +	pos++; +	if (pos[0] == '\0' || pos[1] != ':') { +		os_free(attr); +		return NULL; +	} +	syntax = *pos++; +	pos++; + +	switch (syntax) { +	case 's': +		attr->val = wpabuf_alloc_copy(pos, os_strlen(pos)); +		break; +	case 'x': +		len = os_strlen(pos); +		if (len & 1) +			break; +		len /= 2; +		attr->val = wpabuf_alloc(len); +		if (!attr->val) +			break; +		if (hexstr2bin(pos, wpabuf_put(attr->val, len), len) < 0) { +			wpabuf_free(attr->val); +			os_free(attr); +			return NULL; +		} +		break; +	case 'd': +		attr->val = wpabuf_alloc(4); +		if (attr->val) +			wpabuf_put_be32(attr->val, atoi(pos)); +		break; +	default: +		os_free(attr); +		return NULL; +	} + +	if (!attr->val) { +		os_free(attr); +		return NULL; +	} + +	return attr; +} + + +void hostapd_config_free_radius_attr(struct hostapd_radius_attr *attr)  {  	struct hostapd_radius_attr *prev; @@ -559,8 +647,26 @@ static void hostapd_config_free_sae_passwords(struct hostapd_bss_config *conf)  } +#ifdef CONFIG_DPP2 +static void hostapd_dpp_controller_conf_free(struct dpp_controller_conf *conf) +{ +	struct dpp_controller_conf *prev; + +	while (conf) { +		prev = conf; +		conf = conf->next; +		os_free(prev); +	} +} +#endif /* CONFIG_DPP2 */ + +  void hostapd_config_free_bss(struct hostapd_bss_config *conf)  { +#if defined(CONFIG_WPS) || defined(CONFIG_HS20) +	size_t i; +#endif +  	if (conf == NULL)  		return; @@ -589,12 +695,16 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)  	}  	hostapd_config_free_radius_attr(conf->radius_auth_req_attr);  	hostapd_config_free_radius_attr(conf->radius_acct_req_attr); +	os_free(conf->radius_req_attr_sqlite);  	os_free(conf->rsn_preauth_interfaces);  	os_free(conf->ctrl_interface);  	os_free(conf->ca_cert);  	os_free(conf->server_cert); +	os_free(conf->server_cert2);  	os_free(conf->private_key); +	os_free(conf->private_key2);  	os_free(conf->private_key_passwd); +	os_free(conf->private_key_passwd2);  	os_free(conf->check_cert_subject);  	os_free(conf->ocsp_stapling_response);  	os_free(conf->ocsp_stapling_response_multi); @@ -653,12 +763,8 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)  	os_free(conf->model_description);  	os_free(conf->model_url);  	os_free(conf->upc); -	{ -		unsigned int i; - -		for (i = 0; i < MAX_WPS_VENDOR_EXTENSIONS; i++) -			wpabuf_free(conf->wps_vendor_ext[i]); -	} +	for (i = 0; i < MAX_WPS_VENDOR_EXTENSIONS; i++) +		wpabuf_free(conf->wps_vendor_ext[i]);  	wpabuf_free(conf->wps_nfc_dh_pubkey);  	wpabuf_free(conf->wps_nfc_dh_privkey);  	wpabuf_free(conf->wps_nfc_dev_pw); @@ -684,7 +790,6 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)  	os_free(conf->hs20_operating_class);  	os_free(conf->hs20_icons);  	if (conf->hs20_osu_providers) { -		size_t i;  		for (i = 0; i < conf->hs20_osu_providers_count; i++) {  			struct hs20_osu_provider *p;  			size_t j; @@ -702,8 +807,6 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)  		os_free(conf->hs20_osu_providers);  	}  	if (conf->hs20_operator_icon) { -		size_t i; -  		for (i = 0; i < conf->hs20_operator_icon_count; i++)  			os_free(conf->hs20_operator_icon[i]);  		os_free(conf->hs20_operator_icon); @@ -740,10 +843,27 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)  	os_free(conf->dpp_connector);  	wpabuf_free(conf->dpp_netaccesskey);  	wpabuf_free(conf->dpp_csign); +#ifdef CONFIG_DPP2 +	hostapd_dpp_controller_conf_free(conf->dpp_controller); +#endif /* CONFIG_DPP2 */  #endif /* CONFIG_DPP */  	hostapd_config_free_sae_passwords(conf); +#ifdef CONFIG_AIRTIME_POLICY +	{ +		struct airtime_sta_weight *wt, *wt_prev; + +		wt = conf->airtime_weight_list; +		conf->airtime_weight_list = NULL; +		while (wt) { +			wt_prev = wt; +			wt = wt->next; +			os_free(wt_prev); +		} +	} +#endif /* CONFIG_AIRTIME_POLICY */ +  	os_free(conf);  } @@ -1140,6 +1260,13 @@ int hostapd_config_check(struct hostapd_config *conf, int full_config)  		return -1;  	} +#ifdef CONFIG_AIRTIME_POLICY +	if (full_config && conf->airtime_mode > AIRTIME_MODE_STATIC && +	    !conf->airtime_update_interval) { +		wpa_printf(MSG_ERROR, "Airtime update interval cannot be zero"); +		return -1; +	} +#endif /* CONFIG_AIRTIME_POLICY */  	for (i = 0; i < NUM_TX_QUEUES; i++) {  		if (hostapd_config_check_cw(conf, i))  			return -1; | 
