diff --git a/src/ap/acs.c b/src/ap/acs.c
index 3b45075..6d4c041 100644
--- a/src/ap/acs.c
+++ b/src/ap/acs.c
@@ -13,7 +13,6 @@
 #include "utils/common.h"
 #include "utils/list.h"
 #include "common/ieee802_11_defs.h"
-#include "common/hw_features_common.h"
 #include "common/wpa_ctrl.h"
 #include "drivers/driver.h"
 #include "hostapd.h"
@@ -363,7 +362,7 @@
 }
 
 
-static int acs_usable_ht40_chan(const struct hostapd_channel_data *chan)
+static int acs_usable_ht40_chan(struct hostapd_channel_data *chan)
 {
 	const int allowed[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149,
 				157, 184, 192 };
@@ -377,7 +376,7 @@
 }
 
 
-static int acs_usable_vht80_chan(const struct hostapd_channel_data *chan)
+static int acs_usable_vht80_chan(struct hostapd_channel_data *chan)
 {
 	const int allowed[] = { 36, 52, 100, 116, 132, 149 };
 	unsigned int i;
@@ -390,19 +389,6 @@
 }
 
 
-static int acs_usable_vht160_chan(const struct hostapd_channel_data *chan)
-{
-	const int allowed[] = { 36, 100 };
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(allowed); i++)
-		if (chan->chan == allowed[i])
-			return 1;
-
-	return 0;
-}
-
-
 static int acs_survey_is_sufficient(struct freq_survey *survey)
 {
 	if (!(survey->filled & SURVEY_HAS_NF)) {
@@ -579,7 +565,6 @@
 	long double factor, ideal_factor = 0;
 	int i, j;
 	int n_chans = 1;
-	u32 bw;
 	unsigned int k;
 
 	/* TODO: HT40- support */
@@ -594,23 +579,16 @@
 	    iface->conf->secondary_channel)
 		n_chans = 2;
 
-	if (iface->conf->ieee80211ac) {
-		switch (iface->conf->vht_oper_chwidth) {
-		case VHT_CHANWIDTH_80MHZ:
-			n_chans = 4;
-			break;
-		case VHT_CHANWIDTH_160MHZ:
-			n_chans = 8;
-			break;
-		}
-	}
+	if (iface->conf->ieee80211ac &&
+	    iface->conf->vht_oper_chwidth == 1)
+		n_chans = 4;
 
-	bw = num_chan_to_bw(n_chans);
+	/* TODO: VHT80+80, VHT160. Update acs_adjust_vht_center_freq() too. */
 
-	/* TODO: VHT80+80. Update acs_adjust_vht_center_freq() too. */
-
-	wpa_printf(MSG_DEBUG,
-		   "ACS: Survey analysis for selected bandwidth %d MHz", bw);
+	wpa_printf(MSG_DEBUG, "ACS: Survey analysis for selected bandwidth %d MHz",
+		   n_chans == 1 ? 20 :
+		   n_chans == 2 ? 40 :
+		   80);
 
 	for (i = 0; i < iface->current_mode->num_channels; i++) {
 		double total_weight;
@@ -618,23 +596,12 @@
 
 		chan = &iface->current_mode->channels[i];
 
-		/* Since in the current ACS implementation the first channel is
-		 * always a primary channel, skip channels not available as
-		 * primary until more sophisticated channel selection is
-		 * implemented. */
-		if (!chan_pri_allowed(chan))
+		if (chan->flag & HOSTAPD_CHAN_DISABLED)
 			continue;
 
 		if (!is_in_chanlist(iface, chan))
 			continue;
 
-		if (!chan_bw_allowed(chan, bw, 1, 1)) {
-			wpa_printf(MSG_DEBUG,
-				   "ACS: Channel %d: BW %u is not supported",
-				   chan->chan, bw);
-			continue;
-		}
-
 		/* HT40 on 5 GHz has a limited set of primary channels as per
 		 * 11n Annex J */
 		if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
@@ -647,24 +614,12 @@
 		}
 
 		if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
-		    iface->conf->ieee80211ac) {
-			if (iface->conf->vht_oper_chwidth ==
-			    VHT_CHANWIDTH_80MHZ &&
-			    !acs_usable_vht80_chan(chan)) {
-				wpa_printf(MSG_DEBUG,
-					   "ACS: Channel %d: not allowed as primary channel for VHT80",
-					   chan->chan);
-				continue;
-			}
-
-			if (iface->conf->vht_oper_chwidth ==
-			    VHT_CHANWIDTH_160MHZ &&
-			    !acs_usable_vht160_chan(chan)) {
-				wpa_printf(MSG_DEBUG,
-					   "ACS: Channel %d: not allowed as primary channel for VHT160",
-					   chan->chan);
-				continue;
-			}
+		    iface->conf->ieee80211ac &&
+		    iface->conf->vht_oper_chwidth == 1 &&
+		    !acs_usable_vht80_chan(chan)) {
+			wpa_printf(MSG_DEBUG, "ACS: Channel %d: not allowed as primary channel for VHT80",
+				   chan->chan);
+			continue;
 		}
 
 		factor = 0;
@@ -677,13 +632,6 @@
 			if (!adj_chan)
 				break;
 
-			if (!chan_bw_allowed(adj_chan, bw, 1, 0)) {
-				wpa_printf(MSG_DEBUG,
-					   "ACS: PRI Channel %d: secondary channel %d BW %u is not supported",
-					   chan->chan, adj_chan->chan, bw);
-				break;
-			}
-
 			if (acs_usable_chan(adj_chan)) {
 				factor += adj_chan->interference_factor;
 				total_weight += 1;
@@ -796,14 +744,10 @@
 	case VHT_CHANWIDTH_80MHZ:
 		offset = 6;
 		break;
-	case VHT_CHANWIDTH_160MHZ:
-		offset = 14;
-		break;
 	default:
 		/* TODO: How can this be calculated? Adjust
 		 * acs_find_ideal_chan() */
-		wpa_printf(MSG_INFO,
-			   "ACS: Only VHT20/40/80/160 is supported now");
+		wpa_printf(MSG_INFO, "ACS: Only VHT20/40/80 is supported now");
 		return;
 	}
 
diff --git a/src/ap/ap_config.c b/src/ap/ap_config.c
index 9611dc0..f9b6f29 100644
--- a/src/ap/ap_config.c
+++ b/src/ap/ap_config.c
@@ -131,15 +131,6 @@
 	 * This can be enabled by default once the implementation has been fully
 	 * completed and tested with other implementations. */
 	bss->tls_flags = TLS_CONN_DISABLE_TLSv1_3;
-
-	bss->send_probe_response = 1;
-
-#ifdef CONFIG_HS20
-	bss->hs20_release = (HS20_VERSION >> 4) + 1;
-#endif /* CONFIG_HS20 */
-
-	/* Default to strict CRL checking. */
-	bss->check_crl_strict = 1;
 }
 
 
@@ -202,6 +193,7 @@
 	conf->beacon_int = 100;
 	conf->rts_threshold = -1; /* use driver default: 2347 */
 	conf->fragm_threshold = -1; /* user driver default: 2346 */
+	conf->send_probe_response = 1;
 	/* Set to invalid value means do not add Power Constraint IE */
 	conf->local_pwr_constraint = -1;
 
@@ -241,9 +233,6 @@
 	 * environments for the current frequency band in the country. */
 	conf->country[2] = ' ';
 
-	conf->rssi_reject_assoc_rssi = 0;
-	conf->rssi_reject_assoc_timeout = 30;
-
 	return conf;
 }
 
@@ -259,12 +248,6 @@
 {
 	FILE *f;
 	char buf[128], *pos;
-	const char *keyid;
-	char *context;
-	char *context2;
-	char *token;
-	char *name;
-	char *value;
 	int line = 0, ret = 0, len, ok;
 	u8 addr[ETH_ALEN];
 	struct hostapd_wpa_psk *psk;
@@ -294,35 +277,9 @@
 		if (buf[0] == '\0')
 			continue;
 
-		context = NULL;
-		keyid = NULL;
-		while ((token = str_token(buf, " ", &context))) {
-			if (!os_strchr(token, '='))
-				break;
-			context2 = NULL;
-			name = str_token(token, "=", &context2);
-			value = str_token(token, "", &context2);
-			if (!value)
-				value = "";
-			if (!os_strcmp(name, "keyid")) {
-				keyid = value;
-			} else {
-				wpa_printf(MSG_ERROR,
-					   "Unrecognized '%s=%s' on line %d in '%s'",
-					   name, value, line, fname);
-				ret = -1;
-				break;
-			}
-		}
-
-		if (ret == -1)
-			break;
-
-		if (!token)
-			token = "";
-		if (hwaddr_aton(token, addr)) {
+		if (hwaddr_aton(buf, addr)) {
 			wpa_printf(MSG_ERROR, "Invalid MAC address '%s' on "
-				   "line %d in '%s'", token, line, fname);
+				   "line %d in '%s'", buf, line, fname);
 			ret = -1;
 			break;
 		}
@@ -338,14 +295,15 @@
 		else
 			os_memcpy(psk->addr, addr, ETH_ALEN);
 
-		pos = str_token(buf, "", &context);
-		if (!pos) {
+		pos = buf + 17;
+		if (*pos == '\0') {
 			wpa_printf(MSG_ERROR, "No PSK on line %d in '%s'",
 				   line, fname);
 			os_free(psk);
 			ret = -1;
 			break;
 		}
+		pos++;
 
 		ok = 0;
 		len = os_strlen(pos);
@@ -364,18 +322,6 @@
 			break;
 		}
 
-		if (keyid) {
-			len = os_strlcpy(psk->keyid, keyid, sizeof(psk->keyid));
-			if ((size_t) len >= sizeof(psk->keyid)) {
-				wpa_printf(MSG_ERROR,
-					   "PSK keyid too long on line %d in '%s'",
-					   line, fname);
-				os_free(psk);
-				ret = -1;
-				break;
-			}
-		}
-
 		psk->next = ssid->wpa_psk;
 		ssid->wpa_psk = psk;
 	}
@@ -592,7 +538,6 @@
 	os_free(conf->ocsp_stapling_response_multi);
 	os_free(conf->dh_file);
 	os_free(conf->openssl_ciphers);
-	os_free(conf->openssl_ecdh_curves);
 	os_free(conf->pac_opaque_encr_key);
 	os_free(conf->eap_fast_a_id);
 	os_free(conf->eap_fast_a_id_info);
@@ -699,7 +644,6 @@
 		os_free(conf->hs20_operator_icon);
 	}
 	os_free(conf->subscr_remediation_url);
-	os_free(conf->hs20_sim_provisioning_url);
 	os_free(conf->t_c_filename);
 	os_free(conf->t_c_server_url);
 #endif /* CONFIG_HS20 */
@@ -1059,15 +1003,6 @@
 	}
 #endif /* CONFIG_MBO */
 
-#ifdef CONFIG_OCV
-	if (full_config && bss->ieee80211w == NO_MGMT_FRAME_PROTECTION &&
-	    bss->ocv) {
-		wpa_printf(MSG_ERROR,
-			   "OCV: PMF needs to be enabled whenever using OCV");
-		return -1;
-	}
-#endif /* CONFIG_OCV */
-
 	return 0;
 }
 
@@ -1211,26 +1146,3 @@
 		}
 	}
 }
-
-
-int hostapd_sae_pw_id_in_use(struct hostapd_bss_config *conf)
-{
-	int with_id = 0, without_id = 0;
-	struct sae_password_entry *pw;
-
-	if (conf->ssid.wpa_passphrase)
-		without_id = 1;
-
-	for (pw = conf->sae_passwords; pw; pw = pw->next) {
-		if (pw->identifier)
-			with_id = 1;
-		else
-			without_id = 1;
-		if (with_id && without_id)
-			break;
-	}
-
-	if (with_id && !without_id)
-		return 2;
-	return with_id;
-}
diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
index 6963df4..778366d 100644
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -42,7 +42,6 @@
 #define MESH_CONF_SEC_AMPE BIT(2)
 	unsigned int security;
 	enum mfp_options ieee80211w;
-	int ocv;
 	unsigned int pairwise_cipher;
 	unsigned int group_cipher;
 	unsigned int mgmt_group_cipher;
@@ -123,7 +122,6 @@
 	int vlan_id; /* VLAN ID or -1 (VLAN_ID_WILDCARD) for wildcard entry */
 	struct vlan_description vlan_desc;
 	char ifname[IFNAMSIZ + 1];
-	char bridge[IFNAMSIZ + 1];
 	int configured;
 	int dynamic_vlan;
 #ifdef CONFIG_FULL_DYNAMIC_VLAN
@@ -134,7 +132,6 @@
 };
 
 #define PMK_LEN 32
-#define KEYID_LEN 32
 #define MIN_PASSPHRASE_LEN 8
 #define MAX_PASSPHRASE_LEN 63
 struct hostapd_sta_wpa_psk_short {
@@ -148,7 +145,6 @@
 struct hostapd_wpa_psk {
 	struct hostapd_wpa_psk *next;
 	int group;
-	char keyid[KEYID_LEN];
 	u8 psk[PMK_LEN];
 	u8 addr[ETH_ALEN];
 	u8 p2p_dev_addr[ETH_ALEN];
@@ -339,9 +335,6 @@
 	/* dot11AssociationSAQueryRetryTimeout (in TUs) */
 	int assoc_sa_query_retry_timeout;
 #endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_OCV
-	int ocv; /* Operating Channel Validation */
-#endif /* CONFIG_OCV */
 	enum {
 		PSK_RADIUS_IGNORED = 0,
 		PSK_RADIUS_ACCEPTED = 1,
@@ -391,15 +384,12 @@
 	char *private_key;
 	char *private_key_passwd;
 	int check_crl;
-	int check_crl_strict;
-	unsigned int crl_reload_interval;
 	unsigned int tls_session_lifetime;
 	unsigned int tls_flags;
 	char *ocsp_stapling_response;
 	char *ocsp_stapling_response_multi;
 	char *dh_file;
 	char *openssl_ciphers;
-	char *openssl_ecdh_curves;
 	u8 *pac_opaque_encr_key;
 	u8 *eap_fast_a_id;
 	size_t eap_fast_a_id_len;
@@ -567,7 +557,6 @@
 	int na_mcast_to_ucast;
 #ifdef CONFIG_HS20
 	int hs20;
-	int hs20_release;
 	int disable_dgaf;
 	u16 anqp_domain_id;
 	unsigned int hs20_oper_friendly_name_count;
@@ -607,7 +596,6 @@
 	unsigned int hs20_deauth_req_timeout;
 	char *subscr_remediation_url;
 	u8 subscr_remediation_method;
-	char *hs20_sim_provisioning_url;
 	char *t_c_filename;
 	u32 t_c_timestamp;
 	char *t_c_server_url;
@@ -698,12 +686,6 @@
 #endif /* CONFIG_OWE */
 
 	int coloc_intf_reporting;
-
-	u8 send_probe_response;
-
-#define BACKHAUL_BSS 1
-#define FRONTHAUL_BSS 2
-	int multi_ap; /* bitmap of BACKHAUL_BSS, FRONTHAUL_BSS */
 };
 
 /**
@@ -735,6 +717,7 @@
 	u16 beacon_int;
 	int rts_threshold;
 	int fragm_threshold;
+	u8 send_probe_response;
 	u8 channel;
 	u8 acs;
 	struct wpa_freq_range_list acs_ch_list;
@@ -846,16 +829,12 @@
 #ifdef CONFIG_IEEE80211AX
 	struct he_phy_capabilities_info he_phy_capab;
 	struct he_operation he_op;
-	struct ieee80211_he_mu_edca_parameter_set he_mu_edca;
 #endif /* CONFIG_IEEE80211AX */
 
 	/* VHT enable/disable config from CHAN_SWITCH */
 #define CH_SWITCH_VHT_ENABLED BIT(0)
 #define CH_SWITCH_VHT_DISABLED BIT(1)
 	unsigned int ch_switch_vht_config;
-
-	int rssi_reject_assoc_rssi;
-	int rssi_reject_assoc_timeout;
 };
 
 
@@ -883,6 +862,5 @@
 int hostapd_config_check(struct hostapd_config *conf, int full_config);
 void hostapd_set_security_params(struct hostapd_bss_config *bss,
 				 int full_config);
-int hostapd_sae_pw_id_in_use(struct hostapd_bss_config *conf);
 
 #endif /* HOSTAPD_CONFIG_H */
diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
index 067cf86..728d7f0 100644
--- a/src/ap/ap_drv_ops.c
+++ b/src/ap/ap_drv_ops.c
@@ -176,8 +176,7 @@
 #endif /* CONFIG_HS20 */
 
 #ifdef CONFIG_MBO
-	if (hapd->conf->mbo_enabled ||
-	    OCE_STA_CFON_ENABLED(hapd) || OCE_AP_ENABLED(hapd)) {
+	if (hapd->conf->mbo_enabled || hapd->enable_oce) {
 		pos = hostapd_eid_mbo(hapd, buf, sizeof(buf));
 		if (add_buf_data(&beacon, buf, pos - buf) < 0 ||
 		    add_buf_data(&proberesp, buf, pos - buf) < 0 ||
diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
index d45ab84..db93fde 100644
--- a/src/ap/ap_drv_ops.h
+++ b/src/ap/ap_drv_ops.h
@@ -356,12 +356,4 @@
 	return hapd->driver->stop_ap(hapd->drv_priv);
 }
 
-static inline int hostapd_drv_channel_info(struct hostapd_data *hapd,
-					   struct wpa_channel_info *ci)
-{
-	if (!hapd->driver || !hapd->driver->channel_info)
-		return -1;
-	return hapd->driver->channel_info(hapd->drv_priv, ci);
-}
-
 #endif /* AP_DRV_OPS */
diff --git a/src/ap/authsrv.c b/src/ap/authsrv.c
index 1bb3d9f..95d004e 100644
--- a/src/ap/authsrv.c
+++ b/src/ap/authsrv.c
@@ -136,7 +136,6 @@
 #ifdef CONFIG_HS20
 	srv.subscr_remediation_url = conf->subscr_remediation_url;
 	srv.subscr_remediation_method = conf->subscr_remediation_method;
-	srv.hs20_sim_provisioning_url = conf->hs20_sim_provisioning_url;
 	srv.t_c_server_url = conf->t_c_server_url;
 #endif /* CONFIG_HS20 */
 	srv.erp = conf->eap_server_erp;
@@ -201,16 +200,6 @@
 
 		os_memset(&conf, 0, sizeof(conf));
 		conf.tls_session_lifetime = hapd->conf->tls_session_lifetime;
-		if (hapd->conf->crl_reload_interval > 0 &&
-		    hapd->conf->check_crl <= 0) {
-			wpa_printf(MSG_INFO,
-				   "Cannot enable CRL reload functionality - it depends on check_crl being set");
-		} else if (hapd->conf->crl_reload_interval > 0) {
-			conf.crl_reload_interval =
-				hapd->conf->crl_reload_interval;
-			wpa_printf(MSG_INFO,
-				   "Enabled CRL reload functionality");
-		}
 		conf.tls_flags = hapd->conf->tls_flags;
 		conf.event_cb = authsrv_tls_event;
 		conf.cb_ctx = hapd;
@@ -228,7 +217,6 @@
 		params.private_key_passwd = hapd->conf->private_key_passwd;
 		params.dh_file = hapd->conf->dh_file;
 		params.openssl_ciphers = hapd->conf->openssl_ciphers;
-		params.openssl_ecdh_curves = hapd->conf->openssl_ecdh_curves;
 		params.ocsp_stapling_response =
 			hapd->conf->ocsp_stapling_response;
 		params.ocsp_stapling_response_multi =
@@ -241,8 +229,7 @@
 		}
 
 		if (tls_global_set_verify(hapd->ssl_ctx,
-					  hapd->conf->check_crl,
-					  hapd->conf->check_crl_strict)) {
+					  hapd->conf->check_crl)) {
 			wpa_printf(MSG_ERROR, "Failed to enable check_crl");
 			authsrv_deinit(hapd);
 			return -1;
diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index 3e62991..59bd4af 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -397,8 +397,7 @@
 #ifdef CONFIG_IEEE80211AX
 	if (hapd->iconf->ieee80211ax) {
 		buflen += 3 + sizeof(struct ieee80211_he_capabilities) +
-			3 + sizeof(struct ieee80211_he_operation) +
-			3 + sizeof(struct ieee80211_he_mu_edca_parameter_set);
+			3 + sizeof(struct ieee80211_he_operation);
 	}
 #endif /* CONFIG_IEEE80211AX */
 
@@ -511,7 +510,6 @@
 	if (hapd->iconf->ieee80211ax) {
 		pos = hostapd_eid_he_capab(hapd, pos);
 		pos = hostapd_eid_he_operation(hapd, pos);
-		pos = hostapd_eid_he_mu_edca_parameter_set(hapd, pos);
 	}
 #endif /* CONFIG_IEEE80211AX */
 
@@ -769,7 +767,7 @@
 					    ie, ie_len, ssi_signal) > 0)
 			return;
 
-	if (!hapd->conf->send_probe_response)
+	if (!hapd->iconf->send_probe_response)
 		return;
 
 	if (ieee802_11_parse_elems(ie, ie_len, &elems, 0) == ParseFailed) {
@@ -1087,8 +1085,7 @@
 #ifdef CONFIG_IEEE80211AX
 	if (hapd->iconf->ieee80211ax) {
 		tail_len += 3 + sizeof(struct ieee80211_he_capabilities) +
-			3 + sizeof(struct ieee80211_he_operation) +
-			3 + sizeof(struct ieee80211_he_mu_edca_parameter_set);
+			3 + sizeof(struct ieee80211_he_operation);
 	}
 #endif /* CONFIG_IEEE80211AX */
 
@@ -1225,7 +1222,6 @@
 	if (hapd->iconf->ieee80211ax) {
 		tailpos = hostapd_eid_he_capab(hapd, tailpos);
 		tailpos = hostapd_eid_he_operation(hapd, tailpos);
-		tailpos = hostapd_eid_he_mu_edca_parameter_set(hapd, tailpos);
 	}
 #endif /* CONFIG_IEEE80211AX */
 
@@ -1361,18 +1357,6 @@
 #endif /* CONFIG_HS20 */
 	params->multicast_to_unicast = hapd->conf->multicast_to_unicast;
 	params->pbss = hapd->conf->pbss;
-
-	if (hapd->conf->ftm_responder) {
-		if (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_FTM_RESPONDER) {
-			params->ftm_responder = 1;
-			params->lci = hapd->iface->conf->lci;
-			params->civic = hapd->iface->conf->civic;
-		} else {
-			wpa_printf(MSG_WARNING,
-				   "Not configuring FTM responder as the driver doesn't advertise support for it");
-		}
-	}
-
 	return 0;
 }
 
diff --git a/src/ap/ctrl_iface_ap.c b/src/ap/ctrl_iface_ap.c
index 3128aed..21b813e 100644
--- a/src/ap/ctrl_iface_ap.c
+++ b/src/ap/ctrl_iface_ap.c
@@ -207,7 +207,6 @@
 				      char *buf, size_t buflen)
 {
 	int len, res, ret, i;
-	const char *keyid;
 
 	if (!sta)
 		return 0;
@@ -342,13 +341,6 @@
 			len += ret;
 	}
 
-	keyid = ap_sta_wpa_get_keyid(hapd, sta);
-	if (keyid) {
-		ret = os_snprintf(buf + len, buflen - len, "keyid=%s\n", keyid);
-		if (!os_snprintf_error(buflen - len, ret))
-			len += ret;
-	}
-
 	return len;
 }
 
diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index 79cd00f..993dd19 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -142,30 +142,18 @@
 {
 	struct hostapd_channel_data *first_chan, *chan;
 	int i;
-	u32 bw = num_chan_to_bw(num_chans);
 
 	if (first_chan_idx + num_chans > mode->num_channels)
 		return 0;
 
 	first_chan = &mode->channels[first_chan_idx];
 
-	/* hostapd DFS implementation assumes the first channel as primary.
-	 * If it's not allowed to use the first channel as primary, decline the
-	 * whole channel range. */
-	if (!chan_pri_allowed(first_chan))
-		return 0;
-
 	for (i = 0; i < num_chans; i++) {
 		chan = dfs_get_chan_data(mode, first_chan->freq + i * 20,
 					 first_chan_idx);
 		if (!chan)
 			return 0;
 
-		/* HT 40 MHz secondary channel availability checked only for
-		 * primary channel */
-		if (!chan_bw_allowed(chan, bw, 1, !i))
-			return 0;
-
 		if (!dfs_channel_available(chan, skip_radar))
 			return 0;
 	}
@@ -209,8 +197,7 @@
 		/* Skip HT40/VHT incompatible channels */
 		if (iface->conf->ieee80211n &&
 		    iface->conf->secondary_channel &&
-		    (!dfs_is_chan_allowed(chan, n_chans) ||
-		     !(chan->allowed_bw & HOSTAPD_CHAN_WIDTH_40P)))
+		    !dfs_is_chan_allowed(chan, n_chans))
 			continue;
 
 		/* Skip incompatible chandefs */
diff --git a/src/ap/dhcp_snoop.c b/src/ap/dhcp_snoop.c
index ed37fc8..6d8c2f4 100644
--- a/src/ap/dhcp_snoop.c
+++ b/src/ap/dhcp_snoop.c
@@ -88,15 +88,6 @@
 		}
 	}
 
-	if (hapd->conf->disable_dgaf && is_broadcast_ether_addr(buf)) {
-		for (sta = hapd->sta_list; sta; sta = sta->next) {
-			if (!(sta->flags & WLAN_STA_AUTHORIZED))
-				continue;
-			x_snoop_mcast_to_ucast_convert_send(hapd, sta,
-							    (u8 *) buf, len);
-		}
-	}
-
 	if (msgtype == DHCPACK) {
 		if (b->your_ip == 0)
 			return;
@@ -133,6 +124,15 @@
 		}
 		sta->ipaddr = b->your_ip;
 	}
+
+	if (hapd->conf->disable_dgaf && is_broadcast_ether_addr(buf)) {
+		for (sta = hapd->sta_list; sta; sta = sta->next) {
+			if (!(sta->flags & WLAN_STA_AUTHORIZED))
+				continue;
+			x_snoop_mcast_to_ucast_convert_send(hapd, sta,
+							    (u8 *) buf, len);
+		}
+	}
 }
 
 
diff --git a/src/ap/dpp_hostapd.c b/src/ap/dpp_hostapd.c
index 149f389..4ec044e 100644
--- a/src/ap/dpp_hostapd.c
+++ b/src/ap/dpp_hostapd.c
@@ -505,9 +505,9 @@
 }
 
 
-static int hostapd_dpp_set_configurator(struct hostapd_data *hapd,
-					struct dpp_authentication *auth,
-					const char *cmd)
+static void hostapd_dpp_set_configurator(struct hostapd_data *hapd,
+					 struct dpp_authentication *auth,
+					 const char *cmd)
 {
 	const char *pos, *end;
 	struct dpp_configuration *conf_sta = NULL, *conf_ap = NULL;
@@ -521,7 +521,7 @@
 	char *group_id = NULL;
 
 	if (!cmd)
-		return 0;
+		return;
 
 	wpa_printf(MSG_DEBUG, "DPP: Set configurator parameters: %s", cmd);
 	pos = os_strstr(cmd, " ssid=");
@@ -618,12 +618,10 @@
 				conf_ap->akm = DPP_AKM_PSK;
 			if (psk_set) {
 				os_memcpy(conf_ap->psk, psk, PMK_LEN);
-			} else if (pass_len > 0) {
+			} else {
 				conf_ap->passphrase = os_strdup(pass);
 				if (!conf_ap->passphrase)
 					goto fail;
-			} else {
-				goto fail;
 			}
 		} else if (os_strstr(cmd, " conf=ap-dpp")) {
 			conf_ap->akm = DPP_AKM_DPP;
@@ -665,15 +663,13 @@
 	auth->conf_ap = conf_ap;
 	auth->conf = conf;
 	os_free(group_id);
-	return 0;
+	return;
 
 fail:
-	wpa_msg(hapd->msg_ctx, MSG_INFO,
-		"DPP: Failed to set configurator parameters");
+	wpa_printf(MSG_DEBUG, "DPP: Failed to set configurator parameters");
 	dpp_configuration_free(conf_sta);
 	dpp_configuration_free(conf_ap);
 	os_free(group_id);
-	return -1;
 }
 
 
@@ -846,11 +842,7 @@
 	if (!hapd->dpp_auth)
 		goto fail;
 	hostapd_dpp_set_testing_options(hapd, hapd->dpp_auth);
-	if (hostapd_dpp_set_configurator(hapd, hapd->dpp_auth, cmd) < 0) {
-		dpp_auth_deinit(hapd->dpp_auth);
-		hapd->dpp_auth = NULL;
-		goto fail;
-	}
+	hostapd_dpp_set_configurator(hapd, hapd->dpp_auth, cmd);
 
 	hapd->dpp_auth->neg_freq = neg_freq;
 
@@ -975,12 +967,8 @@
 		return;
 	}
 	hostapd_dpp_set_testing_options(hapd, hapd->dpp_auth);
-	if (hostapd_dpp_set_configurator(hapd, hapd->dpp_auth,
-					 hapd->dpp_configurator_params) < 0) {
-		dpp_auth_deinit(hapd->dpp_auth);
-		hapd->dpp_auth = NULL;
-		return;
-	}
+	hostapd_dpp_set_configurator(hapd, hapd->dpp_auth,
+				     hapd->dpp_configurator_params);
 	os_memcpy(hapd->dpp_auth->peer_mac_addr, src, ETH_ALEN);
 
 	wpa_msg(hapd->msg_ctx, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR
@@ -1904,9 +1892,9 @@
 		return -1;
 
 	curve = get_param(cmd, " curve=");
-	hostapd_dpp_set_testing_options(hapd, auth);
-	if (hostapd_dpp_set_configurator(hapd, auth, cmd) == 0 &&
-	    dpp_configurator_own_config(auth, curve, 1) == 0) {
+	hostapd_dpp_set_configurator(hapd, auth, cmd);
+
+	if (dpp_configurator_own_config(auth, curve, 1) == 0) {
 		hostapd_dpp_handle_config_obj(hapd, auth);
 		ret = 0;
 	}
diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c
index 54be3b5..1135aea 100644
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -38,7 +38,6 @@
 #include "mbo_ap.h"
 #include "dpp_hostapd.h"
 #include "fils_hlp.h"
-#include "neighbor_db.h"
 
 
 #ifdef CONFIG_FILS
@@ -740,12 +739,9 @@
 void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht,
 			     int offset, int width, int cf1, int cf2)
 {
-	/* TODO: If OCV is enabled deauth STAs that don't perform a SA Query */
-
 #ifdef NEED_AP_MLME
 	int channel, chwidth, is_dfs;
 	u8 seg0_idx = 0, seg1_idx = 0;
-	size_t i;
 
 	hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211,
 		       HOSTAPD_LEVEL_INFO,
@@ -828,9 +824,6 @@
 		wpa_msg(hapd->msg_ctx, MSG_INFO, AP_CSA_FINISHED
 			"freq=%d dfs=%d", freq, is_dfs);
 	}
-
-	for (i = 0; i < hapd->iface->num_bss; i++)
-		hostapd_neighbor_set_own_report(hapd->iface->bss[i]);
 #endif /* NEED_AP_MLME */
 }
 
@@ -1079,23 +1072,19 @@
 	struct sta_info *sta;
 	size_t plen __maybe_unused;
 	u16 fc;
-	u8 *action __maybe_unused;
 
-	if (drv_mgmt->frame_len < IEEE80211_HDRLEN + 2 + 1)
+	if (drv_mgmt->frame_len < 24 + 1)
 		return;
 
-	plen = drv_mgmt->frame_len - IEEE80211_HDRLEN - 1;
+	plen = drv_mgmt->frame_len - 24 - 1;
 
 	mgmt = (struct ieee80211_mgmt *) drv_mgmt->frame;
 	fc = le_to_host16(mgmt->frame_control);
 	if (WLAN_FC_GET_STYPE(fc) != WLAN_FC_STYPE_ACTION)
 		return; /* handled by the driver */
 
-	action = (u8 *) &mgmt->u.action.u;
-	wpa_printf(MSG_DEBUG, "RX_ACTION category %u action %u sa " MACSTR
-		   " da " MACSTR " plen %d",
-		   mgmt->u.action.category, *action,
-		   MAC2STR(mgmt->sa), MAC2STR(mgmt->da), (int) plen);
+	wpa_printf(MSG_DEBUG, "RX_ACTION cat %d action plen %d",
+		   mgmt->u.action.category, (int) plen);
 
 	sta = ap_get_sta(hapd, mgmt->sa);
 	if (sta == NULL) {
@@ -1111,7 +1100,10 @@
 #endif /* CONFIG_IEEE80211R_AP */
 #ifdef CONFIG_IEEE80211W
 	if (mgmt->u.action.category == WLAN_ACTION_SA_QUERY && plen >= 4) {
-		ieee802_11_sa_query_action(hapd, mgmt, drv_mgmt->frame_len);
+		ieee802_11_sa_query_action(
+			hapd, mgmt->sa,
+			mgmt->u.action.u.sa_query_resp.action,
+			mgmt->u.action.u.sa_query_resp.trans_id);
 	}
 #endif /* CONFIG_IEEE80211W */
 #ifdef CONFIG_WNM_AP
@@ -1729,11 +1721,6 @@
 				hostapd_reconfig_encryption(hapd);
 			hapd->reenable_beacon = 1;
 			ieee802_11_set_beacon(hapd);
-#ifdef NEED_AP_MLME
-		} else if (hapd->disabled && hapd->iface->cac_started) {
-			wpa_printf(MSG_DEBUG, "DFS: restarting pending CAC");
-			hostapd_handle_dfs(hapd->iface);
-#endif /* NEED_AP_MLME */
 		}
 		break;
 	case EVENT_INTERFACE_DISABLED:
diff --git a/src/ap/eap_user_db.c b/src/ap/eap_user_db.c
index a510ee3..fab307f 100644
--- a/src/ap/eap_user_db.c
+++ b/src/ap/eap_user_db.c
@@ -92,7 +92,7 @@
 		} else if (os_strcmp(col[i], "remediation") == 0 && argv[i]) {
 			user->remediation = strlen(argv[i]) > 0;
 		} else if (os_strcmp(col[i], "t_c_timestamp") == 0 && argv[i]) {
-			user->t_c_timestamp = strtol(argv[i], NULL, 10);
+			user->t_c_timestamp = strtol(argv[i], 0, 10);
 		}
 	}
 
@@ -139,7 +139,6 @@
 	struct hostapd_eap_user *user = NULL;
 	char id_str[256], cmd[300];
 	size_t i;
-	int res;
 
 	if (identity_len >= sizeof(id_str)) {
 		wpa_printf(MSG_DEBUG, "%s: identity len too big: %d >= %d",
@@ -175,7 +174,6 @@
 	if (hapd->tmp_eap_user.identity == NULL)
 		return NULL;
 	os_memcpy(hapd->tmp_eap_user.identity, identity, identity_len);
-	hapd->tmp_eap_user.identity_len = identity_len;
 
 	if (sqlite3_open(hapd->conf->eap_user_sqlite, &db)) {
 		wpa_printf(MSG_INFO, "DB: Failed to open database %s: %s",
@@ -184,12 +182,9 @@
 		return NULL;
 	}
 
-	res = os_snprintf(cmd, sizeof(cmd),
-			  "SELECT * FROM users WHERE identity='%s' AND phase2=%d;",
-			  id_str, phase2);
-	if (os_snprintf_error(sizeof(cmd), res))
-		goto fail;
-
+	os_snprintf(cmd, sizeof(cmd),
+		    "SELECT * FROM users WHERE identity='%s' AND phase2=%d;",
+		    id_str, phase2);
 	wpa_printf(MSG_DEBUG, "DB: %s", cmd);
 	if (sqlite3_exec(db, cmd, get_user_cb, &hapd->tmp_eap_user, NULL) !=
 	    SQLITE_OK) {
@@ -219,7 +214,6 @@
 		}
 	}
 
-fail:
 	sqlite3_close(db);
 
 	return user;
diff --git a/src/ap/fils_hlp.c b/src/ap/fils_hlp.c
index 6da514a..2a359ab 100644
--- a/src/ap/fils_hlp.c
+++ b/src/ap/fils_hlp.c
@@ -580,19 +580,6 @@
 	u8 *tmp, *tmp_pos;
 	int ret = 0;
 
-	if (sta->fils_pending_assoc_req &&
-	    eloop_is_timeout_registered(fils_hlp_timeout, hapd, sta)) {
-		/* Do not process FILS HLP request again if the station
-		 * retransmits (Re)Association Request frame before the previous
-		 * HLP response has either been received or timed out. */
-		wpa_printf(MSG_DEBUG,
-			   "FILS: Do not relay another HLP request from "
-			   MACSTR
-			   " before processing of the already pending one has been completed",
-			   MAC2STR(sta->addr));
-		return 1;
-	}
-
 	/* Old DHCPDISCOVER is not needed anymore, if it was still pending */
 	wpabuf_free(sta->hlp_dhcp_discover);
 	sta->hlp_dhcp_discover = NULL;
diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
index 342585f..117ee08 100644
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -176,27 +176,8 @@
 }
 
 
-static int hostapd_iface_conf_changed(struct hostapd_config *newconf,
-				      struct hostapd_config *oldconf)
-{
-	size_t i;
-
-	if (newconf->num_bss != oldconf->num_bss)
-		return 1;
-
-	for (i = 0; i < newconf->num_bss; i++) {
-		if (os_strcmp(newconf->bss[i]->iface,
-			      oldconf->bss[i]->iface) != 0)
-			return 1;
-	}
-
-	return 0;
-}
-
-
 int hostapd_reload_config(struct hostapd_iface *iface)
 {
-	struct hapd_interfaces *interfaces = iface->interfaces;
 	struct hostapd_data *hapd = iface->bss[0];
 	struct hostapd_config *newconf, *oldconf;
 	size_t j;
@@ -219,35 +200,6 @@
 	hostapd_clear_old(iface);
 
 	oldconf = hapd->iconf;
-	if (hostapd_iface_conf_changed(newconf, oldconf)) {
-		char *fname;
-		int res;
-
-		wpa_printf(MSG_DEBUG,
-			   "Configuration changes include interface/BSS modification - force full disable+enable sequence");
-		fname = os_strdup(iface->config_fname);
-		if (!fname) {
-			hostapd_config_free(newconf);
-			return -1;
-		}
-		hostapd_remove_iface(interfaces, hapd->conf->iface);
-		iface = hostapd_init(interfaces, fname);
-		os_free(fname);
-		hostapd_config_free(newconf);
-		if (!iface) {
-			wpa_printf(MSG_ERROR,
-				   "Failed to initialize interface on config reload");
-			return -1;
-		}
-		iface->interfaces = interfaces;
-		interfaces->iface[interfaces->count] = iface;
-		interfaces->count++;
-		res = hostapd_enable_iface(iface);
-		if (res < 0)
-			wpa_printf(MSG_ERROR,
-				   "Failed to enable interface on config reload");
-		return res;
-	}
 	iface->conf = newconf;
 
 	for (j = 0; j < iface->num_bss; j++) {
@@ -1668,6 +1620,127 @@
 
 #endif /* CONFIG_FST */
 
+
+#ifdef NEED_AP_MLME
+static enum nr_chan_width hostapd_get_nr_chan_width(struct hostapd_data *hapd,
+						    int ht, int vht)
+{
+	if (!ht && !vht)
+		return NR_CHAN_WIDTH_20;
+	if (!hapd->iconf->secondary_channel)
+		return NR_CHAN_WIDTH_20;
+	if (!vht || hapd->iconf->vht_oper_chwidth == VHT_CHANWIDTH_USE_HT)
+		return NR_CHAN_WIDTH_40;
+	if (hapd->iconf->vht_oper_chwidth == VHT_CHANWIDTH_80MHZ)
+		return NR_CHAN_WIDTH_80;
+	if (hapd->iconf->vht_oper_chwidth == VHT_CHANWIDTH_160MHZ)
+		return NR_CHAN_WIDTH_160;
+	if (hapd->iconf->vht_oper_chwidth == VHT_CHANWIDTH_80P80MHZ)
+		return NR_CHAN_WIDTH_80P80;
+	return NR_CHAN_WIDTH_20;
+}
+#endif /* NEED_AP_MLME */
+
+
+static void hostapd_set_own_neighbor_report(struct hostapd_data *hapd)
+{
+#ifdef NEED_AP_MLME
+	u16 capab = hostapd_own_capab_info(hapd);
+	int ht = hapd->iconf->ieee80211n && !hapd->conf->disable_11n;
+	int vht = hapd->iconf->ieee80211ac && !hapd->conf->disable_11ac;
+	struct wpa_ssid_value ssid;
+	u8 channel, op_class;
+	u8 center_freq1_idx = 0, center_freq2_idx = 0;
+	enum nr_chan_width width;
+	u32 bssid_info;
+	struct wpabuf *nr;
+
+	if (!(hapd->conf->radio_measurements[0] &
+	      WLAN_RRM_CAPS_NEIGHBOR_REPORT))
+		return;
+
+	bssid_info = 3; /* AP is reachable */
+	bssid_info |= NEI_REP_BSSID_INFO_SECURITY; /* "same as the AP" */
+	bssid_info |= NEI_REP_BSSID_INFO_KEY_SCOPE; /* "same as the AP" */
+
+	if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT)
+		bssid_info |= NEI_REP_BSSID_INFO_SPECTRUM_MGMT;
+
+	bssid_info |= NEI_REP_BSSID_INFO_RM; /* RRM is supported */
+
+	if (hapd->conf->wmm_enabled) {
+		bssid_info |= NEI_REP_BSSID_INFO_QOS;
+
+		if (hapd->conf->wmm_uapsd &&
+		    (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_AP_UAPSD))
+			bssid_info |= NEI_REP_BSSID_INFO_APSD;
+	}
+
+	if (ht) {
+		bssid_info |= NEI_REP_BSSID_INFO_HT |
+			NEI_REP_BSSID_INFO_DELAYED_BA;
+
+		/* VHT bit added in IEEE P802.11-REVmc/D4.3 */
+		if (vht)
+			bssid_info |= NEI_REP_BSSID_INFO_VHT;
+	}
+
+	/* TODO: Set NEI_REP_BSSID_INFO_MOBILITY_DOMAIN if MDE is set */
+
+	if (ieee80211_freq_to_channel_ext(hapd->iface->freq,
+					  hapd->iconf->secondary_channel,
+					  hapd->iconf->vht_oper_chwidth,
+					  &op_class, &channel) ==
+	    NUM_HOSTAPD_MODES)
+		return;
+	width = hostapd_get_nr_chan_width(hapd, ht, vht);
+	if (vht) {
+		center_freq1_idx = hapd->iconf->vht_oper_centr_freq_seg0_idx;
+		if (width == NR_CHAN_WIDTH_80P80)
+			center_freq2_idx =
+				hapd->iconf->vht_oper_centr_freq_seg1_idx;
+	} else if (ht) {
+		ieee80211_freq_to_chan(hapd->iface->freq +
+				       10 * hapd->iconf->secondary_channel,
+				       &center_freq1_idx);
+	}
+
+	ssid.ssid_len = hapd->conf->ssid.ssid_len;
+	os_memcpy(ssid.ssid, hapd->conf->ssid.ssid, ssid.ssid_len);
+
+	/*
+	 * Neighbor Report element size = BSSID + BSSID info + op_class + chan +
+	 * phy type + wide bandwidth channel subelement.
+	 */
+	nr = wpabuf_alloc(ETH_ALEN + 4 + 1 + 1 + 1 + 5);
+	if (!nr)
+		return;
+
+	wpabuf_put_data(nr, hapd->own_addr, ETH_ALEN);
+	wpabuf_put_le32(nr, bssid_info);
+	wpabuf_put_u8(nr, op_class);
+	wpabuf_put_u8(nr, channel);
+	wpabuf_put_u8(nr, ieee80211_get_phy_type(hapd->iface->freq, ht, vht));
+
+	/*
+	 * Wide Bandwidth Channel subelement may be needed to allow the
+	 * receiving STA to send packets to the AP. See IEEE P802.11-REVmc/D5.0
+	 * Figure 9-301.
+	 */
+	wpabuf_put_u8(nr, WNM_NEIGHBOR_WIDE_BW_CHAN);
+	wpabuf_put_u8(nr, 3);
+	wpabuf_put_u8(nr, width);
+	wpabuf_put_u8(nr, center_freq1_idx);
+	wpabuf_put_u8(nr, center_freq2_idx);
+
+	hostapd_neighbor_set(hapd, hapd->own_addr, &ssid, nr, hapd->iconf->lci,
+			     hapd->iconf->civic, hapd->iconf->stationary_ap);
+
+	wpabuf_free(nr);
+#endif /* NEED_AP_MLME */
+}
+
+
 #ifdef CONFIG_OWE
 
 static int hostapd_owe_iface_iter(struct hostapd_iface *iface, void *ctx)
@@ -1964,7 +2037,7 @@
 		iface->interfaces->terminate_on_error--;
 
 	for (j = 0; j < iface->num_bss; j++)
-		hostapd_neighbor_set_own_report(iface->bss[j]);
+		hostapd_set_own_neighbor_report(iface->bss[j]);
 
 	return 0;
 
@@ -2609,7 +2682,7 @@
 	if (conf == NULL) {
 		 wpa_printf(MSG_ERROR, "%s: Failed to allocate memory for "
 				"configuration", __func__);
-		 return NULL;
+		return NULL;
 	}
 
 	if (driver) {
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index 85e63d3..28b3a1c 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -14,13 +14,6 @@
 #include "ap_config.h"
 #include "drivers/driver.h"
 
-#define OCE_STA_CFON_ENABLED(hapd) \
-	((hapd->conf->oce & OCE_STA_CFON) && \
-	 (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_OCE_STA_CFON))
-#define OCE_AP_ENABLED(hapd) \
-	((hapd->conf->oce & OCE_AP) && \
-	 (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_OCE_AP))
-
 struct wpa_ctrl_dst;
 struct radius_server_data;
 struct upnp_wps_device_sm;
@@ -331,6 +324,11 @@
 
 #ifdef CONFIG_MBO
 	unsigned int mbo_assoc_disallow;
+	/**
+	 * enable_oce - Enable OCE if it is enabled by user and device also
+	 *		supports OCE.
+	 */
+	u8 enable_oce;
 #endif /* CONFIG_MBO */
 
 	struct dl_list nr_db;
diff --git a/src/ap/hs20.c b/src/ap/hs20.c
index 532580e..98d016d 100644
--- a/src/ap/hs20.c
+++ b/src/ap/hs20.c
@@ -25,20 +25,17 @@
 	if (!hapd->conf->hs20)
 		return eid;
 	*eid++ = WLAN_EID_VENDOR_SPECIFIC;
-	*eid++ = hapd->conf->hs20_release < 2 ? 5 : 7;
+	*eid++ = 7;
 	WPA_PUT_BE24(eid, OUI_WFA);
 	eid += 3;
 	*eid++ = HS20_INDICATION_OUI_TYPE;
-	conf = (hapd->conf->hs20_release - 1) << 4; /* Release Number */
-	if (hapd->conf->hs20_release >= 2)
-		conf |= HS20_ANQP_DOMAIN_ID_PRESENT;
+	conf = HS20_VERSION; /* Release Number */
+	conf |= HS20_ANQP_DOMAIN_ID_PRESENT;
 	if (hapd->conf->disable_dgaf)
 		conf |= HS20_DGAF_DISABLED;
 	*eid++ = conf;
-	if (hapd->conf->hs20_release >= 2) {
-		WPA_PUT_LE16(eid, hapd->conf->anqp_domain_id);
-		eid += 2;
-	}
+	WPA_PUT_LE16(eid, hapd->conf->anqp_domain_id);
+	eid += 2;
 
 	return eid;
 }
@@ -87,10 +84,6 @@
 			capab |= WPA_CAPABILITY_MFPR;
 	}
 #endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_OCV
-	if (hapd->conf->ocv)
-		capab |= WPA_CAPABILITY_OCVC;
-#endif /* CONFIG_OCV */
 	WPA_PUT_LE16(eid, capab);
 	eid += 2;
 
@@ -191,14 +184,13 @@
 {
 	struct wpabuf *buf;
 	int ret;
-	size_t url_len;
+	size_t url_len = os_strlen(url);
 
 	if (!url) {
 		wpa_printf(MSG_INFO, "HS 2.0: No T&C Server URL available");
 		return -1;
 	}
 
-	url_len = os_strlen(url);
 	if (5 + url_len > 255) {
 		wpa_printf(MSG_INFO,
 			   "HS 2.0: Too long T&C Server URL for WNM-Notification: '%s'",
diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c
index 9d3d990..5279abc 100644
--- a/src/ap/hw_features.c
+++ b/src/ap/hw_features.c
@@ -229,6 +229,9 @@
 {
 	int pri_chan, sec_chan;
 
+	if (!iface->conf->secondary_channel)
+		return 1; /* HT40 not used */
+
 	pri_chan = iface->conf->channel;
 	sec_chan = pri_chan + iface->conf->secondary_channel * 4;
 
@@ -694,25 +697,30 @@
 static int hostapd_is_usable_chan(struct hostapd_iface *iface,
 				  int channel, int primary)
 {
+	int i;
 	struct hostapd_channel_data *chan;
 
 	if (!iface->current_mode)
 		return 0;
 
-	chan = hw_get_channel_chan(iface->current_mode, channel, NULL);
-	if (!chan)
-		return 0;
+	for (i = 0; i < iface->current_mode->num_channels; i++) {
+		chan = &iface->current_mode->channels[i];
+		if (chan->chan != channel)
+			continue;
 
-	if ((primary && chan_pri_allowed(chan)) ||
-	    (!primary && !(chan->flag & HOSTAPD_CHAN_DISABLED)))
-		return 1;
+		if (!(chan->flag & HOSTAPD_CHAN_DISABLED))
+			return 1;
 
-	wpa_printf(MSG_INFO,
-		   "Channel %d (%s) not allowed for AP mode, flags: 0x%x%s%s",
-		   channel, primary ? "primary" : "secondary",
-		   chan->flag,
-		   chan->flag & HOSTAPD_CHAN_NO_IR ? " NO-IR" : "",
-		   chan->flag & HOSTAPD_CHAN_RADAR ? " RADAR" : "");
+		wpa_printf(MSG_DEBUG,
+			   "%schannel [%i] (%i) is disabled for use in AP mode, flags: 0x%x%s%s",
+			   primary ? "" : "Configured HT40 secondary ",
+			   i, chan->chan, chan->flag,
+			   chan->flag & HOSTAPD_CHAN_NO_IR ? " NO-IR" : "",
+			   chan->flag & HOSTAPD_CHAN_RADAR ? " RADAR" : "");
+	}
+
+	wpa_printf(MSG_INFO, "Channel %d (%s) not allowed for AP mode",
+		   channel, primary ? "primary" : "secondary");
 	return 0;
 }
 
@@ -720,12 +728,6 @@
 static int hostapd_is_usable_chans(struct hostapd_iface *iface)
 {
 	int secondary_chan;
-	struct hostapd_channel_data *pri_chan;
-
-	pri_chan = hw_get_channel_chan(iface->current_mode,
-				       iface->conf->channel, NULL);
-	if (!pri_chan)
-		return 0;
 
 	if (!hostapd_is_usable_chan(iface, iface->conf->channel, 1))
 		return 0;
@@ -740,15 +742,13 @@
 
 	/* Both HT40+ and HT40- are set, pick a valid secondary channel */
 	secondary_chan = iface->conf->channel + 4;
-	if (hostapd_is_usable_chan(iface, secondary_chan, 0) &&
-	    (pri_chan->allowed_bw & HOSTAPD_CHAN_WIDTH_40P)) {
+	if (hostapd_is_usable_chan(iface, secondary_chan, 0)) {
 		iface->conf->secondary_channel = 1;
 		return 1;
 	}
 
 	secondary_chan = iface->conf->channel - 4;
-	if (hostapd_is_usable_chan(iface, secondary_chan, 0) &&
-	    (pri_chan->allowed_bw & HOSTAPD_CHAN_WIDTH_40M)) {
+	if (hostapd_is_usable_chan(iface, secondary_chan, 0)) {
 		iface->conf->secondary_channel = -1;
 		return 1;
 	}
diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c
index 376bbd8..90788de 100644
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -21,7 +21,6 @@
 #include "common/ieee802_11_common.h"
 #include "common/wpa_ctrl.h"
 #include "common/sae.h"
-#include "common/ocv.h"
 #include "radius/radius.h"
 #include "radius/radius_client.h"
 #include "p2p/p2p.h"
@@ -63,22 +62,6 @@
 		       int *is_pub);
 #endif /* CONFIG_FILS */
 
-
-u8 * hostapd_eid_multi_ap(struct hostapd_data *hapd, u8 *eid)
-{
-	u8 multi_ap_val = 0;
-
-	if (!hapd->conf->multi_ap)
-		return eid;
-	if (hapd->conf->multi_ap & BACKHAUL_BSS)
-		multi_ap_val |= MULTI_AP_BACKHAUL_BSS;
-	if (hapd->conf->multi_ap & FRONTHAUL_BSS)
-		multi_ap_val |= MULTI_AP_FRONTHAUL_BSS;
-
-	return eid + add_multi_ap_ie(eid, 9, multi_ap_val);
-}
-
-
 u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid)
 {
 	u8 *pos = eid;
@@ -1760,8 +1743,7 @@
 
 
 static void handle_auth(struct hostapd_data *hapd,
-			const struct ieee80211_mgmt *mgmt, size_t len,
-			int rssi)
+			const struct ieee80211_mgmt *mgmt, size_t len)
 {
 	u16 auth_alg, auth_transaction, status_code;
 	u16 resp = WLAN_STATUS_SUCCESS;
@@ -1943,7 +1925,6 @@
 	sta = ap_get_sta(hapd, mgmt->sa);
 	if (sta) {
 		sta->flags &= ~WLAN_STA_PENDING_FILS_ERP;
-		sta->ft_over_ds = 0;
 		if ((fc & WLAN_FC_RETRY) &&
 		    sta->last_seq_ctrl != WLAN_INVALID_MGMT_SEQ &&
 		    sta->last_seq_ctrl == seq_ctrl &&
@@ -1992,9 +1973,6 @@
 	}
 	sta->last_seq_ctrl = seq_ctrl;
 	sta->last_subtype = WLAN_FC_STYPE_AUTH;
-#ifdef CONFIG_MBO
-	sta->auth_rssi = rssi;
-#endif /* CONFIG_MBO */
 
 	res = ieee802_11_set_radius_info(
 		hapd, sta, res, session_timeout, acct_interim_interval,
@@ -2232,57 +2210,6 @@
 	return WLAN_STATUS_SUCCESS;
 }
 
-static u16 check_multi_ap(struct hostapd_data *hapd, struct sta_info *sta,
-			  const u8 *multi_ap_ie, size_t multi_ap_len)
-{
-	u8 multi_ap_value = 0;
-
-	sta->flags &= ~WLAN_STA_MULTI_AP;
-
-	if (!hapd->conf->multi_ap)
-		return WLAN_STATUS_SUCCESS;
-
-	if (multi_ap_ie) {
-		const u8 *multi_ap_subelem;
-
-		multi_ap_subelem = get_ie(multi_ap_ie + 4,
-					  multi_ap_len - 4,
-					  MULTI_AP_SUB_ELEM_TYPE);
-		if (multi_ap_subelem && multi_ap_subelem[1] == 1) {
-			multi_ap_value = multi_ap_subelem[2];
-		} else {
-			hostapd_logger(hapd, sta->addr,
-				       HOSTAPD_MODULE_IEEE80211,
-				       HOSTAPD_LEVEL_INFO,
-				       "Multi-AP IE has missing or invalid Multi-AP subelement");
-			return WLAN_STATUS_INVALID_IE;
-		}
-	}
-
-	if (multi_ap_value == MULTI_AP_BACKHAUL_STA)
-		sta->flags |= WLAN_STA_MULTI_AP;
-
-	if ((hapd->conf->multi_ap & BACKHAUL_BSS) &&
-	    multi_ap_value == MULTI_AP_BACKHAUL_STA)
-		return WLAN_STATUS_SUCCESS;
-
-	if (hapd->conf->multi_ap & FRONTHAUL_BSS) {
-		if (multi_ap_value == MULTI_AP_BACKHAUL_STA) {
-			hostapd_logger(hapd, sta->addr,
-				       HOSTAPD_MODULE_IEEE80211,
-				       HOSTAPD_LEVEL_INFO,
-				       "Backhaul STA tries to associate with fronthaul-only BSS");
-			return WLAN_STATUS_ASSOC_DENIED_UNSPEC;
-		}
-		return WLAN_STATUS_SUCCESS;
-	}
-
-	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
-		       HOSTAPD_LEVEL_INFO,
-		       "Non-Multi-AP STA tries to associate with backhaul-only BSS");
-	return WLAN_STATUS_ASSOC_DENIED_UNSPEC;
-}
-
 
 static u16 copy_supp_rates(struct hostapd_data *hapd, struct sta_info *sta,
 			   struct ieee802_11_elems *elems)
@@ -2539,11 +2466,6 @@
 	resp = copy_supp_rates(hapd, sta, &elems);
 	if (resp != WLAN_STATUS_SUCCESS)
 		return resp;
-
-	resp = check_multi_ap(hapd, sta, elems.multi_ap, elems.multi_ap_len);
-	if (resp != WLAN_STATUS_SUCCESS)
-		return resp;
-
 #ifdef CONFIG_IEEE80211N
 	resp = copy_sta_ht_capab(hapd, sta, elems.ht_capabilities);
 	if (resp != WLAN_STATUS_SUCCESS)
@@ -2563,10 +2485,6 @@
 		if (resp != WLAN_STATUS_SUCCESS)
 			return resp;
 
-		resp = copy_sta_vht_oper(hapd, sta, elems.vht_operation);
-		if (resp != WLAN_STATUS_SUCCESS)
-			return resp;
-
 		resp = set_sta_vht_opmode(hapd, sta, elems.vht_opmode_notif);
 		if (resp != WLAN_STATUS_SUCCESS)
 			return resp;
@@ -2795,20 +2713,10 @@
 #ifdef CONFIG_HS20
 	wpabuf_free(sta->hs20_ie);
 	if (elems.hs20 && elems.hs20_len > 4) {
-		int release;
-
 		sta->hs20_ie = wpabuf_alloc_copy(elems.hs20 + 4,
 						 elems.hs20_len - 4);
-		release = ((elems.hs20[4] >> 4) & 0x0f) + 1;
-		if (release >= 2 && !wpa_auth_uses_mfp(sta->wpa_sm)) {
-			wpa_printf(MSG_DEBUG,
-				   "HS 2.0: PMF not negotiated by release %d station "
-				   MACSTR, release, MAC2STR(sta->addr));
-			return WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION;
-		}
-	} else {
+	} else
 		sta->hs20_ie = NULL;
-	}
 
 	wpabuf_free(sta->roaming_consortium);
 	if (elems.roaming_cons_sel)
@@ -2839,35 +2747,6 @@
 	}
 #endif /* CONFIG_MBO */
 
-#if defined(CONFIG_FILS) && defined(CONFIG_OCV)
-	if (wpa_auth_uses_ocv(sta->wpa_sm) &&
-	    (sta->auth_alg == WLAN_AUTH_FILS_SK ||
-	     sta->auth_alg == WLAN_AUTH_FILS_SK_PFS ||
-	     sta->auth_alg == WLAN_AUTH_FILS_PK)) {
-		struct wpa_channel_info ci;
-		int tx_chanwidth;
-		int tx_seg1_idx;
-
-		if (hostapd_drv_channel_info(hapd, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info to validate received OCI in FILS (Re)Association Request frame");
-			return WLAN_STATUS_UNSPECIFIED_FAILURE;
-		}
-
-		if (get_sta_tx_parameters(sta->wpa_sm,
-					  channel_width_to_int(ci.chanwidth),
-					  ci.seg1_idx, &tx_chanwidth,
-					  &tx_seg1_idx) < 0)
-			return WLAN_STATUS_UNSPECIFIED_FAILURE;
-
-		if (ocv_verify_tx_params(elems.oci, elems.oci_len, &ci,
-					 tx_chanwidth, tx_seg1_idx) != 0) {
-			wpa_printf(MSG_WARNING, "FILS: %s", ocv_errorstr);
-			return WLAN_STATUS_UNSPECIFIED_FAILURE;
-		}
-	}
-#endif /* CONFIG_FILS && CONFIG_OCV */
-
 	ap_copy_sta_supp_op_classes(sta, elems.supp_op_classes,
 				    elems.supp_op_classes_len);
 
@@ -2912,7 +2791,7 @@
 
 
 static int add_associated_sta(struct hostapd_data *hapd,
-			      struct sta_info *sta, int reassoc)
+			      struct sta_info *sta)
 {
 	struct ieee80211_ht_capabilities ht_cap;
 	struct ieee80211_vht_capabilities vht_cap;
@@ -2928,36 +2807,14 @@
 	 * Skip this if the STA has already completed FT reassociation and the
 	 * TK has been configured since the TX/RX PN must not be reset to 0 for
 	 * the same key.
-	 *
-	 * FT-over-the-DS has a special case where the STA entry (and as such,
-	 * the TK) has not yet been configured to the driver depending on which
-	 * driver interface is used. For that case, allow add-STA operation to
-	 * be used (instead of set-STA). This is needed to allow mac80211-based
-	 * drivers to accept the STA parameter configuration. Since this is
-	 * after a new FT-over-DS exchange, a new TK has been derived, so key
-	 * reinstallation is not a concern for this case.
 	 */
-	wpa_printf(MSG_DEBUG, "Add associated STA " MACSTR
-		   " (added_unassoc=%d auth_alg=%u ft_over_ds=%u reassoc=%d authorized=%d ft_tk=%d fils_tk=%d)",
-		   MAC2STR(sta->addr), sta->added_unassoc, sta->auth_alg,
-		   sta->ft_over_ds, reassoc,
-		   !!(sta->flags & WLAN_STA_AUTHORIZED),
-		   wpa_auth_sta_ft_tk_already_set(sta->wpa_sm),
-		   wpa_auth_sta_fils_tk_already_set(sta->wpa_sm));
-
 	if (!sta->added_unassoc &&
 	    (!(sta->flags & WLAN_STA_AUTHORIZED) ||
-	     (reassoc && sta->ft_over_ds && sta->auth_alg == WLAN_AUTH_FT) ||
 	     (!wpa_auth_sta_ft_tk_already_set(sta->wpa_sm) &&
 	      !wpa_auth_sta_fils_tk_already_set(sta->wpa_sm)))) {
 		hostapd_drv_sta_remove(hapd, sta->addr);
 		wpa_auth_sm_event(sta->wpa_sm, WPA_DRV_STA_REMOVED);
 		set = 0;
-
-		 /* Do not allow the FT-over-DS exception to be used more than
-		  * once per authentication exchange to guarantee a new TK is
-		  * used here */
-		sta->ft_over_ds = 0;
 	}
 
 #ifdef CONFIG_IEEE80211N
@@ -3003,7 +2860,7 @@
 
 static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta,
 			   const u8 *addr, u16 status_code, int reassoc,
-			   const u8 *ies, size_t ies_len, int rssi)
+			   const u8 *ies, size_t ies_len)
 {
 	int send_len;
 	u8 *buf;
@@ -3048,16 +2905,6 @@
 	/* Extended supported rates */
 	p = hostapd_eid_ext_supp_rates(hapd, p);
 
-#ifdef CONFIG_MBO
-	if (status_code == WLAN_STATUS_DENIED_POOR_CHANNEL_CONDITIONS &&
-	    rssi != 0) {
-		int delta = hapd->iconf->rssi_reject_assoc_rssi - rssi;
-
-		p = hostapd_eid_mbo_rssi_assoc_rej(hapd, p, buf + buflen - p,
-						   delta);
-	}
-#endif /* CONFIG_MBO */
-
 #ifdef CONFIG_IEEE80211R_AP
 	if (sta && status_code == WLAN_STATUS_SUCCESS) {
 		/* IEEE 802.11r: Mobility Domain Information, Fast BSS
@@ -3075,8 +2922,7 @@
 #endif /* CONFIG_IEEE80211R_AP */
 
 #ifdef CONFIG_OWE
-	if (sta && status_code == WLAN_STATUS_SUCCESS &&
-	    (hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_OWE))
+	if (sta && (hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_OWE))
 		p = wpa_auth_write_assoc_resp_owe(sta->wpa_sm, p,
 						  buf + buflen - p,
 						  ies, ies_len);
@@ -3149,9 +2995,6 @@
 	}
 #endif /* CONFIG_WPS */
 
-	if (sta && (sta->flags & WLAN_STA_MULTI_AP))
-		p = hostapd_eid_multi_ap(hapd, p);
-
 #ifdef CONFIG_P2P
 	if (sta && sta->p2p_ie && hapd->p2p_group) {
 		struct wpabuf *p2p_resp_ie;
@@ -3226,7 +3069,7 @@
 
 #ifdef CONFIG_OWE
 	if ((hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_OWE) &&
-	    sta && sta->owe_ecdh && status_code == WLAN_STATUS_SUCCESS &&
+	    sta && sta->owe_ecdh &&
 	    wpa_auth_sta_key_mgmt(sta->wpa_sm) == WPA_KEY_MGMT_OWE) {
 		struct wpabuf *pub;
 
@@ -3329,7 +3172,7 @@
 	reply_res = send_assoc_resp(hapd, sta, sta->addr, WLAN_STATUS_SUCCESS,
 				    sta->fils_pending_assoc_is_reassoc,
 				    sta->fils_pending_assoc_req,
-				    sta->fils_pending_assoc_req_len, 0);
+				    sta->fils_pending_assoc_req_len);
 	os_free(sta->fils_pending_assoc_req);
 	sta->fils_pending_assoc_req = NULL;
 	sta->fils_pending_assoc_req_len = 0;
@@ -3366,7 +3209,7 @@
 
 static void handle_assoc(struct hostapd_data *hapd,
 			 const struct ieee80211_mgmt *mgmt, size_t len,
-			 int reassoc, int rssi)
+			 int reassoc)
 {
 	u16 capab_info, listen_interval, seq_ctrl, fc;
 	u16 resp = WLAN_STATUS_SUCCESS, reply_res;
@@ -3549,14 +3392,6 @@
 		resp = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;
 		goto fail;
 	}
-
-	if (hapd->iconf->rssi_reject_assoc_rssi && rssi &&
-	    rssi < hapd->iconf->rssi_reject_assoc_rssi &&
-	    (sta->auth_rssi == 0 ||
-	     sta->auth_rssi < hapd->iconf->rssi_reject_assoc_rssi)) {
-		resp = WLAN_STATUS_DENIED_POOR_CHANNEL_CONDITIONS;
-		goto fail;
-	}
 #endif /* CONFIG_MBO */
 
 	/*
@@ -3714,24 +3549,10 @@
 	 *    issues with processing other non-Data Class 3 frames during this
 	 *    window.
 	 */
-	if (resp == WLAN_STATUS_SUCCESS && sta &&
-	    add_associated_sta(hapd, sta, reassoc))
+	if (resp == WLAN_STATUS_SUCCESS && sta && add_associated_sta(hapd, sta))
 		resp = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;
 
 #ifdef CONFIG_FILS
-	if (sta && delay_assoc && resp == WLAN_STATUS_SUCCESS &&
-	    eloop_is_timeout_registered(fils_hlp_timeout, hapd, sta) &&
-	    sta->fils_pending_assoc_req) {
-		/* Do not reschedule fils_hlp_timeout in case the station
-		 * retransmits (Re)Association Request frame while waiting for
-		 * the previously started FILS HLP wait, so that the timeout can
-		 * be determined from the first pending attempt. */
-		wpa_printf(MSG_DEBUG,
-			   "FILS: Continue waiting for HLP processing before sending (Re)Association Response frame to "
-			   MACSTR, MAC2STR(sta->addr));
-		os_free(tmp);
-		return;
-	}
 	if (sta) {
 		eloop_cancel_timeout(fils_hlp_timeout, hapd, sta);
 		os_free(sta->fils_pending_assoc_req);
@@ -3756,7 +3577,7 @@
 #endif /* CONFIG_FILS */
 
 	reply_res = send_assoc_resp(hapd, sta, mgmt->sa, resp, reassoc, pos,
-				    left, rssi);
+				    left);
 	os_free(tmp);
 
 	/*
@@ -3911,7 +3732,9 @@
 		return 0;
 	}
 
-	ieee802_11_sa_query_action(hapd, mgmt, len);
+	ieee802_11_sa_query_action(hapd, mgmt->sa,
+				   mgmt->u.action.u.sa_query_resp.action,
+				   mgmt->u.action.u.sa_query_resp.trans_id);
 	return 1;
 }
 
@@ -3929,9 +3752,9 @@
 			 unsigned int freq)
 {
 	struct sta_info *sta;
-	u8 *action __maybe_unused;
+	sta = ap_get_sta(hapd, mgmt->sa);
 
-	if (len < IEEE80211_HDRLEN + 2 + 1) {
+	if (len < IEEE80211_HDRLEN + 1) {
 		hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
 			       HOSTAPD_LEVEL_DEBUG,
 			       "handle_action - too short payload (len=%lu)",
@@ -3939,14 +3762,6 @@
 		return 0;
 	}
 
-	action = (u8 *) &mgmt->u.action.u;
-	wpa_printf(MSG_DEBUG, "RX_ACTION category %u action %u sa " MACSTR
-		   " da " MACSTR " len %d freq %u",
-		   mgmt->u.action.category, *action,
-		   MAC2STR(mgmt->sa), MAC2STR(mgmt->da), (int) len, freq);
-
-	sta = ap_get_sta(hapd, mgmt->sa);
-
 	if (mgmt->u.action.category != WLAN_ACTION_PUBLIC &&
 	    (sta == NULL || !(sta->flags & WLAN_STA_ASSOC))) {
 		wpa_printf(MSG_DEBUG, "IEEE 802.11: Ignored Action "
@@ -4196,17 +4011,17 @@
 	switch (stype) {
 	case WLAN_FC_STYPE_AUTH:
 		wpa_printf(MSG_DEBUG, "mgmt::auth");
-		handle_auth(hapd, mgmt, len, ssi_signal);
+		handle_auth(hapd, mgmt, len);
 		ret = 1;
 		break;
 	case WLAN_FC_STYPE_ASSOC_REQ:
 		wpa_printf(MSG_DEBUG, "mgmt::assoc_req");
-		handle_assoc(hapd, mgmt, len, 0, ssi_signal);
+		handle_assoc(hapd, mgmt, len, 0);
 		ret = 1;
 		break;
 	case WLAN_FC_STYPE_REASSOC_REQ:
 		wpa_printf(MSG_DEBUG, "mgmt::reassoc_req");
-		handle_assoc(hapd, mgmt, len, 1, ssi_signal);
+		handle_assoc(hapd, mgmt, len, 1);
 		ret = 1;
 		break;
 	case WLAN_FC_STYPE_DISASSOC:
@@ -4418,7 +4233,7 @@
 		sta->flags |= WLAN_STA_WDS;
 	}
 
-	if (sta->flags & (WLAN_STA_WDS | WLAN_STA_MULTI_AP)) {
+	if (sta->flags & WLAN_STA_WDS) {
 		int ret;
 		char ifname_wds[IFNAMSIZ + 1];
 
diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h
index 5082226..2f3b4da 100644
--- a/src/ap/ieee802_11.h
+++ b/src/ap/ieee802_11.h
@@ -59,7 +59,6 @@
 u8 * hostapd_eid_txpower_envelope(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid);
-u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid);
 
 int hostapd_ht_operation_update(struct hostapd_iface *iface);
 void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
@@ -81,8 +80,6 @@
 void ht40_intolerant_remove(struct hostapd_iface *iface, struct sta_info *sta);
 u16 copy_sta_vht_capab(struct hostapd_data *hapd, struct sta_info *sta,
 		       const u8 *vht_capab);
-u16 copy_sta_vht_oper(struct hostapd_data *hapd, struct sta_info *sta,
-		      const u8 *vht_oper);
 u16 set_sta_vht_opmode(struct hostapd_data *hapd, struct sta_info *sta,
 		       const u8 *vht_opmode);
 void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
@@ -94,8 +91,8 @@
 u8 * hostapd_eid_assoc_comeback_time(struct hostapd_data *hapd,
 				     struct sta_info *sta, u8 *eid);
 void ieee802_11_sa_query_action(struct hostapd_data *hapd,
-				const struct ieee80211_mgmt *mgmt,
-				size_t len);
+				const u8 *sa, const u8 action_type,
+				const u8 *trans_id);
 u8 * hostapd_eid_interworking(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_adv_proto(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_roaming_consortium(struct hostapd_data *hapd, u8 *eid);
@@ -123,9 +120,6 @@
 
 u8 hostapd_mbo_ie_len(struct hostapd_data *hapd);
 
-u8 * hostapd_eid_mbo_rssi_assoc_rej(struct hostapd_data *hapd, u8 *eid,
-				    size_t len, int delta);
-
 #else /* CONFIG_MBO */
 
 static inline u8 * hostapd_eid_mbo(struct hostapd_data *hapd, u8 *eid,
@@ -172,7 +166,4 @@
 			       char **identity, char **radius_cui,
 			       int is_probe_req);
 
-int get_tx_parameters(struct sta_info *sta, int ap_max_chanwidth,
-		      int ap_seg1_idx, int *bandwidth, int *seg1_idx);
-
 #endif /* IEEE802_11_H */
diff --git a/src/ap/ieee802_11_auth.c b/src/ap/ieee802_11_auth.c
index 931d4d0..5cb7fb1 100644
--- a/src/ap/ieee802_11_auth.c
+++ b/src/ap/ieee802_11_auth.c
@@ -289,9 +289,6 @@
 			return HOSTAPD_ACL_ACCEPT;
 		};
 
-		if (hapd->conf->ssid.dynamic_vlan == DYNAMIC_VLAN_DISABLED)
-			vlan_id = NULL;
-
 		/* Check whether ACL cache has an entry for this station */
 		res = hostapd_acl_cache_get(hapd, addr, session_timeout,
 					    acct_interim_interval, vlan_id, psk,
@@ -519,6 +516,7 @@
 	struct hostapd_acl_query_data *query, *prev;
 	struct hostapd_cached_radius_acl *cache;
 	struct radius_hdr *hdr = radius_msg_get_hdr(msg);
+	int *untagged, *tagged, *notempty;
 
 	query = hapd->acl_queries;
 	prev = NULL;
@@ -576,10 +574,12 @@
 			cache->acct_interim_interval = 0;
 		}
 
-		if (hapd->conf->ssid.dynamic_vlan != DYNAMIC_VLAN_DISABLED)
-			cache->vlan_id.notempty = !!radius_msg_get_vlanid(
-				msg, &cache->vlan_id.untagged,
-				MAX_NUM_TAGGED_VLAN, cache->vlan_id.tagged);
+		notempty = &cache->vlan_id.notempty;
+		untagged = &cache->vlan_id.untagged;
+		tagged = cache->vlan_id.tagged;
+		*notempty = !!radius_msg_get_vlanid(msg, untagged,
+						    MAX_NUM_TAGGED_VLAN,
+						    tagged);
 
 		decode_tunnel_passwords(hapd, shared_secret, shared_secret_len,
 					msg, req, cache);
diff --git a/src/ap/ieee802_11_he.c b/src/ap/ieee802_11_he.c
index 0721358..1a8d469 100644
--- a/src/ap/ieee802_11_he.c
+++ b/src/ap/ieee802_11_he.c
@@ -86,34 +86,3 @@
 
 	return pos;
 }
-
-
-u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid)
-{
-	struct ieee80211_he_mu_edca_parameter_set *edca;
-	u8 *pos;
-	size_t i;
-
-	pos = (u8 *) &hapd->iface->conf->he_mu_edca;
-	for (i = 0; i < sizeof(*edca); i++) {
-		if (pos[i])
-			break;
-	}
-	if (i == sizeof(*edca))
-		return eid; /* no MU EDCA Parameters configured */
-
-	pos = eid;
-	*pos++ = WLAN_EID_EXTENSION;
-	*pos++ = 1 + sizeof(*edca);
-	*pos++ = WLAN_EID_EXT_HE_MU_EDCA_PARAMS;
-
-	edca = (struct ieee80211_he_mu_edca_parameter_set *) pos;
-	os_memcpy(edca, &hapd->iface->conf->he_mu_edca, sizeof(*edca));
-
-	wpa_hexdump(MSG_DEBUG, "HE: MU EDCA Parameter Set element",
-		    pos, sizeof(*edca));
-
-	pos += sizeof(*edca);
-
-	return pos;
-}
diff --git a/src/ap/ieee802_11_shared.c b/src/ap/ieee802_11_shared.c
index d70d6c1..c481399 100644
--- a/src/ap/ieee802_11_shared.c
+++ b/src/ap/ieee802_11_shared.c
@@ -10,12 +10,10 @@
 
 #include "utils/common.h"
 #include "common/ieee802_11_defs.h"
-#include "common/ocv.h"
 #include "hostapd.h"
 #include "sta_info.h"
 #include "ap_config.h"
 #include "ap_drv_ops.h"
-#include "wpa_auth.h"
 #include "ieee802_11.h"
 
 
@@ -51,12 +49,7 @@
 void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
 				  const u8 *addr, const u8 *trans_id)
 {
-#ifdef CONFIG_OCV
-	struct sta_info *sta;
-#endif /* CONFIG_OCV */
-	struct ieee80211_mgmt *mgmt;
-	u8 *oci_ie = NULL;
-	u8 oci_ie_len = 0;
+	struct ieee80211_mgmt mgmt;
 	u8 *end;
 
 	wpa_printf(MSG_DEBUG, "IEEE 802.11: Sending SA Query Request to "
@@ -64,61 +57,19 @@
 	wpa_hexdump(MSG_DEBUG, "IEEE 802.11: SA Query Transaction ID",
 		    trans_id, WLAN_SA_QUERY_TR_ID_LEN);
 
-#ifdef CONFIG_OCV
-	sta = ap_get_sta(hapd, addr);
-	if (sta && wpa_auth_uses_ocv(sta->wpa_sm)) {
-		struct wpa_channel_info ci;
-
-		if (hostapd_drv_channel_info(hapd, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info for OCI element in SA Query Request");
-			return;
-		}
-
-		oci_ie_len = OCV_OCI_EXTENDED_LEN;
-		oci_ie = os_zalloc(oci_ie_len);
-		if (!oci_ie) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to allocate buffer for OCI element in SA Query Request");
-			return;
-		}
-
-		if (ocv_insert_extended_oci(&ci, oci_ie) < 0) {
-			os_free(oci_ie);
-			return;
-		}
-	}
-#endif /* CONFIG_OCV */
-
-	mgmt = os_zalloc(sizeof(*mgmt) + oci_ie_len);
-	if (!mgmt) {
-		wpa_printf(MSG_DEBUG,
-			   "Failed to allocate buffer for SA Query Response frame");
-		os_free(oci_ie);
-		return;
-	}
-
-	mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
-					   WLAN_FC_STYPE_ACTION);
-	os_memcpy(mgmt->da, addr, ETH_ALEN);
-	os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN);
-	os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN);
-	mgmt->u.action.category = WLAN_ACTION_SA_QUERY;
-	mgmt->u.action.u.sa_query_req.action = WLAN_SA_QUERY_REQUEST;
-	os_memcpy(mgmt->u.action.u.sa_query_req.trans_id, trans_id,
+	os_memset(&mgmt, 0, sizeof(mgmt));
+	mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
+					  WLAN_FC_STYPE_ACTION);
+	os_memcpy(mgmt.da, addr, ETH_ALEN);
+	os_memcpy(mgmt.sa, hapd->own_addr, ETH_ALEN);
+	os_memcpy(mgmt.bssid, hapd->own_addr, ETH_ALEN);
+	mgmt.u.action.category = WLAN_ACTION_SA_QUERY;
+	mgmt.u.action.u.sa_query_req.action = WLAN_SA_QUERY_REQUEST;
+	os_memcpy(mgmt.u.action.u.sa_query_req.trans_id, trans_id,
 		  WLAN_SA_QUERY_TR_ID_LEN);
-	end = mgmt->u.action.u.sa_query_req.variable;
-#ifdef CONFIG_OCV
-	if (oci_ie_len > 0) {
-		os_memcpy(end, oci_ie, oci_ie_len);
-		end += oci_ie_len;
-	}
-#endif /* CONFIG_OCV */
-	if (hostapd_drv_send_mlme(hapd, mgmt, end - (u8 *) mgmt, 0) < 0)
+	end = mgmt.u.action.u.sa_query_req.trans_id + WLAN_SA_QUERY_TR_ID_LEN;
+	if (hostapd_drv_send_mlme(hapd, &mgmt, end - (u8 *) &mgmt, 0) < 0)
 		wpa_printf(MSG_INFO, "ieee802_11_send_sa_query_req: send failed");
-
-	os_free(mgmt);
-	os_free(oci_ie);
 }
 
 
@@ -126,9 +77,7 @@
 					  const u8 *sa, const u8 *trans_id)
 {
 	struct sta_info *sta;
-	struct ieee80211_mgmt *resp;
-	u8 *oci_ie = NULL;
-	u8 oci_ie_len = 0;
+	struct ieee80211_mgmt resp;
 	u8 *end;
 
 	wpa_printf(MSG_DEBUG, "IEEE 802.11: Received SA Query Request from "
@@ -143,115 +92,30 @@
 		return;
 	}
 
-#ifdef CONFIG_OCV
-	if (wpa_auth_uses_ocv(sta->wpa_sm)) {
-		struct wpa_channel_info ci;
-
-		if (hostapd_drv_channel_info(hapd, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info for OCI element in SA Query Response");
-			return;
-		}
-
-		oci_ie_len = OCV_OCI_EXTENDED_LEN;
-		oci_ie = os_zalloc(oci_ie_len);
-		if (!oci_ie) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to allocate buffer for for OCI element in SA Query Response");
-			return;
-		}
-
-		if (ocv_insert_extended_oci(&ci, oci_ie) < 0) {
-			os_free(oci_ie);
-			return;
-		}
-	}
-#endif /* CONFIG_OCV */
-
-	resp = os_zalloc(sizeof(*resp) + oci_ie_len);
-	if (!resp) {
-		wpa_printf(MSG_DEBUG,
-			   "Failed to allocate buffer for SA Query Response frame");
-		os_free(oci_ie);
-		return;
-	}
-
 	wpa_printf(MSG_DEBUG, "IEEE 802.11: Sending SA Query Response to "
 		   MACSTR, MAC2STR(sa));
 
-	resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
-					   WLAN_FC_STYPE_ACTION);
-	os_memcpy(resp->da, sa, ETH_ALEN);
-	os_memcpy(resp->sa, hapd->own_addr, ETH_ALEN);
-	os_memcpy(resp->bssid, hapd->own_addr, ETH_ALEN);
-	resp->u.action.category = WLAN_ACTION_SA_QUERY;
-	resp->u.action.u.sa_query_req.action = WLAN_SA_QUERY_RESPONSE;
-	os_memcpy(resp->u.action.u.sa_query_req.trans_id, trans_id,
+	os_memset(&resp, 0, sizeof(resp));
+	resp.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
+					  WLAN_FC_STYPE_ACTION);
+	os_memcpy(resp.da, sa, ETH_ALEN);
+	os_memcpy(resp.sa, hapd->own_addr, ETH_ALEN);
+	os_memcpy(resp.bssid, hapd->own_addr, ETH_ALEN);
+	resp.u.action.category = WLAN_ACTION_SA_QUERY;
+	resp.u.action.u.sa_query_req.action = WLAN_SA_QUERY_RESPONSE;
+	os_memcpy(resp.u.action.u.sa_query_req.trans_id, trans_id,
 		  WLAN_SA_QUERY_TR_ID_LEN);
-	end = resp->u.action.u.sa_query_req.variable;
-#ifdef CONFIG_OCV
-	if (oci_ie_len > 0) {
-		os_memcpy(end, oci_ie, oci_ie_len);
-		end += oci_ie_len;
-	}
-#endif /* CONFIG_OCV */
-	if (hostapd_drv_send_mlme(hapd, resp, end - (u8 *) resp, 0) < 0)
+	end = resp.u.action.u.sa_query_req.trans_id + WLAN_SA_QUERY_TR_ID_LEN;
+	if (hostapd_drv_send_mlme(hapd, &resp, end - (u8 *) &resp, 0) < 0)
 		wpa_printf(MSG_INFO, "ieee80211_mgmt_sa_query_request: send failed");
-
-	os_free(resp);
-	os_free(oci_ie);
 }
 
 
-void ieee802_11_sa_query_action(struct hostapd_data *hapd,
-				const struct ieee80211_mgmt *mgmt,
-				size_t len)
+void ieee802_11_sa_query_action(struct hostapd_data *hapd, const u8 *sa,
+				const u8 action_type, const u8 *trans_id)
 {
 	struct sta_info *sta;
 	int i;
-	const u8 *sa = mgmt->sa;
-	const u8 action_type = mgmt->u.action.u.sa_query_resp.action;
-	const u8 *trans_id = mgmt->u.action.u.sa_query_resp.trans_id;
-
-	sta = ap_get_sta(hapd, sa);
-
-#ifdef CONFIG_OCV
-	if (sta && wpa_auth_uses_ocv(sta->wpa_sm)) {
-		struct ieee802_11_elems elems;
-		struct wpa_channel_info ci;
-		int tx_chanwidth;
-		int tx_seg1_idx;
-		size_t ies_len;
-		const u8 *ies;
-
-		ies = mgmt->u.action.u.sa_query_resp.variable;
-		ies_len = len - (ies - (u8 *) mgmt);
-		if (ieee802_11_parse_elems(ies, ies_len, &elems, 1) ==
-		    ParseFailed) {
-			wpa_printf(MSG_DEBUG,
-				   "SA Query: Failed to parse elements");
-			return;
-		}
-
-		if (hostapd_drv_channel_info(hapd, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info to validate received OCI in SA Query Action frame");
-			return;
-		}
-
-		if (get_sta_tx_parameters(sta->wpa_sm,
-					  channel_width_to_int(ci.chanwidth),
-					  ci.seg1_idx, &tx_chanwidth,
-					  &tx_seg1_idx) < 0)
-			return;
-
-		if (ocv_verify_tx_params(elems.oci, elems.oci_len, &ci,
-					 tx_chanwidth, tx_seg1_idx) != 0) {
-			wpa_printf(MSG_WARNING, "%s", ocv_errorstr);
-			return;
-		}
-	}
-#endif /* CONFIG_OCV */
 
 	if (action_type == WLAN_SA_QUERY_REQUEST) {
 		ieee802_11_send_sa_query_resp(hapd, sa, trans_id);
@@ -271,6 +135,7 @@
 
 	/* MLME-SAQuery.confirm */
 
+	sta = ap_get_sta(hapd, sa);
 	if (sta == NULL || sta->sa_query_trans_id == NULL) {
 		wpa_printf(MSG_DEBUG, "IEEE 802.11: No matching STA with "
 			   "pending SA Query request found");
@@ -372,21 +237,6 @@
 			*pos |= 0x01;
 #endif /* CONFIG_FILS */
 		break;
-	case 10: /* Bits 80-87 */
-#ifdef CONFIG_SAE
-		if (hapd->conf->wpa &&
-		    wpa_key_mgmt_sae(hapd->conf->wpa_key_mgmt)) {
-			int in_use = hostapd_sae_pw_id_in_use(hapd->conf);
-
-			if (in_use)
-				*pos |= 0x02; /* Bit 81 - SAE Password
-					       * Identifiers In Use */
-			if (in_use == 2)
-				*pos |= 0x04; /* Bit 82 - SAE Password
-					       * Identifiers Used Exclusively */
-		}
-#endif /* CONFIG_SAE */
-		break;
 	}
 }
 
@@ -426,12 +276,6 @@
 	     !wpa_key_mgmt_fils(hapd->conf->wpa_key_mgmt)) && len < 10)
 		len = 10;
 #endif /* CONFIG_FILS */
-#ifdef CONFIG_SAE
-	if (len < 11 && hapd->conf->wpa &&
-	    wpa_key_mgmt_sae(hapd->conf->wpa_key_mgmt) &&
-	    hostapd_sae_pw_id_in_use(hapd->conf))
-		len = 11;
-#endif /* CONFIG_SAE */
 	if (len < hapd->iface->extended_capa_len)
 		len = hapd->iface->extended_capa_len;
 	if (len == 0)
@@ -703,29 +547,12 @@
 
 #ifdef CONFIG_MBO
 
-u8 * hostapd_eid_mbo_rssi_assoc_rej(struct hostapd_data *hapd, u8 *eid,
-				    size_t len, int delta)
-{
-	u8 mbo[4];
-
-	mbo[0] = OCE_ATTR_ID_RSSI_BASED_ASSOC_REJECT;
-	mbo[1] = 2;
-	/* Delta RSSI */
-	mbo[2] = delta;
-	/* Retry delay */
-	mbo[3] = hapd->iconf->rssi_reject_assoc_timeout;
-
-	return eid + mbo_add_ie(eid, len, mbo, 4);
-}
-
-
 u8 * hostapd_eid_mbo(struct hostapd_data *hapd, u8 *eid, size_t len)
 {
 	u8 mbo[9], *mbo_pos = mbo;
 	u8 *pos = eid;
 
-	if (!hapd->conf->mbo_enabled &&
-	    !OCE_STA_CFON_ENABLED(hapd) && !OCE_AP_ENABLED(hapd))
+	if (!hapd->conf->mbo_enabled && !hapd->enable_oce)
 		return eid;
 
 	if (hapd->conf->mbo_enabled) {
@@ -741,11 +568,12 @@
 		*mbo_pos++ = hapd->mbo_assoc_disallow;
 	}
 
-	if (OCE_STA_CFON_ENABLED(hapd) || OCE_AP_ENABLED(hapd)) {
+	if (hapd->enable_oce & (OCE_AP | OCE_STA_CFON)) {
 		u8 ctrl;
 
 		ctrl = OCE_RELEASE;
-		if (OCE_STA_CFON_ENABLED(hapd) && !OCE_AP_ENABLED(hapd))
+		if ((hapd->enable_oce & (OCE_AP | OCE_STA_CFON)) ==
+		    OCE_STA_CFON)
 			ctrl |= OCE_IS_STA_CFON;
 
 		*mbo_pos++ = OCE_ATTR_ID_CAPA_IND;
@@ -763,8 +591,7 @@
 {
 	u8 len;
 
-	if (!hapd->conf->mbo_enabled &&
-	    !OCE_STA_CFON_ENABLED(hapd) && !OCE_AP_ENABLED(hapd))
+	if (!hapd->conf->mbo_enabled && !hapd->enable_oce)
 		return 0;
 
 	/*
@@ -776,7 +603,7 @@
 		len += 3 + (hapd->mbo_assoc_disallow ? 3 : 0);
 
 	/* OCE capability indication attribute (3) */
-	if (OCE_STA_CFON_ENABLED(hapd) || OCE_AP_ENABLED(hapd))
+	if (hapd->enable_oce & (OCE_AP | OCE_STA_CFON))
 		len += 3;
 
 	return len;
@@ -924,71 +751,3 @@
 
 	return pos;
 }
-
-
-#ifdef CONFIG_OCV
-int get_tx_parameters(struct sta_info *sta, int ap_max_chanwidth,
-		      int ap_seg1_idx, int *bandwidth, int *seg1_idx)
-{
-	int ht_40mhz = 0;
-	int vht_80p80 = 0;
-	int requested_bw;
-
-	if (sta->ht_capabilities)
-		ht_40mhz = !!(sta->ht_capabilities->ht_capabilities_info &
-			      HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET);
-
-	if (sta->vht_operation) {
-		struct ieee80211_vht_operation *oper = sta->vht_operation;
-
-		/*
-		 * If a VHT Operation element was present, use it to determine
-		 * the supported channel bandwidth.
-		 */
-		if (oper->vht_op_info_chwidth == 0) {
-			requested_bw = ht_40mhz ? 40 : 20;
-		} else if (oper->vht_op_info_chan_center_freq_seg1_idx == 0) {
-			requested_bw = 80;
-		} else {
-			int diff;
-
-			requested_bw = 160;
-			diff = abs((int)
-				   oper->vht_op_info_chan_center_freq_seg0_idx -
-				   (int)
-				   oper->vht_op_info_chan_center_freq_seg1_idx);
-			vht_80p80 = oper->vht_op_info_chan_center_freq_seg1_idx
-				!= 0 &&	diff > 16;
-		}
-	} else if (sta->vht_capabilities) {
-		struct ieee80211_vht_capabilities *capab;
-		int vht_chanwidth;
-
-		capab = sta->vht_capabilities;
-
-		/*
-		 * If only the VHT Capabilities element is present (e.g., for
-		 * normal clients), use it to determine the supported channel
-		 * bandwidth.
-		 */
-		vht_chanwidth = capab->vht_capabilities_info &
-			VHT_CAP_SUPP_CHAN_WIDTH_MASK;
-		vht_80p80 = capab->vht_capabilities_info &
-			VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
-
-		/* TODO: Also take into account Extended NSS BW Support field */
-		requested_bw = vht_chanwidth ? 160 : 80;
-	} else {
-		requested_bw = ht_40mhz ? 40 : 20;
-	}
-
-	*bandwidth = requested_bw < ap_max_chanwidth ?
-		requested_bw : ap_max_chanwidth;
-
-	*seg1_idx = 0;
-	if (ap_seg1_idx && vht_80p80)
-		*seg1_idx = ap_seg1_idx;
-
-	return 0;
-}
-#endif /* CONFIG_OCV */
diff --git a/src/ap/ieee802_11_vht.c b/src/ap/ieee802_11_vht.c
index 54ee080..8d06620 100644
--- a/src/ap/ieee802_11_vht.c
+++ b/src/ap/ieee802_11_vht.c
@@ -357,29 +357,6 @@
 }
 
 
-u16 copy_sta_vht_oper(struct hostapd_data *hapd, struct sta_info *sta,
-		      const u8 *vht_oper)
-{
-	if (!vht_oper) {
-		os_free(sta->vht_operation);
-		sta->vht_operation = NULL;
-		return WLAN_STATUS_SUCCESS;
-	}
-
-	if (!sta->vht_operation) {
-		sta->vht_operation =
-			os_zalloc(sizeof(struct ieee80211_vht_operation));
-		if (!sta->vht_operation)
-			return WLAN_STATUS_UNSPECIFIED_FAILURE;
-	}
-
-	os_memcpy(sta->vht_operation, vht_oper,
-		  sizeof(struct ieee80211_vht_operation));
-
-	return WLAN_STATUS_SUCCESS;
-}
-
-
 u16 copy_sta_vendor_vht(struct hostapd_data *hapd, struct sta_info *sta,
 			const u8 *ie, size_t len)
 {
diff --git a/src/ap/ieee802_1x.c b/src/ap/ieee802_1x.c
index a56c82e..985f8b7 100644
--- a/src/ap/ieee802_1x.c
+++ b/src/ap/ieee802_1x.c
@@ -1,6 +1,6 @@
 /*
  * hostapd / IEEE 802.1X-2004 Authenticator
- * Copyright (c) 2002-2019, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2012, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -682,8 +682,7 @@
 
 #ifdef CONFIG_HS20
 	if (hapd->conf->hs20) {
-		u8 ver = hapd->conf->hs20_release - 1;
-
+		u8 ver = 1; /* Release 2 */
 		if (!radius_msg_add_wfa(
 			    msg, RADIUS_VENDOR_ATTR_WFA_HS20_AP_VERSION,
 			    &ver, 1)) {
@@ -1742,45 +1741,6 @@
 }
 
 
-#ifndef CONFIG_NO_VLAN
-static int ieee802_1x_update_vlan(struct radius_msg *msg,
-				  struct hostapd_data *hapd,
-				  struct sta_info *sta)
-{
-	struct vlan_description vlan_desc;
-
-	os_memset(&vlan_desc, 0, sizeof(vlan_desc));
-	vlan_desc.notempty = !!radius_msg_get_vlanid(msg, &vlan_desc.untagged,
-						     MAX_NUM_TAGGED_VLAN,
-						     vlan_desc.tagged);
-
-	if (vlan_desc.notempty &&
-	    !hostapd_vlan_valid(hapd->conf->vlan, &vlan_desc)) {
-		sta->eapol_sm->authFail = TRUE;
-		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_RADIUS,
-			       HOSTAPD_LEVEL_INFO,
-			       "Invalid VLAN %d%s received from RADIUS server",
-			       vlan_desc.untagged,
-			       vlan_desc.tagged[0] ? "+" : "");
-		os_memset(&vlan_desc, 0, sizeof(vlan_desc));
-		ap_sta_set_vlan(hapd, sta, &vlan_desc);
-		return -1;
-	}
-
-	if (hapd->conf->ssid.dynamic_vlan == DYNAMIC_VLAN_REQUIRED &&
-	    !vlan_desc.notempty) {
-		sta->eapol_sm->authFail = TRUE;
-		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
-			       HOSTAPD_LEVEL_INFO,
-			       "authentication server did not include required VLAN ID in Access-Accept");
-		return -1;
-	}
-
-	return ap_sta_set_vlan(hapd, sta, &vlan_desc);
-}
-#endif /* CONFIG_NO_VLAN */
-
-
 /**
  * ieee802_1x_receive_auth - Process RADIUS frames from Authentication Server
  * @msg: RADIUS response message
@@ -1803,6 +1763,12 @@
 	struct eapol_state_machine *sm;
 	int override_eapReq = 0;
 	struct radius_hdr *hdr = radius_msg_get_hdr(msg);
+	struct vlan_description vlan_desc;
+#ifndef CONFIG_NO_VLAN
+	int *untagged, *tagged, *notempty;
+#endif /* CONFIG_NO_VLAN */
+
+	os_memset(&vlan_desc, 0, sizeof(vlan_desc));
 
 	sm = ieee802_1x_search_radius_identifier(hapd, hdr->identifier);
 	if (sm == NULL) {
@@ -1867,21 +1833,56 @@
 	switch (hdr->code) {
 	case RADIUS_CODE_ACCESS_ACCEPT:
 #ifndef CONFIG_NO_VLAN
-		if (hapd->conf->ssid.dynamic_vlan != DYNAMIC_VLAN_DISABLED &&
-		    ieee802_1x_update_vlan(msg, hapd, sta) < 0)
+		if (hapd->conf->ssid.dynamic_vlan != DYNAMIC_VLAN_DISABLED) {
+			notempty = &vlan_desc.notempty;
+			untagged = &vlan_desc.untagged;
+			tagged = vlan_desc.tagged;
+			*notempty = !!radius_msg_get_vlanid(msg, untagged,
+							    MAX_NUM_TAGGED_VLAN,
+							    tagged);
+		}
+
+		if (vlan_desc.notempty &&
+		    !hostapd_vlan_valid(hapd->conf->vlan, &vlan_desc)) {
+			sta->eapol_sm->authFail = TRUE;
+			hostapd_logger(hapd, sta->addr,
+				       HOSTAPD_MODULE_RADIUS,
+				       HOSTAPD_LEVEL_INFO,
+				       "Invalid VLAN %d%s received from RADIUS server",
+				       vlan_desc.untagged,
+				       vlan_desc.tagged[0] ? "+" : "");
+			os_memset(&vlan_desc, 0, sizeof(vlan_desc));
+			ap_sta_set_vlan(hapd, sta, &vlan_desc);
+			break;
+		}
+
+		if (hapd->conf->ssid.dynamic_vlan == DYNAMIC_VLAN_REQUIRED &&
+		    !vlan_desc.notempty) {
+			sta->eapol_sm->authFail = TRUE;
+			hostapd_logger(hapd, sta->addr,
+				       HOSTAPD_MODULE_IEEE8021X,
+				       HOSTAPD_LEVEL_INFO, "authentication "
+				       "server did not include required VLAN "
+				       "ID in Access-Accept");
+			break;
+		}
+#endif /* CONFIG_NO_VLAN */
+
+		if (ap_sta_set_vlan(hapd, sta, &vlan_desc) < 0)
 			break;
 
+#ifndef CONFIG_NO_VLAN
 		if (sta->vlan_id > 0) {
 			hostapd_logger(hapd, sta->addr,
 				       HOSTAPD_MODULE_RADIUS,
 				       HOSTAPD_LEVEL_INFO,
 				       "VLAN ID %d", sta->vlan_id);
 		}
+#endif /* CONFIG_NO_VLAN */
 
 		if ((sta->flags & WLAN_STA_ASSOC) &&
 		    ap_sta_bind_vlan(hapd, sta) < 0)
 			break;
-#endif /* CONFIG_NO_VLAN */
 
 		sta->session_timeout_set = !!session_timeout_set;
 		os_get_reltime(&sta->session_timeout);
@@ -2594,7 +2595,6 @@
 	struct os_reltime diff;
 	const char *name1;
 	const char *name2;
-	char *identity_buf = NULL;
 
 	if (sm == NULL)
 		return 0;
@@ -2710,14 +2710,6 @@
 
 	/* dot1xAuthSessionStatsTable */
 	os_reltime_age(&sta->acct_session_start, &diff);
-	if (sm->eap && !sm->identity) {
-		const u8 *id;
-		size_t id_len;
-
-		id = eap_get_identity(sm->eap, &id_len);
-		if (id)
-			identity_buf = dup_binstr(id, id_len);
-	}
 	ret = os_snprintf(buf + len, buflen - len,
 			  /* TODO: dot1xAuthSessionOctetsRx */
 			  /* TODO: dot1xAuthSessionOctetsTx */
@@ -2733,8 +2725,7 @@
 				   wpa_auth_sta_key_mgmt(sta->wpa_sm))) ?
 			  1 : 2,
 			  (unsigned int) diff.sec,
-			  sm->identity ? (char *) sm->identity : identity_buf);
-	os_free(identity_buf);
+			  sm->identity);
 	if (os_snprintf_error(buflen - len, ret))
 		return len;
 	len += ret;
diff --git a/src/ap/neighbor_db.c b/src/ap/neighbor_db.c
index 2b6f727..b8fd592 100644
--- a/src/ap/neighbor_db.c
+++ b/src/ap/neighbor_db.c
@@ -11,7 +11,6 @@
 
 #include "utils/common.h"
 #include "hostapd.h"
-#include "ieee802_11.h"
 #include "neighbor_db.h"
 
 
@@ -124,7 +123,7 @@
 }
 
 
-void hostapd_free_neighbor_db(struct hostapd_data *hapd)
+void hostpad_free_neighbor_db(struct hostapd_data *hapd)
 {
 	struct hostapd_neighbor_entry *nr, *prev;
 
@@ -135,123 +134,3 @@
 		os_free(nr);
 	}
 }
-
-
-#ifdef NEED_AP_MLME
-static enum nr_chan_width hostapd_get_nr_chan_width(struct hostapd_data *hapd,
-						    int ht, int vht)
-{
-	if (!ht && !vht)
-		return NR_CHAN_WIDTH_20;
-	if (!hapd->iconf->secondary_channel)
-		return NR_CHAN_WIDTH_20;
-	if (!vht || hapd->iconf->vht_oper_chwidth == VHT_CHANWIDTH_USE_HT)
-		return NR_CHAN_WIDTH_40;
-	if (hapd->iconf->vht_oper_chwidth == VHT_CHANWIDTH_80MHZ)
-		return NR_CHAN_WIDTH_80;
-	if (hapd->iconf->vht_oper_chwidth == VHT_CHANWIDTH_160MHZ)
-		return NR_CHAN_WIDTH_160;
-	if (hapd->iconf->vht_oper_chwidth == VHT_CHANWIDTH_80P80MHZ)
-		return NR_CHAN_WIDTH_80P80;
-	return NR_CHAN_WIDTH_20;
-}
-#endif /* NEED_AP_MLME */
-
-
-void hostapd_neighbor_set_own_report(struct hostapd_data *hapd)
-{
-#ifdef NEED_AP_MLME
-	u16 capab = hostapd_own_capab_info(hapd);
-	int ht = hapd->iconf->ieee80211n && !hapd->conf->disable_11n;
-	int vht = hapd->iconf->ieee80211ac && !hapd->conf->disable_11ac;
-	struct wpa_ssid_value ssid;
-	u8 channel, op_class;
-	u8 center_freq1_idx = 0, center_freq2_idx = 0;
-	enum nr_chan_width width;
-	u32 bssid_info;
-	struct wpabuf *nr;
-
-	if (!(hapd->conf->radio_measurements[0] &
-	      WLAN_RRM_CAPS_NEIGHBOR_REPORT))
-		return;
-
-	bssid_info = 3; /* AP is reachable */
-	bssid_info |= NEI_REP_BSSID_INFO_SECURITY; /* "same as the AP" */
-	bssid_info |= NEI_REP_BSSID_INFO_KEY_SCOPE; /* "same as the AP" */
-
-	if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT)
-		bssid_info |= NEI_REP_BSSID_INFO_SPECTRUM_MGMT;
-
-	bssid_info |= NEI_REP_BSSID_INFO_RM; /* RRM is supported */
-
-	if (hapd->conf->wmm_enabled) {
-		bssid_info |= NEI_REP_BSSID_INFO_QOS;
-
-		if (hapd->conf->wmm_uapsd &&
-		    (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_AP_UAPSD))
-			bssid_info |= NEI_REP_BSSID_INFO_APSD;
-	}
-
-	if (ht) {
-		bssid_info |= NEI_REP_BSSID_INFO_HT |
-			NEI_REP_BSSID_INFO_DELAYED_BA;
-
-		/* VHT bit added in IEEE P802.11-REVmc/D4.3 */
-		if (vht)
-			bssid_info |= NEI_REP_BSSID_INFO_VHT;
-	}
-
-	/* TODO: Set NEI_REP_BSSID_INFO_MOBILITY_DOMAIN if MDE is set */
-
-	if (ieee80211_freq_to_channel_ext(hapd->iface->freq,
-					  hapd->iconf->secondary_channel,
-					  hapd->iconf->vht_oper_chwidth,
-					  &op_class, &channel) ==
-	    NUM_HOSTAPD_MODES)
-		return;
-	width = hostapd_get_nr_chan_width(hapd, ht, vht);
-	if (vht) {
-		center_freq1_idx = hapd->iconf->vht_oper_centr_freq_seg0_idx;
-		if (width == NR_CHAN_WIDTH_80P80)
-			center_freq2_idx =
-				hapd->iconf->vht_oper_centr_freq_seg1_idx;
-	} else if (ht) {
-		ieee80211_freq_to_chan(hapd->iface->freq +
-				       10 * hapd->iconf->secondary_channel,
-				       &center_freq1_idx);
-	}
-
-	ssid.ssid_len = hapd->conf->ssid.ssid_len;
-	os_memcpy(ssid.ssid, hapd->conf->ssid.ssid, ssid.ssid_len);
-
-	/*
-	 * Neighbor Report element size = BSSID + BSSID info + op_class + chan +
-	 * phy type + wide bandwidth channel subelement.
-	 */
-	nr = wpabuf_alloc(ETH_ALEN + 4 + 1 + 1 + 1 + 5);
-	if (!nr)
-		return;
-
-	wpabuf_put_data(nr, hapd->own_addr, ETH_ALEN);
-	wpabuf_put_le32(nr, bssid_info);
-	wpabuf_put_u8(nr, op_class);
-	wpabuf_put_u8(nr, channel);
-	wpabuf_put_u8(nr, ieee80211_get_phy_type(hapd->iface->freq, ht, vht));
-
-	/*
-	 * Wide Bandwidth Channel subelement may be needed to allow the
-	 * receiving STA to send packets to the AP. See IEEE P802.11-REVmc/D5.0
-	 * Figure 9-301.
-	 */
-	wpabuf_put_u8(nr, WNM_NEIGHBOR_WIDE_BW_CHAN);
-	wpabuf_put_u8(nr, 3);
-	wpabuf_put_u8(nr, width);
-	wpabuf_put_u8(nr, center_freq1_idx);
-	wpabuf_put_u8(nr, center_freq2_idx);
-
-	hostapd_neighbor_set(hapd, hapd->own_addr, &ssid, nr, hapd->iconf->lci,
-			     hapd->iconf->civic, hapd->iconf->stationary_ap);
-
-	wpabuf_free(nr);
-#endif /* NEED_AP_MLME */
-}
diff --git a/src/ap/neighbor_db.h b/src/ap/neighbor_db.h
index 9c8f4f2..ba46d88 100644
--- a/src/ap/neighbor_db.h
+++ b/src/ap/neighbor_db.h
@@ -17,9 +17,8 @@
 			 const struct wpa_ssid_value *ssid,
 			 const struct wpabuf *nr, const struct wpabuf *lci,
 			 const struct wpabuf *civic, int stationary);
-void hostapd_neighbor_set_own_report(struct hostapd_data *hapd);
 int hostapd_neighbor_remove(struct hostapd_data *hapd, const u8 *bssid,
 			    const struct wpa_ssid_value *ssid);
-void hostapd_free_neighbor_db(struct hostapd_data *hapd);
+void hostpad_free_neighbor_db(struct hostapd_data *hapd);
 
 #endif /* NEIGHBOR_DB_H */
diff --git a/src/ap/rrm.c b/src/ap/rrm.c
index f2d5cd1..56ed29c 100644
--- a/src/ap/rrm.c
+++ b/src/ap/rrm.c
@@ -558,7 +558,7 @@
 
 void hostapd_clean_rrm(struct hostapd_data *hapd)
 {
-	hostapd_free_neighbor_db(hapd);
+	hostpad_free_neighbor_db(hapd);
 	eloop_cancel_timeout(hostapd_lci_rep_timeout_handler, hapd, NULL);
 	hapd->lci_req_active = 0;
 	eloop_cancel_timeout(hostapd_range_rep_timeout_handler, hapd, NULL);
diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c
index 8858a34..179cf43 100644
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
@@ -166,7 +166,7 @@
 	/* just in case */
 	ap_sta_set_authorized(hapd, sta, 0);
 
-	if (sta->flags & (WLAN_STA_WDS | WLAN_STA_MULTI_AP))
+	if (sta->flags & WLAN_STA_WDS)
 		hostapd_set_wds_sta(hapd, NULL, sta->addr, sta->aid, 0);
 
 	if (sta->ipaddr)
@@ -328,7 +328,6 @@
 
 	os_free(sta->ht_capabilities);
 	os_free(sta->vht_capabilities);
-	os_free(sta->vht_operation);
 	hostapd_free_psk_list(sta->psk);
 	os_free(sta->identity);
 	os_free(sta->radius_cui);
@@ -897,6 +896,9 @@
 	struct hostapd_vlan *vlan = NULL, *wildcard_vlan = NULL;
 	int old_vlan_id, vlan_id = 0, ret = 0;
 
+	if (hapd->conf->ssid.dynamic_vlan == DYNAMIC_VLAN_DISABLED)
+		vlan_desc = NULL;
+
 	/* Check if there is something to do */
 	if (hapd->conf->ssid.per_sta_vif && !sta->vlan_id) {
 		/* This sta is lacking its own vif */
@@ -1163,32 +1165,6 @@
 #endif /* CONFIG_IEEE80211W */
 
 
-const char * ap_sta_wpa_get_keyid(struct hostapd_data *hapd,
-				  struct sta_info *sta)
-{
-	struct hostapd_wpa_psk *psk;
-	struct hostapd_ssid *ssid;
-	const u8 *pmk;
-	int pmk_len;
-
-	ssid = &hapd->conf->ssid;
-
-	pmk = wpa_auth_get_pmk(sta->wpa_sm, &pmk_len);
-	if (!pmk || pmk_len != PMK_LEN)
-		return NULL;
-
-	for (psk = ssid->wpa_psk; psk; psk = psk->next)
-		if (os_memcmp(pmk, psk->psk, PMK_LEN) == 0)
-			break;
-	if (!psk)
-		return NULL;
-	if (!psk || !psk->keyid[0])
-		return NULL;
-
-	return psk->keyid;
-}
-
-
 void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta,
 			   int authorized)
 {
@@ -1227,11 +1203,7 @@
 					sta->addr, authorized, dev_addr);
 
 	if (authorized) {
-		const char *keyid;
-		char keyid_buf[100];
 		char ip_addr[100];
-
-		keyid_buf[0] = '\0';
 		ip_addr[0] = '\0';
 #ifdef CONFIG_P2P
 		if (wpa_auth_get_ip_addr(sta->wpa_sm, ip_addr_buf) == 0) {
@@ -1242,20 +1214,14 @@
 		}
 #endif /* CONFIG_P2P */
 
-		keyid = ap_sta_wpa_get_keyid(hapd, sta);
-		if (keyid) {
-			os_snprintf(keyid_buf, sizeof(keyid_buf),
-				    " keyid=%s", keyid);
-		}
-
-		wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s%s",
-			buf, ip_addr, keyid_buf);
+		wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_CONNECTED "%s%s",
+			buf, ip_addr);
 
 		if (hapd->msg_ctx_parent &&
 		    hapd->msg_ctx_parent != hapd->msg_ctx)
 			wpa_msg_no_global(hapd->msg_ctx_parent, MSG_INFO,
-					  AP_STA_CONNECTED "%s%s%s",
-					  buf, ip_addr, keyid_buf);
+					  AP_STA_CONNECTED "%s%s",
+					  buf, ip_addr);
 	} else {
 		wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_DISCONNECTED "%s", buf);
 
diff --git a/src/ap/sta_info.h b/src/ap/sta_info.h
index ee3f628..9cac6f1 100644
--- a/src/ap/sta_info.h
+++ b/src/ap/sta_info.h
@@ -36,7 +36,6 @@
 #define WLAN_STA_VHT_OPMODE_ENABLED BIT(20)
 #define WLAN_STA_VENDOR_VHT BIT(21)
 #define WLAN_STA_PENDING_FILS_ERP BIT(22)
-#define WLAN_STA_MULTI_AP BIT(23)
 #define WLAN_STA_PENDING_DISASSOC_CB BIT(29)
 #define WLAN_STA_PENDING_DEAUTH_CB BIT(30)
 #define WLAN_STA_NONERP BIT(31)
@@ -118,7 +117,6 @@
 	unsigned int power_capab:1;
 	unsigned int agreed_to_steer:1;
 	unsigned int hs20_t_c_filtering:1;
-	unsigned int ft_over_ds:1;
 
 	u16 auth_alg;
 
@@ -164,7 +162,6 @@
 
 	struct ieee80211_ht_capabilities *ht_capabilities;
 	struct ieee80211_vht_capabilities *vht_capabilities;
-	struct ieee80211_vht_operation *vht_operation;
 	u8 vht_opmode;
 
 #ifdef CONFIG_IEEE80211W
@@ -218,7 +215,6 @@
 	u8 cell_capa; /* 0 = unknown (not an MBO STA); otherwise,
 		       * enum mbo_cellular_capa values */
 	struct mbo_non_pref_chan_info *non_pref_chan;
-	int auth_rssi; /* Last Authentication frame RSSI */
 #endif /* CONFIG_MBO */
 
 	u8 *supp_op_classes; /* Supported Operating Classes element, if
@@ -324,8 +320,6 @@
 void ap_sta_start_sa_query(struct hostapd_data *hapd, struct sta_info *sta);
 void ap_sta_stop_sa_query(struct hostapd_data *hapd, struct sta_info *sta);
 int ap_check_sa_query_timeout(struct hostapd_data *hapd, struct sta_info *sta);
-const char * ap_sta_wpa_get_keyid(struct hostapd_data *hapd,
-				  struct sta_info *sta);
 void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
 		       const u8 *addr, u16 reason);
 
diff --git a/src/ap/vlan_full.c b/src/ap/vlan_full.c
index 19aa3c6..aa42335 100644
--- a/src/ap/vlan_full.c
+++ b/src/ap/vlan_full.c
@@ -16,7 +16,6 @@
 
 #include "utils/common.h"
 #include "drivers/priv_netlink.h"
-#include "drivers/linux_ioctl.h"
 #include "common/linux_bridge.h"
 #include "common/linux_vlan.h"
 #include "utils/eloop.h"
@@ -144,9 +143,6 @@
 		return -1;
 	}
 
-	if (linux_br_del_if(fd, br_name, if_name) == 0)
-		goto done;
-
 	if_index = if_nametoindex(if_name);
 
 	if (if_index == 0) {
@@ -172,7 +168,6 @@
 		return -1;
 	}
 
-done:
 	close(fd);
 	return 0;
 }
@@ -199,14 +194,6 @@
 		return -1;
 	}
 
-	if (linux_br_add_if(fd, br_name, if_name) == 0)
-		goto done;
-	if (errno == EBUSY) {
-		/* The interface is already added. */
-		close(fd);
-		return 1;
-	}
-
 	if_index = if_nametoindex(if_name);
 
 	if (if_index == 0) {
@@ -237,7 +224,6 @@
 		return -1;
 	}
 
-done:
 	close(fd);
 	return 0;
 }
@@ -255,9 +241,6 @@
 		return -1;
 	}
 
-	if (linux_br_del(fd, br_name) == 0)
-		goto done;
-
 	arg[0] = BRCTL_DEL_BRIDGE;
 	arg[1] = (unsigned long) br_name;
 
@@ -269,7 +252,6 @@
 		return -1;
 	}
 
-done:
 	close(fd);
 	return 0;
 }
@@ -295,19 +277,11 @@
 		return -1;
 	}
 
-	if (linux_br_add(fd, br_name) == 0)
-		goto done;
-	if (errno == EEXIST) {
-		/* The bridge is already added. */
-		close(fd);
-		return 1;
-	}
-
 	arg[0] = BRCTL_ADD_BRIDGE;
 	arg[1] = (unsigned long) br_name;
 
 	if (ioctl(fd, SIOCGIFBR, arg) < 0) {
-		if (errno == EEXIST) {
+ 		if (errno == EEXIST) {
 			/* The bridge is already added. */
 			close(fd);
 			return 1;
@@ -320,7 +294,6 @@
 		}
 	}
 
-done:
 	/* Decrease forwarding delay to avoid EAPOL timeouts. */
 	os_memset(&ifr, 0, sizeof(ifr));
 	os_strlcpy(ifr.ifr_name, br_name, IFNAMSIZ);
@@ -390,18 +363,12 @@
 {
 	char vlan_ifname[IFNAMSIZ];
 	int clean;
-	int ret;
 
 	if (vlan_naming == DYNAMIC_VLAN_NAMING_WITH_DEVICE)
-		ret = os_snprintf(vlan_ifname, sizeof(vlan_ifname), "%s.%d",
-				  tagged_interface, vid);
+		os_snprintf(vlan_ifname, sizeof(vlan_ifname), "%s.%d",
+			    tagged_interface, vid);
 	else
-		ret = os_snprintf(vlan_ifname, sizeof(vlan_ifname), "vlan%d",
-				  vid);
-	if (ret >= (int) sizeof(vlan_ifname))
-		wpa_printf(MSG_WARNING,
-			   "VLAN: Interface name was truncated to %s",
-			   vlan_ifname);
+		os_snprintf(vlan_ifname, sizeof(vlan_ifname), "vlan%d", vid);
 
 	clean = 0;
 	ifconfig_up(tagged_interface);
@@ -417,28 +384,19 @@
 }
 
 
-static void vlan_bridge_name(char *br_name, struct hostapd_data *hapd,
-			     struct hostapd_vlan *vlan, int vid)
+static void vlan_bridge_name(char *br_name, struct hostapd_data *hapd, int vid)
 {
 	char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
-	int ret;
 
-	if (vlan->bridge[0]) {
-		os_strlcpy(br_name, vlan->bridge, IFNAMSIZ);
-		ret = 0;
-	} else if (hapd->conf->vlan_bridge[0]) {
-		ret = os_snprintf(br_name, IFNAMSIZ, "%s%d",
-				  hapd->conf->vlan_bridge, vid);
+	if (hapd->conf->vlan_bridge[0]) {
+		os_snprintf(br_name, IFNAMSIZ, "%s%d",
+			    hapd->conf->vlan_bridge, vid);
 	} else if (tagged_interface) {
-		ret = os_snprintf(br_name, IFNAMSIZ, "br%s.%d",
-				  tagged_interface, vid);
+		os_snprintf(br_name, IFNAMSIZ, "br%s.%d",
+			    tagged_interface, vid);
 	} else {
-		ret = os_snprintf(br_name, IFNAMSIZ, "brvlan%d", vid);
+		os_snprintf(br_name, IFNAMSIZ, "brvlan%d", vid);
 	}
-	if (ret >= IFNAMSIZ)
-		wpa_printf(MSG_WARNING,
-			   "VLAN: Interface name was truncated to %s",
-			   br_name);
 }
 
 
@@ -487,7 +445,7 @@
 		    !br_addif(hapd->conf->bridge, ifname))
 			vlan->clean |= DVLAN_CLEAN_WLAN_PORT;
 	} else if (untagged > 0 && untagged <= MAX_VLAN_ID) {
-		vlan_bridge_name(br_name, hapd, vlan, untagged);
+		vlan_bridge_name(br_name, hapd, untagged);
 
 		vlan_get_bridge(br_name, hapd, untagged);
 
@@ -500,7 +458,7 @@
 		    tagged[i] <= 0 || tagged[i] > MAX_VLAN_ID ||
 		    (i > 0 && tagged[i] == tagged[i - 1]))
 			continue;
-		vlan_bridge_name(br_name, hapd, vlan, tagged[i]);
+		vlan_bridge_name(br_name, hapd, tagged[i]);
 		vlan_get_bridge(br_name, hapd, tagged[i]);
 		vlan_newlink_tagged(DYNAMIC_VLAN_NAMING_WITH_DEVICE,
 				    ifname, br_name, tagged[i], hapd);
@@ -516,19 +474,12 @@
 {
 	char vlan_ifname[IFNAMSIZ];
 	int clean;
-	int ret;
 
 	if (vlan_naming == DYNAMIC_VLAN_NAMING_WITH_DEVICE)
-		ret = os_snprintf(vlan_ifname, sizeof(vlan_ifname), "%s.%d",
-				  tagged_interface, vid);
+		os_snprintf(vlan_ifname, sizeof(vlan_ifname), "%s.%d",
+			    tagged_interface, vid);
 	else
-		ret = os_snprintf(vlan_ifname, sizeof(vlan_ifname), "vlan%d",
-				  vid);
-	if (ret >= (int) sizeof(vlan_ifname))
-		wpa_printf(MSG_WARNING,
-			   "VLAN: Interface name was truncated to %s",
-			   vlan_ifname);
-
+		os_snprintf(vlan_ifname, sizeof(vlan_ifname), "vlan%d", vid);
 
 	clean = dyn_iface_put(hapd, vlan_ifname);
 
@@ -592,7 +543,7 @@
 			    tagged[i] <= 0 || tagged[i] > MAX_VLAN_ID ||
 			    (i > 0 && tagged[i] == tagged[i - 1]))
 				continue;
-			vlan_bridge_name(br_name, hapd, vlan, tagged[i]);
+			vlan_bridge_name(br_name, hapd, tagged[i]);
 			vlan_dellink_tagged(DYNAMIC_VLAN_NAMING_WITH_DEVICE,
 					    ifname, br_name, tagged[i], hapd);
 			vlan_put_bridge(br_name, hapd, tagged[i]);
@@ -604,7 +555,7 @@
 			    (vlan->clean & DVLAN_CLEAN_WLAN_PORT))
 				br_delif(hapd->conf->bridge, ifname);
 		} else if (untagged > 0 && untagged <= MAX_VLAN_ID) {
-			vlan_bridge_name(br_name, hapd, vlan, untagged);
+			vlan_bridge_name(br_name, hapd, untagged);
 
 			if (vlan->clean & DVLAN_CLEAN_WLAN_PORT)
 				br_delif(br_name, vlan->ifname);
diff --git a/src/ap/vlan_init.c b/src/ap/vlan_init.c
index e293a00..01fecee 100644
--- a/src/ap/vlan_init.c
+++ b/src/ap/vlan_init.c
@@ -187,7 +187,6 @@
 {
 	struct hostapd_vlan *n;
 	char ifname[IFNAMSIZ + 1], *pos;
-	int ret;
 
 	if (vlan == NULL || vlan->vlan_id != VLAN_ID_WILDCARD)
 		return NULL;
@@ -209,13 +208,8 @@
 		n->vlan_desc = *vlan_desc;
 	n->dynamic_vlan = 1;
 
-	ret = os_snprintf(n->ifname, sizeof(n->ifname), "%s%d%s",
-			  ifname, vlan_id, pos);
-	if (os_snprintf_error(sizeof(n->ifname), ret)) {
-		os_free(n);
-		return NULL;
-	}
-	os_strlcpy(n->bridge, vlan->bridge, sizeof(n->bridge));
+	os_snprintf(n->ifname, sizeof(n->ifname), "%s%d%s", ifname, vlan_id,
+		    pos);
 
 	n->next = hapd->conf->vlan;
 	hapd->conf->vlan = n;
diff --git a/src/ap/wnm_ap.c b/src/ap/wnm_ap.c
index 27c69d3..61d2f65 100644
--- a/src/ap/wnm_ap.c
+++ b/src/ap/wnm_ap.c
@@ -12,7 +12,6 @@
 #include "utils/eloop.h"
 #include "common/ieee802_11_defs.h"
 #include "common/wpa_ctrl.h"
-#include "common/ocv.h"
 #include "ap/hostapd.h"
 #include "ap/sta_info.h"
 #include "ap/ap_config.h"
@@ -55,8 +54,8 @@
 	size_t gtk_elem_len = 0;
 	size_t igtk_elem_len = 0;
 	struct wnm_sleep_element wnmsleep_ie;
-	u8 *wnmtfs_ie, *oci_ie;
-	u8 wnmsleep_ie_len, oci_ie_len;
+	u8 *wnmtfs_ie;
+	u8 wnmsleep_ie_len;
 	u16 wnmtfs_ie_len;
 	u8 *pos;
 	struct sta_info *sta;
@@ -89,42 +88,10 @@
 		wnmtfs_ie = NULL;
 	}
 
-	oci_ie = NULL;
-	oci_ie_len = 0;
-#ifdef CONFIG_OCV
-	if (action_type == WNM_SLEEP_MODE_EXIT &&
-	    wpa_auth_uses_ocv(sta->wpa_sm)) {
-		struct wpa_channel_info ci;
-
-		if (hostapd_drv_channel_info(hapd, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info for OCI element in WNM-Sleep Mode frame");
-			os_free(wnmtfs_ie);
-			return -1;
-		}
-
-		oci_ie_len = OCV_OCI_EXTENDED_LEN;
-		oci_ie = os_zalloc(oci_ie_len);
-		if (!oci_ie) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to allocate buffer for OCI element in WNM-Sleep Mode frame");
-			os_free(wnmtfs_ie);
-			return -1;
-		}
-
-		if (ocv_insert_extended_oci(&ci, oci_ie) < 0) {
-			os_free(wnmtfs_ie);
-			os_free(oci_ie);
-			return -1;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 #define MAX_GTK_SUBELEM_LEN 45
 #define MAX_IGTK_SUBELEM_LEN 26
 	mgmt = os_zalloc(sizeof(*mgmt) + wnmsleep_ie_len +
-			 MAX_GTK_SUBELEM_LEN + MAX_IGTK_SUBELEM_LEN +
-			 oci_ie_len);
+			 MAX_GTK_SUBELEM_LEN + MAX_IGTK_SUBELEM_LEN);
 	if (mgmt == NULL) {
 		wpa_printf(MSG_DEBUG, "MLME: Failed to allocate buffer for "
 			   "WNM-Sleep Response action frame");
@@ -167,18 +134,11 @@
 	os_memcpy(pos, &wnmsleep_ie, wnmsleep_ie_len);
 	/* copy TFS IE here */
 	pos += wnmsleep_ie_len;
-	if (wnmtfs_ie) {
+	if (wnmtfs_ie)
 		os_memcpy(pos, wnmtfs_ie, wnmtfs_ie_len);
-		pos += wnmtfs_ie_len;
-	}
-#ifdef CONFIG_OCV
-	/* copy OCV OCI here */
-	if (oci_ie_len > 0)
-		os_memcpy(pos, oci_ie, oci_ie_len);
-#endif /* CONFIG_OCV */
 
 	len = 1 + sizeof(mgmt->u.action.u.wnm_sleep_resp) + gtk_elem_len +
-		igtk_elem_len + wnmsleep_ie_len + wnmtfs_ie_len + oci_ie_len;
+		igtk_elem_len + wnmsleep_ie_len + wnmtfs_ie_len;
 
 	/* In driver, response frame should be forced to sent when STA is in
 	 * PS mode */
@@ -225,7 +185,6 @@
 #undef MAX_IGTK_SUBELEM_LEN
 fail:
 	os_free(wnmtfs_ie);
-	os_free(oci_ie);
 	os_free(mgmt);
 	return res;
 }
@@ -242,11 +201,6 @@
 	u8 *tfsreq_ie_start = NULL;
 	u8 *tfsreq_ie_end = NULL;
 	u16 tfsreq_ie_len = 0;
-#ifdef CONFIG_OCV
-	struct sta_info *sta;
-	const u8 *oci_ie = NULL;
-	u8 oci_ie_len = 0;
-#endif /* CONFIG_OCV */
 
 	if (!hapd->conf->wnm_sleep_mode) {
 		wpa_printf(MSG_DEBUG, "Ignore WNM-Sleep Mode Request from "
@@ -274,12 +228,6 @@
 			if (!tfsreq_ie_start)
 				tfsreq_ie_start = (u8 *) pos;
 			tfsreq_ie_end = (u8 *) pos;
-#ifdef CONFIG_OCV
-		} else if (*pos == WLAN_EID_EXTENSION && ie_len >= 1 &&
-			   pos[2] == WLAN_EID_EXT_OCV_OCI) {
-			oci_ie = pos + 3;
-			oci_ie_len = ie_len - 1;
-#endif /* CONFIG_OCV */
 		} else
 			wpa_printf(MSG_DEBUG, "WNM: EID %d not recognized",
 				   *pos);
@@ -291,27 +239,6 @@
 		return;
 	}
 
-#ifdef CONFIG_OCV
-	sta = ap_get_sta(hapd, addr);
-	if (wnmsleep_ie->action_type == WNM_SLEEP_MODE_EXIT &&
-	    sta && wpa_auth_uses_ocv(sta->wpa_sm)) {
-		struct wpa_channel_info ci;
-
-		if (hostapd_drv_channel_info(hapd, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info to validate received OCI in WNM-Sleep Mode frame");
-			return;
-		}
-
-		if (ocv_verify_tx_params(oci_ie, oci_ie_len, &ci,
-					 channel_width_to_int(ci.chanwidth),
-					 ci.seg1_idx) != 0) {
-			wpa_msg(hapd, MSG_WARNING, "WNM: %s", ocv_errorstr);
-			return;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	if (wnmsleep_ie->action_type == WNM_SLEEP_MODE_ENTER &&
 	    tfsreq_ie_start && tfsreq_ie_end &&
 	    tfsreq_ie_end - tfsreq_ie_start >= 0) {
diff --git a/src/ap/wpa_auth.c b/src/ap/wpa_auth.c
index 8e2b48e..34969e7 100644
--- a/src/ap/wpa_auth.c
+++ b/src/ap/wpa_auth.c
@@ -13,7 +13,6 @@
 #include "utils/state_machine.h"
 #include "utils/bitfield.h"
 #include "common/ieee802_11_defs.h"
-#include "common/ocv.h"
 #include "crypto/aes.h"
 #include "crypto/aes_wrap.h"
 #include "crypto/aes_siv.h"
@@ -23,7 +22,6 @@
 #include "crypto/sha384.h"
 #include "crypto/random.h"
 #include "eapol_auth/eapol_auth_sm.h"
-#include "drivers/driver.h"
 #include "ap_config.h"
 #include "ieee802_11.h"
 #include "wpa_auth.h"
@@ -240,17 +238,6 @@
 }
 
 
-#ifdef CONFIG_OCV
-static int wpa_channel_info(struct wpa_authenticator *wpa_auth,
-			    struct wpa_channel_info *ci)
-{
-	if (!wpa_auth->cb->channel_info)
-		return -1;
-	return wpa_auth->cb->channel_info(wpa_auth->cb_ctx, ci);
-}
-#endif /* CONFIG_OCV */
-
-
 static void wpa_rekey_gmk(void *eloop_ctx, void *timeout_ctx)
 {
 	struct wpa_authenticator *wpa_auth = eloop_ctx;
@@ -873,8 +860,6 @@
 
 		if (wpa_verify_key_mic(sm->wpa_key_mgmt, pmk_len, &PTK,
 				       data, data_len) == 0) {
-			os_memcpy(sm->PMK, pmk, pmk_len);
-			sm->pmk_len = pmk_len;
 			ok = 1;
 			break;
 		}
@@ -2574,27 +2559,6 @@
 	wpabuf_put(plain, tmp2 - tmp);
 
 	*len = (u8 *) wpabuf_put(plain, 0) - len - 1;
-
-#ifdef CONFIG_OCV
-	if (wpa_auth_uses_ocv(sm)) {
-		struct wpa_channel_info ci;
-		u8 *pos;
-
-		if (wpa_channel_info(sm->wpa_auth, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "FILS: Failed to get channel info for OCI element");
-			wpabuf_free(plain);
-			return NULL;
-		}
-
-		pos = wpabuf_put(plain, OCV_OCI_EXTENDED_LEN);
-		if (ocv_insert_extended_oci(&ci, pos) < 0) {
-			wpabuf_free(plain);
-			return NULL;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	return plain;
 }
 
@@ -2660,21 +2624,6 @@
 #endif /* CONFIG_FILS */
 
 
-#ifdef CONFIG_OCV
-int get_sta_tx_parameters(struct wpa_state_machine *sm, int ap_max_chanwidth,
-			  int ap_seg1_idx, int *bandwidth, int *seg1_idx)
-{
-	struct wpa_authenticator *wpa_auth = sm->wpa_auth;
-
-	if (!wpa_auth->cb->get_sta_tx_params)
-		return -1;
-	return wpa_auth->cb->get_sta_tx_params(wpa_auth->cb_ctx, sm->addr,
-					       ap_max_chanwidth, ap_seg1_idx,
-					       bandwidth, seg1_idx);
-}
-#endif /* CONFIG_OCV */
-
-
 SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
 {
 	struct wpa_authenticator *wpa_auth = sm->wpa_auth;
@@ -2726,8 +2675,6 @@
 		    wpa_verify_key_mic(sm->wpa_key_mgmt, pmk_len, &PTK,
 				       sm->last_rx_eapol_key,
 				       sm->last_rx_eapol_key_len) == 0) {
-			os_memcpy(sm->PMK, pmk, pmk_len);
-			sm->pmk_len = pmk_len;
 			ok = 1;
 			break;
 		}
@@ -2799,32 +2746,6 @@
 				   WLAN_REASON_PREV_AUTH_NOT_VALID);
 		return;
 	}
-#ifdef CONFIG_OCV
-	if (wpa_auth_uses_ocv(sm)) {
-		struct wpa_channel_info ci;
-		int tx_chanwidth;
-		int tx_seg1_idx;
-
-		if (wpa_channel_info(wpa_auth, &ci) != 0) {
-			wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
-					"Failed to get channel info to validate received OCI in EAPOL-Key 2/4");
-			return;
-		}
-
-		if (get_sta_tx_parameters(sm,
-					  channel_width_to_int(ci.chanwidth),
-					  ci.seg1_idx, &tx_chanwidth,
-					  &tx_seg1_idx) < 0)
-			return;
-
-		if (ocv_verify_tx_params(kde.oci, kde.oci_len, &ci,
-					 tx_chanwidth, tx_seg1_idx) != 0) {
-			wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
-					ocv_errorstr);
-			return;
-		}
-	}
-#endif /* CONFIG_OCV */
 #ifdef CONFIG_IEEE80211R_AP
 	if (ft && ft_check_msg_2_of_4(wpa_auth, sm, &kde) < 0) {
 		wpa_sta_disconnect(wpa_auth, sm->addr,
@@ -2962,36 +2883,6 @@
 #endif /* CONFIG_IEEE80211W */
 
 
-static int ocv_oci_len(struct wpa_state_machine *sm)
-{
-#ifdef CONFIG_OCV
-	if (wpa_auth_uses_ocv(sm))
-		return OCV_OCI_KDE_LEN;
-#endif /* CONFIG_OCV */
-	return 0;
-}
-
-static int ocv_oci_add(struct wpa_state_machine *sm, u8 **argpos)
-{
-#ifdef CONFIG_OCV
-	struct wpa_channel_info ci;
-
-	if (!wpa_auth_uses_ocv(sm))
-		return 0;
-
-	if (wpa_channel_info(sm->wpa_auth, &ci) != 0) {
-		wpa_printf(MSG_WARNING,
-			   "Failed to get channel info for OCI element");
-		return -1;
-	}
-
-	return ocv_insert_oci_kde(&ci, argpos);
-#else /* CONFIG_OCV */
-	return 0;
-#endif /* CONFIG_OCV */
-}
-
-
 SM_STATE(WPA_PTK, PTKINITNEGOTIATING)
 {
 	u8 rsc[WPA_KEY_RSC_LEN], *_rsc, *gtk, *kde, *pos, dummy_gtk[32];
@@ -3075,7 +2966,7 @@
 		}
 	}
 
-	kde_len = wpa_ie_len + ieee80211w_kde_len(sm) + ocv_oci_len(sm);
+	kde_len = wpa_ie_len + ieee80211w_kde_len(sm);
 	if (gtk)
 		kde_len += 2 + RSN_SELECTOR_LEN + 2 + gtk_len;
 #ifdef CONFIG_IEEE80211R_AP
@@ -3120,10 +3011,6 @@
 				  gtk, gtk_len);
 	}
 	pos = ieee80211w_kde_add(sm, pos);
-	if (ocv_oci_add(sm, &pos) < 0) {
-		os_free(kde);
-		return;
-	}
 
 #ifdef CONFIG_IEEE80211R_AP
 	if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
@@ -3435,7 +3322,7 @@
 	}
 	if (sm->wpa == WPA_VERSION_WPA2) {
 		kde_len = 2 + RSN_SELECTOR_LEN + 2 + gsm->GTK_len +
-			ieee80211w_kde_len(sm) + ocv_oci_len(sm);
+			ieee80211w_kde_len(sm);
 		kde_buf = os_malloc(kde_len);
 		if (kde_buf == NULL)
 			return;
@@ -3446,10 +3333,6 @@
 		pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
 				  gtk, gsm->GTK_len);
 		pos = ieee80211w_kde_add(sm, pos);
-		if (ocv_oci_add(sm, &pos) < 0) {
-			os_free(kde_buf);
-			return;
-		}
 		kde_len = pos - kde;
 	} else {
 		kde = gtk;
@@ -3470,67 +3353,8 @@
 
 SM_STATE(WPA_PTK_GROUP, REKEYESTABLISHED)
 {
-#ifdef CONFIG_OCV
-	struct wpa_authenticator *wpa_auth = sm->wpa_auth;
-	const u8 *key_data, *mic;
-	struct ieee802_1x_hdr *hdr;
-	struct wpa_eapol_key *key;
-	struct wpa_eapol_ie_parse kde;
-	size_t mic_len;
-	u16 key_data_length;
-#endif /* CONFIG_OCV */
-
 	SM_ENTRY_MA(WPA_PTK_GROUP, REKEYESTABLISHED, wpa_ptk_group);
 	sm->EAPOLKeyReceived = FALSE;
-
-#ifdef CONFIG_OCV
-	mic_len = wpa_mic_len(sm->wpa_key_mgmt, sm->pmk_len);
-
-	/*
-	 * Note: last_rx_eapol_key length fields have already been validated in
-	 * wpa_receive().
-	 */
-	hdr = (struct ieee802_1x_hdr *) sm->last_rx_eapol_key;
-	key = (struct wpa_eapol_key *) (hdr + 1);
-	mic = (u8 *) (key + 1);
-	key_data = mic + mic_len + 2;
-	key_data_length = WPA_GET_BE16(mic + mic_len);
-	if (key_data_length > sm->last_rx_eapol_key_len - sizeof(*hdr) -
-	    sizeof(*key) - mic_len - 2)
-		return;
-
-	if (wpa_parse_kde_ies(key_data, key_data_length, &kde) < 0) {
-		wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
-				 "received EAPOL-Key group msg 2/2 with invalid Key Data contents");
-		return;
-	}
-
-	if (wpa_auth_uses_ocv(sm)) {
-		struct wpa_channel_info ci;
-		int tx_chanwidth;
-		int tx_seg1_idx;
-
-		if (wpa_channel_info(wpa_auth, &ci) != 0) {
-			wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
-					"Failed to get channel info to validate received OCI in EAPOL-Key group 1/2");
-			return;
-		}
-
-		if (get_sta_tx_parameters(sm,
-					  channel_width_to_int(ci.chanwidth),
-					  ci.seg1_idx, &tx_chanwidth,
-					  &tx_seg1_idx) < 0)
-			return;
-
-		if (ocv_verify_tx_params(kde.oci, kde.oci_len, &ci,
-					 tx_chanwidth, tx_seg1_idx) != 0) {
-			wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
-					ocv_errorstr);
-			return;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	if (sm->GUpdateStationKeys)
 		sm->group->GKeyDoneStations--;
 	sm->GUpdateStationKeys = FALSE;
@@ -4139,15 +3963,6 @@
 }
 
 
-const u8 * wpa_auth_get_pmk(struct wpa_state_machine *sm, int *len)
-{
-	if (!sm)
-		return NULL;
-	*len = sm->pmk_len;
-	return sm->PMK;
-}
-
-
 int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm)
 {
 	if (sm == NULL)
@@ -4851,7 +4666,7 @@
 		}
 	}
 
-	kde_len = wpa_ie_len + ieee80211w_kde_len(sm) + ocv_oci_len(sm);
+	kde_len = wpa_ie_len + ieee80211w_kde_len(sm);
 	if (gtk)
 		kde_len += 2 + RSN_SELECTOR_LEN + 2 + gtk_len;
 #ifdef CONFIG_IEEE80211R_AP
@@ -4900,10 +4715,6 @@
 		os_memset(opos, 0, 6); /* clear PN */
 	}
 #endif /* CONFIG_IEEE80211W */
-	if (ocv_oci_add(sm, &pos) < 0) {
-		os_free(kde);
-		return -1;
-	}
 
 #ifdef CONFIG_IEEE80211R_AP
 	if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
@@ -4985,7 +4796,7 @@
 	gtk = gsm->GTK[gsm->GN - 1];
 	if (sm->wpa == WPA_VERSION_WPA2) {
 		kde_len = 2 + RSN_SELECTOR_LEN + 2 + gsm->GTK_len +
-			ieee80211w_kde_len(sm) + ocv_oci_len(sm);
+			ieee80211w_kde_len(sm);
 		kde_buf = os_malloc(kde_len);
 		if (kde_buf == NULL)
 			return -1;
@@ -5005,10 +4816,6 @@
 			os_memset(opos, 0, 6); /* clear PN */
 		}
 #endif /* CONFIG_IEEE80211W */
-		if (ocv_oci_add(sm, &pos) < 0) {
-			os_free(kde_buf);
-			return -1;
-		}
 		kde_len = pos - kde;
 	} else {
 		kde = gtk;
diff --git a/src/ap/wpa_auth.h b/src/ap/wpa_auth.h
index e61648d..fad5536 100644
--- a/src/ap/wpa_auth.h
+++ b/src/ap/wpa_auth.h
@@ -145,7 +145,6 @@
 struct rsn_pmksa_cache_entry;
 struct eapol_state_machine;
 struct ft_remote_seq;
-struct wpa_channel_info;
 
 
 struct ft_remote_r0kh {
@@ -192,9 +191,6 @@
 	int group_mgmt_cipher;
 	int sae_require_mfp;
 #endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_OCV
-	int ocv; /* Operating Channel Validation */
-#endif /* CONFIG_OCV */
 #ifdef CONFIG_IEEE80211R_AP
 	u8 ssid[SSID_MAX_LEN];
 	size_t ssid_len;
@@ -269,10 +265,6 @@
 			  size_t data_len);
 	int (*send_oui)(void *ctx, const u8 *dst, u8 oui_suffix, const u8 *data,
 			size_t data_len);
-	int (*channel_info)(void *ctx, struct wpa_channel_info *ci);
-	int (*get_sta_tx_params)(void *ctx, const u8 *addr,
-				 int ap_max_chanwidth, int ap_seg1_idx,
-				 int *bandwidth, int *seg1_idx);
 #ifdef CONFIG_IEEE80211R_AP
 	struct wpa_state_machine * (*add_sta)(void *ctx, const u8 *sta_addr);
 	int (*set_vlan)(void *ctx, const u8 *sta_addr,
@@ -324,8 +316,6 @@
 		      struct wpa_state_machine *sm,
 		      const u8 *osen_ie, size_t osen_ie_len);
 int wpa_auth_uses_mfp(struct wpa_state_machine *sm);
-void wpa_auth_set_ocv(struct wpa_state_machine *sm, int ocv);
-int wpa_auth_uses_ocv(struct wpa_state_machine *sm);
 struct wpa_state_machine *
 wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr,
 		  const u8 *p2p_dev_addr);
@@ -349,7 +339,6 @@
 void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth);
 int wpa_auth_pairwise_set(struct wpa_state_machine *sm);
 int wpa_auth_get_pairwise(struct wpa_state_machine *sm);
-const u8 * wpa_auth_get_pmk(struct wpa_state_machine *sm, int *len);
 int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm);
 int wpa_auth_sta_wpa_version(struct wpa_state_machine *sm);
 int wpa_auth_sta_ft_tk_already_set(struct wpa_state_machine *sm);
@@ -460,9 +449,6 @@
 int wpa_fils_validate_key_confirm(struct wpa_state_machine *sm, const u8 *ies,
 				  size_t ies_len);
 
-int get_sta_tx_parameters(struct wpa_state_machine *sm, int ap_max_chanwidth,
-			  int ap_seg1_idx, int *bandwidth, int *seg1_idx);
-
 int wpa_auth_write_fte(struct wpa_authenticator *wpa_auth, int use_sha384,
 		       u8 *buf, size_t len);
 void wpa_auth_get_fils_aead_params(struct wpa_state_machine *sm,
diff --git a/src/ap/wpa_auth_ft.c b/src/ap/wpa_auth_ft.c
index ac736f0..e8d46ab 100644
--- a/src/ap/wpa_auth_ft.c
+++ b/src/ap/wpa_auth_ft.c
@@ -13,8 +13,6 @@
 #include "utils/list.h"
 #include "common/ieee802_11_defs.h"
 #include "common/ieee802_11_common.h"
-#include "common/ocv.h"
-#include "drivers/driver.h"
 #include "crypto/aes.h"
 #include "crypto/aes_siv.h"
 #include "crypto/aes_wrap.h"
@@ -729,17 +727,6 @@
 }
 
 
-#ifdef CONFIG_OCV
-static int wpa_channel_info(struct wpa_authenticator *wpa_auth,
-			       struct wpa_channel_info *ci)
-{
-	if (!wpa_auth->cb->channel_info)
-		return -1;
-	return wpa_auth->cb->channel_info(wpa_auth->cb_ctx, ci);
-}
-#endif /* CONFIG_OCV */
-
-
 int wpa_write_mdie(struct wpa_auth_config *conf, u8 *buf, size_t len)
 {
 	u8 *pos = buf;
@@ -1464,7 +1451,7 @@
 					now.sec;
 			else if (session_timeout && r1->session_timeout)
 				*session_timeout = 1;
-			else if (session_timeout)
+			else
 				*session_timeout = 0;
 			return 0;
 		}
@@ -2443,35 +2430,6 @@
 			os_free(igtk);
 		}
 #endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_OCV
-		if (wpa_auth_uses_ocv(sm)) {
-			struct wpa_channel_info ci;
-			u8 *nbuf, *ocipos;
-
-			if (wpa_channel_info(sm->wpa_auth, &ci) != 0) {
-				wpa_printf(MSG_WARNING,
-					   "Failed to get channel info for OCI element");
-				os_free(subelem);
-				return NULL;
-			}
-
-			subelem_len += 2 + OCV_OCI_LEN;
-			nbuf = os_realloc(subelem, subelem_len);
-			if (!nbuf) {
-				os_free(subelem);
-				return NULL;
-			}
-			subelem = nbuf;
-
-			ocipos = subelem + subelem_len - 2 - OCV_OCI_LEN;
-			*ocipos++ = FTIE_SUBELEM_OCI;
-			*ocipos++ = OCV_OCI_LEN;
-			if (ocv_insert_oci(&ci, &ocipos) < 0) {
-				os_free(subelem);
-				return NULL;
-			}
-		}
-#endif /* CONFIG_OCV */
 	} else {
 		r0kh_id = conf->r0_key_holder;
 		r0kh_id_len = conf->r0_key_holder_len;
@@ -2638,8 +2596,6 @@
 		os_memcpy(out_pmk_r1, pmk_r1, PMK_LEN);
 		if (out_pairwise)
 			*out_pairwise = pairwise;
-		os_memcpy(sm->PMK, pmk, PMK_LEN);
-		sm->pmk_len = PMK_LEN;
 		if (out_vlan &&
 		    wpa_ft_get_vlan(sm->wpa_auth, sm->addr, out_vlan) < 0) {
 			wpa_printf(MSG_DEBUG, "FT: vlan not available for STA "
@@ -3222,32 +3178,6 @@
 		return WLAN_STATUS_INVALID_FTIE;
 	}
 
-#ifdef CONFIG_OCV
-	if (wpa_auth_uses_ocv(sm)) {
-		struct wpa_channel_info ci;
-		int tx_chanwidth;
-		int tx_seg1_idx;
-
-		if (wpa_channel_info(sm->wpa_auth, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info to validate received OCI in (Re)Assoc Request");
-			return WLAN_STATUS_UNSPECIFIED_FAILURE;
-		}
-
-		if (get_sta_tx_parameters(sm,
-					  channel_width_to_int(ci.chanwidth),
-					  ci.seg1_idx, &tx_chanwidth,
-					  &tx_seg1_idx) < 0)
-			return WLAN_STATUS_UNSPECIFIED_FAILURE;
-
-		if (ocv_verify_tx_params(parse.oci, parse.oci_len, &ci,
-					 tx_chanwidth, tx_seg1_idx) != 0) {
-			wpa_printf(MSG_WARNING, "%s", ocv_errorstr);
-			return WLAN_STATUS_UNSPECIFIED_FAILURE;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	return WLAN_STATUS_SUCCESS;
 }
 
diff --git a/src/ap/wpa_auth_glue.c b/src/ap/wpa_auth_glue.c
index 9091f43..8127403 100644
--- a/src/ap/wpa_auth_glue.c
+++ b/src/ap/wpa_auth_glue.c
@@ -27,7 +27,6 @@
 #include "tkip_countermeasures.h"
 #include "ap_drv_ops.h"
 #include "ap_config.h"
-#include "ieee802_11.h"
 #include "pmksa_cache_auth.h"
 #include "wpa_auth.h"
 #include "wpa_auth_glue.h"
@@ -56,9 +55,6 @@
 	wconf->wmm_enabled = conf->wmm_enabled;
 	wconf->wmm_uapsd = conf->wmm_uapsd;
 	wconf->disable_pmksa_caching = conf->disable_pmksa_caching;
-#ifdef CONFIG_OCV
-	wconf->ocv = conf->ocv;
-#endif /* CONFIG_OCV */
 	wconf->okc = conf->okc;
 #ifdef CONFIG_IEEE80211W
 	wconf->ieee80211w = conf->ieee80211w;
@@ -780,35 +776,6 @@
 }
 
 
-static int hostapd_channel_info(void *ctx, struct wpa_channel_info *ci)
-{
-	struct hostapd_data *hapd = ctx;
-
-	return hostapd_drv_channel_info(hapd, ci);
-}
-
-
-#ifdef CONFIG_OCV
-static int hostapd_get_sta_tx_params(void *ctx, const u8 *addr,
-				     int ap_max_chanwidth, int ap_seg1_idx,
-				     int *bandwidth, int *seg1_idx)
-{
-	struct hostapd_data *hapd = ctx;
-	struct sta_info *sta;
-
-	sta = ap_get_sta(hapd, addr);
-	if (!sta) {
-		hostapd_wpa_auth_logger(hapd, addr, LOGGER_INFO,
-					"Failed to get STA info to validate received OCI");
-		return -1;
-	}
-
-	return get_tx_parameters(sta, ap_max_chanwidth, ap_seg1_idx, bandwidth,
-				 seg1_idx);
-}
-#endif /* CONFIG_OCV */
-
-
 #ifdef CONFIG_IEEE80211R_AP
 
 static int hostapd_wpa_auth_send_ft_action(void *ctx, const u8 *dst,
@@ -847,18 +814,12 @@
 	struct hostapd_data *hapd = ctx;
 	struct sta_info *sta;
 
-	wpa_printf(MSG_DEBUG, "Add station entry for " MACSTR
-		   " based on WPA authenticator callback",
-		   MAC2STR(sta_addr));
 	if (hostapd_add_sta_node(hapd, sta_addr, WLAN_AUTH_FT) < 0)
 		return NULL;
 
 	sta = ap_sta_add(hapd, sta_addr);
 	if (sta == NULL)
 		return NULL;
-	if (hapd->driver && hapd->driver->add_sta_node)
-		sta->added_unassoc = 1;
-	sta->ft_over_ds = 1;
 	if (sta->wpa_sm) {
 		sta->auth_alg = WLAN_AUTH_FT;
 		return sta->wpa_sm;
@@ -1228,10 +1189,6 @@
 		.for_each_auth = hostapd_wpa_auth_for_each_auth,
 		.send_ether = hostapd_wpa_auth_send_ether,
 		.send_oui = hostapd_wpa_auth_send_oui,
-		.channel_info = hostapd_channel_info,
-#ifdef CONFIG_OCV
-		.get_sta_tx_params = hostapd_get_sta_tx_params,
-#endif /* CONFIG_OCV */
 #ifdef CONFIG_IEEE80211R_AP
 		.send_ft_action = hostapd_wpa_auth_send_ft_action,
 		.add_sta = hostapd_wpa_auth_add_sta,
diff --git a/src/ap/wpa_auth_i.h b/src/ap/wpa_auth_i.h
index a349304..b1cea1b 100644
--- a/src/ap/wpa_auth_i.h
+++ b/src/ap/wpa_auth_i.h
@@ -92,9 +92,6 @@
 #endif /* CONFIG_IEEE80211R_AP */
 	unsigned int is_wnmsleep:1;
 	unsigned int pmkid_set:1;
-#ifdef CONFIG_OCV
-	unsigned int ocv_enabled:1;
-#endif /* CONFIG_OCV */
 
 	u8 req_replay_counter[WPA_REPLAY_COUNTER_LEN];
 	int req_replay_counter_used;
diff --git a/src/ap/wpa_auth_ie.c b/src/ap/wpa_auth_ie.c
index 3bcbef7..253fe6e 100644
--- a/src/ap/wpa_auth_ie.c
+++ b/src/ap/wpa_auth_ie.c
@@ -293,13 +293,9 @@
 			capab |= WPA_CAPABILITY_MFPR;
 	}
 #endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_OCV
-	if (conf->ocv)
-		capab |= WPA_CAPABILITY_OCVC;
-#endif /* CONFIG_OCV */
 #ifdef CONFIG_RSN_TESTING
 	if (rsn_testing)
-		capab |= BIT(8) | BIT(15);
+		capab |= BIT(8) | BIT(14) | BIT(15);
 #endif /* CONFIG_RSN_TESTING */
 	WPA_PUT_LE16(pos, capab);
 	pos += 2;
@@ -418,10 +414,6 @@
 			capab |= WPA_CAPABILITY_MFPR;
 	}
 #endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_OCV
-	if (conf->ocv)
-		capab |= WPA_CAPABILITY_OCVC;
-#endif /* CONFIG_OCV */
 	WPA_PUT_LE16(eid, capab);
 	eid += 2;
 
@@ -561,19 +553,6 @@
 	if (version == WPA_PROTO_RSN) {
 		res = wpa_parse_wpa_ie_rsn(wpa_ie, wpa_ie_len, &data);
 
-		if (wpa_key_mgmt_ft(data.key_mgmt) && !mdie &&
-		    !wpa_key_mgmt_only_ft(data.key_mgmt)) {
-			/* Workaround for some HP and Epson printers that seem
-			 * to incorrectly copy the FT-PSK + WPA-PSK AKMs from AP
-			 * advertised RSNE to Association Request frame. */
-			wpa_printf(MSG_DEBUG,
-				   "RSN: FT set in RSNE AKM but MDE is missing from "
-				   MACSTR
-				   " - ignore FT AKM(s) because there's also a non-FT AKM",
-				   MAC2STR(sm->addr));
-			data.key_mgmt &= ~WPA_KEY_MGMT_FT;
-		}
-
 		selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X;
 		if (0) {
 		}
@@ -781,17 +760,6 @@
 	}
 #endif /* CONFIG_SAE */
 
-#ifdef CONFIG_OCV
-	if ((data.capabilities & WPA_CAPABILITY_OCVC) &&
-	    !(data.capabilities & WPA_CAPABILITY_MFPC)) {
-		wpa_printf(MSG_DEBUG,
-			   "Management frame protection required with OCV, but client did not enable it");
-		return WPA_MGMT_FRAME_PROTECTION_VIOLATION;
-	}
-	wpa_auth_set_ocv(sm, wpa_auth->conf.ocv &&
-			 (data.capabilities & WPA_CAPABILITY_OCVC));
-#endif /* CONFIG_OCV */
-
 	if (wpa_auth->conf.ieee80211w == NO_MGMT_FRAME_PROTECTION ||
 	    !(data.capabilities & WPA_CAPABILITY_MFPC))
 		sm->mgmt_frame_prot = 0;
@@ -1027,15 +995,6 @@
 	}
 #endif /* CONFIG_P2P */
 
-#ifdef CONFIG_OCV
-	if (pos[1] > RSN_SELECTOR_LEN + 2 &&
-	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_OCI) {
-		ie->oci = pos + 2 + RSN_SELECTOR_LEN;
-		ie->oci_len = pos[1] - RSN_SELECTOR_LEN;
-		return 0;
-	}
-#endif /* CONFIG_OCV */
-
 	return 0;
 }
 
@@ -1103,34 +1062,13 @@
 }
 
 
-#ifdef CONFIG_OCV
-
-void wpa_auth_set_ocv(struct wpa_state_machine *sm, int ocv)
-{
-	if (sm)
-		sm->ocv_enabled = ocv;
-}
-
-
-int wpa_auth_uses_ocv(struct wpa_state_machine *sm)
-{
-	return sm ? sm->ocv_enabled : 0;
-}
-
-#endif /* CONFIG_OCV */
-
-
 #ifdef CONFIG_OWE
 u8 * wpa_auth_write_assoc_resp_owe(struct wpa_state_machine *sm,
 				   u8 *pos, size_t max_len,
 				   const u8 *req_ies, size_t req_ies_len)
 {
 	int res;
-	struct wpa_auth_config *conf;
-
-	if (!sm)
-		return pos;
-	conf = &sm->wpa_auth->conf;
+	struct wpa_auth_config *conf = &sm->wpa_auth->conf;
 
 #ifdef CONFIG_TESTING_OPTIONS
 	if (conf->own_ie_override_len) {
@@ -1144,7 +1082,7 @@
 	}
 #endif /* CONFIG_TESTING_OPTIONS */
 
-	res = wpa_write_rsn_ie(conf, pos, max_len,
+	res = wpa_write_rsn_ie(&sm->wpa_auth->conf, pos, max_len,
 			       sm->pmksa ? sm->pmksa->pmkid : NULL);
 	if (res < 0)
 		return pos;
diff --git a/src/ap/wpa_auth_ie.h b/src/ap/wpa_auth_ie.h
index a38b206..73e4333 100644
--- a/src/ap/wpa_auth_ie.h
+++ b/src/ap/wpa_auth_ie.h
@@ -33,10 +33,6 @@
 	const u8 *ip_addr_req;
 	const u8 *ip_addr_alloc;
 #endif /* CONFIG_P2P */
-#ifdef CONFIG_OCV
-	const u8 *oci;
-	size_t oci_len;
-#endif /* CONFIG_OCV */
 
 	const u8 *osen;
 	size_t osen_len;
diff --git a/src/common/defs.h b/src/common/defs.h
index 4faf1c8..c968cd6 100644
--- a/src/common/defs.h
+++ b/src/common/defs.h
@@ -59,13 +59,6 @@
 #define WPA_KEY_MGMT_DPP BIT(23)
 #define WPA_KEY_MGMT_FT_IEEE8021X_SHA384 BIT(24)
 
-#define WPA_KEY_MGMT_FT (WPA_KEY_MGMT_FT_PSK | \
-			 WPA_KEY_MGMT_FT_IEEE8021X | \
-			 WPA_KEY_MGMT_FT_IEEE8021X_SHA384 | \
-			 WPA_KEY_MGMT_FT_SAE | \
-			 WPA_KEY_MGMT_FT_FILS_SHA256 | \
-			 WPA_KEY_MGMT_FT_FILS_SHA384)
-
 static inline int wpa_key_mgmt_wpa_ieee8021x(int akm)
 {
 	return !!(akm & (WPA_KEY_MGMT_IEEE8021X |
@@ -93,14 +86,12 @@
 
 static inline int wpa_key_mgmt_ft(int akm)
 {
-	return !!(akm & WPA_KEY_MGMT_FT);
-}
-
-static inline int wpa_key_mgmt_only_ft(int akm)
-{
-	int ft = wpa_key_mgmt_ft(akm);
-	akm &= ~WPA_KEY_MGMT_FT;
-	return ft && !akm;
+	return !!(akm & (WPA_KEY_MGMT_FT_PSK |
+			 WPA_KEY_MGMT_FT_IEEE8021X |
+			 WPA_KEY_MGMT_FT_IEEE8021X_SHA384 |
+			 WPA_KEY_MGMT_FT_SAE |
+			 WPA_KEY_MGMT_FT_FILS_SHA256 |
+			 WPA_KEY_MGMT_FT_FILS_SHA384));
 }
 
 static inline int wpa_key_mgmt_ft_psk(int akm)
@@ -408,15 +399,4 @@
 #define OCE_STA_CFON BIT(1)
 #define OCE_AP BIT(2)
 
-/* enum chan_width - Channel width definitions */
-enum chan_width {
-	CHAN_WIDTH_20_NOHT,
-	CHAN_WIDTH_20,
-	CHAN_WIDTH_40,
-	CHAN_WIDTH_80,
-	CHAN_WIDTH_80P80,
-	CHAN_WIDTH_160,
-	CHAN_WIDTH_UNKNOWN
-};
-
 #endif /* DEFS_H */
diff --git a/src/common/dpp.c b/src/common/dpp.c
index bcb694b..677f586 100644
--- a/src/common/dpp.c
+++ b/src/common/dpp.c
@@ -813,9 +813,7 @@
 	const unsigned char *pk;
 	int ppklen;
 	X509_ALGOR *pa;
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || \
-	(defined(LIBRESSL_VERSION_NUMBER) && \
-	 LIBRESSL_VERSION_NUMBER < 0x20800000L)
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
 	ASN1_OBJECT *pa_oid;
 #else
 	const ASN1_OBJECT *pa_oid;
@@ -2856,7 +2854,7 @@
 		i_pubkey_hash = test_hash;
 	} else if (dpp_test == DPP_TEST_NO_STATUS_AUTH_RESP) {
 		wpa_printf(MSG_INFO, "DPP: TESTING - no Status");
-		status = 255;
+		status = -1;
 	} else if (dpp_test == DPP_TEST_NO_I_NONCE_AUTH_RESP) {
 		wpa_printf(MSG_INFO, "DPP: TESTING - no I-nonce");
 		i_nonce = NULL;
@@ -3459,7 +3457,7 @@
 	}
 #endif /* CONFIG_TESTING_OPTIONS */
 
-	if (!auth->initiator || !auth->peer_bi) {
+	if (!auth->initiator) {
 		dpp_auth_fail(auth, "Unexpected Authentication Response");
 		return NULL;
 	}
@@ -3640,7 +3638,7 @@
 		goto fail;
 	}
 
-	if (auth->own_bi) {
+	if (auth->own_bi && auth->peer_bi) {
 		/* Mutual authentication */
 		if (dpp_auth_derive_l_initiator(auth) < 0)
 			goto fail;
@@ -3848,7 +3846,7 @@
 	}
 #endif /* CONFIG_TESTING_OPTIONS */
 
-	if (auth->initiator || !auth->own_bi) {
+	if (auth->initiator) {
 		dpp_auth_fail(auth, "Unexpected Authentication Confirm");
 		return -1;
 	}
@@ -3906,7 +3904,7 @@
 				      "Initiator Bootstrapping Key Hash mismatch");
 			return -1;
 		}
-	} else if (auth->peer_bi) {
+	} else if (auth->own_bi && auth->peer_bi) {
 		/* Mutual authentication and peer did not include its
 		 * Bootstrapping Key Hash attribute. */
 		dpp_auth_fail(auth,
@@ -4759,7 +4757,7 @@
 		goto fail;
 	}
 	if (os_strcmp(token->string, "EC") != 0) {
-		wpa_printf(MSG_DEBUG, "DPP: Unexpected JWK kty '%s'",
+		wpa_printf(MSG_DEBUG, "DPP: Unexpected JWK kty '%s",
 			   token->string);
 		goto fail;
 	}
@@ -6588,32 +6586,6 @@
 }
 
 
-static int dpp_pkex_identifier_match(const u8 *attr_id, u16 attr_id_len,
-				     const char *identifier)
-{
-	if (!attr_id && identifier) {
-		wpa_printf(MSG_DEBUG,
-			   "DPP: No PKEX code identifier received, but expected one");
-		return 0;
-	}
-
-	if (attr_id && !identifier) {
-		wpa_printf(MSG_DEBUG,
-			   "DPP: PKEX code identifier received, but not expecting one");
-		return 0;
-	}
-
-	if (attr_id && identifier &&
-	    (os_strlen(identifier) != attr_id_len ||
-	     os_memcmp(identifier, attr_id, attr_id_len) != 0)) {
-		wpa_printf(MSG_DEBUG, "DPP: PKEX code identifier mismatch");
-		return 0;
-	}
-
-	return 1;
-}
-
-
 struct dpp_pkex * dpp_pkex_rx_exchange_req(void *msg_ctx,
 					   struct dpp_bootstrap_info *bi,
 					   const u8 *own_mac,
@@ -6658,11 +6630,19 @@
 	}
 #endif /* CONFIG_TESTING_OPTIONS */
 
-	attr_id_len = 0;
 	attr_id = dpp_get_attr(buf, len, DPP_ATTR_CODE_IDENTIFIER,
 			       &attr_id_len);
-	if (!dpp_pkex_identifier_match(attr_id, attr_id_len, identifier))
+	if (!attr_id && identifier) {
+		wpa_printf(MSG_DEBUG,
+			   "DPP: No PKEX code identifier received, but expected one");
 		return NULL;
+	}
+	if (attr_id && identifier &&
+	    (os_strlen(identifier) != attr_id_len ||
+	     os_memcmp(identifier, attr_id, attr_id_len) != 0)) {
+		wpa_printf(MSG_DEBUG, "DPP: PKEX code identifier mismatch");
+		return NULL;
+	}
 
 	attr_group = dpp_get_attr(buf, len, DPP_ATTR_FINITE_CYCLIC_GROUP,
 				  &attr_group_len);
@@ -7034,11 +7014,16 @@
 		return NULL;
 	}
 
-	attr_id_len = 0;
 	attr_id = dpp_get_attr(buf, buflen, DPP_ATTR_CODE_IDENTIFIER,
 			       &attr_id_len);
-	if (!dpp_pkex_identifier_match(attr_id, attr_id_len,
-				       pkex->identifier)) {
+	if (!attr_id && pkex->identifier) {
+		wpa_printf(MSG_DEBUG,
+			   "DPP: No PKEX code identifier received, but expected one");
+		return NULL;
+	}
+	if (attr_id && pkex->identifier &&
+	    (os_strlen(pkex->identifier) != attr_id_len ||
+	     os_memcmp(pkex->identifier, attr_id, attr_id_len) != 0)) {
 		dpp_pkex_fail(pkex, "PKEX code identifier mismatch");
 		return NULL;
 	}
diff --git a/src/common/gas_server.c b/src/common/gas_server.c
index ca46758..b258675 100644
--- a/src/common/gas_server.c
+++ b/src/common/gas_server.c
@@ -97,10 +97,8 @@
 		return;
 
 	response = os_zalloc(sizeof(*response));
-	if (!response) {
-		wpabuf_free(query_resp);
+	if (!response)
 		return;
-	}
 	wpa_printf(MSG_DEBUG, "DPP: Allocated GAS response @%p", response);
 	response->freq = freq;
 	response->handler = handler;
@@ -121,7 +119,6 @@
 				      handler->adv_proto_id_len +
 				      resp_frag_len);
 	if (!resp) {
-		wpabuf_free(query_resp);
 		gas_server_free_response(response);
 		return;
 	}
@@ -260,7 +257,6 @@
 				       handler->adv_proto_id_len +
 				       resp_frag_len);
 	if (!resp) {
-		dl_list_del(&response->list);
 		gas_server_free_response(response);
 		return;
 	}
diff --git a/src/common/hw_features_common.c b/src/common/hw_features_common.c
index 49ed806..db40379 100644
--- a/src/common/hw_features_common.c
+++ b/src/common/hw_features_common.c
@@ -87,29 +87,13 @@
 int allowed_ht40_channel_pair(struct hostapd_hw_modes *mode, int pri_chan,
 			      int sec_chan)
 {
-	int ok, first;
+	int ok, j, first;
 	int allowed[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 140,
 			  149, 157, 165, 184, 192 };
 	size_t k;
-	struct hostapd_channel_data *p_chan, *s_chan;
-	const int ht40_plus = pri_chan < sec_chan;
 
-	p_chan = hw_get_channel_chan(mode, pri_chan, NULL);
-	if (!p_chan)
-		return 0;
-
-	if (pri_chan == sec_chan || !sec_chan) {
-		if (chan_pri_allowed(p_chan))
-			return 1; /* HT40 not used */
-
-		wpa_printf(MSG_ERROR, "Channel %d is not allowed as primary",
-			   pri_chan);
-		return 0;
-	}
-
-	s_chan = hw_get_channel_chan(mode, sec_chan, NULL);
-	if (!s_chan)
-		return 0;
+	if (pri_chan == sec_chan || !sec_chan)
+		return 1; /* HT40 not used */
 
 	wpa_printf(MSG_DEBUG,
 		   "HT40: control channel: %d  secondary channel: %d",
@@ -117,9 +101,16 @@
 
 	/* Verify that HT40 secondary channel is an allowed 20 MHz
 	 * channel */
-	if ((s_chan->flag & HOSTAPD_CHAN_DISABLED) ||
-	    (ht40_plus && !(p_chan->allowed_bw & HOSTAPD_CHAN_WIDTH_40P)) ||
-	    (!ht40_plus && !(p_chan->allowed_bw & HOSTAPD_CHAN_WIDTH_40M))) {
+	ok = 0;
+	for (j = 0; j < mode->num_channels; j++) {
+		struct hostapd_channel_data *chan = &mode->channels[j];
+		if (!(chan->flag & HOSTAPD_CHAN_DISABLED) &&
+		    chan->chan == sec_chan) {
+			ok = 1;
+			break;
+		}
+	}
+	if (!ok) {
 		wpa_printf(MSG_ERROR, "HT40 secondary channel %d not allowed",
 			   sec_chan);
 		return 0;
@@ -562,59 +553,3 @@
 }
 
 #endif /* CONFIG_IEEE80211AC */
-
-
-u32 num_chan_to_bw(int num_chans)
-{
-	switch (num_chans) {
-	case 2:
-	case 4:
-	case 8:
-		return num_chans * 20;
-	default:
-		return 20;
-	}
-}
-
-
-/* check if BW is applicable for channel */
-int chan_bw_allowed(const struct hostapd_channel_data *chan, u32 bw,
-		    int ht40_plus, int pri)
-{
-	u32 bw_mask;
-
-	switch (bw) {
-	case 20:
-		bw_mask = HOSTAPD_CHAN_WIDTH_20;
-		break;
-	case 40:
-		/* HT 40 MHz support declared only for primary channel,
-		 * just skip 40 MHz secondary checking */
-		if (pri && ht40_plus)
-			bw_mask = HOSTAPD_CHAN_WIDTH_40P;
-		else if (pri && !ht40_plus)
-			bw_mask = HOSTAPD_CHAN_WIDTH_40M;
-		else
-			bw_mask = 0;
-		break;
-	case 80:
-		bw_mask = HOSTAPD_CHAN_WIDTH_80;
-		break;
-	case 160:
-		bw_mask = HOSTAPD_CHAN_WIDTH_160;
-		break;
-	default:
-		bw_mask = 0;
-		break;
-	}
-
-	return (chan->allowed_bw & bw_mask) == bw_mask;
-}
-
-
-/* check if channel is allowed to be used as primary */
-int chan_pri_allowed(const struct hostapd_channel_data *chan)
-{
-	return !(chan->flag & HOSTAPD_CHAN_DISABLED) &&
-		(chan->allowed_bw & HOSTAPD_CHAN_WIDTH_20);
-}
diff --git a/src/common/hw_features_common.h b/src/common/hw_features_common.h
index eb1f1c5..9cddbd5 100644
--- a/src/common/hw_features_common.h
+++ b/src/common/hw_features_common.h
@@ -39,9 +39,4 @@
 		      int disabled);
 int ieee80211ac_cap_check(u32 hw, u32 conf);
 
-u32 num_chan_to_bw(int num_chans);
-int chan_bw_allowed(const struct hostapd_channel_data *chan, u32 bw,
-		    int ht40_plus, int pri);
-int chan_pri_allowed(const struct hostapd_channel_data *chan);
-
 #endif /* HW_FEATURES_COMMON_H */
diff --git a/src/common/ieee802_11_common.c b/src/common/ieee802_11_common.c
index 9627799..4fd3357 100644
--- a/src/common/ieee802_11_common.c
+++ b/src/common/ieee802_11_common.c
@@ -1,6 +1,6 @@
 /*
  * IEEE 802.11 Common routines
- * Copyright (c) 2002-2019, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2015, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -126,10 +126,6 @@
 			elems->roaming_cons_sel = pos;
 			elems->roaming_cons_sel_len = elen;
 			break;
-		case MULTI_AP_OUI_TYPE:
-			elems->multi_ap = pos;
-			elems->multi_ap_len = elen;
-			break;
 		default:
 			wpa_printf(MSG_MSGDUMP, "Unknown WFA "
 				   "information element ignored "
@@ -270,10 +266,6 @@
 		elems->password_id = pos;
 		elems->password_id_len = elen;
 		break;
-	case WLAN_EID_EXT_OCV_OCI:
-		elems->oci = pos;
-		elems->oci_len = elen;
-		break;
 	default:
 		if (show_errors) {
 			wpa_printf(MSG_MSGDUMP,
@@ -906,41 +898,6 @@
 }
 
 
-int ieee80211_chaninfo_to_channel(unsigned int freq, enum chan_width chanwidth,
-				  int sec_channel, u8 *op_class, u8 *channel)
-{
-	int vht = CHAN_WIDTH_UNKNOWN;
-
-	switch (chanwidth) {
-	case CHAN_WIDTH_UNKNOWN:
-	case CHAN_WIDTH_20_NOHT:
-	case CHAN_WIDTH_20:
-	case CHAN_WIDTH_40:
-		vht = VHT_CHANWIDTH_USE_HT;
-		break;
-	case CHAN_WIDTH_80:
-		vht = VHT_CHANWIDTH_80MHZ;
-		break;
-	case CHAN_WIDTH_80P80:
-		vht = VHT_CHANWIDTH_80P80MHZ;
-		break;
-	case CHAN_WIDTH_160:
-		vht = VHT_CHANWIDTH_160MHZ;
-		break;
-	}
-
-	if (ieee80211_freq_to_channel_ext(freq, sec_channel, vht, op_class,
-					  channel) == NUM_HOSTAPD_MODES) {
-		wpa_printf(MSG_WARNING,
-			   "Cannot determine operating class and channel (freq=%u chanwidth=%d sec_channel=%d)",
-			   freq, chanwidth, sec_channel);
-		return -1;
-	}
-
-	return 0;
-}
-
-
 static const char *const us_op_class_cc[] = {
 	"US", "CA", NULL
 };
@@ -1540,24 +1497,6 @@
 }
 
 
-const u8 * get_vendor_ie(const u8 *ies, size_t len, u32 vendor_type)
-{
-	const u8 *pos = ies, *end = ies + len;
-
-	while (end - pos > 1) {
-		if (2 + pos[1] > end - pos)
-			break;
-
-		if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
-		    vendor_type == WPA_GET_BE32(&pos[2]))
-			return pos;
-		pos += 2 + pos[1];
-	}
-
-	return NULL;
-}
-
-
 size_t mbo_add_ie(u8 *buf, size_t len, const u8 *attr, size_t attr_len)
 {
 	/*
@@ -1582,26 +1521,6 @@
 }
 
 
-size_t add_multi_ap_ie(u8 *buf, size_t len, u8 value)
-{
-	u8 *pos = buf;
-
-	if (len < 9)
-		return 0;
-
-	*pos++ = WLAN_EID_VENDOR_SPECIFIC;
-	*pos++ = 7; /* len */
-	WPA_PUT_BE24(pos, OUI_WFA);
-	pos += 3;
-	*pos++ = MULTI_AP_OUI_TYPE;
-	*pos++ = MULTI_AP_SUB_ELEM_TYPE;
-	*pos++ = 1; /* len */
-	*pos++ = value;
-
-	return pos - buf;
-}
-
-
 static const struct country_op_class us_op_class[] = {
 	{ 1, 115 },
 	{ 2, 118 },
@@ -1747,27 +1666,6 @@
 }
 
 
-int oper_class_bw_to_int(const struct oper_class_map *map)
-{
-	switch (map->bw) {
-	case BW20:
-		return 20;
-	case BW40PLUS:
-	case BW40MINUS:
-		return 40;
-	case BW80:
-		return 80;
-	case BW80P80:
-	case BW160:
-		return 160;
-	case BW2160:
-		return 2160;
-	default:
-		return 0;
-	}
-}
-
-
 int ieee802_11_parse_candidate_list(const char *pos, u8 *nei_rep,
 				    size_t nei_rep_len)
 {
@@ -1868,11 +1766,3 @@
 
 	return nei_pos - nei_rep;
 }
-
-
-int ieee802_11_ext_capab(const u8 *ie, unsigned int capab)
-{
-	if (!ie || ie[1] <= capab / 8)
-		return 0;
-	return !!(ie[2 + capab / 8] & BIT(capab % 8));
-}
diff --git a/src/common/ieee802_11_common.h b/src/common/ieee802_11_common.h
index ce3bb8b..ff7e51d 100644
--- a/src/common/ieee802_11_common.h
+++ b/src/common/ieee802_11_common.h
@@ -1,6 +1,6 @@
 /*
  * IEEE 802.11 Common routines
- * Copyright (c) 2002-2019, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2012, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -10,7 +10,6 @@
 #define IEEE802_11_COMMON_H
 
 #include "defs.h"
-#include "ieee802_11_defs.h"
 
 struct hostapd_hw_modes;
 
@@ -85,8 +84,6 @@
 	const u8 *power_capab;
 	const u8 *roaming_cons_sel;
 	const u8 *password_id;
-	const u8 *oci;
-	const u8 *multi_ap;
 
 	u8 ssid_len;
 	u8 supp_rates_len;
@@ -133,8 +130,6 @@
 	u8 power_capab_len;
 	u8 roaming_cons_sel_len;
 	u8 password_id_len;
-	u8 oci_len;
-	u8 multi_ap_len;
 
 	struct mb_ies_info mb_ies;
 };
@@ -165,8 +160,6 @@
 enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
 						   int sec_channel, int vht,
 						   u8 *op_class, u8 *channel);
-int ieee80211_chaninfo_to_channel(unsigned int freq, enum chan_width chanwidth,
-				  int sec_channel, u8 *op_class, u8 *channel);
 int ieee80211_is_dfs(int freq, const struct hostapd_hw_modes *modes,
 		     u16 num_modes);
 enum phy_type ieee80211_get_phy_type(int freq, int ht, int vht);
@@ -193,12 +186,9 @@
 
 const u8 * get_ie(const u8 *ies, size_t len, u8 eid);
 const u8 * get_ie_ext(const u8 *ies, size_t len, u8 ext);
-const u8 * get_vendor_ie(const u8 *ies, size_t len, u32 vendor_type);
 
 size_t mbo_add_ie(u8 *buf, size_t len, const u8 *attr, size_t attr_len);
 
-size_t add_multi_ap_ie(u8 *buf, size_t len, u8 value);
-
 struct country_op_class {
 	u8 country_op_class;
 	u8 global_op_class;
@@ -207,11 +197,8 @@
 u8 country_to_global_op_class(const char *country, u8 op_class);
 
 const struct oper_class_map * get_oper_class(const char *country, u8 op_class);
-int oper_class_bw_to_int(const struct oper_class_map *map);
 
 int ieee802_11_parse_candidate_list(const char *pos, u8 *nei_rep,
 				    size_t nei_rep_len);
 
-int ieee802_11_ext_capab(const u8 *ie, unsigned int capab);
-
 #endif /* IEEE802_11_COMMON_H */
diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index b285d13..762e731 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -1,6 +1,6 @@
 /*
  * IEEE 802.11 Frame type definitions
- * Copyright (c) 2002-2019, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2015, Jouni Malinen <j@w1.fi>
  * Copyright (c) 2007-2008 Intel Corporation
  *
  * This software may be distributed under the terms of the BSD license.
@@ -467,89 +467,7 @@
 #define WLAN_EID_EXT_PASSWORD_IDENTIFIER 33
 #define WLAN_EID_EXT_HE_CAPABILITIES 35
 #define WLAN_EID_EXT_HE_OPERATION 36
-#define WLAN_EID_EXT_HE_MU_EDCA_PARAMS 38
-#define WLAN_EID_EXT_OCV_OCI 54
 
-/* Extended Capabilities field */
-#define WLAN_EXT_CAPAB_20_40_COEX 0
-#define WLAN_EXT_CAPAB_GLK 1
-#define WLAN_EXT_CAPAB_EXT_CHAN_SWITCH 2
-#define WLAN_EXT_CAPAB_GLK_GCR 3
-#define WLAN_EXT_CAPAB_PSMP 4
-/* 5 - Reserved */
-#define WLAN_EXT_CAPAB_S_PSMP 6
-#define WLAN_EXT_CAPAB_EVENT 7
-#define WLAN_EXT_CAPAB_DIAGNOSTICS 8
-#define WLAN_EXT_CAPAB_MULTICAST_DIAGNOSTICS 9
-#define WLAN_EXT_CAPAB_LOCATION_TRACKING 10
-#define WLAN_EXT_CAPAB_FMS 11
-#define WLAN_EXT_CAPAB_PROXY_ARP 12
-#define WLAN_EXT_CAPAB_COLL_INTERF_REP 13
-#define WLAN_EXT_CAPAB_CIVIC_LOCATION 14
-#define WLAN_EXT_CAPAB_GEOSPATIAL_LOCATION 15
-#define WLAN_EXT_CAPAB_TFS 16
-#define WLAN_EXT_CAPAB_WNM_SLEEP_MODE 17
-#define WLAN_EXT_CAPAB_TIM_BROADCAST 18
-#define WLAN_EXT_CAPAB_BSS_TRANSITION 19
-#define WLAN_EXT_CAPAB_QOS_TRAFFIC 20
-#define WLAN_EXT_CAPAB_AC_STA_COUNT 21
-#define WLAN_EXT_CAPAB_MULTIPLE_BSSID 22
-#define WLAN_EXT_CAPAB_TIMING_MEASUREMENT 23
-#define WLAN_EXT_CAPAB_CHANNEL_USAGE 24
-#define WLAN_EXT_CAPAB_SSID_LIST 25
-#define WLAN_EXT_CAPAB_DMS 26
-#define WLAN_EXT_CAPAB_UTF_TSF_OFFSET 27
-#define WLAN_EXT_CAPAB_TPU_BUFFER_STA 28
-#define WLAN_EXT_CAPAB_TDLS_PEER_PSM 29
-#define WLAN_EXT_CAPAB_TDLS_CHANNEL_SWITCH 30
-#define WLAN_EXT_CAPAB_INTERWORKING 31
-#define WLAN_EXT_CAPAB_QOS_MAP 32
-#define WLAN_EXT_CAPAB_EBR 33
-#define WLAN_EXT_CAPAB_SSPN_INTERFACE 34
-/* 35 - Reserved */
-#define WLAN_EXT_CAPAB_MSGCF 36
-#define WLAN_EXT_CAPAB_TDLS 37
-#define WLAN_EXT_CAPAB_TDLS_PROHIBITED 38
-#define WLAN_EXT_CAPAB_TDLS_CHANNEL_SWITCH_PROHIBITED 39
-#define WLAN_EXT_CAPAB_REJECT_UNADMITTED_FRAME 40
-#define WLAN_EXT_CAPAB_
-/* 41-43 - Service Interval Granularity */
-#define WLAN_EXT_CAPAB_IDENTIFIER_LOCATION 44
-#define WLAN_EXT_CAPAB_U_APSD_COEX 45
-#define WLAN_EXT_CAPAB_WNM_NOTIFCATION 46
-#define WLAN_EXT_CAPAB_QAB 47
-#define WLAN_EXT_CAPAB_UTF_8_SSID 48
-#define WLAN_EXT_CAPAB_QMF 49
-#define WLAN_EXT_CAPAB_QMF_RECONFIG 50
-#define WLAN_EXT_CAPAB_ROBUST_AV_STREAMING 51
-#define WLAN_EXT_CAPAB_ADVANCED_GCR 52
-#define WLAN_EXT_CAPAB_MESH_GCR 53
-#define WLAN_EXT_CAPAB_SCS 54
-#define WLAN_EXT_CAPAB_QLOAD_REPORT 55
-#define WLAN_EXT_CAPAB_ALT_EDCA 56
-#define WLAN_EXT_CAPAB_UNPROT_TXOP_NEG 57
-#define WLAN_EXT_CAPAB_PROT_TXOP_NEG 58
-/* 59 - Reserved */
-#define WLAN_EXT_CAPAB_PROT_QLOAD_REPORT 60
-#define WLAN_EXT_CAPAB_TDLS_WIDER_BW 61
-#define WLAN_EXT_CAPAB_OPMODE_NOTIF 62
-#define WLAN_EXT_CAPAB_
-/* 63-64 - Max Number of MSDUs In A-MSDU */
-#define WLAN_EXT_CAPAB_CHANNEL_SCHEDULE_MGMT 65
-#define WLAN_EXT_CAPAB_GEODB_INBAND_ENABLING_SIGNAL 66
-#define WLAN_EXT_CAPAB_NETWORK_CHANNEL_CTRL 67
-#define WLAN_EXT_CAPAB_WHITE_SPACE_MAP 68
-#define WLAN_EXT_CAPAB_CHANNEL_AVAIL_QUERY 69
-#define WLAN_EXT_CAPAB_FTM_RESPONDER 70
-#define WLAN_EXT_CAPAB_FTM_INITIATOR 71
-#define WLAN_EXT_CAPAB_FILS 72
-#define WLAN_EXT_CAPAB_EXT_SPECTRUM_MGMT 73
-#define WLAN_EXT_CAPAB_FUTURE_CHANNEL_GUIDANCE 74
-#define WLAN_EXT_CAPAB_PAD 75
-/* 76-79 - Reserved */
-#define WLAN_EXT_CAPAB_COMPLETE_NON_TX_BSSID_PROFILE 80
-#define WLAN_EXT_CAPAB_SAE_PW_ID 81
-#define WLAN_EXT_CAPAB_SAE_PW_ID_EXCLUSIVELY 82
 
 /* Action frame categories (IEEE Std 802.11-2016, 9.4.1.11, Table 9-76) */
 #define WLAN_ACTION_SPECTRUM_MGMT 0
@@ -947,12 +865,10 @@
 				struct {
 					u8 action;
 					u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
-					u8 variable[]; /* OCI element */
 				} STRUCT_PACKED sa_query_req;
 				struct {
 					u8 action; /* */
 					u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
-					u8 variable[]; /* OCI element */
 				} STRUCT_PACKED sa_query_resp;
 				struct {
 					u8 action;
@@ -1294,13 +1210,6 @@
 #define MBO_OUI_TYPE 22
 #define OWE_IE_VENDOR_TYPE 0x506f9a1c
 #define OWE_OUI_TYPE 28
-#define MULTI_AP_OUI_TYPE 0x1B
-
-#define MULTI_AP_SUB_ELEM_TYPE 0x06
-#define MULTI_AP_TEAR_DOWN BIT(4)
-#define MULTI_AP_FRONTHAUL_BSS BIT(5)
-#define MULTI_AP_BACKHAUL_BSS BIT(6)
-#define MULTI_AP_BACKHAUL_STA BIT(7)
 
 #define WMM_OUI_TYPE 2
 #define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
@@ -1438,15 +1347,13 @@
 #define HS20_PPS_MO_ID_PRESENT 0x02
 #define HS20_ANQP_DOMAIN_ID_PRESENT 0x04
 #ifndef HS20_VERSION
-#define HS20_VERSION 0x20 /* Release 3 */
+#define HS20_VERSION 0x10 /* Release 2 */
 #endif /* HS20_VERSION */
 
 /* WNM-Notification WFA vendors specific subtypes */
 #define HS20_WNM_SUB_REM_NEEDED 0
 #define HS20_WNM_DEAUTH_IMMINENT_NOTICE 1
-#define WFA_WNM_NOTIF_SUBELEM_NON_PREF_CHAN_REPORT 2
-#define WFA_WNM_NOTIF_SUBELEM_CELL_DATA_CAPA 3
-#define HS20_WNM_T_C_ACCEPTANCE 4
+#define HS20_WNM_T_C_ACCEPTANCE 2
 
 #define HS20_DEAUTH_REASON_CODE_BSS 0
 #define HS20_DEAUTH_REASON_CODE_ESS 1
@@ -1535,6 +1442,12 @@
 	MBO_TRANSITION_REJECT_REASON_SERVICES = 6,
 };
 
+/* MBO v0.0_r19, 4.4: WNM-Notification vendor subelements */
+enum wfa_wnm_notif_subelem_id {
+	WFA_WNM_NOTIF_SUBELEM_NON_PREF_CHAN_REPORT = 2,
+	WFA_WNM_NOTIF_SUBELEM_CELL_DATA_CAPA = 3,
+};
+
 /* MBO v0.0_r27, 4.3: MBO ANQP-elements */
 #define MBO_ANQP_OUI_TYPE 0x12
 #define MBO_ANQP_SUBTYPE_QUERY_LIST 1
@@ -1928,14 +1841,11 @@
 };
 
 /* IEEE Std 802.11-2016, Table 9-88 - Beacon Request subelement IDs */
-/* IEEE P802.11-REVmd/D2.0, Table 9-106 - Optional subelement IDs for
- * Beacon request */
 #define WLAN_BEACON_REQUEST_SUBELEM_SSID	0
 #define WLAN_BEACON_REQUEST_SUBELEM_INFO	1 /* Beacon Reporting */
 #define WLAN_BEACON_REQUEST_SUBELEM_DETAIL	2 /* Reporting Detail */
 #define WLAN_BEACON_REQUEST_SUBELEM_REQUEST	10
 #define WLAN_BEACON_REQUEST_SUBELEM_AP_CHANNEL	51 /* AP Channel Report */
-#define WLAN_BEACON_REQUEST_SUBELEM_LAST_INDICATION	164
 #define WLAN_BEACON_REQUEST_SUBELEM_VENDOR	221
 
 /*
@@ -1985,21 +1895,9 @@
 } STRUCT_PACKED;
 
 /* IEEE Std 802.11-2016, Table 9-112 - Beacon report Subelement IDs */
-/* IEEE P802.11-REVmd/D2.0, Table 9-130 - Optional subelement IDs for
- * Beacon report */
 #define WLAN_BEACON_REPORT_SUBELEM_FRAME_BODY	1
-#define WLAN_BEACON_REPORT_SUBELEM_FRAME_BODY_FRAGMENT_ID	2
-#define WLAN_BEACON_REPORT_SUBELEM_LAST_INDICATION	164
 #define WLAN_BEACON_REPORT_SUBELEM_VENDOR	221
 
-/* IEEE P802.11-REVmd/D2.0, Table 9-232 - Data field format of the
- * Reported Frame Body Fragment ID subelement */
-#define REPORTED_FRAME_BODY_SUBELEM_LEN		4
-#define REPORTED_FRAME_BODY_MORE_FRAGMENTS	BIT(7)
-
-/* IEEE P802.11-REVmd/D2.0, 9.4.2.21.7 - Beacon report  */
-#define BEACON_REPORT_LAST_INDICATION_SUBELEM_LEN	3
-
 /* IEEE Std 802.11ad-2012 - Multi-band element */
 struct multi_band_ie {
 	u8 eid; /* WLAN_EID_MULTI_BAND */
@@ -2102,15 +2000,14 @@
 };
 
 struct ieee80211_he_capabilities {
-	u8 he_mac_capab_info[6];
-	u8 he_phy_capab_info[11];
+	u8 he_mac_capab_info[5];
+	u8 he_phy_capab_info[9];
 	u8 he_txrx_mcs_support[12]; /* TODO: 4, 8, or 12 octets */
 	/* PPE Thresholds (optional) */
 } STRUCT_PACKED;
 
 struct ieee80211_he_operation {
-	u32 he_oper_params; /* HE Operation Parameters[3] and
-			     * BSS Color Information[1] */
+	u32 he_oper_params;
 	u8 he_mcs_nss_set[2];
 	u8 vht_op_info_chwidth;
 	u8 vht_op_info_chan_center_freq_seg0_idx;
@@ -2127,55 +2024,28 @@
 #define HE_PHYCAP_MU_BEAMFORMER_CAPAB		((u8) BIT(1))
 
 /* HE Operation defines */
-/* HE Operation Parameters and BSS Color Information fields */
 #define HE_OPERATION_BSS_COLOR_MASK		((u32) (BIT(0) | BIT(1) | \
 							BIT(2) | BIT(3) | \
 							BIT(4) | BIT(5)))
-#define HE_OPERATION_PARTIAL_BSS_COLOR		((u32) BIT(6))
-#define HE_OPERATION_BSS_COLOR_DISABLED		((u32) BIT(7))
-#define HE_OPERATION_DFLT_PE_DURATION_MASK	((u32) (BIT(8) | BIT(9) | \
-							BIT(10)))
-#define HE_OPERATION_DFLT_PE_DURATION_OFFSET	8
-#define HE_OPERATION_TWT_REQUIRED		((u32) BIT(11))
-#define HE_OPERATION_RTS_THRESHOLD_MASK	((u32) (BIT(12) | BIT(13) | \
+#define HE_OPERATION_DFLT_PE_DURATION_MASK	((u32) (BIT(6) | BIT(7) | \
+							BIT(8)))
+#define HE_OPERATION_DFLT_PE_DURATION_OFFSET	6
+#define HE_OPERATION_TWT_REQUIRED		((u32) BIT(9))
+#define HE_OPERATION_RTS_THRESHOLD_MASK	((u32) (BIT(10) | BIT(11) | \
+						BIT(12) | BIT(13) | \
 						BIT(14) | BIT(15) | \
 						BIT(16) | BIT(17) | \
-						BIT(18) | BIT(19) | \
-						BIT(20) | BIT(21)))
-#define HE_OPERATION_RTS_THRESHOLD_OFFSET	12
-
-struct ieee80211_he_mu_edca_parameter_set {
-	u8 he_qos_info;
-	u8 he_mu_ac_be_param[3];
-	u8 he_mu_ac_bk_param[3];
-	u8 he_mu_ac_vi_param[3];
-	u8 he_mu_ac_vo_param[3];
-} STRUCT_PACKED;
-
-/* HE MU AC parameter record field format */
-/* ACI/AIFSN */
-#define HE_MU_AC_PARAM_ACI_IDX 0
-#define HE_MU_AC_PARAM_AIFSN ((u8) (BIT(0) | BIT(1) | BIT(2) | BIT(3)))
-#define HE_MU_AC_PARAM_ACM ((u8) BIT(4))
-#define HE_MU_AC_PARAM_ACI ((u8) (BIT(5) | BIT(6)))
-/* B7: Reserved */
-
-/* ECWmin/ECWmax */
-#define HE_MU_AC_PARAM_ECW_IDX 1
-#define HE_MU_AC_PARAM_ECWMIN ((u8) (BIT(0) | BIT(1) | BIT(2) | BIT(3)))
-#define HE_MU_AC_PARAM_ECWMAX ((u8) (BIT(4) | BIT(5) | BIT(6) | BIT(7)))
-
-/* MU EDCA Timer */
-#define HE_MU_AC_PARAM_TIMER_IDX 2
-
-/* HE QoS Info field */
-#define HE_QOS_INFO_EDCA_PARAM_SET_COUNT ((u8) (BIT(0) | BIT(1) | \
-						BIT(2) | BIT(3)))
-#define HE_QOS_INFO_Q_ACK ((u8) (BIT(4)))
-#define HE_QOS_INFO_QUEUE_REQUEST ((u8) (BIT(5)))
-#define HE_QOS_INFO_TXOP_REQUEST ((u8) (BIT(6)))
-/* B7: Reserved if sent by an AP; More Data Ack if sent by a non-AP STA */
-#define HE_QOS_INFO_MORE_DATA_ACK ((u8) (BIT(7)))
+						BIT(18) | BIT(19)))
+#define HE_OPERATION_RTS_THRESHOLD_OFFSET	10
+#define HE_OPERATION_PARTIAL_BSS_COLOR		((u32) BIT(20))
+#define HE_OPERATION_MAX_BSSID_INDICATOR_MASK	((u32) (BIT(21) | BIT(22) | \
+							BIT(23) | BIT(24) | \
+							BIT(25) | BIT(26) | \
+							BIT(27) | BIT(28)))
+#define HE_OPERATION_MAX_BSSID_INDICATOR_OFFSET 21
+#define HE_OPERATION_TX_BSSID_INDICATOR		((u32) BIT(29))
+#define HE_OPERATION_BSS_COLOR_DISABLED		((u32) BIT(30))
+#define HE_OPERATION_BSS_DUAL_BEACON		((u32) BIT(31))
 
 /* DPP Public Action frame identifiers - OUI_WFA */
 #define DPP_OUI_TYPE 0x1A
diff --git a/src/common/linux_bridge.h b/src/common/linux_bridge.h
index 84386e6..7b76846 100644
--- a/src/common/linux_bridge.h
+++ b/src/common/linux_bridge.h
@@ -9,21 +9,6 @@
 #ifndef LINUX_BRIDGE_H
 #define LINUX_BRIDGE_H
 
-/* This ioctl is defined in linux/sockios.h */
-
-#ifndef SIOCBRADDBR
-#define SIOCBRADDBR 0x89a0
-#endif
-#ifndef SIOCBRDELBR
-#define SIOCBRDELBR 0x89a1
-#endif
-#ifndef SIOCBRADDIF
-#define SIOCBRADDIF 0x89a2
-#endif
-#ifndef SIOCBRDELIF
-#define SIOCBRDELIF 0x89a3
-#endif
-
 /* This interface is defined in linux/if_bridge.h */
 
 #define BRCTL_GET_VERSION 0
diff --git a/src/common/ocv.c b/src/common/ocv.c
deleted file mode 100644
index 06badfb..0000000
--- a/src/common/ocv.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Operating Channel Validation (OCV)
- * Copyright (c) 2018, Mathy Vanhoef
- *
- * This software may be distributed under the terms of the BSD license.
- * See README for more details.
- */
-
-#include "utils/includes.h"
-#include "utils/common.h"
-#include "drivers/driver.h"
-#include "common/ieee802_11_common.h"
-#include "ocv.h"
-
-/**
- * Caller of OCV functionality may use various debug output functions, so store
- * the error here and let the caller use an appropriate debug output function.
- */
-char ocv_errorstr[256];
-
-
-int ocv_derive_all_parameters(struct oci_info *oci)
-{
-	const struct oper_class_map *op_class_map;
-
-	oci->freq = ieee80211_chan_to_freq(NULL, oci->op_class, oci->channel);
-	if (oci->freq < 0) {
-		wpa_printf(MSG_INFO,
-			   "Error interpreting OCI: unrecognized opclass/channel pair (%d/%d)",
-			   oci->op_class, oci->channel);
-		return -1;
-	}
-
-	op_class_map = get_oper_class(NULL, oci->op_class);
-	if (!op_class_map) {
-		wpa_printf(MSG_INFO,
-			   "Error interpreting OCI: Unrecognized opclass (%d)",
-			   oci->op_class);
-		return -1;
-	}
-
-	oci->chanwidth = oper_class_bw_to_int(op_class_map);
-	oci->sec_channel = 0;
-	if (op_class_map->bw == BW40PLUS)
-		oci->sec_channel = 1;
-	else if (op_class_map->bw == BW40MINUS)
-		oci->sec_channel = -1;
-
-	return 0;
-}
-
-
-int ocv_insert_oci(struct wpa_channel_info *ci, u8 **argpos)
-{
-	u8 op_class, channel;
-	u8 *pos = *argpos;
-
-	if (ieee80211_chaninfo_to_channel(ci->frequency, ci->chanwidth,
-					  ci->sec_channel,
-					  &op_class, &channel) < 0) {
-		wpa_printf(MSG_WARNING,
-			   "Cannot determine operating class and channel for OCI element");
-		return -1;
-	}
-
-	*pos++ = op_class;
-	*pos++ = channel;
-	*pos++ = ci->seg1_idx;
-
-	*argpos = pos;
-	return 0;
-}
-
-
-int ocv_insert_oci_kde(struct wpa_channel_info *ci, u8 **argpos)
-{
-	u8 *pos = *argpos;
-
-	*pos++ = WLAN_EID_VENDOR_SPECIFIC;
-	*pos++ = RSN_SELECTOR_LEN + 3;
-	RSN_SELECTOR_PUT(pos, RSN_KEY_DATA_OCI);
-	pos += RSN_SELECTOR_LEN;
-
-	*argpos = pos;
-	return ocv_insert_oci(ci, argpos);
-}
-
-
-int ocv_insert_extended_oci(struct wpa_channel_info *ci, u8 *pos)
-{
-	*pos++ = WLAN_EID_EXTENSION;
-	*pos++ = 1 + OCV_OCI_LEN;
-	*pos++ = WLAN_EID_EXT_OCV_OCI;
-	return ocv_insert_oci(ci, &pos);
-}
-
-
-int ocv_verify_tx_params(const u8 *oci_ie, size_t oci_ie_len,
-			 struct wpa_channel_info *ci, int tx_chanwidth,
-			 int tx_seg1_idx)
-{
-	struct oci_info oci;
-
-	if (!oci_ie) {
-		os_snprintf(ocv_errorstr, sizeof(ocv_errorstr),
-			    "OCV failed: did not receive mandatory OCI");
-		return -1;
-	}
-
-	if (oci_ie_len != 3) {
-		os_snprintf(ocv_errorstr, sizeof(ocv_errorstr),
-			    "OCV failed: received OCI of unexpected length (%d)",
-			    (int) oci_ie_len);
-		return -1;
-	}
-
-	os_memset(&oci, 0, sizeof(oci));
-	oci.op_class = oci_ie[0];
-	oci.channel = oci_ie[1];
-	oci.seg1_idx = oci_ie[2];
-	if (ocv_derive_all_parameters(&oci) != 0) {
-		os_snprintf(ocv_errorstr, sizeof(ocv_errorstr),
-			    "OCV failed: unable to interpret received OCI");
-		return -1;
-	}
-
-	/* Primary frequency used to send frames to STA must match the STA's */
-	if ((int) ci->frequency != oci.freq) {
-		os_snprintf(ocv_errorstr, sizeof(ocv_errorstr),
-			    "OCV failed: primary channel mismatch in received OCI (we use %d but receiver is using %d)",
-			    ci->frequency, oci.freq);
-		return -1;
-	}
-
-	/* We shouldn't transmit with a higher bandwidth than the STA supports
-	 */
-	if (tx_chanwidth > oci.chanwidth) {
-		os_snprintf(ocv_errorstr, sizeof(ocv_errorstr),
-			    "OCV failed: channel bandwidth mismatch in received OCI (we use %d but receiver only supports %d)",
-			    tx_chanwidth, oci.chanwidth);
-		return -1;
-	}
-
-	/*
-	 * Secondary channel only needs be checked for 40 MHz in the 2.4 GHz
-	 * band. In the 5 GHz band it's verified through the primary frequency.
-	 * Note that the field ci->sec_channel is only filled in when we use
-	 * 40 MHz.
-	 */
-	if (tx_chanwidth == 40 && ci->frequency < 2500 &&
-	    ci->sec_channel != oci.sec_channel) {
-		os_snprintf(ocv_errorstr, sizeof(ocv_errorstr),
-			    "OCV failed: secondary channel mismatch in received OCI (we use %d but receiver is using %d)",
-			    ci->sec_channel, oci.sec_channel);
-		return -1;
-	}
-
-	/*
-	 * When using a 160 or 80+80 MHz channel to transmit, verify that we use
-	 * the same segments as the receiver by comparing frequency segment 1.
-	 */
-	if ((ci->chanwidth == CHAN_WIDTH_160 ||
-	     ci->chanwidth == CHAN_WIDTH_80P80) &&
-	    tx_seg1_idx != oci.seg1_idx) {
-		os_snprintf(ocv_errorstr, sizeof(ocv_errorstr),
-			    "OCV failed: frequency segment 1 mismatch in received OCI (we use %d but receiver is using %d)",
-			    tx_seg1_idx, oci.seg1_idx);
-		return -1;
-	}
-
-	return 0;
-}
diff --git a/src/common/ocv.h b/src/common/ocv.h
deleted file mode 100644
index 6379d9d..0000000
--- a/src/common/ocv.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Operating Channel Validation (OCV)
- * Copyright (c) 2018, Mathy Vanhoef
- *
- * This software may be distributed under the terms of the BSD license.
- * See README for more details.
- */
-
-#ifndef OCV_H
-#define OCV_H
-
-struct wpa_channel_info;
-
-struct oci_info {
-	/* Values in the OCI element */
-	u8 op_class;
-	u8 channel;
-	u8 seg1_idx;
-
-	/* Derived values for easier verification */
-	int freq;
-	int sec_channel;
-	int chanwidth;
-};
-
-#define OCV_OCI_LEN		3
-#define OCV_OCI_EXTENDED_LEN	(3 + OCV_OCI_LEN)
-#define OCV_OCI_KDE_LEN		(2 + RSN_SELECTOR_LEN + OCV_OCI_LEN)
-
-extern char ocv_errorstr[256];
-
-int ocv_derive_all_parameters(struct oci_info *oci);
-int ocv_insert_oci(struct wpa_channel_info *ci, u8 **argpos);
-int ocv_insert_oci_kde(struct wpa_channel_info *ci, u8 **argpos);
-int ocv_insert_extended_oci(struct wpa_channel_info *ci, u8 *pos);
-int ocv_verify_tx_params(const u8 *oci_ie, size_t oci_ie_len,
-			 struct wpa_channel_info *ci, int tx_chanwidth,
-			 int tx_seg1_idx);
-
-#endif /* OCV_H */
diff --git a/src/common/qca-vendor.h b/src/common/qca-vendor.h
index 6f5b87e..7a4da46 100644
--- a/src/common/qca-vendor.h
+++ b/src/common/qca-vendor.h
@@ -42,12 +42,8 @@
  *
  * @QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY: Recommendation of frequency
  *	ranges to avoid to reduce issues due to interference or internal
- *	co-existence information in the driver. These frequencies aim to
- *	minimize the traffic but not to totally avoid the traffic. That said
- *	for a P2P use case, these frequencies are allowed for the P2P
- *	discovery/negotiation but avoid the group to get formed on these
- *	frequencies. The event data structure is defined in
- *	struct qca_avoid_freq_list.
+ *	co-existence information in the driver. The event data structure is
+ *	defined in struct qca_avoid_freq_list.
  *
  * @QCA_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY: Command to check driver support
  *	for DFS offloading.
@@ -162,11 +158,6 @@
  *	timer value. Uses the attributes defines in
  *	enum qca_wlan_vendor_attr_ocb_get_tsf_resp.
  *
- * @QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES: Command/event to update the
- *	link properties of the respective interface. As an event, is used
- *	to notify the connected station's status. The attributes for this
- *	command are defined in enum qca_wlan_vendor_attr_link_properties.
- *
  * @QCA_NL80211_VENDOR_SUBCMD_P2P_LISTEN_OFFLOAD_START: Command used to
  *	start the P2P Listen offload function in device and pass the listen
  *	channel, period, interval, count, device types, and vendor specific
@@ -483,30 +474,6 @@
  *	configure parameters per peer to capture Channel Frequency Response
  *	(CFR) and enable Periodic CFR capture. The attributes for this command
  *	are defined in enum qca_wlan_vendor_peer_cfr_capture_attr.
- *
- * @QCA_NL80211_VENDOR_SUBCMD_THROUGHPUT_CHANGE_EVENT: Event to indicate changes
- *	in throughput dynamically. The driver estimates the throughput based on
- *	number of packets being transmitted/received per second and indicates
- *	the changes in throughput to user space. Userspace tools can use this
- *	information to configure kernel's TCP parameters in order to achieve
- *	peak throughput. Optionally, the driver will also send guidance on
- *	modifications to kernel's TCP parameters which can be referred by
- *	userspace tools. The attributes used with this event are defined in enum
- *	qca_wlan_vendor_attr_throughput_change.
- *
- * @QCA_NL80211_VENDOR_SUBCMD_COEX_CONFIG: This command is used to set
- *	priorities among different types of traffic during coex scenarios.
- *	Current supported prioritization is among WLAN/BT/ZIGBEE with different
- *	profiles mentioned in enum qca_coex_config_profiles. The associated
- *	attributes used with this command are defined in enum
- *	qca_vendor_attr_coex_config.
- *
- *	Based on the config provided, FW will boost the weight and prioritize
- *	the traffic for that subsystem (WLAN/BT/Zigbee).
- *
- * @QCA_NL80211_VENDOR_SUBCMD_GET_SUPPORTED_AKMS: This command is used to query
- *	the supported AKM suite selectorss from the driver. It returns the list
- *	of supported AKMs in the attribute NL80211_ATTR_AKM_SUITES.
  */
 enum qca_nl80211_vendor_subcmds {
 	QCA_NL80211_VENDOR_SUBCMD_UNSPEC = 0,
@@ -669,9 +636,6 @@
 	QCA_NL80211_VENDOR_SUBCMD_NAN_EXT = 171,
 	QCA_NL80211_VENDOR_SUBCMD_ROAM_SCAN_EVENT = 172,
 	QCA_NL80211_VENDOR_SUBCMD_PEER_CFR_CAPTURE_CFG = 173,
-	QCA_NL80211_VENDOR_SUBCMD_THROUGHPUT_CHANGE_EVENT = 174,
-	QCA_NL80211_VENDOR_SUBCMD_COEX_CONFIG = 175,
-	QCA_NL80211_VENDOR_SUBCMD_GET_SUPPORTED_AKMS = 176,
 };
 
 enum qca_wlan_vendor_attr {
@@ -852,12 +816,6 @@
 	 * to report the corresponding antenna index to the chain RSSI value
 	 */
 	QCA_WLAN_VENDOR_ATTR_ANTENNA_INFO = 40,
-	/* Used in QCA_NL80211_VENDOR_SUBCMD_GET_CHAIN_RSSI command to report
-	 * the specific antenna EVM value (unsigned 32 bit value). With a
-	 * determinate group of antennas, the driver specifies the EVM value
-	 * for each antenna ID, and application extract them in user space.
-	 */
-	QCA_WLAN_VENDOR_ATTR_CHAIN_EVM = 41,
 
 	/* keep last */
 	QCA_WLAN_VENDOR_ATTR_AFTER_LAST,
@@ -4448,27 +4406,6 @@
 	 * qca_wlan_vendor_spectral_scan_cap_hw_gen.
 	 */
 	QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_HW_GEN = 5,
-	/* Spectral bin scaling formula ID. u16 attribute.
-	 * It uses values defined in enum
-	 * qca_wlan_vendor_spectral_scan_cap_formula_id.
-	 */
-	QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_FORMULA_ID = 6,
-	/* Spectral bin scaling param - low level offset.
-	 * s16 attribute.
-	 */
-	QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_LOW_LEVEL_OFFSET = 7,
-	/* Spectral bin scaling param - high level offset.
-	 * s16 attribute.
-	 */
-	QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_HIGH_LEVEL_OFFSET = 8,
-	/* Spectral bin scaling param - RSSI threshold.
-	 * s16 attribute.
-	 */
-	QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_RSSI_THR = 9,
-	/* Spectral bin scaling param - default AGC max gain.
-	 * u8 attribute.
-	 */
-	QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_DEFAULT_AGC_MAX_GAIN = 10,
 
 	QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_AFTER_LAST,
 	QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_MAX =
@@ -4614,20 +4551,6 @@
 };
 
 /**
- * qca_wlan_vendor_spectral_scan_cap_formula_id: Attribute values for
- * QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_FORMULA_ID in the vendor subcmd
- * QCA_NL80211_VENDOR_SUBCMD_SPECTRAL_SCAN_GET_CAP_INFO. This represents the
- * Spectral bin scaling formula ID.
- * @QCA_WLAN_VENDOR_SPECTRAL_SCAN_CAP_NO_SCALING: No scaling
- * @QCA_WLAN_VENDOR_SPECTRAL_SCAN_CAP_AGC_GAIN_RSSI_CORR_BASED: AGC gain
- * and RSSI threshold based formula.
- */
-enum qca_wlan_vendor_spectral_scan_cap_formula_id {
-	QCA_WLAN_VENDOR_SPECTRAL_SCAN_CAP_NO_SCALING = 0,
-	QCA_WLAN_VENDOR_SPECTRAL_SCAN_CAP_AGC_GAIN_RSSI_CORR_BASED = 1,
-};
-
-/**
  * enum qca_wlan_vendor_attr_rropavail_info - Specifies whether Representative
  * RF Operating Parameter (RROP) information is available, and if so, at which
  * point in the application-driver interaction sequence it can be retrieved by
@@ -5490,60 +5413,6 @@
 	QCA_WLAN_HE_16US_OF_PROCESS_TIME = 2,
 };
 
-/**
- * enum qca_wlan_he_om_ctrl_ch_bw - HE OM control field BW configuration
- *
- * Indicates the HE Operating mode control channel width setting value.
- *
- * @QCA_WLAN_HE_OM_CTRL_BW_20M: Primary 20 MHz
- * @QCA_WLAN_HE_OM_CTRL_BW_40M: Primary 40 MHz
- * @QCA_WLAN_HE_OM_CTRL_BW_80M: Primary 80 MHz
- * @QCA_WLAN_HE_OM_CTRL_BW_160M: 160 MHz and 80+80 MHz
- */
-enum qca_wlan_he_om_ctrl_ch_bw {
-	QCA_WLAN_HE_OM_CTRL_BW_20M = 0,
-	QCA_WLAN_HE_OM_CTRL_BW_40M = 1,
-	QCA_WLAN_HE_OM_CTRL_BW_80M = 2,
-	QCA_WLAN_HE_OM_CTRL_BW_160M = 3,
-};
-
-/**
- * enum qca_wlan_vendor_attr_he_omi_tx: Represents attributes for
- * HE operating mode control transmit request. These attributes are
- * sent as part of QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OMI_TX and
- * QCA_NL80211_VENDOR_SUBCMD_WIFI_TEST_CONFIGURATION.
- *
- * @QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS: Mandatory 8-bit unsigned value
- * indicates the maximum number of spatial streams, NSS, that the STA
- * supports in reception for PPDU bandwidths less than or equal to 80 MHz
- * and is set to NSS - 1.
- *
- * @QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW: Mandatory 8-bit unsigned value
- * indicates the operating channel width supported by the STA for both
- * reception and transmission. Uses enum qca_wlan_he_om_ctrl_ch_bw values.
- *
- * @QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE: Mandatory 8-bit unsigned value
- * indicates the all trigger based UL MU operations by the STA.
- * 0 - UL MU operations are enabled by the STA.
- * 1 - All triggered UL MU transmissions are suspended by the STA.
- *
- * @QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS: Mandatory 8-bit unsigned value
- * indicates the maximum number of space-time streams, NSTS, that
- * the STA supports in transmission and is set to NSTS - 1.
- */
-enum qca_wlan_vendor_attr_he_omi_tx {
-	QCA_WLAN_VENDOR_ATTR_HE_OMI_INVALID = 0,
-	QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS = 1,
-	QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW = 2,
-	QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE = 3,
-	QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS = 4,
-
-	/* keep last */
-	QCA_WLAN_VENDOR_ATTR_HE_OMI_AFTER_LAST,
-	QCA_WLAN_VENDOR_ATTR_HE_OMI_MAX =
-	QCA_WLAN_VENDOR_ATTR_HE_OMI_AFTER_LAST - 1,
-};
-
 /* Attributes for data used by
  * QCA_NL80211_VENDOR_SUBCMD_WIFI_TEST_CONFIGURATION
  */
@@ -5735,79 +5604,6 @@
 	 */
 	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_TWT_RESUME = 26,
 
-	/* 8-bit unsigned value to set the HE operating mode control
-	 * (OM CTRL) Channel Width subfield.
-	 * The Channel Width subfield indicates the operating channel width
-	 * supported by the STA for both reception and transmission.
-	 * Uses the enum qca_wlan_he_om_ctrl_ch_bw values.
-	 * This setting is cleared with the
-	 * QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_CLEAR_HE_OM_CTRL_CONFIG
-	 * flag attribute to reset defaults.
-	 * This attribute is used to configure the testbed device.
-	 */
-	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_BW = 27,
-
-	/* 8-bit unsigned value to configure the number of spatial
-	 * streams in HE operating mode control field.
-	 * This setting is cleared with the
-	 * QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_CLEAR_HE_OM_CTRL_CONFIG
-	 * flag attribute to reset defaults.
-	 * This attribute is used to configure the testbed device.
-	 */
-	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_NSS = 28,
-
-	/* Flag attribute to configure the UL MU disable bit in
-	 * HE operating mode control field.
-	 * This setting is cleared with the
-	 * QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_CLEAR_HE_OM_CTRL_CONFIG
-	 * flag attribute to reset defaults.
-	 * This attribute is used to configure the testbed device.
-	 */
-	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_UL_MU_DISABLE = 29,
-
-	/* Flag attribute to clear the previously set HE operating mode
-	 * control field configuration.
-	 * This attribute is used to configure the testbed device to reset
-	 * defaults to clear any previously set HE operating mode control
-	 * field configuration.
-	 */
-	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_CLEAR_HE_OM_CTRL_CONFIG = 30,
-
-	/* 8-bit unsigned value to configure HE single user PPDU
-	 * transmission. By default this setting is disabled and it
-	 * is disabled in the reset defaults of the device configuration.
-	 * This attribute is used to configure the testbed device.
-	 * 1-enable, 0-disable
-	 */
-	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_TX_SUPPDU = 31,
-
-	/* 8-bit unsigned value to configure action frame transmission
-	 * in HE trigger based PPDU transmission.
-	 * By default this setting is disabled and it is disabled in
-	 * the reset defaults of the device configuration.
-	 * This attribute is used to configure the testbed device.
-	 * 1-enable, 0-disable
-	 */
-	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_ACTION_TX_TB_PPDU = 32,
-
-	/* Nested attribute to indicate HE operating mode control field
-	 * transmission. It contains operating mode control field Nss,
-	 * channel bandwidth, Tx Nsts and UL MU disable attributes.
-	 * These nested attributes are used to send HE operating mode control
-	 * with configured values.
-	 * Uses the enum qca_wlan_vendor_attr_he_omi_tx attributes.
-	 * This attribute is used to configure the testbed device.
-	 */
-	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OMI_TX = 33,
-
-	/* 8-bit unsigned value to configure +HTC_HE support to indicate the
-	 * support for the reception of a frame that carries an HE variant
-	 * HT Control field.
-	 * This attribute is used to configure the testbed device.
-	 * 1-enable, 0-disable
-	 */
-	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_HTC_HE_SUPP = 34,
-
 	/* keep last */
 	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_AFTER_LAST,
 	QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_MAX =
@@ -6194,159 +5990,4 @@
 	QCA_WLAN_VENDOR_ATTR_PEER_CFR_AFTER_LAST - 1,
 };
 
-/**
- * enum qca_wlan_throughput_level - Current throughput level
- *
- * Indicates the current level of throughput calculated by the driver. The
- * driver may choose different thresholds to decide whether the throughput level
- * is low or medium or high based on variety of parameters like physical link
- * capacity of the current connection, the number of packets being dispatched
- * per second, etc. The throughput level events might not be consistent with the
- * actual current throughput value being observed.
- *
- * @QCA_WLAN_THROUGHPUT_LEVEL_LOW: Low level of throughput
- * @QCA_WLAN_THROUGHPUT_LEVEL_MEDIUM: Medium level of throughput
- * @QCA_WLAN_THROUGHPUT_LEVEL_HIGH: High level of throughput
- */
-enum qca_wlan_throughput_level {
-	QCA_WLAN_THROUGHPUT_LEVEL_LOW = 0,
-	QCA_WLAN_THROUGHPUT_LEVEL_MEDIUM = 1,
-	QCA_WLAN_THROUGHPUT_LEVEL_HIGH = 2,
-};
-
-/**
- * enum qca_wlan_vendor_attr_throughput_change - Vendor subcmd attributes to
- * report throughput changes from the driver to user space. enum values are used
- * for netlink attributes sent with
- * %QCA_NL80211_VENDOR_SUBCMD_THROUGHPUT_CHANGE_EVENT sub command.
- */
-enum qca_wlan_vendor_attr_throughput_change {
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_INVALID = 0,
-	/* Indicates the direction of throughput in which the change is being
-	 * reported. u8 attribute. Value is 0 for TX and 1 for RX.
-	 */
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_DIRECTION = 1,
-	/* Indicates the newly observed throughput level. enum
-	 * qca_wlan_throughput_level describes the possible range of values.
-	 * u8 attribute.
-	 */
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_THROUGHPUT_LEVEL = 2,
-	/* Indicates the driver's guidance on the new value to be set to
-	 * kernel's TCP parameter tcp_limit_output_bytes. u32 attribute. The
-	 * driver may optionally include this attribute.
-	 */
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_TCP_LIMIT_OUTPUT_BYTES = 3,
-	/* Indicates the driver's guidance on the new value to be set to
-	 * kernel's TCP parameter tcp_adv_win_scale. s8 attribute. Possible
-	 * values are from -31 to 31. The driver may optionally include this
-	 * attribute.
-	 */
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_TCP_ADV_WIN_SCALE = 4,
-	/* Indicates the driver's guidance on the new value to be set to
-	 * kernel's TCP parameter tcp_delack_seg. u32 attribute. The driver may
-	 * optionally include this attribute.
-	 */
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_TCP_DELACK_SEG = 5,
-
-	/* keep last */
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_AFTER_LAST,
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_MAX =
-	QCA_WLAN_VENDOR_ATTR_THROUGHPUT_CHANGE_AFTER_LAST - 1,
-};
-
-/**
- * enum qca_coex_config_profiles - This enum defines different types of
- * traffic streams that can be prioritized one over the other during coex
- * scenarios.
- * The types defined in this enum are categorized in the below manner.
- * 0 - 31 values corresponds to WLAN
- * 32 - 63 values corresponds to BT
- * 64 - 95 values corresponds to Zigbee
- * @QCA_WIFI_STA_DISCOVERY: Prioritize discovery frames for WLAN STA
- * @QCA_WIFI_STA_CONNECTION: Prioritize connection frames for WLAN STA
- * @QCA_WIFI_STA_CLASS_3_MGMT: Prioritize class 3 mgmt frames for WLAN STA
- * @QCA_WIFI_STA_DATA : Prioritize data frames for WLAN STA
- * @QCA_WIFI_STA_ALL: Priritize all frames for WLAN STA
- * @QCA_WIFI_SAP_DISCOVERY: Prioritize discovery frames for WLAN SAP
- * @QCA_WIFI_SAP_CONNECTION: Prioritize connection frames for WLAN SAP
- * @QCA_WIFI_SAP_CLASS_3_MGMT: Prioritize class 3 mgmt frames for WLAN SAP
- * @QCA_WIFI_SAP_DATA: Prioritize data frames for WLAN SAP
- * @QCA_WIFI_SAP_ALL: Prioritize all frames for WLAN SAP
- * @QCA_BT_A2DP: Prioritize BT A2DP
- * @QCA_BT_BLE: Prioritize BT BLE
- * @QCA_BT_SCO: Prioritize BT SCO
- * @QCA_ZB_LOW: Prioritize Zigbee Low
- * @QCA_ZB_HIGH: Prioritize Zigbee High
- */
-enum qca_coex_config_profiles {
-	/* 0 - 31 corresponds to WLAN */
-	QCA_WIFI_STA_DISCOVERY = 0,
-	QCA_WIFI_STA_CONNECTION = 1,
-	QCA_WIFI_STA_CLASS_3_MGMT = 2,
-	QCA_WIFI_STA_DATA = 3,
-	QCA_WIFI_STA_ALL = 4,
-	QCA_WIFI_SAP_DISCOVERY = 5,
-	QCA_WIFI_SAP_CONNECTION = 6,
-	QCA_WIFI_SAP_CLASS_3_MGMT = 7,
-	QCA_WIFI_SAP_DATA = 8,
-	QCA_WIFI_SAP_ALL = 9,
-	/* 32 - 63 corresponds to BT */
-	QCA_BT_A2DP = 32,
-	QCA_BT_BLE = 33,
-	QCA_BT_SCO = 34,
-	/* 64 - 95 corresponds to Zigbee */
-	QCA_ZB_LOW = 64,
-	QCA_ZB_HIGH = 65
-};
-
-/**
- * enum qca_vendor_attr_coex_config - Specifies vendor coex config attributes
- *
- * @QCA_VENDOR_ATTR_COEX_CONFIG_PROFILES: This attribute contains variable
- * length array of 8-bit values from enum qca_coex_config_profiles.
- * FW will prioritize the profiles in the order given in the array encapsulated
- * in this attribute.
- * For example:
- * -----------------------------------------------------------------------
- * |     1       |       34       |        32         |         65       |
- * -----------------------------------------------------------------------
- * If the attribute contains the values defined in above array then it means
- * 1) Wifi STA connection has priority over BT_SCO, BT_A2DP and ZIGBEE HIGH.
- * 2) BT_SCO has priority over BT_A2DP.
- * 3) BT_A2DP has priority over ZIGBEE HIGH.
- * Profiles which are not listed in this array shall not be preferred over the
- * profiles which are listed in the array as a part of this attribute.
- */
-enum qca_vendor_attr_coex_config {
-	QCA_VENDOR_ATTR_COEX_CONFIG_INVALID = 0,
-	QCA_VENDOR_ATTR_COEX_CONFIG_PROFILES = 1,
-
-	/* Keep last */
-	QCA_VENDOR_ATTR_COEX_CONFIG_AFTER_LAST,
-	QCA_VENDOR_ATTR_COEX_CONFIG_MAX =
-	QCA_VENDOR_ATTR_COEX_CONFIG_AFTER_LAST - 1,
-};
-
-/**
- * enum qca_wlan_vendor_attr_link_properties - Represent the link properties.
- *
- * @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAC_ADDR: MAC address of the peer
- * (STA/AP) for the connected link.
- * @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS: Attribute containing a
- * &struct nl80211_sta_flag_update for the respective connected link. MAC
- * address of the peer represented by
- * QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAC_ADDR.
- */
-enum qca_wlan_vendor_attr_link_properties {
-	QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_INVALID = 0,
-	/* 1 - 3 are reserved */
-	QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAC_ADDR = 4,
-	QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS = 5,
-
-	/* Keep last */
-	QCA_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST,
-	QCA_VENDOR_ATTR_LINK_PROPERTIES_MAX =
-	QCA_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST - 1,
-};
-
 #endif /* QCA_VENDOR_H */
diff --git a/src/common/version.h b/src/common/version.h
index eb4f313..16c1004 100644
--- a/src/common/version.h
+++ b/src/common/version.h
@@ -9,6 +9,6 @@
 #define GIT_VERSION_STR_POSTFIX ""
 #endif /* GIT_VERSION_STR_POSTFIX */
 
-#define VERSION_STR "2.8-devel" VERSION_STR_POSTFIX GIT_VERSION_STR_POSTFIX
+#define VERSION_STR "2.7-devel" VERSION_STR_POSTFIX GIT_VERSION_STR_POSTFIX
 
 #endif /* VERSION_H */
diff --git a/src/common/wpa_common.c b/src/common/wpa_common.c
index b47f632..14c5769 100644
--- a/src/common/wpa_common.c
+++ b/src/common/wpa_common.c
@@ -880,12 +880,6 @@
 			parse->igtk_len = len;
 			break;
 #endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_OCV
-		case FTIE_SUBELEM_OCI:
-			parse->oci = pos;
-			parse->oci_len = len;
-			break;
-#endif /* CONFIG_OCV */
 		default:
 			wpa_printf(MSG_DEBUG, "FT: Unknown subelem id %u", id);
 			break;
@@ -1208,8 +1202,6 @@
 		pos = rsn_ie + 6;
 		left = rsn_ie_len - 6;
 
-		data->group_cipher = WPA_CIPHER_GTK_NOT_USED;
-		data->key_mgmt = WPA_KEY_MGMT_OSEN;
 		data->proto = WPA_PROTO_OSEN;
 	} else {
 		const struct rsn_ie_hdr *hdr;
diff --git a/src/common/wpa_common.h b/src/common/wpa_common.h
index 37b5834..6261744 100644
--- a/src/common/wpa_common.h
+++ b/src/common/wpa_common.h
@@ -110,7 +110,6 @@
 #define RSN_KEY_DATA_KEYID RSN_SELECTOR(0x00, 0x0f, 0xac, 10)
 #define RSN_KEY_DATA_MULTIBAND_GTK RSN_SELECTOR(0x00, 0x0f, 0xac, 11)
 #define RSN_KEY_DATA_MULTIBAND_KEYID RSN_SELECTOR(0x00, 0x0f, 0xac, 12)
-#define RSN_KEY_DATA_OCI RSN_SELECTOR(0x00, 0x0f, 0xac, 13)
 
 #define WFA_KEY_DATA_IP_ADDR_REQ RSN_SELECTOR(0x50, 0x6f, 0x9a, 4)
 #define WFA_KEY_DATA_IP_ADDR_ALLOC RSN_SELECTOR(0x50, 0x6f, 0x9a, 5)
@@ -149,8 +148,7 @@
 #define WPA_CAPABILITY_SPP_A_MSDU_REQUIRED BIT(11)
 #define WPA_CAPABILITY_PBAC BIT(12)
 #define WPA_CAPABILITY_EXT_KEY_ID_FOR_UNICAST BIT(13)
-#define WPA_CAPABILITY_OCVC BIT(14)
-/* B15: Reserved */
+/* B14-B15: Reserved */
 
 
 /* IEEE 802.11r */
@@ -328,7 +326,6 @@
 #define FTIE_SUBELEM_GTK 2
 #define FTIE_SUBELEM_R0KH_ID 3
 #define FTIE_SUBELEM_IGTK 4
-#define FTIE_SUBELEM_OCI 5
 
 struct rsn_rdie {
 	u8 id;
@@ -454,10 +451,6 @@
 	size_t tie_len;
 	const u8 *igtk;
 	size_t igtk_len;
-#ifdef CONFIG_OCV
-	const u8 *oci;
-	size_t oci_len;
-#endif /* CONFIG_OCV */
 	const u8 *ric;
 	size_t ric_len;
 	int key_mgmt;
diff --git a/src/common/wpa_ctrl.c b/src/common/wpa_ctrl.c
index 8722b19..a0fe822 100644
--- a/src/common/wpa_ctrl.c
+++ b/src/common/wpa_ctrl.c
@@ -11,8 +11,6 @@
 #ifdef CONFIG_CTRL_IFACE
 
 #ifdef CONFIG_CTRL_IFACE_UNIX
-#include <sys/stat.h>
-#include <fcntl.h>
 #include <sys/un.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -143,19 +141,6 @@
 		return NULL;
 	}
 	tries++;
-#ifdef ANDROID
-	/* Set client socket file permissions so that bind() creates the client
-	 * socket with these permissions and there is no need to try to change
-	 * them with chmod() after bind() which would have potential issues with
-	 * race conditions. These permissions are needed to make sure the server
-	 * side (wpa_supplicant or hostapd) can reply to the control interface
-	 * messages.
-	 *
-	 * The lchown() calls below after bind() are also part of the needed
-	 * operations to allow the response to go through. Those are using the
-	 * no-deference-symlinks version to avoid races. */
-	fchmod(ctrl->s, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
-#endif /* ANDROID */
 	if (bind(ctrl->s, (struct sockaddr *) &ctrl->local,
 		    sizeof(ctrl->local)) < 0) {
 		if (errno == EADDRINUSE && tries < 2) {
@@ -174,6 +159,7 @@
 	}
 
 #ifdef ANDROID
+	chmod(ctrl->local.sun_path, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
 	/* Set group even if we do not have privileges to change owner */
 	grp_wifi = getgrnam("wifi");
 	gid_wifi = grp_wifi ? grp_wifi->gr_gid : 0;
@@ -185,8 +171,8 @@
 		os_free(ctrl);
 		return NULL;
 	}
-	lchown(ctrl->local.sun_path, -1, gid_wifi);
-	lchown(ctrl->local.sun_path, uid_system, gid_wifi);
+	chown(ctrl->local.sun_path, -1, gid_wifi);
+	chown(ctrl->local.sun_path, uid_system, gid_wifi);
 
 	if (os_strncmp(ctrl_path, "@android:", 9) == 0) {
 		if (socket_local_client_connect(
@@ -572,8 +558,7 @@
 			res = recv(ctrl->s, reply, *reply_len, 0);
 			if (res < 0)
 				return res;
-			if ((res > 0 && reply[0] == '<') ||
-			    (res > 6 && strncmp(reply, "IFNAME=", 7) == 0)) {
+			if (res > 0 && reply[0] == '<') {
 				/* This is an unsolicited message from
 				 * wpa_supplicant, not the reply to the
 				 * request. Use msg_cb to report this to the
diff --git a/src/crypto/crypto_openssl.c b/src/crypto/crypto_openssl.c
index f89053a..f4cff43 100644
--- a/src/crypto/crypto_openssl.c
+++ b/src/crypto/crypto_openssl.c
@@ -29,7 +29,6 @@
 #include "sha1.h"
 #include "sha256.h"
 #include "sha384.h"
-#include "sha512.h"
 #include "md5.h"
 #include "aes_wrap.h"
 #include "crypto.h"
diff --git a/src/crypto/md4-internal.c b/src/crypto/md4-internal.c
index cf408e8..d9c737a 100644
--- a/src/crypto/md4-internal.c
+++ b/src/crypto/md4-internal.c
@@ -85,7 +85,7 @@
 	(cp)[1] = (value) >> 8;						\
 	(cp)[0] = (value); } while (0)
 
-static const u8 PADDING[MD4_BLOCK_LENGTH] = {
+static u8 PADDING[MD4_BLOCK_LENGTH] = {
 	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
diff --git a/src/crypto/random.c b/src/crypto/random.c
index ca9c0c8..6f4cf81 100644
--- a/src/crypto/random.c
+++ b/src/crypto/random.c
@@ -25,9 +25,6 @@
 #include "utils/includes.h"
 #ifdef __linux__
 #include <fcntl.h>
-#ifdef CONFIG_GETRANDOM
-#include <sys/random.h>
-#endif /* CONFIG_GETRANDOM */
 #endif /* __linux__ */
 
 #include "utils/common.h"
@@ -238,52 +235,30 @@
 		return 1; /* Already initialized - good to continue */
 
 	/*
-	 * Try to fetch some more data from the kernel high quality RNG.
-	 * There may not be enough data available at this point,
+	 * Try to fetch some more data from the kernel high quality
+	 * /dev/random. There may not be enough data available at this point,
 	 * so use non-blocking read to avoid blocking the application
 	 * completely.
 	 */
-
-#ifdef CONFIG_GETRANDOM
-	res = getrandom(dummy_key + dummy_key_avail,
-			sizeof(dummy_key) - dummy_key_avail, GRND_NONBLOCK);
-	if (res < 0) {
-		if (errno == ENOSYS) {
-			wpa_printf(MSG_DEBUG,
-				   "random: getrandom() not supported, falling back to /dev/random");
-		} else {
-			wpa_printf(MSG_INFO,
-				   "random: no data from getrandom(): %s",
-				   strerror(errno));
-			res = 0;
-		}
-	}
-#else /* CONFIG_GETRANDOM */
-	res = -1;
-#endif /* CONFIG_GETRANDOM */
-	if (res < 0) {
-		fd = open("/dev/random", O_RDONLY | O_NONBLOCK);
-		if (fd < 0) {
-			wpa_printf(MSG_ERROR,
-				   "random: Cannot open /dev/random: %s",
-				   strerror(errno));
-			return -1;
-		}
-
-		res = read(fd, dummy_key + dummy_key_avail,
-			   sizeof(dummy_key) - dummy_key_avail);
-		if (res < 0) {
-			wpa_printf(MSG_ERROR,
-				   "random: Cannot read from /dev/random: %s",
-				   strerror(errno));
-			res = 0;
-		}
-		close(fd);
+	fd = open("/dev/random", O_RDONLY | O_NONBLOCK);
+	if (fd < 0) {
+		wpa_printf(MSG_ERROR, "random: Cannot open /dev/random: %s",
+			   strerror(errno));
+		return -1;
 	}
 
-	wpa_printf(MSG_DEBUG, "random: Got %u/%u random bytes", (unsigned) res,
+	res = read(fd, dummy_key + dummy_key_avail,
+		   sizeof(dummy_key) - dummy_key_avail);
+	if (res < 0) {
+		wpa_printf(MSG_ERROR, "random: Cannot read from /dev/random: "
+			   "%s", strerror(errno));
+		res = 0;
+	}
+	wpa_printf(MSG_DEBUG, "random: Got %u/%u bytes from "
+		   "/dev/random", (unsigned) res,
 		   (unsigned) (sizeof(dummy_key) - dummy_key_avail));
 	dummy_key_avail += res;
+	close(fd);
 
 	if (dummy_key_avail == sizeof(dummy_key)) {
 		if (own_pool_ready < MIN_READY_MARK)
@@ -293,7 +268,7 @@
 	}
 
 	wpa_printf(MSG_INFO, "random: Only %u/%u bytes of strong "
-		   "random data available",
+		   "random data available from /dev/random",
 		   (unsigned) dummy_key_avail, (unsigned) sizeof(dummy_key));
 
 	if (own_pool_ready >= MIN_READY_MARK ||
@@ -445,19 +420,6 @@
 	if (random_fd >= 0)
 		return;
 
-#ifdef CONFIG_GETRANDOM
-	{
-		u8 dummy;
-
-		if (getrandom(&dummy, 0, GRND_NONBLOCK) == 0 ||
-		    errno != ENOSYS) {
-			wpa_printf(MSG_DEBUG,
-				   "random: getrandom() support available");
-			return;
-		}
-	}
-#endif /* CONFIG_GETRANDOM */
-
 	random_fd = open("/dev/random", O_RDONLY | O_NONBLOCK);
 	if (random_fd < 0) {
 		wpa_printf(MSG_ERROR, "random: Cannot open /dev/random: %s",
diff --git a/src/crypto/sha512-internal.c b/src/crypto/sha512-internal.c
index c026394..76c4fe7 100644
--- a/src/crypto/sha512-internal.c
+++ b/src/crypto/sha512-internal.c
@@ -109,14 +109,9 @@
 /* compress 1024-bits */
 static int sha512_compress(struct sha512_state *md, unsigned char *buf)
 {
-	u64 S[8], t0, t1;
-	u64 *W;
+	u64 S[8], W[80], t0, t1;
 	int i;
 
-	W = os_malloc(80 * sizeof(u64));
-	if (!W)
-		return -1;
-
 	/* copy state into S */
 	for (i = 0; i < 8; i++) {
 		S[i] = md->state[i];
@@ -151,7 +146,6 @@
 		md->state[i] = md->state[i] + S[i];
 	}
 
-	os_free(W);
 	return 0;
 }
 
diff --git a/src/crypto/sha512.c b/src/crypto/sha512.c
deleted file mode 100644
index 66311c3..0000000
--- a/src/crypto/sha512.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * SHA-512 hash implementation and interface functions
- * Copyright (c) 2003-2018, Jouni Malinen <j@w1.fi>
- *
- * This software may be distributed under the terms of the BSD license.
- * See README for more details.
- */
-
-#include "includes.h"
-
-#include "common.h"
-#include "sha512.h"
-#include "crypto.h"
-
-
-/**
- * hmac_sha512_vector - HMAC-SHA512 over data vector (RFC 2104)
- * @key: Key for HMAC operations
- * @key_len: Length of the key in bytes
- * @num_elem: Number of elements in the data vector
- * @addr: Pointers to the data areas
- * @len: Lengths of the data blocks
- * @mac: Buffer for the hash (64 bytes)
- * Returns: 0 on success, -1 on failure
- */
-int hmac_sha512_vector(const u8 *key, size_t key_len, size_t num_elem,
-		       const u8 *addr[], const size_t *len, u8 *mac)
-{
-	unsigned char k_pad[128]; /* padding - key XORd with ipad/opad */
-	unsigned char tk[64];
-	const u8 *_addr[6];
-	size_t _len[6], i;
-
-	if (num_elem > 5) {
-		/*
-		 * Fixed limit on the number of fragments to avoid having to
-		 * allocate memory (which could fail).
-		 */
-		return -1;
-	}
-
-	/* if key is longer than 128 bytes reset it to key = SHA512(key) */
-	if (key_len > 128) {
-		if (sha512_vector(1, &key, &key_len, tk) < 0)
-			return -1;
-		key = tk;
-		key_len = 64;
-	}
-
-	/* the HMAC_SHA512 transform looks like:
-	 *
-	 * SHA512(K XOR opad, SHA512(K XOR ipad, text))
-	 *
-	 * where K is an n byte key
-	 * ipad is the byte 0x36 repeated 128 times
-	 * opad is the byte 0x5c repeated 128 times
-	 * and text is the data being protected */
-
-	/* start out by storing key in ipad */
-	os_memset(k_pad, 0, sizeof(k_pad));
-	os_memcpy(k_pad, key, key_len);
-	/* XOR key with ipad values */
-	for (i = 0; i < 128; i++)
-		k_pad[i] ^= 0x36;
-
-	/* perform inner SHA512 */
-	_addr[0] = k_pad;
-	_len[0] = 128;
-	for (i = 0; i < num_elem; i++) {
-		_addr[i + 1] = addr[i];
-		_len[i + 1] = len[i];
-	}
-	if (sha512_vector(1 + num_elem, _addr, _len, mac) < 0)
-		return -1;
-
-	os_memset(k_pad, 0, sizeof(k_pad));
-	os_memcpy(k_pad, key, key_len);
-	/* XOR key with opad values */
-	for (i = 0; i < 128; i++)
-		k_pad[i] ^= 0x5c;
-
-	/* perform outer SHA512 */
-	_addr[0] = k_pad;
-	_len[0] = 128;
-	_addr[1] = mac;
-	_len[1] = SHA512_MAC_LEN;
-	return sha512_vector(2, _addr, _len, mac);
-}
-
-
-/**
- * hmac_sha512 - HMAC-SHA512 over data buffer (RFC 2104)
- * @key: Key for HMAC operations
- * @key_len: Length of the key in bytes
- * @data: Pointers to the data area
- * @data_len: Length of the data area
- * @mac: Buffer for the hash (64 bytes)
- * Returns: 0 on success, -1 on failure
- */
-int hmac_sha512(const u8 *key, size_t key_len, const u8 *data,
-		size_t data_len, u8 *mac)
-{
-	return hmac_sha512_vector(key, key_len, 1, &data, &data_len, mac);
-}
diff --git a/src/crypto/tls.h b/src/crypto/tls.h
index 413cccd..481b346 100644
--- a/src/crypto/tls.h
+++ b/src/crypto/tls.h
@@ -82,7 +82,6 @@
 	int cert_in_cb;
 	const char *openssl_ciphers;
 	unsigned int tls_session_lifetime;
-	unsigned int crl_reload_interval;
 	unsigned int tls_flags;
 
 	void (*event_cb)(void *ctx, enum tls_event ev,
@@ -104,9 +103,6 @@
 #define TLS_CONN_SUITEB BIT(11)
 #define TLS_CONN_SUITEB_NO_ECDH BIT(12)
 #define TLS_CONN_DISABLE_TLSv1_3 BIT(13)
-#define TLS_CONN_ENABLE_TLSv1_0 BIT(14)
-#define TLS_CONN_ENABLE_TLSv1_1 BIT(15)
-#define TLS_CONN_ENABLE_TLSv1_2 BIT(16)
 
 /**
  * struct tls_connection_params - Parameters for TLS connection
@@ -148,8 +144,6 @@
  * @cert_id: the certificate's id when using engine
  * @ca_cert_id: the CA certificate's id when using engine
  * @openssl_ciphers: OpenSSL cipher configuration
- * @openssl_ecdh_curves: OpenSSL ECDH curve configuration. %NULL for auto if
- *	supported, empty string to disable, or a colon-separated curve list.
  * @flags: Parameter options (TLS_CONN_*)
  * @ocsp_stapling_response: DER encoded file with cached OCSP stapling response
  *	or %NULL if OCSP is not enabled
@@ -193,7 +187,6 @@
 	const char *cert_id;
 	const char *ca_cert_id;
 	const char *openssl_ciphers;
-	const char *openssl_ecdh_curves;
 
 	unsigned int flags;
 	const char *ocsp_stapling_response;
@@ -328,11 +321,9 @@
  * @tls_ctx: TLS context data from tls_init()
  * @check_crl: 0 = do not verify CRLs, 1 = verify CRL for the user certificate,
  * 2 = verify CRL for all certificates
- * @strict: 0 = allow CRL time errors, 1 = do not allow CRL time errors
  * Returns: 0 on success, -1 on failure
  */
-int __must_check tls_global_set_verify(void *tls_ctx, int check_crl,
-				       int strict);
+int __must_check tls_global_set_verify(void *tls_ctx, int check_crl);
 
 /**
  * tls_connection_set_verify - Set certificate verification options
diff --git a/src/crypto/tls_gnutls.c b/src/crypto/tls_gnutls.c
index 527d01e..36dafd2 100644
--- a/src/crypto/tls_gnutls.c
+++ b/src/crypto/tls_gnutls.c
@@ -461,12 +461,6 @@
 		}
 	}
 
-	if (params->openssl_ecdh_curves) {
-		wpa_printf(MSG_INFO,
-			   "GnuTLS: openssl_ecdh_curves not supported");
-		return -1;
-	}
-
 	/* TODO: gnutls_certificate_set_verify_flags(xcred, flags);
 	 * to force peer validation(?) */
 
@@ -848,7 +842,7 @@
 }
 
 
-int tls_global_set_verify(void *ssl_ctx, int check_crl, int strict)
+int tls_global_set_verify(void *ssl_ctx, int check_crl)
 {
 	/* TODO */
 	return 0;
diff --git a/src/crypto/tls_internal.c b/src/crypto/tls_internal.c
index 9c57ab2..d289c94 100644
--- a/src/crypto/tls_internal.c
+++ b/src/crypto/tls_internal.c
@@ -248,12 +248,6 @@
 		return -1;
 	}
 
-	if (params->openssl_ecdh_curves) {
-		wpa_printf(MSG_INFO, "TLS: openssl_ecdh_curves not supported");
-		tlsv1_cred_free(cred);
-		return -1;
-	}
-
 	if (tlsv1_set_ca_cert(cred, params->ca_cert,
 			      params->ca_cert_blob, params->ca_cert_blob_len,
 			      params->ca_path)) {
@@ -359,7 +353,7 @@
 }
 
 
-int tls_global_set_verify(void *tls_ctx, int check_crl, int strict)
+int tls_global_set_verify(void *tls_ctx, int check_crl)
 {
 	struct tls_global *global = tls_ctx;
 	global->check_crl = check_crl;
diff --git a/src/crypto/tls_none.c b/src/crypto/tls_none.c
index 108e9aa..5d0c6bd 100644
--- a/src/crypto/tls_none.c
+++ b/src/crypto/tls_none.c
@@ -72,7 +72,7 @@
 }
 
 
-int tls_global_set_verify(void *tls_ctx, int check_crl, int strict)
+int tls_global_set_verify(void *tls_ctx, int check_crl)
 {
 	return -1;
 }
diff --git a/src/crypto/tls_openssl.c b/src/crypto/tls_openssl.c
index 181e64d..5bb14e2 100644
--- a/src/crypto/tls_openssl.c
+++ b/src/crypto/tls_openssl.c
@@ -104,9 +104,7 @@
 
 #endif
 
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || \
-	(defined(LIBRESSL_VERSION_NUMBER) && \
-	 LIBRESSL_VERSION_NUMBER < 0x20700000L)
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
 #ifdef CONFIG_SUITEB
 static int RSA_bits(const RSA *r)
 {
@@ -228,16 +226,10 @@
 struct tls_data {
 	SSL_CTX *ssl;
 	unsigned int tls_session_lifetime;
-	int check_crl;
-	int check_crl_strict;
-	char *ca_cert;
-	unsigned int crl_reload_interval;
-	struct os_reltime crl_last_reload;
 };
 
 struct tls_connection {
 	struct tls_context *context;
-	struct tls_data *data;
 	SSL_CTX *ssl_ctx;
 	SSL *ssl;
 	BIO *ssl_in, *ssl_out;
@@ -323,37 +315,6 @@
 #endif /* CONFIG_NO_STDOUT_DEBUG */
 
 
-static X509_STORE * tls_crl_cert_reload(const char *ca_cert, int check_crl)
-{
-	int flags;
-	X509_STORE *store;
-
-	store = X509_STORE_new();
-	if (!store) {
-		wpa_printf(MSG_DEBUG,
-			   "OpenSSL: %s - failed to allocate new certificate store",
-			   __func__);
-		return NULL;
-	}
-
-	if (ca_cert && X509_STORE_load_locations(store, ca_cert, NULL) != 1) {
-		tls_show_errors(MSG_WARNING, __func__,
-				"Failed to load root certificates");
-		X509_STORE_free(store);
-		return NULL;
-	}
-
-	if (check_crl)
-		flags = X509_V_FLAG_CRL_CHECK;
-	if (check_crl == 2)
-		flags |= X509_V_FLAG_CRL_CHECK_ALL;
-
-	X509_STORE_set_flags(store, flags);
-
-	return store;
-}
-
-
 #ifdef CONFIG_NATIVE_WINDOWS
 
 /* Windows CryptoAPI and access to certificate stores */
@@ -1042,10 +1003,8 @@
 		return NULL;
 	}
 	data->ssl = ssl;
-	if (conf) {
+	if (conf)
 		data->tls_session_lifetime = conf->tls_session_lifetime;
-		data->crl_reload_interval = conf->crl_reload_interval;
-	}
 
 	SSL_CTX_set_options(ssl, SSL_OP_NO_SSLv2);
 	SSL_CTX_set_options(ssl, SSL_OP_NO_SSLv3);
@@ -1127,7 +1086,6 @@
 		os_free(context);
 	if (data->tls_session_lifetime > 0)
 		SSL_CTX_flush_sessions(ssl, 0);
-	os_free(data->ca_cert);
 	SSL_CTX_free(ssl);
 
 	tls_openssl_ref_count--;
@@ -1523,32 +1481,11 @@
 	SSL_CTX *ssl = data->ssl;
 	struct tls_connection *conn;
 	long options;
-	X509_STORE *new_cert_store;
-	struct os_reltime now;
 	struct tls_context *context = SSL_CTX_get_app_data(ssl);
 
-	/* Replace X509 store if it is time to update CRL. */
-	if (data->crl_reload_interval > 0 && os_get_reltime(&now) == 0 &&
-	    os_reltime_expired(&now, &data->crl_last_reload,
-			       data->crl_reload_interval)) {
-		wpa_printf(MSG_INFO,
-			   "OpenSSL: Flushing X509 store with ca_cert file");
-		new_cert_store = tls_crl_cert_reload(data->ca_cert,
-						     data->check_crl);
-		if (!new_cert_store) {
-			wpa_printf(MSG_ERROR,
-				   "OpenSSL: Error replacing X509 store with ca_cert file");
-		} else {
-			/* Replace old store */
-			SSL_CTX_set_cert_store(ssl, new_cert_store);
-			data->crl_last_reload = now;
-		}
-	}
-
 	conn = os_zalloc(sizeof(*conn));
 	if (conn == NULL)
 		return NULL;
-	conn->data = data;
 	conn->ssl_ctx = ssl;
 	conn->ssl = SSL_new(ssl);
 	if (conn->ssl == NULL) {
@@ -2072,13 +2009,6 @@
 			   "time mismatch");
 		preverify_ok = 1;
 	}
-	if (!preverify_ok && !conn->data->check_crl_strict &&
-	    (err == X509_V_ERR_CRL_HAS_EXPIRED ||
-	     err == X509_V_ERR_CRL_NOT_YET_VALID)) {
-		wpa_printf(MSG_DEBUG,
-			   "OpenSSL: Ignore certificate validity CRL time mismatch");
-		preverify_ok = 1;
-	}
 
 	err_str = X509_verify_cert_error_string(err);
 
@@ -2469,16 +2399,13 @@
 		SSL_CTX_set_client_CA_list(ssl_ctx,
 					   SSL_load_client_CA_file(ca_cert));
 #endif /* OPENSSL_NO_STDIO */
-
-		os_free(data->ca_cert);
-		data->ca_cert = os_strdup(ca_cert);
 	}
 
 	return 0;
 }
 
 
-int tls_global_set_verify(void *ssl_ctx, int check_crl, int strict)
+int tls_global_set_verify(void *ssl_ctx, int check_crl)
 {
 	int flags;
 
@@ -2495,10 +2422,6 @@
 		if (check_crl == 2)
 			flags |= X509_V_FLAG_CRL_CHECK_ALL;
 		X509_STORE_set_flags(cs, flags);
-
-		data->check_crl = check_crl;
-		data->check_crl_strict = strict;
-		os_get_reltime(&data->crl_last_reload);
 	}
 	return 0;
 }
@@ -2614,38 +2537,6 @@
 	else
 		SSL_clear_options(ssl, SSL_OP_NO_TLSv1_3);
 #endif /* SSL_OP_NO_TLSv1_3 */
-#if OPENSSL_VERSION_NUMBER >= 0x10100000L
-	if (flags & (TLS_CONN_ENABLE_TLSv1_0 |
-		     TLS_CONN_ENABLE_TLSv1_1 |
-		     TLS_CONN_ENABLE_TLSv1_2)) {
-		int version = 0;
-
-		/* Explicit request to enable TLS versions even if needing to
-		 * override systemwide policies. */
-		if (flags & TLS_CONN_ENABLE_TLSv1_0) {
-			version = TLS1_VERSION;
-		} else if (flags & TLS_CONN_ENABLE_TLSv1_1) {
-			if (!(flags & TLS_CONN_DISABLE_TLSv1_0))
-				version = TLS1_1_VERSION;
-		} else if (flags & TLS_CONN_ENABLE_TLSv1_2) {
-			if (!(flags & (TLS_CONN_DISABLE_TLSv1_0 |
-				       TLS_CONN_DISABLE_TLSv1_1)))
-				version = TLS1_2_VERSION;
-		}
-		if (!version) {
-			wpa_printf(MSG_DEBUG,
-				   "OpenSSL: Invalid TLS version configuration");
-			return -1;
-		}
-
-		if (SSL_set_min_proto_version(ssl, version) != 1) {
-			wpa_printf(MSG_DEBUG,
-				   "OpenSSL: Failed to set minimum TLS version");
-			return -1;
-		}
-	}
-#endif /* >= 1.1.0 */
-
 #ifdef CONFIG_SUITEB
 #ifdef OPENSSL_IS_BORINGSSL
 	/* Start with defaults from BoringSSL */
@@ -2748,22 +2639,7 @@
 			return -1;
 		}
 	}
-#else /* OPENSSL_IS_BORINGSSL */
-	if (!(flags & (TLS_CONN_SUITEB | TLS_CONN_SUITEB_NO_ECDH)) &&
-	    openssl_ciphers && SSL_set_cipher_list(ssl, openssl_ciphers) != 1) {
-		wpa_printf(MSG_INFO,
-			   "OpenSSL: Failed to set openssl_ciphers '%s'",
-			   openssl_ciphers);
-		return -1;
-	}
 #endif /* OPENSSL_IS_BORINGSSL */
-#else /* CONFIG_SUITEB */
-	if (openssl_ciphers && SSL_set_cipher_list(ssl, openssl_ciphers) != 1) {
-		wpa_printf(MSG_INFO,
-			   "OpenSSL: Failed to set openssl_ciphers '%s'",
-			   openssl_ciphers);
-		return -1;
-	}
 #endif /* CONFIG_SUITEB */
 
 	return 0;
@@ -2885,15 +2761,6 @@
 		return 0;
 	}
 
-#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)\
-	     && !defined(ANDROID)
-	if (SSL_use_certificate_chain_file(conn->ssl, client_cert) == 1) {
-		ERR_clear_error();
-		wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_certificate_chain_file"
-			   " --> OK");
-		return 0;
-	}
-#else
 	if (SSL_use_certificate_file(conn->ssl, client_cert,
 				     SSL_FILETYPE_PEM) == 1) {
 		ERR_clear_error();
@@ -2901,7 +2768,6 @@
 			   " --> OK");
 		return 0;
 	}
-#endif
 
 	tls_show_errors(MSG_DEBUG, __func__,
 			"SSL_use_certificate_file failed");
@@ -4655,40 +4521,6 @@
 		return -1;
 	}
 
-	if (!params->openssl_ecdh_curves) {
-#ifndef OPENSSL_IS_BORINGSSL
-#ifndef OPENSSL_NO_EC
-#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) && \
-	(OPENSSL_VERSION_NUMBER < 0x10100000L)
-		if (SSL_set_ecdh_auto(conn->ssl, 1) != 1) {
-			wpa_printf(MSG_INFO,
-				   "OpenSSL: Failed to set ECDH curves to auto");
-			return -1;
-		}
-#endif /* >= 1.0.2 && < 1.1.0 */
-#endif /* OPENSSL_NO_EC */
-#endif /* OPENSSL_IS_BORINGSSL */
-	} else if (params->openssl_ecdh_curves[0]) {
-#if defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER < 0x10002000L)
-		wpa_printf(MSG_INFO,
-			"OpenSSL: ECDH configuration nnot supported");
-		return -1;
-#else /* OPENSSL_IS_BORINGSSL || < 1.0.2 */
-#ifndef OPENSSL_NO_EC
-		if (SSL_set1_curves_list(conn->ssl,
-					 params->openssl_ecdh_curves) != 1) {
-			wpa_printf(MSG_INFO,
-				   "OpenSSL: Failed to set ECDH curves '%s'",
-				   params->openssl_ecdh_curves);
-			return -1;
-		}
-#else /* OPENSSL_NO_EC */
-		wpa_printf(MSG_INFO, "OpenSSL: ECDH not supported");
-		return -1;
-#endif /* OPENSSL_NO_EC */
-#endif /* OPENSSL_IS_BORINGSSL */
-	}
-
 	if (tls_set_conn_flags(conn, params->flags,
 			       params->openssl_ciphers) < 0)
 		return -1;
@@ -4755,41 +4587,6 @@
 		return -1;
 	}
 
-	if (!params->openssl_ecdh_curves) {
-#ifndef OPENSSL_IS_BORINGSSL
-#ifndef OPENSSL_NO_EC
-#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) && \
-	(OPENSSL_VERSION_NUMBER < 0x10100000L)
-		if (SSL_CTX_set_ecdh_auto(ssl_ctx, 1) != 1) {
-			wpa_printf(MSG_INFO,
-				   "OpenSSL: Failed to set ECDH curves to auto");
-			return -1;
-		}
-#endif /* >= 1.0.2 && < 1.1.0 */
-#endif /* OPENSSL_NO_EC */
-#endif /* OPENSSL_IS_BORINGSSL */
-	} else if (params->openssl_ecdh_curves[0]) {
-#if defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER < 0x10002000L)
-		wpa_printf(MSG_INFO,
-			"OpenSSL: ECDH configuration nnot supported");
-		return -1;
-#else /* OPENSSL_IS_BORINGSSL || < 1.0.2 */
-#ifndef OPENSSL_NO_EC
-		if (SSL_CTX_set1_curves_list(ssl_ctx,
-					     params->openssl_ecdh_curves) !=
-		    1) {
-			wpa_printf(MSG_INFO,
-				   "OpenSSL: Failed to set ECDH curves '%s'",
-				   params->openssl_ecdh_curves);
-			return -1;
-		}
-#else /* OPENSSL_NO_EC */
-		wpa_printf(MSG_INFO, "OpenSSL: ECDH not supported");
-		return -1;
-#endif /* OPENSSL_NO_EC */
-#endif /* OPENSSL_IS_BORINGSSL */
-	}
-
 #ifdef SSL_OP_NO_TICKET
 	if (params->flags & TLS_CONN_DISABLE_SESSION_TICKET)
 		SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_TICKET);
diff --git a/src/crypto/tls_wolfssl.c b/src/crypto/tls_wolfssl.c
index b59622e..cc8c704 100644
--- a/src/crypto/tls_wolfssl.c
+++ b/src/crypto/tls_wolfssl.c
@@ -1524,12 +1524,6 @@
 		return -1;
 	}
 
-	if (params->openssl_ecdh_curves) {
-		wpa_printf(MSG_INFO,
-			   "wolfSSL: openssl_ecdh_curves not supported");
-		return -1;
-	}
-
 #ifdef HAVE_SESSION_TICKET
 	/* Session ticket is off by default - can't disable once on. */
 	if (!(params->flags & TLS_CONN_DISABLE_SESSION_TICKET))
@@ -1549,7 +1543,7 @@
 }
 
 
-int tls_global_set_verify(void *tls_ctx, int check_crl, int strict)
+int tls_global_set_verify(void *tls_ctx, int check_crl)
 {
 	wpa_printf(MSG_DEBUG, "SSL: global set verify: %d", check_crl);
 
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 23423d9..d34c679 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -58,16 +58,6 @@
 #define HOSTAPD_CHAN_VHT_130_30 0x04000000
 #define HOSTAPD_CHAN_VHT_150_10 0x08000000
 
-/* Allowed bandwidth mask */
-enum hostapd_chan_width_attr {
-	HOSTAPD_CHAN_WIDTH_10   = BIT(0),
-	HOSTAPD_CHAN_WIDTH_20   = BIT(1),
-	HOSTAPD_CHAN_WIDTH_40P  = BIT(2),
-	HOSTAPD_CHAN_WIDTH_40M  = BIT(3),
-	HOSTAPD_CHAN_WIDTH_80   = BIT(4),
-	HOSTAPD_CHAN_WIDTH_160  = BIT(5),
-};
-
 /* Filter gratuitous ARP */
 #define WPA_DATA_FRAME_FILTER_FLAG_ARP BIT(0)
 /* Filter unsolicited Neighbor Advertisement */
@@ -121,13 +111,6 @@
 	int flag;
 
 	/**
-	 * allowed_bw - Allowed channel width bitmask
-	 *
-	 * See enum hostapd_chan_width_attr.
-	 */
-	u32 allowed_bw;
-
-	/**
 	 * max_tx_power - Regulatory transmit power limit in dBm
 	 */
 	u8 max_tx_power;
@@ -931,10 +914,10 @@
 	 * passphrase - RSN passphrase for PSK
 	 *
 	 * This value is made available only for WPA/WPA2-Personal (PSK) and
-	 * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK. This
-	 * is the 8..63 character ASCII passphrase, if available. Please note
-	 * that this can be %NULL if passphrase was not used to generate the
-	 * PSK. In that case, the psk field must be used to fetch the PSK.
+	 * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE. This is
+	 * the 8..63 character ASCII passphrase, if available. Please note that
+	 * this can be %NULL if passphrase was not used to generate the PSK. In
+	 * that case, the psk field must be used to fetch the PSK.
 	 */
 	const char *passphrase;
 
@@ -942,9 +925,9 @@
 	 * psk - RSN PSK (alternative for passphrase for PSK)
 	 *
 	 * This value is made available only for WPA/WPA2-Personal (PSK) and
-	 * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK. This
-	 * is the 32-octet (256-bit) PSK, if available. The driver wrapper
-	 * should be prepared to handle %NULL value as an error.
+	 * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE. This is
+	 * the 32-octet (256-bit) PSK, if available. The driver wrapper should
+	 * be prepared to handle %NULL value as an error.
 	 */
 	const u8 *psk;
 
@@ -1384,23 +1367,6 @@
 	 * service).
 	 */
 	int multicast_to_unicast;
-
-	/**
-	 * ftm_responder - Whether FTM responder is enabled
-	 */
-	int ftm_responder;
-
-	/**
-	 * lci - Binary data, the content of an LCI report IE with type 8 as
-	 * defined in IEEE Std 802.11-2016, 9.4.2.22.10
-	 */
-	const struct wpabuf *lci;
-
-	/**
-	 * civic - Binary data, the content of a measurement report IE with
-	 * type 11 as defined in IEEE Std 802.11-2016, 9.4.2.22.13
-	 */
-	const struct wpabuf *civic;
 };
 
 struct wpa_driver_mesh_bss_params {
@@ -1458,7 +1424,6 @@
 #define WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA384    0x00002000
 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA256 0x00004000
 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA384 0x00008000
-#define WPA_DRIVER_CAPA_KEY_MGMT_SAE 		0x00010000
 	/** Bitfield of supported key management suites */
 	unsigned int key_mgmt;
 
@@ -1492,7 +1457,7 @@
 #define WPA_DRIVER_FLAGS_DFS_OFFLOAD			0x00000004
 /** Driver takes care of RSN 4-way handshake internally; PMK is configured with
  * struct wpa_driver_ops::set_key using alg = WPA_ALG_PMK */
-#define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X		0x00000008
+#define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE 0x00000008
 /** Driver is for a wired Ethernet interface */
 #define WPA_DRIVER_FLAGS_WIRED		0x00000010
 /** Driver provides separate commands for authentication and association (SME in
@@ -1614,10 +1579,6 @@
 #define WPA_DRIVER_FLAGS_MFP_OPTIONAL		0x0040000000000000ULL
 /** Driver is a self-managed regulatory device */
 #define WPA_DRIVER_FLAGS_SELF_MANAGED_REGULATORY       0x0080000000000000ULL
-/** Driver supports FTM responder functionality */
-#define WPA_DRIVER_FLAGS_FTM_RESPONDER		0x0100000000000000ULL
-/** Driver support 4-way handshake offload for WPA-Personal */
-#define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK	0x0200000000000000ULL
 	u64 flags;
 
 #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
@@ -1941,21 +1902,19 @@
 	SMPS_INVALID,
 };
 
-#define WPA_INVALID_NOISE 9999
+/* enum chan_width - Channel width definitions */
+enum chan_width {
+	CHAN_WIDTH_20_NOHT,
+	CHAN_WIDTH_20,
+	CHAN_WIDTH_40,
+	CHAN_WIDTH_80,
+	CHAN_WIDTH_80P80,
+	CHAN_WIDTH_160,
+	CHAN_WIDTH_UNKNOWN
+};
 
 /**
  * struct wpa_signal_info - Information about channel signal quality
- * @frequency: control frequency
- * @above_threshold: true if the above threshold was crossed
- *	(relevant for a CQM event)
- * @current_signal: in dBm
- * @avg_signal: in dBm
- * @avg_beacon_signal: in dBm
- * @current_noise: %WPA_INVALID_NOISE if not supported
- * @current_txrate: current TX rate
- * @chanwidth: channel width
- * @center_frq1: center frequency for the first segment
- * @center_frq2: center frequency for the second segment (if relevant)
  */
 struct wpa_signal_info {
 	u32 frequency;
@@ -1971,26 +1930,6 @@
 };
 
 /**
- * struct wpa_channel_info - Information about the current channel
- * @frequency: Center frequency of the primary 20 MHz channel
- * @chanwidth: Width of the current operating channel
- * @sec_channel: Location of the secondary 20 MHz channel (either +1 or -1).
- *	This field is only filled in when using a 40 MHz channel.
- * @center_frq1: Center frequency of frequency segment 0
- * @center_frq2: Center frequency of frequency segment 1 (for 80+80 channels)
- * @seg1_idx: Frequency segment 1 index when using a 80+80 channel. This is
- *	derived from center_frq2 for convenience.
- */
-struct wpa_channel_info {
-	u32 frequency;
-	enum chan_width chanwidth;
-	int sec_channel;
-	int center_frq1;
-	int center_frq2;
-	u8 seg1_idx;
-};
-
-/**
  * struct beacon_data - Beacon data
  * @head: Head portion of Beacon frame (before TIM IE)
  * @tail: Tail portion of Beacon frame (after TIM IE)
@@ -3426,14 +3365,6 @@
 	int (*signal_poll)(void *priv, struct wpa_signal_info *signal_info);
 
 	/**
-	 * channel_info - Get parameters of the current operating channel
-	 * @priv: Private driver interface data
-	 * @channel_info: Channel info structure
-	 * Returns: 0 on success, negative (<0) on failure
-	 */
-	int (*channel_info)(void *priv, struct wpa_channel_info *channel_info);
-
-	/**
 	 * set_authmode - Set authentication algorithm(s) for static WEP
 	 * @priv: Private driver interface data
 	 * @authmode: 1=Open System, 2=Shared Key, 3=both
@@ -3714,7 +3645,7 @@
 	/**
 	 * status - Get driver interface status information
 	 * @priv: Private driver interface data
-	 * @buf: Buffer for printing the status information
+	 * @buf: Buffer for printing tou the status information
 	 * @buflen: Maximum length of the buffer
 	 * Returns: Length of written status information or -1 on failure
 	 */
@@ -3838,14 +3769,6 @@
 	int (*set_transmit_next_pn)(void *priv, struct transmit_sa *sa);
 
 	/**
-	 * set_receive_lowest_pn - Set receive lowest PN
-	 * @priv: Private driver interface data
-	 * @sa: secure association
-	 * Returns: 0 on success, -1 on failure (or if not supported)
-	 */
-	int (*set_receive_lowest_pn)(void *priv, struct receive_sa *sa);
-
-	/**
 	 * create_receive_sc - create secure channel for receiving
 	 * @priv: Private driver interface data
 	 * @sc: secure channel
@@ -4156,15 +4079,6 @@
 	 */
 	int (*send_external_auth_status)(void *priv,
 					 struct external_auth *params);
-
-	/**
-	 * set_4addr_mode - Set 4-address mode
-	 * @priv: Private driver interface data
-	 * @bridge_ifname: Bridge interface name
-	 * @val: 0 - disable 4addr mode, 1 - enable 4addr mode
-	 * Returns: 0 on success, < 0 on failure
-	 */
-	int (*set_4addr_mode)(void *priv, const char *bridge_ifname, int val);
 };
 
 /**
@@ -5607,8 +5521,6 @@
 /* Convert chan_width to a string for logging and control interfaces */
 const char * channel_width_to_string(enum chan_width width);
 
-int channel_width_to_int(enum chan_width width);
-
 int ht_supported(const struct hostapd_hw_modes *mode);
 int vht_supported(const struct hostapd_hw_modes *mode);
 
diff --git a/src/drivers/driver_atheros.c b/src/drivers/driver_atheros.c
index 62f5baa..16c2ae9 100644
--- a/src/drivers/driver_atheros.c
+++ b/src/drivers/driver_atheros.c
@@ -1329,11 +1329,11 @@
 		}
 		atheros_raw_receive(drv, NULL,
 				    (u8 *) custom + MGMT_FRAM_TAG_SIZE, len);
-	} else if (os_strncmp(custom, "Manage.auth ", 12) == 0) {
+		} else if (os_strncmp(custom, "Manage.auth ", 12) == 0) {
 		/* Format: "Manage.auth <frame len>" | zero padding | frame */
 		int len = atoi(custom + 12);
-		if (len < 0 ||
-		    MGMT_FRAM_TAG_SIZE + len > end - custom) {
+			if (len < 0 ||
+			    MGMT_FRAM_TAG_SIZE + len > end - custom) {
 			wpa_printf(MSG_DEBUG,
 				   "Invalid Manage.auth event length %d", len);
 			return;
@@ -1342,7 +1342,7 @@
 				    (u8 *) custom + MGMT_FRAM_TAG_SIZE, len);
 #endif /* CONFIG_IEEE80211W || CONFIG_IEEE80211R || CONFIG_FILS */
 #ifdef ATHEROS_USE_RAW_RECEIVE
-	} else if (os_strncmp(custom, "Manage.action ", 14) == 0) {
+		} else if (os_strncmp(custom, "Manage.action ", 14) == 0) {
 		/* Format: "Manage.assoc_req <frame len>" | zero padding | frame
 		 */
 		int len = atoi(custom + 14);
diff --git a/src/drivers/driver_common.c b/src/drivers/driver_common.c
index e55e6cd..ac0916e 100644
--- a/src/drivers/driver_common.c
+++ b/src/drivers/driver_common.c
@@ -115,25 +115,6 @@
 }
 
 
-int channel_width_to_int(enum chan_width width)
-{
-	switch (width) {
-	case CHAN_WIDTH_20_NOHT:
-	case CHAN_WIDTH_20:
-		return 20;
-	case CHAN_WIDTH_40:
-		return 40;
-	case CHAN_WIDTH_80:
-		return 80;
-	case CHAN_WIDTH_80P80:
-	case CHAN_WIDTH_160:
-		return 160;
-	default:
-		return 0;
-	}
-}
-
-
 int ht_supported(const struct hostapd_hw_modes *mode)
 {
 	if (!(mode->flags & HOSTAPD_MODE_FLAG_HT_INFO_KNOWN)) {
@@ -253,8 +234,7 @@
 	DF2S(DRIVER_IE);
 	DF2S(SET_KEYS_AFTER_ASSOC);
 	DF2S(DFS_OFFLOAD);
-	DF2S(4WAY_HANDSHAKE_PSK);
-	DF2S(4WAY_HANDSHAKE_8021X);
+	DF2S(4WAY_HANDSHAKE);
 	DF2S(WIRED);
 	DF2S(SME);
 	DF2S(AP);
diff --git a/src/drivers/driver_hostap.c b/src/drivers/driver_hostap.c
index 61b39b1..597da33 100644
--- a/src/drivers/driver_hostap.c
+++ b/src/drivers/driver_hostap.c
@@ -231,11 +231,7 @@
 	}
 
         memset(&ifr, 0, sizeof(ifr));
-	if (os_snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%sap",
-			drv->iface) >= (int) sizeof(ifr.ifr_name)) {
-		wpa_printf(MSG_ERROR, "hostap: AP interface name truncated");
-		return -1;
-	}
+        snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%sap", drv->iface);
         if (ioctl(drv->sock, SIOCGIFINDEX, &ifr) != 0) {
 		wpa_printf(MSG_ERROR, "ioctl(SIOCGIFINDEX): %s",
 			   strerror(errno));
@@ -352,10 +348,7 @@
 	struct ifreq ifr;
 	char ifname[IFNAMSIZ];
 
-	if (os_snprintf(ifname, IFNAMSIZ, "%sap", drv->iface) >= IFNAMSIZ) {
-		wpa_printf(MSG_ERROR, "hostap: AP interface name truncated");
-		return -1;
-	}
+	os_snprintf(ifname, IFNAMSIZ, "%sap", drv->iface);
 	if (linux_set_iface_flags(drv->ioctl_sock, ifname, dev_up) < 0)
 		return -1;
 
@@ -1131,7 +1124,6 @@
 	for (i = 0; i < 14; i++) {
 		mode->channels[i].chan = i + 1;
 		mode->channels[i].freq = chan2freq[i];
-		mode->channels[i].allowed_bw = HOSTAPD_CHAN_WIDTH_20;
 		/* TODO: Get allowed channel list from the driver */
 		if (i >= 11)
 			mode->channels[i].flag = HOSTAPD_CHAN_DISABLED;
diff --git a/src/drivers/driver_macsec_linux.c b/src/drivers/driver_macsec_linux.c
index 9d981bb..e89b3ba 100644
--- a/src/drivers/driver_macsec_linux.c
+++ b/src/drivers/driver_macsec_linux.c
@@ -177,9 +177,6 @@
 	if (drv->controlled_port_enabled_set) {
 		struct rtnl_link *change = rtnl_link_alloc();
 
-		wpa_printf(MSG_DEBUG, DRV_PREFIX
-			   "%s: try_commit controlled_port_enabled=%d",
-			   drv->ifname, drv->controlled_port_enabled);
 		if (!change)
 			return -1;
 
@@ -199,24 +196,13 @@
 		drv->controlled_port_enabled_set = FALSE;
 	}
 
-	if (drv->protect_frames_set) {
-		wpa_printf(MSG_DEBUG, DRV_PREFIX
-			   "%s: try_commit protect_frames=%d",
-			   drv->ifname, drv->protect_frames);
+	if (drv->protect_frames_set)
 		rtnl_link_macsec_set_protect(drv->link, drv->protect_frames);
-	}
 
-	if (drv->encrypt_set) {
-		wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: try_commit encrypt=%d",
-			   drv->ifname, drv->encrypt);
+	if (drv->encrypt_set)
 		rtnl_link_macsec_set_encrypt(drv->link, drv->encrypt);
-	}
 
 	if (drv->replay_protect_set) {
-		wpa_printf(MSG_DEBUG, DRV_PREFIX
-			   "%s: try_commit replay_protect=%d replay_window=%d",
-			   drv->ifname, drv->replay_protect,
-			   drv->replay_window);
 		rtnl_link_macsec_set_replay_protect(drv->link,
 						    drv->replay_protect);
 		if (drv->replay_protect)
@@ -224,12 +210,8 @@
 						    drv->replay_window);
 	}
 
-	if (drv->encoding_sa_set) {
-		wpa_printf(MSG_DEBUG, DRV_PREFIX
-			   "%s: try_commit encoding_sa=%d",
-			   drv->ifname, drv->encoding_sa);
+	if (drv->encoding_sa_set)
 		rtnl_link_macsec_set_encoding_sa(drv->link, drv->encoding_sa);
-	}
 
 	err = rtnl_link_add(drv->sk, drv->link, 0);
 	if (err < 0)
@@ -336,8 +318,6 @@
 			   drv->common.ifname);
 		goto cache;
 	}
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "ifname=%s parent_ifi=%d",
-		   drv->common.ifname, drv->parent_ifi);
 
 	err = init_genl_ctx(drv);
 	if (err < 0)
@@ -659,7 +639,7 @@
 			   DRV_PREFIX "failed to communicate: %d (%s)",
 			   ret, nl_geterror(-ret));
 
-	ctx->cb_arg.pn = NULL;
+	ctx->cb_arg.pn = 0;
 
 out_free_msg:
 	nlmsg_free(msg);
@@ -690,50 +670,6 @@
 
 
 /**
- * macsec_drv_set_receive_lowest_pn - Set receive lowest PN
- * @priv: Private driver interface data
- * @sa: secure association
- * Returns: 0 on success, -1 on failure (or if not supported)
- */
-static int macsec_drv_set_receive_lowest_pn(void *priv, struct receive_sa *sa)
-{
-	struct macsec_drv_data *drv = priv;
-	struct macsec_genl_ctx *ctx = &drv->ctx;
-	struct nl_msg *msg;
-	struct nlattr *nest;
-	int ret = -1;
-
-	wpa_printf(MSG_DEBUG,
-		   DRV_PREFIX "%s: set_receive_lowest_pn -> %d: %d",
-		   drv->ifname, sa->an, sa->next_pn);
-
-	msg = msg_prepare(MACSEC_CMD_UPD_RXSA, ctx, drv->ifi);
-	if (!msg)
-		return ret;
-
-	nest = nla_nest_start(msg, MACSEC_ATTR_SA_CONFIG);
-	if (!nest)
-		goto nla_put_failure;
-
-	NLA_PUT_U8(msg, MACSEC_SA_ATTR_AN, sa->an);
-	NLA_PUT_U32(msg, MACSEC_SA_ATTR_PN, sa->next_pn);
-
-	nla_nest_end(msg, nest);
-
-	ret = nl_send_recv(ctx->sk, msg);
-	if (ret < 0) {
-		wpa_printf(MSG_ERROR,
-			   DRV_PREFIX "failed to communicate: %d (%s)",
-			   ret, nl_geterror(-ret));
-	}
-
-nla_put_failure:
-	nlmsg_free(msg);
-	return ret;
-}
-
-
-/**
  * macsec_drv_get_transmit_next_pn - Get transmit next PN
  * @priv: Private driver interface data
  * @sa: secure association
@@ -818,10 +754,8 @@
 	struct nl_msg *msg;
 	int ret = -1;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: create_receive_sc -> " SCISTR
-		   " (conf_offset=%u validation=%d)",
-		   drv->ifname, SCI2STR(sc->sci.addr, sc->sci.port),
-		   conf_offset, validation);
+	wpa_printf(MSG_DEBUG, "%s -> " SCISTR, __func__,
+		   SCI2STR(sc->sci.addr, sc->sci.port));
 
 	msg = msg_prepare(MACSEC_CMD_ADD_RXSC, ctx, drv->ifi);
 	if (!msg)
@@ -856,8 +790,8 @@
 	struct nl_msg *msg;
 	int ret = -1;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: delete_receive_sc -> " SCISTR,
-		   drv->ifname, SCI2STR(sc->sci.addr, sc->sci.port));
+	wpa_printf(MSG_DEBUG, "%s -> " SCISTR, __func__,
+		   SCI2STR(sc->sci.addr, sc->sci.port));
 
 	msg = msg_prepare(MACSEC_CMD_DEL_RXSC, ctx, drv->ifi);
 	if (!msg)
@@ -893,17 +827,8 @@
 	struct nlattr *nest;
 	int ret = -1;
 
-	wpa_printf(MSG_DEBUG,
-		   DRV_PREFIX "%s: create_receive_sa -> %d on " SCISTR
-		   " (enable_receive=%d next_pn=%u)",
-		   drv->ifname, sa->an,
-		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port),
-		   sa->enable_receive, sa->next_pn);
-	wpa_hexdump(MSG_DEBUG, DRV_PREFIX "SA keyid",
-		    &sa->pkey->key_identifier,
-		    sizeof(sa->pkey->key_identifier));
-	wpa_hexdump_key(MSG_DEBUG, DRV_PREFIX "SA key",
-			sa->pkey->key, sa->pkey->key_len);
+	wpa_printf(MSG_DEBUG, "%s -> %d on " SCISTR, __func__, sa->an,
+		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
 
 	msg = msg_prepare(MACSEC_CMD_ADD_RXSA, ctx, drv->ifi);
 	if (!msg)
@@ -952,8 +877,7 @@
 	struct nlattr *nest;
 	int ret = -1;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: delete_receive_sa -> %d on "
-		   SCISTR, drv->ifname, sa->an,
+	wpa_printf(MSG_DEBUG, "%s -> %d on " SCISTR, __func__, sa->an,
 		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
 
 	msg = msg_prepare(MACSEC_CMD_DEL_RXSA, ctx, drv->ifi);
@@ -1030,8 +954,7 @@
 	struct macsec_drv_data *drv = priv;
 	struct macsec_genl_ctx *ctx = &drv->ctx;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: enable_receive_sa -> %d on "
-		   SCISTR, drv->ifname, sa->an,
+	wpa_printf(MSG_DEBUG, "%s -> %d on " SCISTR, __func__, sa->an,
 		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
 
 	return set_active_rx_sa(ctx, drv->ifi, mka_sci_u64(&sa->sc->sci),
@@ -1050,8 +973,7 @@
 	struct macsec_drv_data *drv = priv;
 	struct macsec_genl_ctx *ctx = &drv->ctx;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: disable_receive_sa -> %d on "
-		   SCISTR, drv->ifname, sa->an,
+	wpa_printf(MSG_DEBUG, "%s -> %d on " SCISTR, __func__, sa->an,
 		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
 
 	return set_active_rx_sa(ctx, drv->ifi, mka_sci_u64(&sa->sc->sci),
@@ -1087,7 +1009,7 @@
  */
 static int macsec_drv_create_transmit_sc(
 	void *priv, struct transmit_sc *sc,
-	unsigned int conf_offset)
+	enum confidentiality_offset conf_offset)
 {
 	struct macsec_drv_data *drv = priv;
 	struct rtnl_link *link;
@@ -1095,10 +1017,7 @@
 	u64 sci;
 	int err;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX
-		   "%s: create_transmit_sc -> " SCISTR " (conf_offset=%d)",
-		   drv->common.ifname, SCI2STR(sc->sci.addr, sc->sci.port),
-		   conf_offset);
+	wpa_printf(MSG_DEBUG, "%s", __func__);
 
 	if (!drv->sk) {
 		wpa_printf(MSG_ERROR, DRV_PREFIX "NULL rtnl socket");
@@ -1141,9 +1060,6 @@
 
 	drv->ifi = rtnl_link_get_ifindex(link);
 	ifname = rtnl_link_get_name(link);
-	wpa_printf(MSG_DEBUG,
-		   DRV_PREFIX "%s: create_transmit_sc: ifi=%d ifname=%s",
-		   drv->common.ifname, drv->ifi, ifname);
 	os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
 	rtnl_link_put(link);
 
@@ -1172,8 +1088,7 @@
 	struct macsec_drv_data *drv = priv;
 	int err;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: delete_transmit_sc -> " SCISTR,
-		   drv->ifname, SCI2STR(sc->sci.addr, sc->sci.port));
+	wpa_printf(MSG_DEBUG, "%s", __func__);
 
 	if (!drv->sk)
 		return 0;
@@ -1210,16 +1125,7 @@
 	struct nlattr *nest;
 	int ret = -1;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: create_transmit_sa -> %d on "
-		   SCISTR " (enable_transmit=%d next_pn=%u)",
-		   drv->ifname, sa->an,
-		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port),
-		   sa->enable_transmit, sa->next_pn);
-	wpa_hexdump(MSG_DEBUG, DRV_PREFIX "SA keyid",
-		    &sa->pkey->key_identifier,
-		    sizeof(sa->pkey->key_identifier));
-	wpa_hexdump_key(MSG_DEBUG, DRV_PREFIX "SA key",
-			sa->pkey->key, sa->pkey->key_len);
+	wpa_printf(MSG_DEBUG, "%s -> %d", __func__, sa->an);
 
 	msg = msg_prepare(MACSEC_CMD_ADD_TXSA, ctx, drv->ifi);
 	if (!msg)
@@ -1265,9 +1171,7 @@
 	struct nlattr *nest;
 	int ret = -1;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: delete_transmit_sa -> %d on "
-		   SCISTR, drv->ifname, sa->an,
-		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
+	wpa_printf(MSG_DEBUG, "%s -> %d", __func__, sa->an);
 
 	msg = msg_prepare(MACSEC_CMD_DEL_TXSA, ctx, drv->ifi);
 	if (!msg)
@@ -1339,9 +1243,7 @@
 	struct macsec_genl_ctx *ctx = &drv->ctx;
 	int ret;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: enable_transmit_sa -> %d on "
-		   SCISTR, drv->ifname, sa->an,
-		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
+	wpa_printf(MSG_DEBUG, "%s -> %d", __func__, sa->an);
 
 	ret = set_active_tx_sa(ctx, drv->ifi, sa->an, TRUE);
 	if (ret < 0) {
@@ -1367,38 +1269,12 @@
 	struct macsec_drv_data *drv = priv;
 	struct macsec_genl_ctx *ctx = &drv->ctx;
 
-	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: disable_transmit_sa -> %d on "
-		   SCISTR, drv->ifname, sa->an,
-		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
+	wpa_printf(MSG_DEBUG, "%s -> %d", __func__, sa->an);
 
 	return set_active_tx_sa(ctx, drv->ifi, sa->an, FALSE);
 }
 
 
-static int macsec_drv_status(void *priv, char *buf, size_t buflen)
-{
-	struct macsec_drv_data *drv = priv;
-	int res;
-	char *pos, *end;
-
-	pos = buf;
-	end = buf + buflen;
-
-	res = os_snprintf(pos, end - pos,
-			  "ifname=%s\n"
-			  "ifi=%d\n"
-			  "parent_ifname=%s\n"
-			  "parent_ifi=%d\n",
-			  drv->common.ifname, drv->ifi,
-			  drv->ifname, drv->parent_ifi);
-	if (os_snprintf_error(end - pos, res))
-		return pos - buf;
-	pos += res;
-
-	return pos - buf;
-}
-
-
 const struct wpa_driver_ops wpa_driver_macsec_linux_ops = {
 	.name = "macsec_linux",
 	.desc = "MACsec Ethernet driver for Linux",
@@ -1417,7 +1293,6 @@
 	.set_current_cipher_suite = macsec_drv_set_current_cipher_suite,
 	.enable_controlled_port = macsec_drv_enable_controlled_port,
 	.get_receive_lowest_pn = macsec_drv_get_receive_lowest_pn,
-	.set_receive_lowest_pn = macsec_drv_set_receive_lowest_pn,
 	.get_transmit_next_pn = macsec_drv_get_transmit_next_pn,
 	.set_transmit_next_pn = macsec_drv_set_transmit_next_pn,
 	.create_receive_sc = macsec_drv_create_receive_sc,
@@ -1432,6 +1307,4 @@
 	.delete_transmit_sa = macsec_drv_delete_transmit_sa,
 	.enable_transmit_sa = macsec_drv_enable_transmit_sa,
 	.disable_transmit_sa = macsec_drv_disable_transmit_sa,
-
-	.status = macsec_drv_status,
 };
diff --git a/src/drivers/driver_macsec_qca.c b/src/drivers/driver_macsec_qca.c
index 8372393..e397950 100644
--- a/src/drivers/driver_macsec_qca.c
+++ b/src/drivers/driver_macsec_qca.c
@@ -383,7 +383,7 @@
 }
 
 
-static int macsec_qca_set_transmit_next_pn(void *priv, struct transmit_sa *sa)
+int macsec_qca_set_transmit_next_pn(void *priv, struct transmit_sa *sa)
 {
 	struct macsec_qca_data *drv = priv;
 	int ret = 0;
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 0a70e22..771e766 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -40,9 +40,6 @@
 #include "driver_nl80211.h"
 
 
-#ifndef NETLINK_CAP_ACK
-#define NETLINK_CAP_ACK 10
-#endif /* NETLINK_CAP_ACK */
 /* support for extack if compilation headers are too old */
 #ifndef NETLINK_EXT_ACK
 #define NETLINK_EXT_ACK 11
@@ -409,11 +406,6 @@
 	setsockopt(nl_socket_get_fd(nl_handle), SOL_NETLINK,
 		   NETLINK_EXT_ACK, &opt, sizeof(opt));
 
-	/* try to set NETLINK_CAP_ACK to 1, ignoring errors */
-	opt = 1;
-	setsockopt(nl_socket_get_fd(nl_handle), SOL_NETLINK,
-		   NETLINK_CAP_ACK, &opt, sizeof(opt));
-
 	err = nl_send_auto_complete(nl_handle, msg);
 	if (err < 0)
 		goto out;
@@ -1477,7 +1469,7 @@
 {
 	struct nl_msg *msg;
 
-	sig->current_signal = -WPA_INVALID_NOISE;
+	sig->current_signal = -9999;
 	sig->current_txrate = 0;
 
 	if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_STATION)) ||
@@ -1539,7 +1531,7 @@
 {
 	struct nl_msg *msg;
 
-	sig_change->current_noise = WPA_INVALID_NOISE;
+	sig_change->current_noise = 9999;
 	sig_change->frequency = drv->assoc_freq;
 
 	msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_GET_SURVEY);
@@ -1547,70 +1539,6 @@
 }
 
 
-static int get_channel_info(struct nl_msg *msg, void *arg)
-{
-	struct nlattr *tb[NL80211_ATTR_MAX + 1] = { 0 };
-	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
-	struct wpa_channel_info *chan_info = arg;
-
-	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
-		  genlmsg_attrlen(gnlh, 0), NULL);
-
-	os_memset(chan_info, 0, sizeof(struct wpa_channel_info));
-	chan_info->chanwidth = CHAN_WIDTH_UNKNOWN;
-
-	if (tb[NL80211_ATTR_WIPHY_FREQ])
-		chan_info->frequency =
-			nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]);
-	if (tb[NL80211_ATTR_CHANNEL_WIDTH])
-		chan_info->chanwidth = convert2width(
-			nla_get_u32(tb[NL80211_ATTR_CHANNEL_WIDTH]));
-	if (tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
-		enum nl80211_channel_type ct =
-			nla_get_u32(tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
-
-		switch (ct) {
-		case NL80211_CHAN_HT40MINUS:
-			chan_info->sec_channel = -1;
-			break;
-		case NL80211_CHAN_HT40PLUS:
-			chan_info->sec_channel = 1;
-			break;
-		default:
-			chan_info->sec_channel = 0;
-			break;
-		}
-	}
-	if (tb[NL80211_ATTR_CENTER_FREQ1])
-		chan_info->center_frq1 =
-			nla_get_u32(tb[NL80211_ATTR_CENTER_FREQ1]);
-	if (tb[NL80211_ATTR_CENTER_FREQ2])
-		chan_info->center_frq2 =
-			nla_get_u32(tb[NL80211_ATTR_CENTER_FREQ2]);
-
-	if (chan_info->center_frq2) {
-		u8 seg1_idx = 0;
-
-		if (ieee80211_freq_to_chan(chan_info->center_frq2, &seg1_idx) !=
-		    NUM_HOSTAPD_MODES)
-			chan_info->seg1_idx = seg1_idx;
-	}
-
-	return NL_SKIP;
-}
-
-
-static int nl80211_channel_info(void *priv, struct wpa_channel_info *ci)
-{
-	struct i802_bss *bss = priv;
-	struct wpa_driver_nl80211_data *drv = bss->drv;
-	struct nl_msg *msg;
-
-	msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_INTERFACE);
-	return send_and_recv_msgs(drv, msg, get_channel_info, ci);
-}
-
-
 static void wpa_driver_nl80211_event_receive(int sock, void *eloop_ctx,
 					     void *handle)
 {
@@ -2241,11 +2169,6 @@
 		ret = -1;
 #endif /* CONFIG_DPP */
 #ifdef CONFIG_IEEE80211W
-#ifdef CONFIG_OCV
-	/* SA Query Request */
-	if (nl80211_register_action_frame(bss, (u8 *) "\x08\x00", 2) < 0)
-		ret = -1;
-#endif /* CONFIG_OCV */
 	/* SA Query Response */
 	if (nl80211_register_action_frame(bss, (u8 *) "\x08\x01", 2) < 0)
 		ret = -1;
@@ -3039,7 +2962,7 @@
 #endif /* CONFIG_DRIVER_NL80211_QCA */
 
 	if (alg == WPA_ALG_PMK &&
-	    (drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X))
+	    (drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
 		return nl80211_set_pmk(drv, key, key_len, addr);
 
 	if (alg == WPA_ALG_NONE) {
@@ -3242,8 +3165,7 @@
 
 int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
 			    const u8 *addr, int cmd, u16 reason_code,
-			    int local_state_change,
-			    struct nl_handle *nl_connect)
+			    int local_state_change)
 {
 	int ret;
 	struct nl_msg *msg;
@@ -3257,10 +3179,7 @@
 		return -1;
 	}
 
-	if (nl_connect)
-		ret = send_and_recv(drv->global, nl_connect, msg, NULL, NULL);
-	else
-		ret = send_and_recv_msgs(drv, msg, NULL, NULL);
+	ret = send_and_recv_msgs(drv, msg, NULL, NULL);
 	if (ret) {
 		wpa_dbg(drv->ctx, MSG_DEBUG,
 			"nl80211: MLME command failed: reason=%u ret=%d (%s)",
@@ -3271,8 +3190,7 @@
 
 
 static int wpa_driver_nl80211_disconnect(struct wpa_driver_nl80211_data *drv,
-					 int reason_code,
-					 struct nl_handle *nl_connect)
+					 int reason_code)
 {
 	int ret;
 	int drv_associated = drv->associated;
@@ -3281,7 +3199,7 @@
 	nl80211_mark_disconnected(drv);
 	/* Disconnect command doesn't need BSSID - it uses cached value */
 	ret = wpa_driver_nl80211_mlme(drv, NULL, NL80211_CMD_DISCONNECT,
-				      reason_code, 0, nl_connect);
+				      reason_code, 0);
 	/*
 	 * For locally generated disconnect, supplicant already generates a
 	 * DEAUTH event, so ignore the event from NL80211.
@@ -3303,19 +3221,13 @@
 		nl80211_mark_disconnected(drv);
 		return nl80211_leave_ibss(drv, 1);
 	}
-	if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) {
-		struct nl_handle *nl_connect = NULL;
-
-		if (bss->use_nl_connect)
-			nl_connect = bss->nl_connect;
-		return wpa_driver_nl80211_disconnect(drv, reason_code,
-						     nl_connect);
-	}
+	if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME))
+		return wpa_driver_nl80211_disconnect(drv, reason_code);
 	wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " reason_code=%d)",
 		   __func__, MAC2STR(addr), reason_code);
 	nl80211_mark_disconnected(drv);
 	ret = wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DEAUTHENTICATE,
-				      reason_code, 0, NULL);
+				      reason_code, 0);
 	/*
 	 * For locally generated deauthenticate, supplicant already generates a
 	 * DEAUTH event, so ignore the event from NL80211.
@@ -4045,7 +3957,7 @@
 	struct wpa_driver_nl80211_data *drv = bss->drv;
 	struct nl_msg *msg;
 	u8 cmd = NL80211_CMD_NEW_BEACON;
-	int ret = -ENOBUFS;
+	int ret;
 	int beacon_set;
 	int num_suites;
 	int smps_mode;
@@ -4251,29 +4163,6 @@
 			goto fail;
 	}
 
-	if (params->ftm_responder) {
-		struct nlattr *ftm;
-
-		if (!(drv->capa.flags & WPA_DRIVER_FLAGS_FTM_RESPONDER)) {
-			ret = -ENOTSUP;
-			goto fail;
-		}
-
-		ftm = nla_nest_start(msg, NL80211_ATTR_FTM_RESPONDER);
-		if (!ftm ||
-		    nla_put_flag(msg, NL80211_FTM_RESP_ATTR_ENABLED) ||
-		    (params->lci &&
-		     nla_put(msg, NL80211_FTM_RESP_ATTR_LCI,
-			     wpabuf_len(params->lci),
-			     wpabuf_head(params->lci))) ||
-		    (params->civic &&
-		     nla_put(msg, NL80211_FTM_RESP_ATTR_CIVICLOC,
-			     wpabuf_len(params->civic),
-			     wpabuf_head(params->civic))))
-			goto fail;
-		nla_nest_end(msg, ftm);
-	}
-
 	ret = send_and_recv_msgs(drv, msg, NULL, NULL);
 	if (ret) {
 		wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",
@@ -4325,7 +4214,7 @@
 	return ret;
 fail:
 	nlmsg_free(msg);
-	return ret;
+	return -ENOBUFS;
 }
 
 
@@ -5576,16 +5465,9 @@
 			return -1;
 	}
 
-	if (params->req_key_mgmt_offload &&
-	    (drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X)) {
-		    wpa_printf(MSG_DEBUG, "  * WANT_1X_4WAY_HS");
-		    if (nla_put_flag(msg, NL80211_ATTR_WANT_1X_4WAY_HS))
-			    return -1;
-	    }
-
 	/* Add PSK in case of 4-way handshake offload */
 	if (params->psk &&
-	    (drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK)) {
+	    (drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE)) {
 		wpa_hexdump_key(MSG_DEBUG, "  * PSK", params->psk, 32);
 		if (nla_put(msg, NL80211_ATTR_PMK, 32, params->psk))
 			return -1;
@@ -5716,10 +5598,9 @@
 		goto fail;
 
 	if (nl_connect)
-		ret = send_and_recv(drv->global, nl_connect, msg,
-				    NULL, (void *) -1);
+		ret = send_and_recv(drv->global, nl_connect, msg, NULL, NULL);
 	else
-		ret = send_and_recv_msgs(drv, msg, NULL, (void *) -1);
+		ret = send_and_recv_msgs(drv, msg, NULL, NULL);
 
 	msg = NULL;
 	if (ret) {
@@ -5731,7 +5612,6 @@
 	}
 
 fail:
-	nl80211_nlmsg_clear(msg);
 	nlmsg_free(msg);
 	return ret;
 
@@ -5762,7 +5642,7 @@
 			   "disconnecting before reassociation "
 			   "attempt");
 		if (wpa_driver_nl80211_disconnect(
-			    drv, WLAN_REASON_PREV_AUTH_NOT_VALID, nl_connect))
+			    drv, WLAN_REASON_PREV_AUTH_NOT_VALID))
 			return -1;
 		ret = wpa_driver_nl80211_try_connect(drv, params, nl_connect);
 	}
@@ -5793,13 +5673,8 @@
 
 		if (wpa_driver_nl80211_set_mode(priv, nlmode) < 0)
 			return -1;
-		if (params->auth_alg & WPA_AUTH_ALG_SAE) {
+		if (params->auth_alg & WPA_AUTH_ALG_SAE)
 			nl_connect = bss->nl_connect;
-			bss->use_nl_connect = 1;
-		} else {
-			bss->use_nl_connect = 0;
-		}
-
 		return wpa_driver_nl80211_connect(drv, params, nl_connect);
 	}
 
@@ -6406,7 +6281,6 @@
 	struct wpa_driver_nl80211_data *drv = bss->drv;
 	struct nl_msg *msg;
 	struct nlattr *txq, *params;
-	int res;
 
 	msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_WIPHY);
 	if (!msg)
@@ -6452,11 +6326,7 @@
 
 	nla_nest_end(msg, txq);
 
-	res = send_and_recv_msgs(drv, msg, NULL, NULL);
-	wpa_printf(MSG_DEBUG,
-		   "nl80211: TX queue param set: queue=%d aifs=%d cw_min=%d cw_max=%d burst_time=%d --> res=%d",
-		   queue, aifs, cw_min, cw_max, burst_time, res);
-	if (res == 0)
+	if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
 		return 0;
 	msg = NULL;
 fail:
@@ -6755,12 +6625,9 @@
 		}
 		return i802_set_sta_vlan(priv, addr, name, 0);
 	} else {
-		if (bridge_ifname &&
-		    linux_br_del_if(drv->global->ioctl_sock, bridge_ifname,
-				    name) < 0)
-			wpa_printf(MSG_INFO,
-				   "nl80211: Failed to remove interface %s from bridge %s: %s",
-				   name, bridge_ifname, strerror(errno));
+		if (bridge_ifname)
+			linux_br_del_if(drv->global->ioctl_sock, bridge_ifname,
+					name);
 
 		i802_set_sta_vlan(priv, addr, bss->ifname, 0);
 		nl80211_remove_iface(drv, if_nametoindex(name));
@@ -7929,12 +7796,11 @@
 		     params->fils_cache_id)) ||
 	    (params->pmk_len && params->pmk_len <= PMK_MAX_LEN &&
 	     nla_put(msg, NL80211_ATTR_PMK, params->pmk_len, params->pmk))) {
-		nl80211_nlmsg_clear(msg);
 		nlmsg_free(msg);
 		return -ENOBUFS;
 	}
 
-	return send_and_recv_msgs(bss->drv, msg, NULL, (void *) -1);
+	return send_and_recv_msgs(bss->drv, msg, NULL, NULL);
 }
 
 
@@ -8706,8 +8572,6 @@
 	struct wpa_driver_nl80211_data *drv = bss->drv;
 	int res;
 	char *pos, *end;
-	struct nl_msg *msg;
-	char alpha2[3] = { 0, 0, 0 };
 
 	pos = buf;
 	end = buf + buflen;
@@ -8852,23 +8716,6 @@
 		pos += res;
 	}
 
-	msg = nlmsg_alloc();
-	if (msg &&
-	    nl80211_cmd(drv, msg, 0, NL80211_CMD_GET_REG) &&
-	    nla_put_u32(msg, NL80211_ATTR_WIPHY, drv->wiphy_idx) == 0) {
-		if (send_and_recv_msgs(drv, msg, nl80211_get_country,
-				       alpha2) == 0 &&
-		    alpha2[0]) {
-			res = os_snprintf(pos, end - pos, "country=%s\n",
-					  alpha2);
-			if (os_snprintf_error(end - pos, res))
-				return pos - buf;
-			pos += res;
-		}
-	} else {
-		nlmsg_free(msg);
-	}
-
 	return pos - buf;
 }
 
@@ -10801,49 +10648,6 @@
 }
 
 
-static int nl80211_set_4addr_mode(void *priv, const char *bridge_ifname,
-				  int val)
-{
-	struct i802_bss *bss = priv;
-	struct wpa_driver_nl80211_data *drv = bss->drv;
-	struct nl_msg *msg;
-	int ret = -ENOBUFS;
-
-	wpa_printf(MSG_DEBUG, "nl80211: %s 4addr mode (bridge_ifname: %s)",
-		   val ? "Enable" : "Disable", bridge_ifname);
-
-	msg = nl80211_cmd_msg(drv->first_bss, 0, NL80211_CMD_SET_INTERFACE);
-	if (!msg || nla_put_u8(msg, NL80211_ATTR_4ADDR, val))
-		goto fail;
-
-	if (bridge_ifname[0] && bss->added_if_into_bridge && !val) {
-		if (linux_br_del_if(drv->global->ioctl_sock,
-				    bridge_ifname, bss->ifname)) {
-			wpa_printf(MSG_ERROR,
-				   "nl80211: Failed to remove interface %s from bridge %s",
-				   bss->ifname, bridge_ifname);
-			return -1;
-		}
-		bss->added_if_into_bridge = 0;
-	}
-
-	ret = send_and_recv_msgs(drv, msg, NULL, NULL);
-	msg = NULL;
-	if (!ret) {
-		if (bridge_ifname[0] && val &&
-		    i802_check_bridge(drv, bss, bridge_ifname, bss->ifname) < 0)
-			return -1;
-		return 0;
-	}
-
-fail:
-	nlmsg_free(msg);
-	wpa_printf(MSG_ERROR, "nl80211: Failed to enable/disable 4addr");
-
-	return ret;
-}
-
-
 const struct wpa_driver_ops wpa_driver_nl80211_ops = {
 	.name = "nl80211",
 	.desc = "Linux nl80211/cfg80211",
@@ -10903,7 +10707,6 @@
 	.resume = wpa_driver_nl80211_resume,
 	.signal_monitor = nl80211_signal_monitor,
 	.signal_poll = nl80211_signal_poll,
-	.channel_info = nl80211_channel_info,
 	.send_frame = nl80211_send_frame,
 	.set_param = nl80211_set_param,
 	.get_radio_name = nl80211_get_radio_name,
@@ -10973,5 +10776,4 @@
 	.get_ext_capab = nl80211_get_ext_capab,
 	.update_connect_params = nl80211_update_connection_params,
 	.send_external_auth_status = nl80211_send_external_auth_status,
-	.set_4addr_mode = nl80211_set_4addr_mode,
 };
diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
index 1e7fe7a..5ac0c7d 100644
--- a/src/drivers/driver_nl80211.h
+++ b/src/drivers/driver_nl80211.h
@@ -66,7 +66,6 @@
 	unsigned int wdev_id_set:1;
 	unsigned int added_if:1;
 	unsigned int static_ap:1;
-	unsigned int use_nl_connect:1;
 
 	u8 addr[ETH_ALEN];
 
@@ -166,7 +165,6 @@
 	unsigned int he_capab_vendor_cmd_avail:1;
 	unsigned int fetch_bss_trans_status:1;
 	unsigned int roam_vendor_cmd_avail:1;
-	unsigned int get_supported_akm_suites_avail:1;
 
 	u64 vendor_scan_cookie;
 	u64 remain_on_chan_cookie;
@@ -254,8 +252,7 @@
 				enum nl80211_iftype nlmode);
 int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
 			    const u8 *addr, int cmd, u16 reason_code,
-			    int local_state_change,
-			    struct nl_handle *nl_connect);
+			    int local_state_change);
 
 int nl80211_create_monitor_interface(struct wpa_driver_nl80211_data *drv);
 void nl80211_remove_monitor_interface(struct wpa_driver_nl80211_data *drv);
diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
index 37eeb5e..7b360d2 100644
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -403,11 +403,10 @@
 		capa->flags |= WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD;
 
 	if (ext_feature_isset(ext_features, len,
-			      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK))
-		capa->flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK;
-	if (ext_feature_isset(ext_features, len,
+			      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) &&
+	    ext_feature_isset(ext_features, len,
 			      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
-		capa->flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X;
+		capa->flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE;
 
 	if (ext_feature_isset(ext_features, len,
 			      NL80211_EXT_FEATURE_MFP_OPTIONAL))
@@ -429,10 +428,6 @@
 		    NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION))
 		capa->flags |= WPA_DRIVER_FLAGS_OCE_STA;
 #endif /* CONFIG_MBO */
-
-	if (ext_feature_isset(ext_features, len,
-			      NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
-		capa->flags |= WPA_DRIVER_FLAGS_FTM_RESPONDER;
 }
 
 
@@ -787,9 +782,6 @@
 				case QCA_NL80211_VENDOR_SUBCMD_ROAM:
 					drv->roam_vendor_cmd_avail = 1;
 					break;
-				case QCA_NL80211_VENDOR_SUBCMD_GET_SUPPORTED_AKMS:
-					drv->get_supported_akm_suites_avail = 1;
-					break;
 #endif /* CONFIG_DRIVER_NL80211_QCA */
 				}
 			}
@@ -962,126 +954,6 @@
 }
 
 
-static unsigned int get_akm_suites_info(struct nlattr *tb)
-{
-	int i, num;
-	unsigned int key_mgmt = 0;
-	u32 *akms;
-
-	if (!tb)
-		return 0;
-
-	num = nla_len(tb) / sizeof(u32);
-	akms = nla_data(tb);
-	for (i = 0; i < num; i++) {
-		u32 a = akms[i];
-
-		wpa_printf(MSG_DEBUG,
-			   "nl80211: Supported AKM %02x-%02x-%02x:%u",
-			   a >> 24, (a >> 16) & 0xff,
-			   (a >> 8) & 0xff, a & 0xff);
-		switch (a) {
-		case RSN_AUTH_KEY_MGMT_UNSPEC_802_1X:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA |
-				WPA_DRIVER_CAPA_KEY_MGMT_WPA2;
-			break;
-		case RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
-				WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;
-			break;
-		case RSN_AUTH_KEY_MGMT_FT_802_1X:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FT;
-			break;
-		case RSN_AUTH_KEY_MGMT_FT_PSK:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK;
-			break;
-		case RSN_AUTH_KEY_MGMT_802_1X_SUITE_B:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_SUITE_B;
-			break;
-		case RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_SUITE_B_192;
-			break;
-		case RSN_AUTH_KEY_MGMT_OWE:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_OWE;
-			break;
-		case RSN_AUTH_KEY_MGMT_DPP:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_DPP;
-			break;
-		case RSN_AUTH_KEY_MGMT_FILS_SHA256:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA256;
-			break;
-		case RSN_AUTH_KEY_MGMT_FILS_SHA384:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA384;
-			break;
-		case RSN_AUTH_KEY_MGMT_FT_FILS_SHA256:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA256;
-			break;
-		case RSN_AUTH_KEY_MGMT_FT_FILS_SHA384:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA384;
-			break;
-		case RSN_AUTH_KEY_MGMT_SAE:
-			key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_SAE;
-			break;
-		}
-	}
-
-	return key_mgmt;
-}
-
-
-static int get_akm_suites_handler(struct nl_msg *msg, void *arg)
-{
-	struct nlattr *tb[NL80211_ATTR_MAX + 1];
-	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
-	unsigned int *key_mgmt = arg;
-
-	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
-		  genlmsg_attrlen(gnlh, 0), NULL);
-
-	if (tb[NL80211_ATTR_VENDOR_DATA]) {
-		struct nlattr *nl_vend = tb[NL80211_ATTR_VENDOR_DATA];
-		struct nlattr *tb_data[NL80211_ATTR_MAX + 1];
-
-		nla_parse(tb_data, NL80211_ATTR_MAX,
-			  nla_data(nl_vend), nla_len(nl_vend), NULL);
-
-		*key_mgmt =
-			get_akm_suites_info(tb_data[NL80211_ATTR_AKM_SUITES]);
-	}
-
-	return NL_SKIP;
-}
-
-
-static int qca_nl80211_get_akm_suites(struct wpa_driver_nl80211_data *drv)
-{
-	struct nl_msg *msg;
-	unsigned int key_mgmt = 0;
-	int ret;
-
-	if (!drv->get_supported_akm_suites_avail)
-		return -1;
-
-	if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
-	    nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_QCA) ||
-	    nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD,
-			QCA_NL80211_VENDOR_SUBCMD_GET_SUPPORTED_AKMS)) {
-		nlmsg_free(msg);
-		return -1;
-	}
-
-	ret = send_and_recv_msgs(drv, msg, get_akm_suites_handler, &key_mgmt);
-	if (!ret) {
-		wpa_printf(MSG_DEBUG,
-			   "nl80211: Replace capa.key_mgmt based on driver advertised capabilities: 0x%x",
-			   key_mgmt);
-		drv->capa.key_mgmt = key_mgmt;
-	}
-
-	return ret;
-}
-
-
 static int qca_nl80211_he_capab_handler(struct nl_msg *msg, void *arg)
 {
 	struct nlattr *tb[NL80211_ATTR_MAX + 1];
@@ -1307,18 +1179,11 @@
 		drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA256 |
 			WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA384 |
 			WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA256 |
-			WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA384 |
-			WPA_DRIVER_CAPA_KEY_MGMT_SAE;
+			WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA384;
 	else if (drv->capa.flags & WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD)
 		drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA256 |
 			WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA384;
 
-#ifdef CONFIG_DRIVER_NL80211_QCA
-	/* Override drv->capa.key_mgmt based on driver advertised capability
-	 * constraints, if available. */
-	qca_nl80211_get_akm_suites(drv);
-#endif /* CONFIG_DRIVER_NL80211_QCA */
-
 	drv->capa.auth = WPA_DRIVER_AUTH_OPEN |
 		WPA_DRIVER_AUTH_SHARED |
 		WPA_DRIVER_AUTH_LEAP;
@@ -1442,7 +1307,6 @@
 	u8 channel;
 	chan->freq = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_FREQ]);
 	chan->flag = 0;
-	chan->allowed_bw = ~0;
 	chan->dfs_cac_ms = 0;
 	if (ieee80211_freq_to_chan(chan->freq, &channel) != NUM_HOSTAPD_MODES)
 		chan->chan = channel;
@@ -1458,19 +1322,6 @@
 	if (tb_freq[NL80211_FREQUENCY_ATTR_GO_CONCURRENT])
 		chan->flag |= HOSTAPD_CHAN_GO_CONCURRENT;
 
-	if (tb_freq[NL80211_FREQUENCY_ATTR_NO_10MHZ])
-		chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_10;
-	if (tb_freq[NL80211_FREQUENCY_ATTR_NO_20MHZ])
-		chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_20;
-	if (tb_freq[NL80211_FREQUENCY_ATTR_NO_HT40_PLUS])
-		chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_40P;
-	if (tb_freq[NL80211_FREQUENCY_ATTR_NO_HT40_MINUS])
-		chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_40M;
-	if (tb_freq[NL80211_FREQUENCY_ATTR_NO_80MHZ])
-		chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_80;
-	if (tb_freq[NL80211_FREQUENCY_ATTR_NO_160MHZ])
-		chan->allowed_bw &= ~HOSTAPD_CHAN_WIDTH_160;
-
 	if (tb_freq[NL80211_FREQUENCY_ATTR_DFS_STATE]) {
 		enum nl80211_dfs_state state =
 			nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_DFS_STATE]);
@@ -1505,12 +1356,6 @@
 		[NL80211_FREQUENCY_ATTR_RADAR] = { .type = NLA_FLAG },
 		[NL80211_FREQUENCY_ATTR_MAX_TX_POWER] = { .type = NLA_U32 },
 		[NL80211_FREQUENCY_ATTR_DFS_STATE] = { .type = NLA_U32 },
-		[NL80211_FREQUENCY_ATTR_NO_10MHZ] = { .type = NLA_FLAG },
-		[NL80211_FREQUENCY_ATTR_NO_20MHZ] = { .type = NLA_FLAG },
-		[NL80211_FREQUENCY_ATTR_NO_HT40_PLUS] = { .type = NLA_FLAG },
-		[NL80211_FREQUENCY_ATTR_NO_HT40_MINUS] = { .type = NLA_FLAG },
-		[NL80211_FREQUENCY_ATTR_NO_80MHZ] = { .type = NLA_FLAG },
-		[NL80211_FREQUENCY_ATTR_NO_160MHZ] = { .type = NLA_FLAG },
 	};
 	int new_channels = 0;
 	struct hostapd_channel_data *channel;
@@ -2087,61 +1932,6 @@
 }
 
 
-static const char * modestr(enum hostapd_hw_mode mode)
-{
-	switch (mode) {
-	case HOSTAPD_MODE_IEEE80211B:
-		return "802.11b";
-	case HOSTAPD_MODE_IEEE80211G:
-		return "802.11g";
-	case HOSTAPD_MODE_IEEE80211A:
-		return "802.11a";
-	case HOSTAPD_MODE_IEEE80211AD:
-		return "802.11ad";
-	default:
-		return "?";
-	}
-}
-
-
-static void nl80211_dump_chan_list(struct hostapd_hw_modes *modes,
-				   u16 num_modes)
-{
-	int i;
-
-	if (!modes)
-		return;
-
-	for (i = 0; i < num_modes; i++) {
-		struct hostapd_hw_modes *mode = &modes[i];
-		char str[200];
-		char *pos = str;
-		char *end = pos + sizeof(str);
-		int j, res;
-
-		for (j = 0; j < mode->num_channels; j++) {
-			struct hostapd_channel_data *chan = &mode->channels[j];
-
-			res = os_snprintf(pos, end - pos, " %d%s%s%s",
-					  chan->freq,
-					  (chan->flag & HOSTAPD_CHAN_DISABLED) ?
-					  "[DISABLED]" : "",
-					  (chan->flag & HOSTAPD_CHAN_NO_IR) ?
-					  "[NO_IR]" : "",
-					  (chan->flag & HOSTAPD_CHAN_RADAR) ?
-					  "[RADAR]" : "");
-			if (os_snprintf_error(end - pos, res))
-				break;
-			pos += res;
-		}
-
-		*pos = '\0';
-		wpa_printf(MSG_DEBUG, "nl80211: Mode IEEE %s:%s",
-			   modestr(mode->mode), str);
-	}
-}
-
-
 struct hostapd_hw_modes *
 nl80211_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags,
 			    u8 *dfs_domain)
@@ -2173,8 +1963,6 @@
 	}
 
 	if (send_and_recv_msgs(drv, msg, phy_info_handler, &result) == 0) {
-		struct hostapd_hw_modes *modes;
-
 		nl80211_set_regulatory_flags(drv, &result);
 		if (result.failed) {
 			int i;
@@ -2190,10 +1978,8 @@
 
 		*dfs_domain = result.dfs_domain;
 
-		modes = wpa_driver_nl80211_postprocess_modes(result.modes,
-							     num_modes);
-		nl80211_dump_chan_list(modes, *num_modes);
-		return modes;
+		return wpa_driver_nl80211_postprocess_modes(result.modes,
+							    num_modes);
 	}
 
 	return NULL;
diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index 06e619b..5b8efbc 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -754,12 +754,12 @@
 			 * disconnection event for the old AP may show up after
 			 * we have started connection with the new AP.
 			 */
-			wpa_printf(MSG_DEBUG,
-				   "nl80211: Ignore deauth/disassoc event from old AP "
-				   MACSTR
-				   " when already connecting with " MACSTR,
-				   MAC2STR(bssid),
-				   MAC2STR(drv->auth_attempt_bssid));
+			 wpa_printf(MSG_DEBUG,
+				    "nl80211: Ignore deauth/disassoc event from old AP "
+				    MACSTR
+				    " when already connecting with " MACSTR,
+				    MAC2STR(bssid),
+				    MAC2STR(drv->auth_attempt_bssid));
 			return;
 		}
 
@@ -2183,54 +2183,6 @@
 }
 
 
-static void nl80211_dump_freq(const char *title, struct nlattr *nl_freq)
-{
-	static struct nla_policy freq_policy[NL80211_FREQUENCY_ATTR_MAX + 1] = {
-		[NL80211_FREQUENCY_ATTR_FREQ] = { .type = NLA_U32 },
-		[NL80211_FREQUENCY_ATTR_DISABLED] = { .type = NLA_FLAG },
-		[NL80211_FREQUENCY_ATTR_NO_IR] = { .type = NLA_FLAG },
-		[NL80211_FREQUENCY_ATTR_RADAR] = { .type = NLA_FLAG },
-		[NL80211_FREQUENCY_ATTR_MAX_TX_POWER] = { .type = NLA_U32 },
-	};
-	struct nlattr *tb[NL80211_FREQUENCY_ATTR_MAX + 1];
-	u32 freq = 0, max_tx_power = 0;
-
-	nla_parse(tb, NL80211_FREQUENCY_ATTR_MAX,
-		  nla_data(nl_freq), nla_len(nl_freq), freq_policy);
-
-	if (tb[NL80211_FREQUENCY_ATTR_FREQ])
-		freq = nla_get_u32(tb[NL80211_FREQUENCY_ATTR_FREQ]);
-	if (tb[NL80211_FREQUENCY_ATTR_MAX_TX_POWER])
-		max_tx_power =
-			nla_get_u32(tb[NL80211_FREQUENCY_ATTR_MAX_TX_POWER]);
-
-	wpa_printf(MSG_DEBUG,
-		   "nl80211: Channel (%s): freq=%u max_tx_power=%u%s%s%s",
-		   title, freq, max_tx_power,
-		   tb[NL80211_FREQUENCY_ATTR_DISABLED] ? " disabled" : "",
-		   tb[NL80211_FREQUENCY_ATTR_NO_IR] ? " no-IR" : "",
-		   tb[NL80211_FREQUENCY_ATTR_RADAR] ? " radar" : "");
-}
-
-
-static void nl80211_reg_beacon_hint_event(struct wpa_driver_nl80211_data *drv,
-					   struct nlattr *tb[])
-{
-	union wpa_event_data data;
-
-	wpa_printf(MSG_DEBUG, "nl80211: Regulatory beacon hint");
-	os_memset(&data, 0, sizeof(data));
-	data.channel_list_changed.initiator = REGDOM_BEACON_HINT;
-
-	if (tb[NL80211_ATTR_FREQ_BEFORE])
-		nl80211_dump_freq("before", tb[NL80211_ATTR_FREQ_BEFORE]);
-	if (tb[NL80211_ATTR_FREQ_AFTER])
-		nl80211_dump_freq("after", tb[NL80211_ATTR_FREQ_AFTER]);
-
-	wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED, &data);
-}
-
-
 static void nl80211_external_auth(struct wpa_driver_nl80211_data *drv,
 				  struct nlattr **tb)
 {
@@ -2319,7 +2271,7 @@
 	ed.sta_opmode.addr = nla_data(tb[NL80211_ATTR_MAC]);
 
 	if (tb[NL80211_ATTR_SMPS_MODE]) {
-		smps_mode = nla_get_u8(tb[NL80211_ATTR_SMPS_MODE]);
+		smps_mode = nla_get_u32(tb[NL80211_ATTR_SMPS_MODE]);
 		switch (smps_mode) {
 		case NL80211_SMPS_OFF:
 			ed.sta_opmode.smps_mode = SMPS_OFF;
@@ -2375,6 +2327,7 @@
 				 struct nlattr **tb)
 {
 	struct wpa_driver_nl80211_data *drv = bss->drv;
+	union wpa_event_data data;
 	int external_scan_event = 0;
 
 	wpa_printf(MSG_DEBUG, "nl80211: Drv Event %d (%s) received for %s",
@@ -2527,7 +2480,11 @@
 		nl80211_reg_change_event(drv, tb);
 		break;
 	case NL80211_CMD_REG_BEACON_HINT:
-		nl80211_reg_beacon_hint_event(drv, tb);
+		wpa_printf(MSG_DEBUG, "nl80211: Regulatory beacon hint");
+		os_memset(&data, 0, sizeof(data));
+		data.channel_list_changed.initiator = REGDOM_BEACON_HINT;
+		wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED,
+				     &data);
 		break;
 	case NL80211_CMD_NEW_STATION:
 		nl80211_new_station_event(drv, bss, tb);
diff --git a/src/drivers/driver_nl80211_scan.c b/src/drivers/driver_nl80211_scan.c
index 33a8d35..86501f4 100644
--- a/src/drivers/driver_nl80211_scan.c
+++ b/src/drivers/driver_nl80211_scan.c
@@ -866,8 +866,7 @@
 			   "mismatch (" MACSTR ")", MAC2STR(addr));
 		wpa_driver_nl80211_mlme(drv, addr,
 					NL80211_CMD_DEAUTHENTICATE,
-					WLAN_REASON_PREV_AUTH_NOT_VALID, 1,
-					NULL);
+					WLAN_REASON_PREV_AUTH_NOT_VALID, 1);
 	}
 }
 
diff --git a/src/drivers/driver_openbsd.c b/src/drivers/driver_openbsd.c
index c06e75c..e94eda0 100644
--- a/src/drivers/driver_openbsd.c
+++ b/src/drivers/driver_openbsd.c
@@ -62,8 +62,7 @@
 wpa_driver_openbsd_get_capa(void *priv, struct wpa_driver_capa *capa)
 {
 	os_memset(capa, 0, sizeof(*capa));
-	capa->flags = WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK |
-		      WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X;
+	capa->flags = WPA_DRIVER_FLAGS_4WAY_HANDSHAKE;
 	return 0;
 }
 
diff --git a/src/drivers/driver_wext.c b/src/drivers/driver_wext.c
index f7755cc..933b8d9 100644
--- a/src/drivers/driver_wext.c
+++ b/src/drivers/driver_wext.c
@@ -868,16 +868,14 @@
 			      const char *ifname)
 {
 	char buf[200], *res;
-	int type, ret;
+	int type;
 	FILE *f;
 
 	if (strcmp(ifname, ".") == 0 || strcmp(ifname, "..") == 0)
 		return -1;
 
-	ret = snprintf(buf, sizeof(buf), "/sys/class/net/%s/device/net/%s/type",
-		       drv->ifname, ifname);
-	if (os_snprintf_error(sizeof(buf), ret))
-		return -1;
+	snprintf(buf, sizeof(buf), "/sys/class/net/%s/device/net/%s/type",
+		 drv->ifname, ifname);
 
 	f = fopen(buf, "r");
 	if (!f)
@@ -1647,8 +1645,7 @@
 		if (range->enc_capa & IW_ENC_CAPA_CIPHER_CCMP)
 			drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP;
 		if (range->enc_capa & IW_ENC_CAPA_4WAY_HANDSHAKE)
-			drv->capa.flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK |
-				WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X;
+			drv->capa.flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE;
 		drv->capa.auth = WPA_DRIVER_AUTH_OPEN |
 			WPA_DRIVER_AUTH_SHARED |
 			WPA_DRIVER_AUTH_LEAP;
@@ -1679,7 +1676,7 @@
 
 	wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
 
-	if (!(drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X))
+	if (!(drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
 		return 0;
 
 	if (!psk)
@@ -2431,8 +2428,8 @@
 	struct iwreq iwr;
 
 	os_memset(si, 0, sizeof(*si));
-	si->current_signal = -WPA_INVALID_NOISE;
-	si->current_noise = WPA_INVALID_NOISE;
+	si->current_signal = -9999;
+	si->current_noise = 9999;
 	si->chanwidth = CHAN_WIDTH_UNKNOWN;
 
 	os_memset(&iwr, 0, sizeof(iwr));
diff --git a/src/drivers/driver_wired.c b/src/drivers/driver_wired.c
index c7537b7..7e09dcf 100644
--- a/src/drivers/driver_wired.c
+++ b/src/drivers/driver_wired.c
@@ -96,16 +96,16 @@
 	hdr = (struct ieee8023_hdr *) buf;
 
 	switch (ntohs(hdr->ethertype)) {
-	case ETH_P_PAE:
-		wpa_printf(MSG_MSGDUMP, "Received EAPOL packet");
-		sa = hdr->src;
-		os_memset(&event, 0, sizeof(event));
-		event.new_sta.addr = sa;
-		wpa_supplicant_event(ctx, EVENT_NEW_STA, &event);
+		case ETH_P_PAE:
+			wpa_printf(MSG_MSGDUMP, "Received EAPOL packet");
+			sa = hdr->src;
+			os_memset(&event, 0, sizeof(event));
+			event.new_sta.addr = sa;
+			wpa_supplicant_event(ctx, EVENT_NEW_STA, &event);
 
-		pos = (u8 *) (hdr + 1);
-		left = len - sizeof(*hdr);
-		drv_event_eapol_rx(ctx, sa, pos, left);
+			pos = (u8 *) (hdr + 1);
+			left = len - sizeof(*hdr);
+			drv_event_eapol_rx(ctx, sa, pos, left);
 		break;
 
 	default:
diff --git a/src/drivers/drivers.mak b/src/drivers/drivers.mak
index 442c59c..1496b47 100644
--- a/src/drivers/drivers.mak
+++ b/src/drivers/drivers.mak
@@ -22,7 +22,6 @@
 DRV_CFLAGS += -DCONFIG_DRIVER_MACSEC_LINUX
 DRV_OBJS += ../src/drivers/driver_macsec_linux.o
 NEED_DRV_WIRED_COMMON=1
-NEED_LIBNL=y
 CONFIG_LIBNL3_ROUTE=y
 endif
 
@@ -52,7 +51,37 @@
 NEED_LINUX_IOCTL=y
 NEED_RFKILL=y
 NEED_RADIOTAP=y
-NEED_LIBNL=y
+
+ifdef CONFIG_LIBNL32
+  DRV_LIBS += -lnl-3
+  DRV_LIBS += -lnl-genl-3
+  DRV_CFLAGS += -DCONFIG_LIBNL20
+  ifdef LIBNL_INC
+    DRV_CFLAGS += -I$(LIBNL_INC)
+  else
+    PKG_CONFIG ?= pkg-config
+    DRV_CFLAGS += $(shell $(PKG_CONFIG) --cflags libnl-3.0)
+  endif
+ifdef CONFIG_LIBNL3_ROUTE
+  DRV_LIBS += -lnl-route-3
+  DRV_CFLAGS += -DCONFIG_LIBNL3_ROUTE
+endif
+else
+  ifdef CONFIG_LIBNL_TINY
+    DRV_LIBS += -lnl-tiny
+  else
+    ifndef CONFIG_OSX
+      DRV_LIBS += -lnl
+    endif
+  endif
+
+  ifdef CONFIG_LIBNL20
+    ifndef CONFIG_LIBNL_TINY
+      DRV_LIBS += -lnl-genl
+    endif
+    DRV_CFLAGS += -DCONFIG_LIBNL20
+  endif
+endif
 endif
 
 ifdef CONFIG_DRIVER_BSD
@@ -154,55 +183,26 @@
 
 ifdef CONFIG_VLAN_NETLINK
 ifdef CONFIG_FULL_DYNAMIC_VLAN
-NEED_LIBNL=y
-CONFIG_LIBNL3_ROUTE=y
-endif
-endif
-
-ifdef NEED_LIBNL
-ifndef CONFIG_LIBNL32
-ifndef CONFIG_LIBNL20
-ifndef CONFIG_LIBNL_TINY
-PKG_CONFIG ?= pkg-config
-HAVE_LIBNL3 := $(shell $(PKG_CONFIG) --exists libnl-3.0; echo $$?)
-ifeq ($(HAVE_LIBNL3),0)
-CONFIG_LIBNL32=y
-endif
-endif
-endif
-endif
-
 ifdef CONFIG_LIBNL32
   DRV_LIBS += -lnl-3
   DRV_LIBS += -lnl-genl-3
+  DRV_LIBS += -lnl-route-3
   DRV_CFLAGS += -DCONFIG_LIBNL20
-  ifdef LIBNL_INC
-    DRV_CFLAGS += -I$(LIBNL_INC)
-  else
-    PKG_CONFIG ?= pkg-config
-    DRV_CFLAGS += $(shell $(PKG_CONFIG) --cflags libnl-3.0)
-  endif
-  ifdef CONFIG_LIBNL3_ROUTE
-    DRV_LIBS += -lnl-route-3
-    DRV_CFLAGS += -DCONFIG_LIBNL3_ROUTE
-  endif
 else
   ifdef CONFIG_LIBNL_TINY
     DRV_LIBS += -lnl-tiny
   else
-    ifndef CONFIG_OSX
-      DRV_LIBS += -lnl
-    endif
+    DRV_LIBS += -lnl
   endif
 
   ifdef CONFIG_LIBNL20
-    ifndef CONFIG_LIBNL_TINY
-      DRV_LIBS += -lnl-genl
-    endif
+    DRV_LIBS += -lnl-genl
+    DRV_LIBS += -lnl-route
     DRV_CFLAGS += -DCONFIG_LIBNL20
   endif
 endif
 endif
+endif
 
 ##### COMMON VARS
 DRV_BOTH_CFLAGS := $(DRV_CFLAGS) $(DRV_WPA_CFLAGS) $(DRV_AP_CFLAGS)
diff --git a/src/drivers/drivers.mk b/src/drivers/drivers.mk
index 599a0b5..cd25133 100644
--- a/src/drivers/drivers.mk
+++ b/src/drivers/drivers.mk
@@ -23,7 +23,6 @@
 DRV_OBJS += src/drivers/driver_macsec_linux.c
 NEED_DRV_WIRED_COMMON=1
 CONFIG_LIBNL3_ROUTE=y
-NEED_LIBNL=y
 endif
 
 ifdef NEED_DRV_WIRED_COMMON
@@ -47,7 +46,29 @@
 NEED_LINUX_IOCTL=y
 NEED_RFKILL=y
 NEED_RADIOTAP=y
-NEED_LIBNL=y
+
+ifdef CONFIG_LIBNL32
+  DRV_LIBS += -lnl-3
+  DRV_LIBS += -lnl-genl-3
+  DRV_CFLAGS += -DCONFIG_LIBNL20 -I/usr/include/libnl3
+ifdef CONFIG_LIBNL3_ROUTE
+  DRV_LIBS += -lnl-route-3
+  DRV_CFLAGS += -DCONFIG_LIBNL3_ROUTE
+endif
+else
+  ifdef CONFIG_LIBNL_TINY
+    DRV_LIBS += -lnl-tiny
+  else
+    DRV_LIBS += -lnl
+  endif
+
+  ifdef CONFIG_LIBNL20
+    ifndef CONFIG_LIBNL_TINY
+      DRV_LIBS += -lnl-genl
+    endif
+    DRV_CFLAGS += -DCONFIG_LIBNL20
+  endif
+endif
 endif
 
 ifdef CONFIG_DRIVER_BSD
@@ -150,20 +171,11 @@
 
 ifdef CONFIG_VLAN_NETLINK
 ifdef CONFIG_FULL_DYNAMIC_VLAN
-NEED_LIBNL=y
-CONFIG_LIBNL3_ROUTE=y
-endif
-endif
-
-ifdef NEED_LIBNL
 ifdef CONFIG_LIBNL32
   DRV_LIBS += -lnl-3
   DRV_LIBS += -lnl-genl-3
-  DRV_CFLAGS += -DCONFIG_LIBNL20 -I/usr/include/libnl3
-ifdef CONFIG_LIBNL3_ROUTE
   DRV_LIBS += -lnl-route-3
-  DRV_CFLAGS += -DCONFIG_LIBNL3_ROUTE
-endif
+  DRV_CFLAGS += -DCONFIG_LIBNL20
 else
   ifdef CONFIG_LIBNL_TINY
     DRV_LIBS += -lnl-tiny
@@ -172,13 +184,13 @@
   endif
 
   ifdef CONFIG_LIBNL20
-    ifndef CONFIG_LIBNL_TINY
-      DRV_LIBS += -lnl-genl
-    endif
+    DRV_LIBS += -lnl-genl
+    DRV_LIBS += -lnl-route
     DRV_CFLAGS += -DCONFIG_LIBNL20
   endif
 endif
 endif
+endif
 
 ##### COMMON VARS
 DRV_BOTH_CFLAGS := $(DRV_CFLAGS) $(DRV_WPA_CFLAGS) $(DRV_AP_CFLAGS)
diff --git a/src/drivers/linux_ioctl.c b/src/drivers/linux_ioctl.c
index 7edb9df..e21147a 100644
--- a/src/drivers/linux_ioctl.c
+++ b/src/drivers/linux_ioctl.c
@@ -12,7 +12,6 @@
 #include <net/if_arp.h>
 
 #include "utils/common.h"
-#include "common/linux_bridge.h"
 #include "linux_ioctl.h"
 
 
@@ -120,14 +119,25 @@
 }
 
 
+#ifndef SIOCBRADDBR
+#define SIOCBRADDBR 0x89a0
+#endif
+#ifndef SIOCBRDELBR
+#define SIOCBRDELBR 0x89a1
+#endif
+#ifndef SIOCBRADDIF
+#define SIOCBRADDIF 0x89a2
+#endif
+#ifndef SIOCBRDELIF
+#define SIOCBRDELIF 0x89a3
+#endif
+
+
 int linux_br_add(int sock, const char *brname)
 {
 	if (ioctl(sock, SIOCBRADDBR, brname) < 0) {
-		int saved_errno = errno;
-
 		wpa_printf(MSG_DEBUG, "Could not add bridge %s: %s",
 			   brname, strerror(errno));
-		errno = saved_errno;
 		return -1;
 	}
 
@@ -160,11 +170,8 @@
 	os_strlcpy(ifr.ifr_name, brname, IFNAMSIZ);
 	ifr.ifr_ifindex = ifindex;
 	if (ioctl(sock, SIOCBRADDIF, &ifr) < 0) {
-		int saved_errno = errno;
-
 		wpa_printf(MSG_DEBUG, "Could not add interface %s into bridge "
 			   "%s: %s", ifname, brname, strerror(errno));
-		errno = saved_errno;
 		return -1;
 	}
 
diff --git a/src/drivers/nl80211_copy.h b/src/drivers/nl80211_copy.h
index 31ae5c7..1766a12 100644
--- a/src/drivers/nl80211_copy.h
+++ b/src/drivers/nl80211_copy.h
@@ -1033,38 +1033,6 @@
  *	%NL80211_ATTR_CHANNEL_WIDTH,%NL80211_ATTR_NSS attributes with its
  *	address(specified in %NL80211_ATTR_MAC).
  *
- * @NL80211_CMD_GET_FTM_RESPONDER_STATS: Retrieve FTM responder statistics, in
- *	the %NL80211_ATTR_FTM_RESPONDER_STATS attribute.
- *
- * @NL80211_CMD_PEER_MEASUREMENT_START: start a (set of) peer measurement(s)
- *	with the given parameters, which are encapsulated in the nested
- *	%NL80211_ATTR_PEER_MEASUREMENTS attribute. Optionally, MAC address
- *	randomization may be enabled and configured by specifying the
- *	%NL80211_ATTR_MAC and %NL80211_ATTR_MAC_MASK attributes.
- *	If a timeout is requested, use the %NL80211_ATTR_TIMEOUT attribute.
- *	A u64 cookie for further %NL80211_ATTR_COOKIE use is is returned in
- *	the netlink extended ack message.
- *
- *	To cancel a measurement, close the socket that requested it.
- *
- *	Measurement results are reported to the socket that requested the
- *	measurement using @NL80211_CMD_PEER_MEASUREMENT_RESULT when they
- *	become available, so applications must ensure a large enough socket
- *	buffer size.
- *
- *	Depending on driver support it may or may not be possible to start
- *	multiple concurrent measurements.
- * @NL80211_CMD_PEER_MEASUREMENT_RESULT: This command number is used for the
- *	result notification from the driver to the requesting socket.
- * @NL80211_CMD_PEER_MEASUREMENT_COMPLETE: Notification only, indicating that
- *	the measurement completed, using the measurement cookie
- *	(%NL80211_ATTR_COOKIE).
- *
- * @NL80211_CMD_NOTIFY_RADAR: Notify the kernel that a radar signal was
- *	detected and reported by a neighboring device on the channel
- *	indicated by %NL80211_ATTR_WIPHY_FREQ and other attributes
- *	determining the width and type.
- *
  * @NL80211_CMD_MAX: highest used command number
  * @__NL80211_CMD_AFTER_LAST: internal use
  */
@@ -1277,14 +1245,6 @@
 
 	NL80211_CMD_CONTROL_PORT_FRAME,
 
-	NL80211_CMD_GET_FTM_RESPONDER_STATS,
-
-	NL80211_CMD_PEER_MEASUREMENT_START,
-	NL80211_CMD_PEER_MEASUREMENT_RESULT,
-	NL80211_CMD_PEER_MEASUREMENT_COMPLETE,
-
-	NL80211_CMD_NOTIFY_RADAR,
-
 	/* add new commands above here */
 
 	/* used to define NL80211_CMD_MAX below */
@@ -1741,7 +1701,7 @@
  *	the values passed in @NL80211_ATTR_SCAN_SSIDS (eg. if an SSID
  *	is included in the probe request, but the match attributes
  *	will never let it go through), -EINVAL may be returned.
- *	If omitted, no filtering is done.
+ *	If ommited, no filtering is done.
  *
  * @NL80211_ATTR_INTERFACE_COMBINATIONS: Nested attribute listing the supported
  *	interface combinations. In each nested item, it contains attributes
@@ -1846,7 +1806,7 @@
  *
  * @NL80211_ATTR_INACTIVITY_TIMEOUT: timeout value in seconds, this can be
  *	used by the drivers which has MLME in firmware and does not have support
- *	to report per station tx/rx activity to free up the station entry from
+ *	to report per station tx/rx activity to free up the staion entry from
  *	the list. This needs to be used when the driver advertises the
  *	capability to timeout the stations.
  *
@@ -2207,7 +2167,7 @@
  *
  * @NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST: When present the RSSI level for BSSs in
  *	the specified band is to be adjusted before doing
- *	%NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI based comparison to figure out
+ *	%NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI based comparision to figure out
  *	better BSSs. The attribute value is a packed structure
  *	value as specified by &struct nl80211_bss_select_rssi_adjust.
  *
@@ -2281,24 +2241,6 @@
  *	association request when used with NL80211_CMD_NEW_STATION). Can be set
  *	only if %NL80211_STA_FLAG_WME is set.
  *
- * @NL80211_ATTR_FTM_RESPONDER: nested attribute which user-space can include
- *	in %NL80211_CMD_START_AP or %NL80211_CMD_SET_BEACON for fine timing
- *	measurement (FTM) responder functionality and containing parameters as
- *	possible, see &enum nl80211_ftm_responder_attr
- *
- * @NL80211_ATTR_FTM_RESPONDER_STATS: Nested attribute with FTM responder
- *	statistics, see &enum nl80211_ftm_responder_stats.
- *
- * @NL80211_ATTR_TIMEOUT: Timeout for the given operation in milliseconds (u32),
- *	if the attribute is not given no timeout is requested. Note that 0 is an
- *	invalid value.
- *
- * @NL80211_ATTR_PEER_MEASUREMENTS: peer measurements request (and result)
- *	data, uses nested attributes specified in
- *	&enum nl80211_peer_measurement_attrs.
- *	This is also used for capability advertisement in the wiphy information,
- *	with the appropriate sub-attributes.
- *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2740,14 +2682,6 @@
 
 	NL80211_ATTR_HE_CAPABILITY,
 
-	NL80211_ATTR_FTM_RESPONDER,
-
-	NL80211_ATTR_FTM_RESPONDER_STATS,
-
-	NL80211_ATTR_TIMEOUT,
-
-	NL80211_ATTR_PEER_MEASUREMENTS,
-
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
@@ -3117,14 +3051,6 @@
  * @NL80211_STA_INFO_PAD: attribute used for padding for 64-bit alignment
  * @NL80211_STA_INFO_ACK_SIGNAL: signal strength of the last ACK frame(u8, dBm)
  * @NL80211_STA_INFO_ACK_SIGNAL_AVG: avg signal strength of ACK frames (s8, dBm)
- * @NL80211_STA_INFO_RX_MPDUS: total number of received packets (MPDUs)
- *	(u32, from this station)
- * @NL80211_STA_INFO_FCS_ERROR_COUNT: total number of packets (MPDUs) received
- *	with an FCS error (u32, from this station). This count may not include
- *	some packets with an FCS error due to TA corruption. Hence this counter
- *	might not be fully accurate.
- * @NL80211_STA_INFO_CONNECTED_TO_GATE: set to true if STA has a path to a
- *	mesh gate (u8, 0 or 1)
  * @__NL80211_STA_INFO_AFTER_LAST: internal
  * @NL80211_STA_INFO_MAX: highest possible station info attribute
  */
@@ -3165,9 +3091,6 @@
 	NL80211_STA_INFO_PAD,
 	NL80211_STA_INFO_ACK_SIGNAL,
 	NL80211_STA_INFO_ACK_SIGNAL_AVG,
-	NL80211_STA_INFO_RX_MPDUS,
-	NL80211_STA_INFO_FCS_ERROR_COUNT,
-	NL80211_STA_INFO_CONNECTED_TO_GATE,
 
 	/* keep last */
 	__NL80211_STA_INFO_AFTER_LAST,
@@ -3947,11 +3870,6 @@
  *	remove it from the STA's list of peers. You may set this to 0 to disable
  *	the removal of the STA. Default is 30 minutes.
  *
- * @NL80211_MESHCONF_CONNECTED_TO_GATE: If set to true then this mesh STA
- *	will advertise that it is connected to a gate in the mesh formation
- *	field.  If left unset then the mesh formation field will only
- *	advertise such if there is an active root mesh path.
- *
  * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
  */
 enum nl80211_meshconf_params {
@@ -3984,7 +3902,6 @@
 	NL80211_MESHCONF_POWER_MODE,
 	NL80211_MESHCONF_AWAKE_WINDOW,
 	NL80211_MESHCONF_PLINK_TIMEOUT,
-	NL80211_MESHCONF_CONNECTED_TO_GATE,
 
 	/* keep last */
 	__NL80211_MESHCONF_ATTR_AFTER_LAST,
@@ -4917,7 +4834,7 @@
  *	numbers = [ #{STA} <= 1, #{P2P-client,P2P-GO} <= 3 ], max = 4
  *	=> allows a STA plus three P2P interfaces
  *
- * The list of these four possibilities could completely be contained
+ * The list of these four possiblities could completely be contained
  * within the %NL80211_ATTR_INTERFACE_COMBINATIONS attribute to indicate
  * that any of these groups must match.
  *
@@ -4947,7 +4864,7 @@
  * enum nl80211_plink_state - state of a mesh peer link finite state machine
  *
  * @NL80211_PLINK_LISTEN: initial state, considered the implicit
- *	state of non existent mesh peer links
+ *	state of non existant mesh peer links
  * @NL80211_PLINK_OPN_SNT: mesh plink open frame has been sent to
  *	this mesh peer
  * @NL80211_PLINK_OPN_RCVD: mesh plink open frame has been received
@@ -5308,13 +5225,6 @@
  * @NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT: Driver/device can omit all data
  *	except for supported rates from the probe request content if requested
  *	by the %NL80211_SCAN_FLAG_MIN_PREQ_CONTENT flag.
- * @NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER: Driver supports enabling fine
- *	timing measurement responder role.
- *
- * @NL80211_EXT_FEATURE_CAN_REPLACE_PTK0: Driver/device confirm that they are
- *      able to rekey an in-use key correctly. Userspace must not rekey PTK keys
- *      if this flag is not set. Ignoring this can leak clear text packets and/or
- *      freeze the connection.
  *
  * @NUM_NL80211_EXT_FEATURES: number of extended features.
  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
@@ -5353,8 +5263,6 @@
 	NL80211_EXT_FEATURE_TXQS,
 	NL80211_EXT_FEATURE_SCAN_RANDOM_SN,
 	NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT,
-	NL80211_EXT_FEATURE_CAN_REPLACE_PTK0,
-	NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER,
 
 	/* add new features before the definition below */
 	NUM_NL80211_EXT_FEATURES,
@@ -5439,7 +5347,7 @@
  *	request parameters IE in the probe request
  * @NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP: accept broadcast probe responses
  * @NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE: send probe request frames at
- *	rate of at least 5.5M. In case non OCE AP is discovered in the channel,
+ *	rate of at least 5.5M. In case non OCE AP is dicovered in the channel,
  *	only the first probe req in the channel will be sent in high rate.
  * @NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION: allow probe request
  *	tx deferral (dot11FILSProbeDelay shall be set to 15ms)
@@ -5894,458 +5802,4 @@
 	NL80211_EXTERNAL_AUTH_ABORT,
 };
 
-/**
- * enum nl80211_ftm_responder_attributes - fine timing measurement
- *	responder attributes
- * @__NL80211_FTM_RESP_ATTR_INVALID: Invalid
- * @NL80211_FTM_RESP_ATTR_ENABLED: FTM responder is enabled
- * @NL80211_FTM_RESP_ATTR_LCI: The content of Measurement Report Element
- *	(9.4.2.22 in 802.11-2016) with type 8 - LCI (9.4.2.22.10),
- *	i.e. starting with the measurement token
- * @NL80211_FTM_RESP_ATTR_CIVIC: The content of Measurement Report Element
- *	(9.4.2.22 in 802.11-2016) with type 11 - Civic (Section 9.4.2.22.13),
- *	i.e. starting with the measurement token
- * @__NL80211_FTM_RESP_ATTR_LAST: Internal
- * @NL80211_FTM_RESP_ATTR_MAX: highest FTM responder attribute.
- */
-enum nl80211_ftm_responder_attributes {
-	__NL80211_FTM_RESP_ATTR_INVALID,
-
-	NL80211_FTM_RESP_ATTR_ENABLED,
-	NL80211_FTM_RESP_ATTR_LCI,
-	NL80211_FTM_RESP_ATTR_CIVICLOC,
-
-	/* keep last */
-	__NL80211_FTM_RESP_ATTR_LAST,
-	NL80211_FTM_RESP_ATTR_MAX = __NL80211_FTM_RESP_ATTR_LAST - 1,
-};
-
-/*
- * enum nl80211_ftm_responder_stats - FTM responder statistics
- *
- * These attribute types are used with %NL80211_ATTR_FTM_RESPONDER_STATS
- * when getting FTM responder statistics.
- *
- * @__NL80211_FTM_STATS_INVALID: attribute number 0 is reserved
- * @NL80211_FTM_STATS_SUCCESS_NUM: number of FTM sessions in which all frames
- *	were ssfully answered (u32)
- * @NL80211_FTM_STATS_PARTIAL_NUM: number of FTM sessions in which part of the
- *	frames were successfully answered (u32)
- * @NL80211_FTM_STATS_FAILED_NUM: number of failed FTM sessions (u32)
- * @NL80211_FTM_STATS_ASAP_NUM: number of ASAP sessions (u32)
- * @NL80211_FTM_STATS_NON_ASAP_NUM: number of non-ASAP sessions (u32)
- * @NL80211_FTM_STATS_TOTAL_DURATION_MSEC: total sessions durations - gives an
- *	indication of how much time the responder was busy (u64, msec)
- * @NL80211_FTM_STATS_UNKNOWN_TRIGGERS_NUM: number of unknown FTM triggers -
- *	triggers from initiators that didn't finish successfully the negotiation
- *	phase with the responder (u32)
- * @NL80211_FTM_STATS_RESCHEDULE_REQUESTS_NUM: number of FTM reschedule requests
- *	- initiator asks for a new scheduling although it already has scheduled
- *	FTM slot (u32)
- * @NL80211_FTM_STATS_OUT_OF_WINDOW_TRIGGERS_NUM: number of FTM triggers out of
- *	scheduled window (u32)
- * @NL80211_FTM_STATS_PAD: used for padding, ignore
- * @__NL80211_TXQ_ATTR_AFTER_LAST: Internal
- * @NL80211_FTM_STATS_MAX: highest possible FTM responder stats attribute
- */
-enum nl80211_ftm_responder_stats {
-	__NL80211_FTM_STATS_INVALID,
-	NL80211_FTM_STATS_SUCCESS_NUM,
-	NL80211_FTM_STATS_PARTIAL_NUM,
-	NL80211_FTM_STATS_FAILED_NUM,
-	NL80211_FTM_STATS_ASAP_NUM,
-	NL80211_FTM_STATS_NON_ASAP_NUM,
-	NL80211_FTM_STATS_TOTAL_DURATION_MSEC,
-	NL80211_FTM_STATS_UNKNOWN_TRIGGERS_NUM,
-	NL80211_FTM_STATS_RESCHEDULE_REQUESTS_NUM,
-	NL80211_FTM_STATS_OUT_OF_WINDOW_TRIGGERS_NUM,
-	NL80211_FTM_STATS_PAD,
-
-	/* keep last */
-	__NL80211_FTM_STATS_AFTER_LAST,
-	NL80211_FTM_STATS_MAX = __NL80211_FTM_STATS_AFTER_LAST - 1
-};
-
-/**
- * enum nl80211_preamble - frame preamble types
- * @NL80211_PREAMBLE_LEGACY: legacy (HR/DSSS, OFDM, ERP PHY) preamble
- * @NL80211_PREAMBLE_HT: HT preamble
- * @NL80211_PREAMBLE_VHT: VHT preamble
- * @NL80211_PREAMBLE_DMG: DMG preamble
- */
-enum nl80211_preamble {
-	NL80211_PREAMBLE_LEGACY,
-	NL80211_PREAMBLE_HT,
-	NL80211_PREAMBLE_VHT,
-	NL80211_PREAMBLE_DMG,
-};
-
-/**
- * enum nl80211_peer_measurement_type - peer measurement types
- * @NL80211_PMSR_TYPE_INVALID: invalid/unused, needed as we use
- *	these numbers also for attributes
- *
- * @NL80211_PMSR_TYPE_FTM: flight time measurement
- *
- * @NUM_NL80211_PMSR_TYPES: internal
- * @NL80211_PMSR_TYPE_MAX: highest type number
- */
-enum nl80211_peer_measurement_type {
-	NL80211_PMSR_TYPE_INVALID,
-
-	NL80211_PMSR_TYPE_FTM,
-
-	NUM_NL80211_PMSR_TYPES,
-	NL80211_PMSR_TYPE_MAX = NUM_NL80211_PMSR_TYPES - 1
-};
-
-/**
- * enum nl80211_peer_measurement_status - peer measurement status
- * @NL80211_PMSR_STATUS_SUCCESS: measurement completed successfully
- * @NL80211_PMSR_STATUS_REFUSED: measurement was locally refused
- * @NL80211_PMSR_STATUS_TIMEOUT: measurement timed out
- * @NL80211_PMSR_STATUS_FAILURE: measurement failed, a type-dependent
- *	reason may be available in the response data
- */
-enum nl80211_peer_measurement_status {
-	NL80211_PMSR_STATUS_SUCCESS,
-	NL80211_PMSR_STATUS_REFUSED,
-	NL80211_PMSR_STATUS_TIMEOUT,
-	NL80211_PMSR_STATUS_FAILURE,
-};
-
-/**
- * enum nl80211_peer_measurement_req - peer measurement request attributes
- * @__NL80211_PMSR_REQ_ATTR_INVALID: invalid
- *
- * @NL80211_PMSR_REQ_ATTR_DATA: This is a nested attribute with measurement
- *	type-specific request data inside. The attributes used are from the
- *	enums named nl80211_peer_measurement_<type>_req.
- * @NL80211_PMSR_REQ_ATTR_GET_AP_TSF: include AP TSF timestamp, if supported
- *	(flag attribute)
- *
- * @NUM_NL80211_PMSR_REQ_ATTRS: internal
- * @NL80211_PMSR_REQ_ATTR_MAX: highest attribute number
- */
-enum nl80211_peer_measurement_req {
-	__NL80211_PMSR_REQ_ATTR_INVALID,
-
-	NL80211_PMSR_REQ_ATTR_DATA,
-	NL80211_PMSR_REQ_ATTR_GET_AP_TSF,
-
-	/* keep last */
-	NUM_NL80211_PMSR_REQ_ATTRS,
-	NL80211_PMSR_REQ_ATTR_MAX = NUM_NL80211_PMSR_REQ_ATTRS - 1
-};
-
-/**
- * enum nl80211_peer_measurement_resp - peer measurement response attributes
- * @__NL80211_PMSR_RESP_ATTR_INVALID: invalid
- *
- * @NL80211_PMSR_RESP_ATTR_DATA: This is a nested attribute with measurement
- *	type-specific results inside. The attributes used are from the enums
- *	named nl80211_peer_measurement_<type>_resp.
- * @NL80211_PMSR_RESP_ATTR_STATUS: u32 value with the measurement status
- *	(using values from &enum nl80211_peer_measurement_status.)
- * @NL80211_PMSR_RESP_ATTR_HOST_TIME: host time (%CLOCK_BOOTTIME) when the
- *	result was measured; this value is not expected to be accurate to
- *	more than 20ms. (u64, nanoseconds)
- * @NL80211_PMSR_RESP_ATTR_AP_TSF: TSF of the AP that the interface
- *	doing the measurement is connected to when the result was measured.
- *	This shall be accurately reported if supported and requested
- *	(u64, usec)
- * @NL80211_PMSR_RESP_ATTR_FINAL: If results are sent to the host partially
- *	(*e.g. with FTM per-burst data) this flag will be cleared on all but
- *	the last result; if all results are combined it's set on the single
- *	result.
- * @NL80211_PMSR_RESP_ATTR_PAD: padding for 64-bit attributes, ignore
- *
- * @NUM_NL80211_PMSR_RESP_ATTRS: internal
- * @NL80211_PMSR_RESP_ATTR_MAX: highest attribute number
- */
-enum nl80211_peer_measurement_resp {
-	__NL80211_PMSR_RESP_ATTR_INVALID,
-
-	NL80211_PMSR_RESP_ATTR_DATA,
-	NL80211_PMSR_RESP_ATTR_STATUS,
-	NL80211_PMSR_RESP_ATTR_HOST_TIME,
-	NL80211_PMSR_RESP_ATTR_AP_TSF,
-	NL80211_PMSR_RESP_ATTR_FINAL,
-	NL80211_PMSR_RESP_ATTR_PAD,
-
-	/* keep last */
-	NUM_NL80211_PMSR_RESP_ATTRS,
-	NL80211_PMSR_RESP_ATTR_MAX = NUM_NL80211_PMSR_RESP_ATTRS - 1
-};
-
-/**
- * enum nl80211_peer_measurement_peer_attrs - peer attributes for measurement
- * @__NL80211_PMSR_PEER_ATTR_INVALID: invalid
- *
- * @NL80211_PMSR_PEER_ATTR_ADDR: peer's MAC address
- * @NL80211_PMSR_PEER_ATTR_CHAN: channel definition, nested, using top-level
- *	attributes like %NL80211_ATTR_WIPHY_FREQ etc.
- * @NL80211_PMSR_PEER_ATTR_REQ: This is a nested attribute indexed by
- *	measurement type, with attributes from the
- *	&enum nl80211_peer_measurement_req inside.
- * @NL80211_PMSR_PEER_ATTR_RESP: This is a nested attribute indexed by
- *	measurement type, with attributes from the
- *	&enum nl80211_peer_measurement_resp inside.
- *
- * @NUM_NL80211_PMSR_PEER_ATTRS: internal
- * @NL80211_PMSR_PEER_ATTR_MAX: highest attribute number
- */
-enum nl80211_peer_measurement_peer_attrs {
-	__NL80211_PMSR_PEER_ATTR_INVALID,
-
-	NL80211_PMSR_PEER_ATTR_ADDR,
-	NL80211_PMSR_PEER_ATTR_CHAN,
-	NL80211_PMSR_PEER_ATTR_REQ,
-	NL80211_PMSR_PEER_ATTR_RESP,
-
-	/* keep last */
-	NUM_NL80211_PMSR_PEER_ATTRS,
-	NL80211_PMSR_PEER_ATTR_MAX = NUM_NL80211_PMSR_PEER_ATTRS - 1,
-};
-
-/**
- * enum nl80211_peer_measurement_attrs - peer measurement attributes
- * @__NL80211_PMSR_ATTR_INVALID: invalid
- *
- * @NL80211_PMSR_ATTR_MAX_PEERS: u32 attribute used for capability
- *	advertisement only, indicates the maximum number of peers
- *	measurements can be done with in a single request
- * @NL80211_PMSR_ATTR_REPORT_AP_TSF: flag attribute in capability
- *	indicating that the connected AP's TSF can be reported in
- *	measurement results
- * @NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR: flag attribute in capability
- *	indicating that MAC address randomization is supported.
- * @NL80211_PMSR_ATTR_TYPE_CAPA: capabilities reported by the device,
- *	this contains a nesting indexed by measurement type, and
- *	type-specific capabilities inside, which are from the enums
- *	named nl80211_peer_measurement_<type>_capa.
- * @NL80211_PMSR_ATTR_PEERS: nested attribute, the nesting index is
- *	meaningless, just a list of peers to measure with, with the
- *	sub-attributes taken from
- *	&enum nl80211_peer_measurement_peer_attrs.
- *
- * @NUM_NL80211_PMSR_ATTR: internal
- * @NL80211_PMSR_ATTR_MAX: highest attribute number
- */
-enum nl80211_peer_measurement_attrs {
-	__NL80211_PMSR_ATTR_INVALID,
-
-	NL80211_PMSR_ATTR_MAX_PEERS,
-	NL80211_PMSR_ATTR_REPORT_AP_TSF,
-	NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR,
-	NL80211_PMSR_ATTR_TYPE_CAPA,
-	NL80211_PMSR_ATTR_PEERS,
-
-	/* keep last */
-	NUM_NL80211_PMSR_ATTR,
-	NL80211_PMSR_ATTR_MAX = NUM_NL80211_PMSR_ATTR - 1
-};
-
-/**
- * enum nl80211_peer_measurement_ftm_capa - FTM capabilities
- * @__NL80211_PMSR_FTM_CAPA_ATTR_INVALID: invalid
- *
- * @NL80211_PMSR_FTM_CAPA_ATTR_ASAP: flag attribute indicating ASAP mode
- *	is supported
- * @NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP: flag attribute indicating non-ASAP
- *	mode is supported
- * @NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI: flag attribute indicating if LCI
- *	data can be requested during the measurement
- * @NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC: flag attribute indicating if civic
- *	location data can be requested during the measurement
- * @NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES: u32 bitmap attribute of bits
- *	from &enum nl80211_preamble.
- * @NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS: bitmap of values from
- *	&enum nl80211_chan_width indicating the supported channel
- *	bandwidths for FTM. Note that a higher channel bandwidth may be
- *	configured to allow for other measurements types with different
- *	bandwidth requirement in the same measurement.
- * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT: u32 attribute indicating
- *	the maximum bursts exponent that can be used (if not present anything
- *	is valid)
- * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST: u32 attribute indicating
- *	the maximum FTMs per burst (if not present anything is valid)
- *
- * @NUM_NL80211_PMSR_FTM_CAPA_ATTR: internal
- * @NL80211_PMSR_FTM_CAPA_ATTR_MAX: highest attribute number
- */
-enum nl80211_peer_measurement_ftm_capa {
-	__NL80211_PMSR_FTM_CAPA_ATTR_INVALID,
-
-	NL80211_PMSR_FTM_CAPA_ATTR_ASAP,
-	NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP,
-	NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI,
-	NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC,
-	NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES,
-	NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS,
-	NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT,
-	NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST,
-
-	/* keep last */
-	NUM_NL80211_PMSR_FTM_CAPA_ATTR,
-	NL80211_PMSR_FTM_CAPA_ATTR_MAX = NUM_NL80211_PMSR_FTM_CAPA_ATTR - 1
-};
-
-/**
- * enum nl80211_peer_measurement_ftm_req - FTM request attributes
- * @__NL80211_PMSR_FTM_REQ_ATTR_INVALID: invalid
- *
- * @NL80211_PMSR_FTM_REQ_ATTR_ASAP: ASAP mode requested (flag)
- * @NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE: preamble type (see
- *	&enum nl80211_preamble), optional for DMG (u32)
- * @NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP: number of bursts exponent as in
- *	802.11-2016 9.4.2.168 "Fine Timing Measurement Parameters element"
- *	(u8, 0-15, optional with default 15 i.e. "no preference")
- * @NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD: interval between bursts in units
- *	of 100ms (u16, optional with default 0)
- * @NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION: burst duration, as in 802.11-2016
- *	Table 9-257 "Burst Duration field encoding" (u8, 0-15, optional with
- *	default 15 i.e. "no preference")
- * @NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST: number of successful FTM frames
- *	requested per burst
- *	(u8, 0-31, optional with default 0 i.e. "no preference")
- * @NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES: number of FTMR frame retries
- *	(u8, default 3)
- * @NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI: request LCI data (flag)
- * @NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC: request civic location data
- *	(flag)
- *
- * @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
- * @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
- */
-enum nl80211_peer_measurement_ftm_req {
-	__NL80211_PMSR_FTM_REQ_ATTR_INVALID,
-
-	NL80211_PMSR_FTM_REQ_ATTR_ASAP,
-	NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE,
-	NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP,
-	NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD,
-	NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION,
-	NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST,
-	NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES,
-	NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI,
-	NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
-
-	/* keep last */
-	NUM_NL80211_PMSR_FTM_REQ_ATTR,
-	NL80211_PMSR_FTM_REQ_ATTR_MAX = NUM_NL80211_PMSR_FTM_REQ_ATTR - 1
-};
-
-/**
- * enum nl80211_peer_measurement_ftm_failure_reasons - FTM failure reasons
- * @NL80211_PMSR_FTM_FAILURE_UNSPECIFIED: unspecified failure, not used
- * @NL80211_PMSR_FTM_FAILURE_NO_RESPONSE: no response from the FTM responder
- * @NL80211_PMSR_FTM_FAILURE_REJECTED: FTM responder rejected measurement
- * @NL80211_PMSR_FTM_FAILURE_WRONG_CHANNEL: we already know the peer is
- *	on a different channel, so can't measure (if we didn't know, we'd
- *	try and get no response)
- * @NL80211_PMSR_FTM_FAILURE_PEER_NOT_CAPABLE: peer can't actually do FTM
- * @NL80211_PMSR_FTM_FAILURE_INVALID_TIMESTAMP: invalid T1/T4 timestamps
- *	received
- * @NL80211_PMSR_FTM_FAILURE_PEER_BUSY: peer reports busy, you may retry
- *	later (see %NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME)
- * @NL80211_PMSR_FTM_FAILURE_BAD_CHANGED_PARAMS: parameters were changed
- *	by the peer and are no longer supported
- */
-enum nl80211_peer_measurement_ftm_failure_reasons {
-	NL80211_PMSR_FTM_FAILURE_UNSPECIFIED,
-	NL80211_PMSR_FTM_FAILURE_NO_RESPONSE,
-	NL80211_PMSR_FTM_FAILURE_REJECTED,
-	NL80211_PMSR_FTM_FAILURE_WRONG_CHANNEL,
-	NL80211_PMSR_FTM_FAILURE_PEER_NOT_CAPABLE,
-	NL80211_PMSR_FTM_FAILURE_INVALID_TIMESTAMP,
-	NL80211_PMSR_FTM_FAILURE_PEER_BUSY,
-	NL80211_PMSR_FTM_FAILURE_BAD_CHANGED_PARAMS,
-};
-
-/**
- * enum nl80211_peer_measurement_ftm_resp - FTM response attributes
- * @__NL80211_PMSR_FTM_RESP_ATTR_INVALID: invalid
- *
- * @NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON: FTM-specific failure reason
- *	(u32, optional)
- * @NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX: optional, if bursts are reported
- *	as separate results then it will be the burst index 0...(N-1) and
- *	the top level will indicate partial results (u32)
- * @NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS: number of FTM Request frames
- *	transmitted (u32, optional)
- * @NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES: number of FTM Request frames
- *	that were acknowleged (u32, optional)
- * @NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME: retry time received from the
- *	busy peer (u32, seconds)
- * @NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP: actual number of bursts exponent
- *	used by the responder (similar to request, u8)
- * @NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION: actual burst duration used by
- *	the responder (similar to request, u8)
- * @NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST: actual FTMs per burst used
- *	by the responder (similar to request, u8)
- * @NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG: average RSSI across all FTM action
- *	frames (optional, s32, 1/2 dBm)
- * @NL80211_PMSR_FTM_RESP_ATTR_RSSI_SPREAD: RSSI spread across all FTM action
- *	frames (optional, s32, 1/2 dBm)
- * @NL80211_PMSR_FTM_RESP_ATTR_TX_RATE: bitrate we used for the response to the
- *	FTM action frame (optional, nested, using &enum nl80211_rate_info
- *	attributes)
- * @NL80211_PMSR_FTM_RESP_ATTR_RX_RATE: bitrate the responder used for the FTM
- *	action frame (optional, nested, using &enum nl80211_rate_info attrs)
- * @NL80211_PMSR_FTM_RESP_ATTR_RTT_AVG: average RTT (s64, picoseconds, optional
- *	but one of RTT/DIST must be present)
- * @NL80211_PMSR_FTM_RESP_ATTR_RTT_VARIANCE: RTT variance (u64, ps^2, note that
- *	standard deviation is the square root of variance, optional)
- * @NL80211_PMSR_FTM_RESP_ATTR_RTT_SPREAD: RTT spread (u64, picoseconds,
- *	optional)
- * @NL80211_PMSR_FTM_RESP_ATTR_DIST_AVG: average distance (s64, mm, optional
- *	but one of RTT/DIST must be present)
- * @NL80211_PMSR_FTM_RESP_ATTR_DIST_VARIANCE: distance variance (u64, mm^2, note
- *	that standard deviation is the square root of variance, optional)
- * @NL80211_PMSR_FTM_RESP_ATTR_DIST_SPREAD: distance spread (u64, mm, optional)
- * @NL80211_PMSR_FTM_RESP_ATTR_LCI: LCI data from peer (binary, optional);
- *	this is the contents of the Measurement Report Element (802.11-2016
- *	9.4.2.22.1) starting with the Measurement Token, with Measurement
- *	Type 8.
- * @NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC: civic location data from peer
- *	(binary, optional);
- *	this is the contents of the Measurement Report Element (802.11-2016
- *	9.4.2.22.1) starting with the Measurement Token, with Measurement
- *	Type 11.
- * @NL80211_PMSR_FTM_RESP_ATTR_PAD: ignore, for u64/s64 padding only
- *
- * @NUM_NL80211_PMSR_FTM_RESP_ATTR: internal
- * @NL80211_PMSR_FTM_RESP_ATTR_MAX: highest attribute number
- */
-enum nl80211_peer_measurement_ftm_resp {
-	__NL80211_PMSR_FTM_RESP_ATTR_INVALID,
-
-	NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON,
-	NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX,
-	NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS,
-	NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES,
-	NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME,
-	NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP,
-	NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION,
-	NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST,
-	NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG,
-	NL80211_PMSR_FTM_RESP_ATTR_RSSI_SPREAD,
-	NL80211_PMSR_FTM_RESP_ATTR_TX_RATE,
-	NL80211_PMSR_FTM_RESP_ATTR_RX_RATE,
-	NL80211_PMSR_FTM_RESP_ATTR_RTT_AVG,
-	NL80211_PMSR_FTM_RESP_ATTR_RTT_VARIANCE,
-	NL80211_PMSR_FTM_RESP_ATTR_RTT_SPREAD,
-	NL80211_PMSR_FTM_RESP_ATTR_DIST_AVG,
-	NL80211_PMSR_FTM_RESP_ATTR_DIST_VARIANCE,
-	NL80211_PMSR_FTM_RESP_ATTR_DIST_SPREAD,
-	NL80211_PMSR_FTM_RESP_ATTR_LCI,
-	NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC,
-	NL80211_PMSR_FTM_RESP_ATTR_PAD,
-
-	/* keep last */
-	NUM_NL80211_PMSR_FTM_RESP_ATTR,
-	NL80211_PMSR_FTM_RESP_ATTR_MAX = NUM_NL80211_PMSR_FTM_RESP_ATTR - 1
-};
-
 #endif /* __LINUX_NL80211_H */
diff --git a/src/eap_peer/eap_fast.c b/src/eap_peer/eap_fast.c
index 94ce57d..74cec7d 100644
--- a/src/eap_peer/eap_fast.c
+++ b/src/eap_peer/eap_fast.c
@@ -250,8 +250,8 @@
 	os_memset(data->key_data, 0, EAP_FAST_KEY_LEN);
 	os_memset(data->emsk, 0, EAP_EMSK_LEN);
 	os_free(data->session_id);
-	wpabuf_clear_free(data->pending_phase2_req);
-	wpabuf_clear_free(data->pending_resp);
+	wpabuf_free(data->pending_phase2_req);
+	wpabuf_free(data->pending_resp);
 	os_free(data);
 }
 
@@ -486,7 +486,7 @@
 	    (config->pending_req_identity || config->pending_req_password ||
 	     config->pending_req_otp || config->pending_req_new_password ||
 	     config->pending_req_sim)) {
-		wpabuf_clear_free(data->pending_phase2_req);
+		wpabuf_free(data->pending_phase2_req);
 		data->pending_phase2_req = wpabuf_alloc_copy(hdr, len);
 	} else if (*resp == NULL)
 		return -1;
@@ -801,7 +801,7 @@
 		ret->methodState = METHOD_DONE;
 		ret->decision = DECISION_FAIL;
 		data->phase2_success = 0;
-		wpabuf_clear_free(resp);
+		wpabuf_free(resp);
 		return NULL;
 	}
 
@@ -815,7 +815,7 @@
 		} else {
 			wpa_printf(MSG_ERROR, "EAP-FAST: Failed to derive "
 				   "Session-Id");
-			wpabuf_clear_free(resp);
+			wpabuf_free(resp);
 			return NULL;
 		}
 	}
@@ -1150,7 +1150,7 @@
 		wpa_printf(MSG_INFO, "EAP-FAST: Failed to encrypt a Phase 2 "
 			   "frame");
 	}
-	wpabuf_clear_free(resp);
+	wpabuf_free(resp);
 
 	return 0;
 }
@@ -1328,14 +1328,14 @@
 		wpa_printf(MSG_INFO, "EAP-FAST: Too short Phase 2 "
 			   "TLV frame (len=%lu)",
 			   (unsigned long) wpabuf_len(in_decrypted));
-		wpabuf_clear_free(in_decrypted);
+		wpabuf_free(in_decrypted);
 		return -1;
 	}
 
 	res = eap_fast_process_decrypted(sm, data, ret, identifier,
 					 in_decrypted, out_data);
 
-	wpabuf_clear_free(in_decrypted);
+	wpabuf_free(in_decrypted);
 
 	return res;
 }
@@ -1613,7 +1613,7 @@
 		if (sm->waiting_ext_cert_check) {
 			wpa_printf(MSG_DEBUG,
 				   "EAP-FAST: Waiting external server certificate validation");
-			wpabuf_clear_free(data->pending_resp);
+			wpabuf_free(data->pending_resp);
 			data->pending_resp = resp;
 			return NULL;
 		}
@@ -1641,7 +1641,7 @@
 					   "EAP-FAST: Could not derive keys");
 				ret->methodState = METHOD_DONE;
 				ret->decision = DECISION_FAIL;
-				wpabuf_clear_free(resp);
+				wpabuf_free(resp);
 				return NULL;
 			}
 		}
@@ -1650,7 +1650,7 @@
 			/*
 			 * Application data included in the handshake message.
 			 */
-			wpabuf_clear_free(data->pending_phase2_req);
+			wpabuf_free(data->pending_phase2_req);
 			data->pending_phase2_req = resp;
 			resp = NULL;
 			res = eap_fast_decrypt(sm, data, ret, id, &msg, &resp);
@@ -1658,7 +1658,7 @@
 	}
 
 	if (res == 1) {
-		wpabuf_clear_free(resp);
+		wpabuf_free(resp);
 		return eap_peer_tls_build_ack(id, EAP_TYPE_FAST,
 					      data->fast_version);
 	}
@@ -1684,9 +1684,9 @@
 		data->phase2_method->deinit_for_reauth(sm, data->phase2_priv);
 	os_free(data->key_block_p);
 	data->key_block_p = NULL;
-	wpabuf_clear_free(data->pending_phase2_req);
+	wpabuf_free(data->pending_phase2_req);
 	data->pending_phase2_req = NULL;
-	wpabuf_clear_free(data->pending_resp);
+	wpabuf_free(data->pending_resp);
 	data->pending_resp = NULL;
 }
 
diff --git a/src/eap_peer/eap_peap.c b/src/eap_peer/eap_peap.c
index 650bea6..34075b1 100644
--- a/src/eap_peer/eap_peap.c
+++ b/src/eap_peer/eap_peap.c
@@ -1,6 +1,6 @@
 /*
  * EAP peer method: EAP-PEAP (draft-josefsson-pppext-eap-tls-eap-10.txt)
- * Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -169,7 +169,7 @@
 static void eap_peap_free_key(struct eap_peap_data *data)
 {
 	if (data->key_data) {
-		bin_clear_free(data->key_data, EAP_TLS_KEY_LEN + EAP_EMSK_LEN);
+		bin_clear_free(data->key_data, EAP_TLS_KEY_LEN);
 		data->key_data = NULL;
 	}
 }
@@ -186,9 +186,9 @@
 	eap_peer_tls_ssl_deinit(sm, &data->ssl);
 	eap_peap_free_key(data);
 	os_free(data->session_id);
-	wpabuf_clear_free(data->pending_phase2_req);
-	wpabuf_clear_free(data->pending_resp);
-	bin_clear_free(data, sizeof(*data));
+	wpabuf_free(data->pending_phase2_req);
+	wpabuf_free(data->pending_resp);
+	os_free(data);
 }
 
 
@@ -253,7 +253,7 @@
 {
 	u8 *tk;
 	u8 isk[32], imck[60];
-	int resumed, res;
+	int resumed;
 
 	/*
 	 * Tunnel key (TK) is the first 60 octets of the key generated by
@@ -292,11 +292,9 @@
 	 * in the end of the label just before ISK; is that just a typo?)
 	 */
 	wpa_hexdump_key(MSG_DEBUG, "EAP-PEAP: TempKey", tk, 40);
-	res = peap_prfplus(data->peap_version, tk, 40,
-			   "Inner Methods Compound Keys",
-			   isk, sizeof(isk), imck, sizeof(imck));
-	os_memset(isk, 0, sizeof(isk));
-	if (res < 0)
+	if (peap_prfplus(data->peap_version, tk, 40,
+			 "Inner Methods Compound Keys",
+			 isk, sizeof(isk), imck, sizeof(imck)) < 0)
 		return -1;
 	wpa_hexdump_key(MSG_DEBUG, "EAP-PEAP: IMCK (IPMKj)",
 			imck, sizeof(imck));
@@ -305,7 +303,6 @@
 	wpa_hexdump_key(MSG_DEBUG, "EAP-PEAP: IPMK (S-IPMKj)", data->ipmk, 40);
 	os_memcpy(data->cmk, imck + 40, 20);
 	wpa_hexdump_key(MSG_DEBUG, "EAP-PEAP: CMK (CMKj)", data->cmk, 20);
-	os_memset(imck, 0, sizeof(imck));
 
 	return 0;
 }
@@ -385,7 +382,7 @@
 	wpabuf_put_be16(msg, status); /* Status */
 
 	if (crypto_tlv_used && eap_tlv_add_cryptobinding(sm, data, msg)) {
-		wpabuf_clear_free(msg);
+		wpabuf_free(msg);
 		return NULL;
 	}
 
@@ -654,11 +651,11 @@
 					if (*resp == NULL) {
 						ret->methodState = METHOD_DONE;
 						ret->decision = DECISION_FAIL;
-						wpabuf_clear_free(buf);
+						wpabuf_free(buf);
 						return -1;
 					}
 					wpabuf_put_buf(*resp, buf);
-					wpabuf_clear_free(buf);
+					wpabuf_free(buf);
 					break;
 				}
 			}
@@ -731,7 +728,7 @@
 	    (config->pending_req_identity || config->pending_req_password ||
 	     config->pending_req_otp || config->pending_req_new_password ||
 	     config->pending_req_sim)) {
-		wpabuf_clear_free(data->pending_phase2_req);
+		wpabuf_free(data->pending_phase2_req);
 		data->pending_phase2_req = wpabuf_alloc_copy(hdr, len);
 	}
 
@@ -810,7 +807,7 @@
 		struct wpabuf *nmsg = wpabuf_alloc(sizeof(struct eap_hdr) +
 						   wpabuf_len(in_decrypted));
 		if (nmsg == NULL) {
-			wpabuf_clear_free(in_decrypted);
+			wpabuf_free(in_decrypted);
 			return 0;
 		}
 		nhdr = wpabuf_put(nmsg, sizeof(*nhdr));
@@ -820,7 +817,7 @@
 		nhdr->length = host_to_be16(sizeof(struct eap_hdr) +
 					    wpabuf_len(in_decrypted));
 
-		wpabuf_clear_free(in_decrypted);
+		wpabuf_free(in_decrypted);
 		in_decrypted = nmsg;
 	}
 
@@ -829,7 +826,7 @@
 		wpa_printf(MSG_INFO, "EAP-PEAP: Too short Phase 2 "
 			   "EAP frame (len=%lu)",
 			   (unsigned long) wpabuf_len(in_decrypted));
-		wpabuf_clear_free(in_decrypted);
+		wpabuf_free(in_decrypted);
 		return 0;
 	}
 	len = be_to_host16(hdr->length);
@@ -838,7 +835,7 @@
 			   "Phase 2 EAP frame (len=%lu hdr->length=%lu)",
 			   (unsigned long) wpabuf_len(in_decrypted),
 			   (unsigned long) len);
-		wpabuf_clear_free(in_decrypted);
+		wpabuf_free(in_decrypted);
 		return 0;
 	}
 	if (len < wpabuf_len(in_decrypted)) {
@@ -855,7 +852,7 @@
 	case EAP_CODE_REQUEST:
 		if (eap_peap_phase2_request(sm, data, ret, in_decrypted,
 					    &resp)) {
-			wpabuf_clear_free(in_decrypted);
+			wpabuf_free(in_decrypted);
 			wpa_printf(MSG_INFO, "EAP-PEAP: Phase2 Request "
 				   "processing failed");
 			return 0;
@@ -875,7 +872,7 @@
 					   "completed successfully");
 				ret->methodState = METHOD_DONE;
 				ret->decision = DECISION_FAIL;
-				wpabuf_clear_free(in_decrypted);
+				wpabuf_free(in_decrypted);
 				return 0;
 			}
 			wpa_printf(MSG_DEBUG, "EAP-PEAP: Version 1 - "
@@ -885,7 +882,7 @@
 			ret->methodState = METHOD_DONE;
 			data->phase2_success = 1;
 			if (data->peap_outer_success == 2) {
-				wpabuf_clear_free(in_decrypted);
+				wpabuf_free(in_decrypted);
 				wpa_printf(MSG_DEBUG, "EAP-PEAP: Use TLS ACK "
 					   "to finish authentication");
 				return 1;
@@ -931,7 +928,7 @@
 		break;
 	}
 
-	wpabuf_clear_free(in_decrypted);
+	wpabuf_free(in_decrypted);
 
 	if (resp) {
 		int skip_change2 = 0;
@@ -958,7 +955,7 @@
 			wpa_printf(MSG_INFO, "EAP-PEAP: Failed to encrypt "
 				   "a Phase 2 frame");
 		}
-		wpabuf_clear_free(resp);
+		wpabuf_free(resp);
 	}
 
 	return 0;
@@ -1059,7 +1056,7 @@
 		if (sm->waiting_ext_cert_check) {
 			wpa_printf(MSG_DEBUG,
 				   "EAP-PEAP: Waiting external server certificate validation");
-			wpabuf_clear_free(data->pending_resp);
+			wpabuf_free(data->pending_resp);
 			data->pending_resp = resp;
 			return NULL;
 		}
@@ -1084,18 +1081,12 @@
 				   "key derivation", label);
 			data->key_data =
 				eap_peer_tls_derive_key(sm, &data->ssl, label,
-							EAP_TLS_KEY_LEN +
-							EAP_EMSK_LEN);
+							EAP_TLS_KEY_LEN);
 			if (data->key_data) {
 				wpa_hexdump_key(MSG_DEBUG,
 						"EAP-PEAP: Derived key",
 						data->key_data,
 						EAP_TLS_KEY_LEN);
-				wpa_hexdump_key(MSG_DEBUG,
-						"EAP-PEAP: Derived EMSK",
-						data->key_data +
-						EAP_TLS_KEY_LEN,
-						EAP_EMSK_LEN);
 			} else {
 				wpa_printf(MSG_DEBUG, "EAP-PEAP: Failed to "
 					   "derive key");
@@ -1140,7 +1131,7 @@
 			/*
 			 * Application data included in the handshake message.
 			 */
-			wpabuf_clear_free(data->pending_phase2_req);
+			wpabuf_free(data->pending_phase2_req);
 			data->pending_phase2_req = resp;
 			resp = NULL;
 			res = eap_peap_decrypt(sm, data, ret, req, &msg,
@@ -1153,7 +1144,7 @@
 	}
 
 	if (res == 1) {
-		wpabuf_clear_free(resp);
+		wpabuf_free(resp);
 		return eap_peer_tls_build_ack(id, EAP_TYPE_PEAP,
 					      data->peap_version);
 	}
@@ -1177,9 +1168,9 @@
 	if (data->phase2_priv && data->phase2_method &&
 	    data->phase2_method->deinit_for_reauth)
 		data->phase2_method->deinit_for_reauth(sm, data->phase2_priv);
-	wpabuf_clear_free(data->pending_phase2_req);
+	wpabuf_free(data->pending_phase2_req);
 	data->pending_phase2_req = NULL;
-	wpabuf_clear_free(data->pending_resp);
+	wpabuf_free(data->pending_resp);
 	data->pending_resp = NULL;
 	data->crypto_binding_used = 0;
 }
@@ -1266,7 +1257,6 @@
 		os_memcpy(key, csk, EAP_TLS_KEY_LEN);
 		wpa_hexdump(MSG_DEBUG, "EAP-PEAP: Derived key",
 			    key, EAP_TLS_KEY_LEN);
-		os_memset(csk, 0, sizeof(csk));
 	} else
 		os_memcpy(key, data->key_data, EAP_TLS_KEY_LEN);
 
@@ -1274,29 +1264,6 @@
 }
 
 
-static u8 * eap_peap_get_emsk(struct eap_sm *sm, void *priv, size_t *len)
-{
-	struct eap_peap_data *data = priv;
-	u8 *key;
-
-	if (!data->key_data || !data->phase2_success)
-		return NULL;
-
-	if (data->crypto_binding_used) {
-		/* [MS-PEAP] does not define EMSK derivation */
-		return NULL;
-	}
-
-	key = os_memdup(data->key_data + EAP_TLS_KEY_LEN, EAP_EMSK_LEN);
-	if (!key)
-		return NULL;
-
-	*len = EAP_EMSK_LEN;
-
-	return key;
-}
-
-
 static u8 * eap_peap_get_session_id(struct eap_sm *sm, void *priv, size_t *len)
 {
 	struct eap_peap_data *data = priv;
@@ -1329,7 +1296,6 @@
 	eap->process = eap_peap_process;
 	eap->isKeyAvailable = eap_peap_isKeyAvailable;
 	eap->getKey = eap_peap_getKey;
-	eap->get_emsk = eap_peap_get_emsk;
 	eap->get_status = eap_peap_get_status;
 	eap->has_reauth_data = eap_peap_has_reauth_data;
 	eap->deinit_for_reauth = eap_peap_deinit_for_reauth;
diff --git a/src/eap_peer/eap_tls_common.c b/src/eap_peer/eap_tls_common.c
index 7dbd364..0de1315 100644
--- a/src/eap_peer/eap_tls_common.c
+++ b/src/eap_peer/eap_tls_common.c
@@ -1,6 +1,6 @@
 /*
  * EAP peer: EAP-TLS/PEAP/TTLS/FAST common functions
- * Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -70,22 +70,16 @@
 		params->flags &= ~TLS_CONN_DISABLE_SESSION_TICKET;
 	if (os_strstr(txt, "tls_disable_tlsv1_0=1"))
 		params->flags |= TLS_CONN_DISABLE_TLSv1_0;
-	if (os_strstr(txt, "tls_disable_tlsv1_0=0")) {
+	if (os_strstr(txt, "tls_disable_tlsv1_0=0"))
 		params->flags &= ~TLS_CONN_DISABLE_TLSv1_0;
-		params->flags |= TLS_CONN_ENABLE_TLSv1_0;
-	}
 	if (os_strstr(txt, "tls_disable_tlsv1_1=1"))
 		params->flags |= TLS_CONN_DISABLE_TLSv1_1;
-	if (os_strstr(txt, "tls_disable_tlsv1_1=0")) {
+	if (os_strstr(txt, "tls_disable_tlsv1_1=0"))
 		params->flags &= ~TLS_CONN_DISABLE_TLSv1_1;
-		params->flags |= TLS_CONN_ENABLE_TLSv1_1;
-	}
 	if (os_strstr(txt, "tls_disable_tlsv1_2=1"))
 		params->flags |= TLS_CONN_DISABLE_TLSv1_2;
-	if (os_strstr(txt, "tls_disable_tlsv1_2=0")) {
+	if (os_strstr(txt, "tls_disable_tlsv1_2=0"))
 		params->flags &= ~TLS_CONN_DISABLE_TLSv1_2;
-		params->flags |= TLS_CONN_ENABLE_TLSv1_2;
-	}
 	if (os_strstr(txt, "tls_disable_tlsv1_3=1"))
 		params->flags |= TLS_CONN_DISABLE_TLSv1_3;
 	if (os_strstr(txt, "tls_disable_tlsv1_3=0"))
@@ -176,9 +170,7 @@
 		 * TLS v1.3 changes, so disable this by default for now. */
 		params->flags |= TLS_CONN_DISABLE_TLSv1_3;
 	}
-	if (data->eap_type == EAP_TYPE_TLS ||
-	    data->eap_type == EAP_UNAUTH_TLS_TYPE ||
-	    data->eap_type == EAP_WFA_UNAUTH_TLS_TYPE) {
+	if (data->eap_type == EAP_TYPE_TLS) {
 		/* While the current EAP-TLS implementation is more or less
 		 * complete for TLS v1.3, there has been no interoperability
 		 * testing with other implementations, so disable for by default
@@ -396,26 +388,10 @@
 	u8 *out;
 
 	if (eap_type == EAP_TYPE_TLS && data->tls_v13) {
-		u8 *id, *method_id;
-
-		/* Session-Id = <EAP-Type> || Method-Id
-		 * Method-Id = TLS-Exporter("EXPORTER_EAP_TLS_Method-Id",
-		 *                          "", 64)
-		 */
-		*len = 1 + 64;
-		id = os_malloc(*len);
-		if (!id)
-			return NULL;
-		method_id = eap_peer_tls_derive_key(
-			sm, data, "EXPORTER_EAP_TLS_Method-Id", 64);
-		if (!method_id) {
-			os_free(id);
-			return NULL;
-		}
-		id[0] = eap_type;
-		os_memcpy(id + 1, method_id, 64);
-		os_free(method_id);
-		return id;
+		*len = 64;
+		return eap_peer_tls_derive_key(sm, data,
+					       "EXPORTER_EAP_TLS_Session-Id",
+					       64);
 	}
 
 	if (tls_connection_get_random(sm->ssl_ctx, data->conn, &keys) ||
diff --git a/src/eap_peer/eap_ttls.c b/src/eap_peer/eap_ttls.c
index 5d26701..f18788c 100644
--- a/src/eap_peer/eap_ttls.c
+++ b/src/eap_peer/eap_ttls.c
@@ -196,8 +196,8 @@
 	eap_peer_tls_ssl_deinit(sm, &data->ssl);
 	eap_ttls_free_key(data);
 	os_free(data->session_id);
-	wpabuf_clear_free(data->pending_phase2_req);
-	wpabuf_clear_free(data->pending_resp);
+	wpabuf_free(data->pending_phase2_req);
+	wpabuf_free(data->pending_resp);
 	os_free(data);
 }
 
@@ -248,7 +248,7 @@
 
 	msg = wpabuf_alloc(sizeof(struct ttls_avp) + wpabuf_len(*resp) + 4);
 	if (msg == NULL) {
-		wpabuf_clear_free(*resp);
+		wpabuf_free(*resp);
 		*resp = NULL;
 		return -1;
 	}
@@ -258,7 +258,7 @@
 	os_memcpy(pos, wpabuf_head(*resp), wpabuf_len(*resp));
 	pos += wpabuf_len(*resp);
 	AVP_PAD(avp, pos);
-	wpabuf_clear_free(*resp);
+	wpabuf_free(*resp);
 	wpabuf_put(msg, pos - avp);
 	*resp = msg;
 	return 0;
@@ -510,7 +510,7 @@
 	challenge = eap_ttls_implicit_challenge(
 		sm, data, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN + 1);
 	if (challenge == NULL) {
-		wpabuf_clear_free(msg);
+		wpabuf_free(msg);
 		wpa_printf(MSG_ERROR, "EAP-TTLS/MSCHAPV2: Failed to derive "
 			   "implicit challenge");
 		return -1;
@@ -529,7 +529,7 @@
 	*pos++ = 0; /* Flags */
 	if (os_get_random(pos, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN) < 0) {
 		os_free(challenge);
-		wpabuf_clear_free(msg);
+		wpabuf_free(msg);
 		wpa_printf(MSG_ERROR, "EAP-TTLS/MSCHAPV2: Failed to get "
 			   "random data for peer challenge");
 		return -1;
@@ -543,7 +543,7 @@
 				     peer_challenge, pos, data->auth_response,
 				     data->master_key)) {
 		os_free(challenge);
-		wpabuf_clear_free(msg);
+		wpabuf_free(msg);
 		wpa_printf(MSG_ERROR, "EAP-TTLS/MSCHAPV2: Failed to derive "
 			   "response");
 		return -1;
@@ -604,7 +604,7 @@
 	challenge = eap_ttls_implicit_challenge(
 		sm, data, EAP_TTLS_MSCHAP_CHALLENGE_LEN + 1);
 	if (challenge == NULL) {
-		wpabuf_clear_free(msg);
+		wpabuf_free(msg);
 		wpa_printf(MSG_ERROR, "EAP-TTLS/MSCHAP: Failed to derive "
 			   "implicit challenge");
 		return -1;
@@ -628,7 +628,7 @@
 		if (challenge_response(challenge, password, pos)) {
 			wpa_printf(MSG_ERROR,
 				   "EAP-TTLS/MSCHAP: Failed derive password hash");
-			wpabuf_clear_free(msg);
+			wpabuf_free(msg);
 			os_free(challenge);
 			return -1;
 		}
@@ -641,7 +641,7 @@
 					  pos)) {
 			wpa_printf(MSG_ERROR,
 				   "EAP-TTLS/MSCHAP: Failed derive password");
-			wpabuf_clear_free(msg);
+			wpabuf_free(msg);
 			os_free(challenge);
 			return -1;
 		}
@@ -760,7 +760,7 @@
 	challenge = eap_ttls_implicit_challenge(
 		sm, data, EAP_TTLS_CHAP_CHALLENGE_LEN + 1);
 	if (challenge == NULL) {
-		wpabuf_clear_free(msg);
+		wpabuf_free(msg);
 		wpa_printf(MSG_ERROR, "EAP-TTLS/CHAP: Failed to derive "
 			   "implicit challenge");
 		return -1;
@@ -1073,10 +1073,10 @@
 				 resp, out_data)) {
 		wpa_printf(MSG_INFO, "EAP-TTLS: Failed to encrypt a Phase 2 "
 			   "frame");
-		wpabuf_clear_free(resp);
+		wpabuf_free(resp);
 		return -1;
 	}
-	wpabuf_clear_free(resp);
+	wpabuf_free(resp);
 
 	return 0;
 }
@@ -1297,7 +1297,7 @@
 		   config->pending_req_otp ||
 		   config->pending_req_new_password ||
 		   config->pending_req_sim) {
-		wpabuf_clear_free(data->pending_phase2_req);
+		wpabuf_free(data->pending_phase2_req);
 		data->pending_phase2_req = wpabuf_dup(in_decrypted);
 	}
 
@@ -1340,7 +1340,7 @@
 			 * processing when EAP request is re-processed after
 			 * user input.
 			 */
-			wpabuf_clear_free(data->pending_phase2_req);
+			wpabuf_free(data->pending_phase2_req);
 			data->pending_phase2_req = wpabuf_alloc(0);
 		}
 
@@ -1413,7 +1413,7 @@
 		in_decrypted = data->pending_phase2_req;
 		data->pending_phase2_req = NULL;
 		if (wpabuf_len(in_decrypted) == 0) {
-			wpabuf_clear_free(in_decrypted);
+			wpabuf_free(in_decrypted);
 			return eap_ttls_implicit_identity_request(
 				sm, data, ret, identifier, out_data);
 		}
@@ -1449,7 +1449,7 @@
 					    &parse, in_decrypted, out_data);
 
 done:
-	wpabuf_clear_free(in_decrypted);
+	wpabuf_free(in_decrypted);
 	os_free(parse.eapdata);
 
 	if (retval < 0) {
@@ -1509,7 +1509,7 @@
 	if (sm->waiting_ext_cert_check) {
 		wpa_printf(MSG_DEBUG,
 			   "EAP-TTLS: Waiting external server certificate validation");
-		wpabuf_clear_free(data->pending_resp);
+		wpabuf_free(data->pending_resp);
 		data->pending_resp = *out_data;
 		*out_data = NULL;
 		return 0;
@@ -1543,7 +1543,7 @@
 		/*
 		 * Application data included in the handshake message.
 		 */
-		wpabuf_clear_free(data->pending_phase2_req);
+		wpabuf_free(data->pending_phase2_req);
 		data->pending_phase2_req = *out_data;
 		*out_data = NULL;
 		res = eap_ttls_decrypt(sm, data, ret, identifier, in_data,
@@ -1646,7 +1646,7 @@
 	/* FIX: what about res == -1? Could just move all error processing into
 	 * the other functions and get rid of this res==1 case here. */
 	if (res == 1) {
-		wpabuf_clear_free(resp);
+		wpabuf_free(resp);
 		return eap_peer_tls_build_ack(id, EAP_TYPE_TTLS,
 					      data->ttls_version);
 	}
@@ -1669,9 +1669,9 @@
 	if (data->phase2_priv && data->phase2_method &&
 	    data->phase2_method->deinit_for_reauth)
 		data->phase2_method->deinit_for_reauth(sm, data->phase2_priv);
-	wpabuf_clear_free(data->pending_phase2_req);
+	wpabuf_free(data->pending_phase2_req);
 	data->pending_phase2_req = NULL;
-	wpabuf_clear_free(data->pending_resp);
+	wpabuf_free(data->pending_resp);
 	data->pending_resp = NULL;
 	data->decision_succ = DECISION_FAIL;
 #ifdef EAP_TNC
diff --git a/src/eap_server/eap.h b/src/eap_server/eap.h
index 45e1212..4fbc661 100644
--- a/src/eap_server/eap.h
+++ b/src/eap_server/eap.h
@@ -153,8 +153,6 @@
 int eap_sm_method_pending(struct eap_sm *sm);
 const u8 * eap_get_identity(struct eap_sm *sm, size_t *len);
 const char * eap_get_serial_num(struct eap_sm *sm);
-const char * eap_get_method(struct eap_sm *sm);
-const char * eap_get_imsi(struct eap_sm *sm);
 struct eap_eapol_interface * eap_get_interface(struct eap_sm *sm);
 void eap_server_clear_identity(struct eap_sm *sm);
 void eap_server_mschap_rx_callback(struct eap_sm *sm, const char *source,
diff --git a/src/eap_server/eap_i.h b/src/eap_server/eap_i.h
index 1cade10..cf8a9f0 100644
--- a/src/eap_server/eap_i.h
+++ b/src/eap_server/eap_i.h
@@ -160,7 +160,6 @@
 	u8 *identity;
 	size_t identity_len;
 	char *serial_num;
-	char imsi[20];
 	/* Whether Phase 2 method should validate identity match */
 	int require_identity_match;
 	int lastId; /* Identifier used in the last EAP-Packet */
diff --git a/src/eap_server/eap_server.c b/src/eap_server/eap_server.c
index b33f632..38a1b5c 100644
--- a/src/eap_server/eap_server.c
+++ b/src/eap_server/eap_server.c
@@ -2003,32 +2003,6 @@
 }
 
 
-/**
- * eap_get_method - Get the used EAP method
- * @sm: Pointer to EAP state machine allocated with eap_server_sm_init()
- * Returns: Pointer to the method name or %NULL if not available
- */
-const char * eap_get_method(struct eap_sm *sm)
-{
-	if (!sm || !sm->m)
-		return NULL;
-	return sm->m->name;
-}
-
-
-/**
- * eap_get_imsi - Get IMSI of the user
- * @sm: Pointer to EAP state machine allocated with eap_server_sm_init()
- * Returns: Pointer to IMSI or %NULL if not available
- */
-const char * eap_get_imsi(struct eap_sm *sm)
-{
-	if (!sm || sm->imsi[0] == '\0')
-		return NULL;
-	return sm->imsi;
-}
-
-
 void eap_erp_update_identity(struct eap_sm *sm, const u8 *eap, size_t len)
 {
 #ifdef CONFIG_ERP
diff --git a/src/eap_server/eap_server_aka.c b/src/eap_server/eap_server_aka.c
index 1bea706..1750211 100644
--- a/src/eap_server/eap_server_aka.c
+++ b/src/eap_server/eap_server_aka.c
@@ -796,10 +796,6 @@
 		return;
 	}
 
-	if (data->permanent[0] == EAP_AKA_PERMANENT_PREFIX ||
-	    data->permanent[0] == EAP_AKA_PRIME_PERMANENT_PREFIX)
-		os_strlcpy(sm->imsi, &data->permanent[1], sizeof(sm->imsi));
-
 #ifdef EAP_SERVER_AKA_PRIME
 	if (data->eap_method == EAP_TYPE_AKA_PRIME) {
 		/* Note: AUTN = (SQN ^ AK) || AMF || MAC which gives us the
diff --git a/src/eap_server/eap_server_peap.c b/src/eap_server/eap_server_peap.c
index 3d334a0..18d31b5 100644
--- a/src/eap_server/eap_server_peap.c
+++ b/src/eap_server/eap_server_peap.c
@@ -1,6 +1,6 @@
 /*
  * hostapd / EAP-PEAP (draft-josefsson-pppext-eap-tls-eap-10.txt)
- * Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -324,7 +324,6 @@
 {
 	u8 *tk;
 	u8 isk[32], imck[60];
-	int res;
 
 	/*
 	 * Tunnel key (TK) is the first 60 octets of the key generated by
@@ -359,11 +358,9 @@
 	 * in the end of the label just before ISK; is that just a typo?)
 	 */
 	wpa_hexdump_key(MSG_DEBUG, "EAP-PEAP: TempKey", tk, 40);
-	res = peap_prfplus(data->peap_version, tk, 40,
-			   "Inner Methods Compound Keys",
-			   isk, sizeof(isk), imck, sizeof(imck));
-	os_memset(isk, 0, sizeof(isk));
-	if (res < 0) {
+	if (peap_prfplus(data->peap_version, tk, 40,
+			 "Inner Methods Compound Keys",
+			 isk, sizeof(isk), imck, sizeof(imck)) < 0) {
 		os_free(tk);
 		return -1;
 	}
@@ -376,7 +373,6 @@
 	wpa_hexdump_key(MSG_DEBUG, "EAP-PEAP: IPMK (S-IPMKj)", data->ipmk, 40);
 	os_memcpy(data->cmk, imck + 40, 20);
 	wpa_hexdump_key(MSG_DEBUG, "EAP-PEAP: CMK (CMKj)", data->cmk, 20);
-	os_memset(imck, 0, sizeof(imck));
 
 	return 0;
 }
@@ -760,7 +756,7 @@
 			} else {
 				eap_peap_state(data, FAILURE);
 			}
-
+			
 		} else if (status == EAP_TLV_RESULT_FAILURE) {
 			wpa_printf(MSG_INFO, "EAP-PEAP: TLV Result - Failure "
 				   "- requested %s", requested);
@@ -1326,17 +1322,14 @@
 				   "key");
 		}
 
-		os_memset(csk, 0, sizeof(csk));
-
 		return eapKeyData;
 	}
 
 	/* TODO: PEAPv1 - different label in some cases */
 	eapKeyData = eap_server_tls_derive_key(sm, &data->ssl,
 					       "client EAP encryption",
-					       EAP_TLS_KEY_LEN + EAP_EMSK_LEN);
+					       EAP_TLS_KEY_LEN);
 	if (eapKeyData) {
-		os_memset(eapKeyData + EAP_TLS_KEY_LEN, 0, EAP_EMSK_LEN);
 		*len = EAP_TLS_KEY_LEN;
 		wpa_hexdump(MSG_DEBUG, "EAP-PEAP: Derived key",
 			    eapKeyData, EAP_TLS_KEY_LEN);
@@ -1348,40 +1341,6 @@
 }
 
 
-static u8 * eap_peap_get_emsk(struct eap_sm *sm, void *priv, size_t *len)
-{
-	struct eap_peap_data *data = priv;
-	u8 *eapKeyData, *emsk;
-
-	if (data->state != SUCCESS)
-		return NULL;
-
-	if (data->crypto_binding_used) {
-		/* [MS-PEAP] does not define EMSK derivation */
-		return NULL;
-	}
-
-	/* TODO: PEAPv1 - different label in some cases */
-	eapKeyData = eap_server_tls_derive_key(sm, &data->ssl,
-					       "client EAP encryption",
-					       EAP_TLS_KEY_LEN + EAP_EMSK_LEN);
-	if (eapKeyData) {
-		emsk = os_memdup(eapKeyData + EAP_TLS_KEY_LEN, EAP_EMSK_LEN);
-		bin_clear_free(eapKeyData, EAP_TLS_KEY_LEN + EAP_EMSK_LEN);
-		if (!emsk)
-			return NULL;
-		*len = EAP_EMSK_LEN;
-		wpa_hexdump(MSG_DEBUG, "EAP-PEAP: Derived EMSK",
-			    emsk, EAP_EMSK_LEN);
-	} else {
-		wpa_printf(MSG_DEBUG, "EAP-PEAP: Failed to derive EMSK");
-		emsk = NULL;
-	}
-
-	return emsk;
-}
-
-
 static Boolean eap_peap_isSuccess(struct eap_sm *sm, void *priv)
 {
 	struct eap_peap_data *data = priv;
@@ -1417,7 +1376,6 @@
 	eap->process = eap_peap_process;
 	eap->isDone = eap_peap_isDone;
 	eap->getKey = eap_peap_getKey;
-	eap->get_emsk = eap_peap_get_emsk;
 	eap->isSuccess = eap_peap_isSuccess;
 	eap->getSessionId = eap_peap_get_session_id;
 
diff --git a/src/eap_server/eap_server_sim.c b/src/eap_server/eap_server_sim.c
index 1287827..10637d4 100644
--- a/src/eap_server/eap_server_sim.c
+++ b/src/eap_server/eap_server_sim.c
@@ -535,9 +535,6 @@
 		goto failed;
 	}
 
-	if (data->permanent[0] == EAP_SIM_PERMANENT_PREFIX)
-		os_strlcpy(sm->imsi, &data->permanent[1], sizeof(sm->imsi));
-
 	identity_len = sm->identity_len;
 	while (identity_len > 0 && sm->identity[identity_len - 1] == '\0') {
 		wpa_printf(MSG_DEBUG, "EAP-SIM: Workaround - drop last null "
diff --git a/src/eap_server/eap_server_tls.c b/src/eap_server/eap_server_tls.c
index 13d2349..8b9e53c 100644
--- a/src/eap_server/eap_server_tls.c
+++ b/src/eap_server/eap_server_tls.c
@@ -22,7 +22,6 @@
 	enum { START, CONTINUE, SUCCESS, FAILURE } state;
 	int established;
 	u8 eap_type;
-	int phase2;
 };
 
 
@@ -86,8 +85,6 @@
 
 	data->eap_type = EAP_TYPE_TLS;
 
-	data->phase2 = sm->init_phase2;
-
 	return data;
 }
 
@@ -205,20 +202,6 @@
 		wpa_printf(MSG_DEBUG, "EAP-TLS: Done");
 		eap_tls_state(data, SUCCESS);
 		eap_tls_valid_session(sm, data);
-		if (sm->serial_num) {
-			char user[128];
-			int user_len;
-
-			user_len = os_snprintf(user, sizeof(user), "cert-%s",
-					       sm->serial_num);
-			if (eap_user_get(sm, (const u8 *) user, user_len,
-					 data->phase2) < 0)
-				wpa_printf(MSG_DEBUG,
-					   "EAP-TLS: No user entry found based on the serial number of the client certificate ");
-			else
-				wpa_printf(MSG_DEBUG,
-					   "EAP-TLS: Updated user entry based on the serial number of the client certificate ");
-		}
 	}
 
 	return res;
@@ -305,8 +288,6 @@
 		   "EAP-TLS: Resuming previous session");
 	eap_tls_state(data, SUCCESS);
 	tls_connection_set_success_data_resumed(data->ssl.conn);
-	/* TODO: Cache serial number with session and update EAP user
-	 * information based on the cached serial number */
 }
 
 
diff --git a/src/eap_server/eap_server_tls_common.c b/src/eap_server/eap_server_tls_common.c
index 4ba7c24..0ae7867 100644
--- a/src/eap_server/eap_server_tls_common.c
+++ b/src/eap_server/eap_server_tls_common.c
@@ -146,26 +146,10 @@
 	u8 *out;
 
 	if (eap_type == EAP_TYPE_TLS && data->tls_v13) {
-		u8 *id, *method_id;
-
-		/* Session-Id = <EAP-Type> || Method-Id
-		 * Method-Id = TLS-Exporter("EXPORTER_EAP_TLS_Method-Id",
-		 *                          "", 64)
-		 */
-		*len = 1 + 64;
-		id = os_malloc(*len);
-		if (!id)
-			return NULL;
-		method_id = eap_server_tls_derive_key(
-			sm, data, "EXPORTER_EAP_TLS_Method-Id", 64);
-		if (!method_id) {
-			os_free(id);
-			return NULL;
-		}
-		id[0] = eap_type;
-		os_memcpy(id + 1, method_id, 64);
-		os_free(method_id);
-		return id;
+		*len = 64;
+		return eap_server_tls_derive_key(sm, data,
+						 "EXPORTER_EAP_TLS_Session-Id",
+						 64);
 	}
 
 	if (tls_connection_get_random(sm->ssl_ctx, data->conn, &keys))
diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c
index 47d95ae..585b4a0 100644
--- a/src/p2p/p2p.c
+++ b/src/p2p/p2p.c
@@ -1470,8 +1470,7 @@
 		p2p->op_channel = p2p->cfg->op_channel;
 	} else if (p2p_channel_random_social(&p2p->cfg->channels,
 					     &p2p->op_reg_class,
-					     &p2p->op_channel,
-					     NULL, NULL) == 0) {
+					     &p2p->op_channel) == 0) {
 		p2p_dbg(p2p, "Select random available social channel (op_class %u channel %u) as operating channel preference",
 			p2p->op_reg_class, p2p->op_channel);
 	} else {
@@ -4770,12 +4769,9 @@
 
 
 int p2p_config_get_random_social(struct p2p_config *p2p, u8 *op_class,
-				 u8 *op_channel,
-				 struct wpa_freq_range_list *avoid_list,
-				 struct wpa_freq_range_list *disallow_list)
+				 u8 *op_channel)
 {
-	return p2p_channel_random_social(&p2p->channels, op_class, op_channel,
-					 avoid_list, disallow_list);
+	return p2p_channel_random_social(&p2p->channels, op_class, op_channel);
 }
 
 
diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h
index f2969ee..fac5ce0 100644
--- a/src/p2p/p2p.h
+++ b/src/p2p/p2p.h
@@ -104,11 +104,6 @@
 	unsigned int vht_center_freq2;
 
 	/**
-	 * he - Indicates if IEEE 802.11ax HE is enabled
-	 */
-	int he;
-
-	/**
 	 * ssid - SSID of the group
 	 */
 	u8 ssid[SSID_MAX_LEN];
@@ -2010,8 +2005,6 @@
  * @p2p: P2P config
  * @op_class: Selected operating class
  * @op_channel: Selected social channel
- * @avoid_list: Channel ranges to try to avoid or %NULL
- * @disallow_list: Channel ranges to discard or %NULL
  * Returns: 0 on success, -1 on failure
  *
  * This function is used before p2p_init is called. A random social channel
@@ -2019,9 +2012,7 @@
  * returned on success.
  */
 int p2p_config_get_random_social(struct p2p_config *p2p, u8 *op_class,
-				 u8 *op_channel,
-				 struct wpa_freq_range_list *avoid_list,
-				 struct wpa_freq_range_list *disallow_list);
+				 u8 *op_channel);
 
 int p2p_set_listen_channel(struct p2p_data *p2p, u8 reg_class, u8 channel,
 			   u8 forced);
diff --git a/src/p2p/p2p_i.h b/src/p2p/p2p_i.h
index 64a9977..a73d99e 100644
--- a/src/p2p/p2p_i.h
+++ b/src/p2p/p2p_i.h
@@ -718,9 +718,7 @@
 int p2p_channel_select(struct p2p_channels *chans, const int *classes,
 		       u8 *op_class, u8 *op_channel);
 int p2p_channel_random_social(struct p2p_channels *chans, u8 *op_class,
-			      u8 *op_channel,
-			      struct wpa_freq_range_list *avoid_list,
-			      struct wpa_freq_range_list *disallow_list);
+			      u8 *op_channel);
 
 /* p2p_parse.c */
 void p2p_copy_filter_devname(char *dst, size_t dst_len,
diff --git a/src/p2p/p2p_invitation.c b/src/p2p/p2p_invitation.c
index 77d662a..bbba001 100644
--- a/src/p2p/p2p_invitation.c
+++ b/src/p2p/p2p_invitation.c
@@ -488,7 +488,7 @@
 	if (*msg.status == P2P_SC_FAIL_NO_COMMON_CHANNELS &&
 	    p2p->retry_invite_req &&
 	    p2p_channel_random_social(&p2p->cfg->channels, &p2p->op_reg_class,
-				      &p2p->op_channel, NULL, NULL) == 0) {
+				      &p2p->op_channel) == 0) {
 		p2p->retry_invite_req = 0;
 		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
 		p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
diff --git a/src/p2p/p2p_utils.c b/src/p2p/p2p_utils.c
index 1a62a44..2e2aa8a 100644
--- a/src/p2p/p2p_utils.c
+++ b/src/p2p/p2p_utils.c
@@ -413,30 +413,17 @@
 
 
 int p2p_channel_random_social(struct p2p_channels *chans, u8 *op_class,
-			      u8 *op_channel,
-			      struct wpa_freq_range_list *avoid_list,
-			      struct wpa_freq_range_list *disallow_list)
+			      u8 *op_channel)
 {
 	u8 chan[4];
 	unsigned int num_channels = 0;
 
-	/* Try to find available social channels from 2.4 GHz.
-	 * If the avoid_list includes any of the 2.4 GHz social channels, that
-	 * channel is not allowed by p2p_channels_includes() rules. However, it
-	 * is assumed to allow minimal traffic for P2P negotiation, so allow it
-	 * here for social channel selection unless explicitly disallowed in the
-	 * disallow_list. */
-	if (p2p_channels_includes(chans, 81, 1) ||
-	    (freq_range_list_includes(avoid_list, 2412) &&
-	     !freq_range_list_includes(disallow_list, 2412)))
+	/* Try to find available social channels from 2.4 GHz */
+	if (p2p_channels_includes(chans, 81, 1))
 		chan[num_channels++] = 1;
-	if (p2p_channels_includes(chans, 81, 6) ||
-	    (freq_range_list_includes(avoid_list, 2437) &&
-	     !freq_range_list_includes(disallow_list, 2437)))
+	if (p2p_channels_includes(chans, 81, 6))
 		chan[num_channels++] = 6;
-	if (p2p_channels_includes(chans, 81, 11) ||
-	    (freq_range_list_includes(avoid_list, 2462) &&
-	     !freq_range_list_includes(disallow_list, 2462)))
+	if (p2p_channels_includes(chans, 81, 11))
 		chan[num_channels++] = 11;
 
 	/* Try to find available social channels from 60 GHz */
diff --git a/src/pae/ieee802_1x_cp.c b/src/pae/ieee802_1x_cp.c
index 8cdce30..360fcd3 100644
--- a/src/pae/ieee802_1x_cp.c
+++ b/src/pae/ieee802_1x_cp.c
@@ -38,10 +38,12 @@
 
 	/* Logon -> CP */
 	enum connect_type connect;
+	u8 *authorization_data;
 
 	/* KaY -> CP */
 	Boolean chgd_server; /* clear by CP */
 	Boolean elected_self;
+	u8 *authorization_data1;
 	enum confidentiality_offset cipher_offset;
 	u64 cipher_suite;
 	Boolean new_sak; /* clear by CP */
@@ -318,11 +320,8 @@
 	SM_ENTRY(CP, RETIRE);
 	/* RETIRE state machine not keep with Figure 12-2 in
 	 * IEEE Std 802.1X-2010 */
-	if (sm->oki) {
-		ieee802_1x_kay_delete_sas(sm->kay, sm->oki);
-		os_free(sm->oki);
-		sm->oki = NULL;
-	}
+	os_free(sm->oki);
+	sm->oki = NULL;
 	sm->orx = FALSE;
 	sm->otx = FALSE;
 	ieee802_1x_kay_set_old_sa_attr(sm->kay, sm->oki, sm->oan,
@@ -384,8 +383,7 @@
 		if (!sm->elected_self)
 			SM_ENTER(CP, READY);
 		if (sm->elected_self &&
-		    (sm->all_receiving || !sm->controlled_port_enabled ||
-		     !sm->transmit_when))
+		    (sm->all_receiving || !sm->transmit_when))
 			SM_ENTER(CP, TRANSMIT);
 		break;
 
@@ -408,8 +406,8 @@
 
 	case CP_READY:
 		if (sm->new_sak || changed_connect(sm))
-			SM_ENTER(CP, ABANDON);
-		if (sm->server_transmitting || !sm->controlled_port_enabled)
+			SM_ENTER(CP, RECEIVE);
+		if (sm->server_transmitting)
 			SM_ENTER(CP, TRANSMIT);
 		break;
 	case CP_ABANDON:
@@ -466,6 +464,7 @@
 	sm->retire_delay = MKA_SAK_RETIRE_TIME;
 	sm->CP_state = CP_BEGIN;
 	sm->changed = FALSE;
+	sm->authorization_data = NULL;
 
 	wpa_printf(MSG_DEBUG, "CP: state machine created");
 
@@ -477,6 +476,7 @@
 	secy_cp_control_confidentiality_offset(sm->kay,
 					       sm->confidentiality_offset);
 
+	SM_ENTER(CP, INIT);
 	SM_STEP_RUN(CP);
 
 	return sm;
@@ -518,6 +518,7 @@
 	eloop_cancel_timeout(ieee802_1x_cp_step_cb, sm, NULL);
 	os_free(sm->lki);
 	os_free(sm->oki);
+	os_free(sm->authorization_data);
 	os_free(sm);
 }
 
@@ -588,6 +589,19 @@
 
 
 /**
+ * ieee802_1x_cp_set_authorizationdata -
+ */
+void ieee802_1x_cp_set_authorizationdata(void *cp_ctx, u8 *pdata, int len)
+{
+	struct ieee802_1x_cp_sm *sm = cp_ctx;
+	os_free(sm->authorization_data);
+	sm->authorization_data = os_zalloc(len);
+	if (sm->authorization_data)
+		os_memcpy(sm->authorization_data, pdata, len);
+}
+
+
+/**
  * ieee802_1x_cp_set_ciphersuite -
  */
 void ieee802_1x_cp_set_ciphersuite(void *cp_ctx, u64 cs)
diff --git a/src/pae/ieee802_1x_cp.h b/src/pae/ieee802_1x_cp.h
index a357b27..695629e 100644
--- a/src/pae/ieee802_1x_cp.h
+++ b/src/pae/ieee802_1x_cp.h
@@ -25,6 +25,7 @@
 void ieee802_1x_cp_connect_secure(void *cp_ctx);
 void ieee802_1x_cp_signal_chgdserver(void *cp_ctx);
 void ieee802_1x_cp_set_electedself(void *cp_ctx, Boolean status);
+void ieee802_1x_cp_set_authorizationdata(void *cp_ctx, u8 *pdata, int len);
 void ieee802_1x_cp_set_ciphersuite(void *cp_ctx, u64 cs);
 void ieee802_1x_cp_set_offset(void *cp_ctx, enum confidentiality_offset offset);
 void ieee802_1x_cp_signal_newsak(void *cp_ctx);
diff --git a/src/pae/ieee802_1x_kay.c b/src/pae/ieee802_1x_kay.c
index b4455c8..cda23fc 100644
--- a/src/pae/ieee802_1x_kay.c
+++ b/src/pae/ieee802_1x_kay.c
@@ -1,5 +1,5 @@
 /*
- * IEEE 802.1X-2010 Key Agreement Protocol of PAE state machine
+ * IEEE 802.1X-2010 Key Agree Protocol of PAE state machine
  * Copyright (c) 2013, Qualcomm Atheros, Inc.
  *
  * This software may be distributed under the terms of the BSD license.
@@ -27,9 +27,6 @@
 #define DEFAULT_ICV_LEN		16
 #define MAX_ICV_LEN		32  /* 32 bytes, 256 bits */
 
-#define MAX_MISSING_SAK_USE 10  /* Accept up to 10 inbound MKPDUs without
-				 * SAK-USE before dropping */
-
 #define PENDING_PN_EXHAUSTION 0xC0000000
 
 #define MKA_ALIGN_LENGTH(len) (((len) + 0x3) & ~0x3)
@@ -46,6 +43,7 @@
 		.name = CS_NAME_GCM_AES_128,
 		.capable = MACSEC_CAP_INTEG_AND_CONF_0_30_50,
 		.sak_len = DEFAULT_SA_KEY_LEN,
+		.index = 0,
 	},
 	/* GCM-AES-256 */
 	{
@@ -53,6 +51,7 @@
 		.name = CS_NAME_GCM_AES_256,
 		.capable = MACSEC_CAP_INTEG_AND_CONF_0_30_50,
 		.sak_len = 32,
+		.index = 1 /* index */
 	},
 };
 #define CS_TABLE_SIZE (ARRAY_SIZE(cipher_suite_tbl))
@@ -62,13 +61,19 @@
 	{
 		.parameter = MKA_ALGO_AGILITY_2009,
 
+		/* 128-bit CAK, KEK, ICK, ICV */
+		.cak_len = DEFAULT_ICV_LEN,
+		.kek_len = DEFAULT_ICV_LEN,
+		.ick_len = DEFAULT_ICV_LEN,
 		.icv_len = DEFAULT_ICV_LEN,
 
-		.cak_trfm = ieee802_1x_cak_aes_cmac,
-		.ckn_trfm = ieee802_1x_ckn_aes_cmac,
-		.kek_trfm = ieee802_1x_kek_aes_cmac,
-		.ick_trfm = ieee802_1x_ick_aes_cmac,
-		.icv_hash = ieee802_1x_icv_aes_cmac,
+		.cak_trfm = ieee802_1x_cak_128bits_aes_cmac,
+		.ckn_trfm = ieee802_1x_ckn_128bits_aes_cmac,
+		.kek_trfm = ieee802_1x_kek_128bits_aes_cmac,
+		.ick_trfm = ieee802_1x_ick_128bits_aes_cmac,
+		.icv_hash = ieee802_1x_icv_128bits_aes_cmac,
+
+		.index = 1,
 	},
 };
 #define MKA_ALG_TABLE_SIZE (ARRAY_SIZE(mka_alg_tbl))
@@ -104,34 +109,6 @@
 }
 
 
-static const char * mi_txt(const u8 *mi)
-{
-	static char txt[MI_LEN * 2 + 1];
-
-	wpa_snprintf_hex(txt, sizeof(txt), mi, MI_LEN);
-	return txt;
-}
-
-
-static const char * sci_txt(const struct ieee802_1x_mka_sci *sci)
-{
-	static char txt[ETH_ALEN * 3 + 1 + 5 + 1];
-
-	os_snprintf(txt, sizeof(txt), MACSTR "@%u",
-		    MAC2STR(sci->addr), be_to_host16(sci->port));
-	return txt;
-}
-
-
-static const char * algo_agility_txt(const u8 *algo_agility)
-{
-	static char txt[4 * 2 + 1];
-
-	wpa_snprintf_hex(txt, sizeof(txt), algo_agility, 4);
-	return txt;
-}
-
-
 /**
  * ieee802_1x_mka_dump_basic_body -
  */
@@ -143,25 +120,26 @@
 	if (!body)
 		return;
 
-	/* IEEE Std 802.1X-2010, Figure 11-8 */
 	body_len = get_mka_param_body_len(body);
-	wpa_printf(MSG_DEBUG, "MKA Basic Parameter Set");
-	wpa_printf(MSG_DEBUG, "\tMKA Version Identifier: %d", body->version);
-	wpa_printf(MSG_DEBUG, "\tKey Server Priority: %d", body->priority);
-	wpa_printf(MSG_DEBUG, "\tKey Server: %d", body->key_server);
-	wpa_printf(MSG_DEBUG, "\tMACsec Desired: %d", body->macsec_desired);
-	wpa_printf(MSG_DEBUG, "\tMACsec Capability: %d",
-		   body->macsec_capability);
-	wpa_printf(MSG_DEBUG, "\tParameter set body length: %zu", body_len);
-	wpa_printf(MSG_DEBUG, "\tSCI: %s", sci_txt(&body->actor_sci));
-	wpa_printf(MSG_DEBUG, "\tActor's Member Identifier: %s",
-		   mi_txt(body->actor_mi));
-	wpa_printf(MSG_DEBUG, "\tActor's Message Number: %d",
+	wpa_printf(MSG_DEBUG, "*** MKA Basic Parameter set ***");
+	wpa_printf(MSG_DEBUG, "\tVersion.......: %d", body->version);
+	wpa_printf(MSG_DEBUG, "\tPriority......: %d", body->priority);
+	wpa_printf(MSG_DEBUG, "\tKeySvr........: %d", body->key_server);
+	wpa_printf(MSG_DEBUG, "\tMACSecDesired.: %d", body->macsec_desired);
+	wpa_printf(MSG_DEBUG, "\tMACSecCapable.: %d", body->macsec_capability);
+	wpa_printf(MSG_DEBUG, "\tBody Length...: %zu", body_len);
+	wpa_printf(MSG_DEBUG, "\tSCI MAC.......: " MACSTR,
+		   MAC2STR(body->actor_sci.addr));
+	wpa_printf(MSG_DEBUG, "\tSCI Port .....: %d",
+		   be_to_host16(body->actor_sci.port));
+	wpa_hexdump(MSG_DEBUG, "\tMember Id.....:",
+		    body->actor_mi, sizeof(body->actor_mi));
+	wpa_printf(MSG_DEBUG, "\tMessage Number: %d",
 		   be_to_host32(body->actor_mn));
-	wpa_printf(MSG_DEBUG, "\tAlgorithm Agility: %s",
-		   algo_agility_txt(body->algo_agility));
-	wpa_hexdump(MSG_DEBUG, "\tCAK Name", body->ckn,
-		    body_len + MKA_HDR_LEN - sizeof(*body));
+	wpa_hexdump(MSG_DEBUG, "\tAlgo Agility..:",
+		    body->algo_agility, sizeof(body->algo_agility));
+	wpa_hexdump_ascii(MSG_DEBUG, "\tCAK Name......:", body->ckn,
+			  body_len + MKA_HDR_LEN - sizeof(*body));
 }
 
 
@@ -179,21 +157,20 @@
 	if (body == NULL)
 		return;
 
-	/* IEEE Std 802.1X-2010, Figure 11-9 */
 	body_len = get_mka_param_body_len(body);
 	if (body->type == MKA_LIVE_PEER_LIST) {
-		wpa_printf(MSG_DEBUG, "Live Peer List parameter set");
-		wpa_printf(MSG_DEBUG, "\tBody Length: %zu", body_len);
+		wpa_printf(MSG_DEBUG, "*** Live Peer List ***");
+		wpa_printf(MSG_DEBUG, "\tBody Length...: %zu", body_len);
 	} else if (body->type == MKA_POTENTIAL_PEER_LIST) {
-		wpa_printf(MSG_DEBUG, "Potential Peer List parameter set");
-		wpa_printf(MSG_DEBUG, "\tBody Length: %zu", body_len);
+		wpa_printf(MSG_DEBUG, "*** Potential Live Peer List ***");
+		wpa_printf(MSG_DEBUG, "\tBody Length...: %zu", body_len);
 	}
 
 	for (i = 0; i < body_len; i += MI_LEN + sizeof(mn)) {
 		mi = body->peer + i;
 		os_memcpy(&mn, mi + MI_LEN, sizeof(mn));
-		wpa_printf(MSG_DEBUG, "\tMember Id: %s  Message Number: %d",
-			   mi_txt(mi), be_to_host32(mn));
+		wpa_hexdump_ascii(MSG_DEBUG, "\tMember Id.....:", mi, MI_LEN);
+		wpa_printf(MSG_DEBUG, "\tMessage Number: %d", be_to_host32(mn));
 	}
 }
 
@@ -209,20 +186,18 @@
 	if (body == NULL)
 		return;
 
-	/* IEEE Std 802.1X-2010, Figure 11-11 and 11-12 */
 	body_len = get_mka_param_body_len(body);
-	wpa_printf(MSG_DEBUG, "Distributed SAK parameter set");
-	wpa_printf(MSG_DEBUG, "\tDistributed AN........: %d", body->dan);
-	wpa_printf(MSG_DEBUG, "\tConfidentiality Offset: %d",
+	wpa_printf(MSG_INFO, "*** Distributed SAK ***");
+	wpa_printf(MSG_INFO, "\tDistributed AN........: %d", body->dan);
+	wpa_printf(MSG_INFO, "\tConfidentiality Offset: %d",
 		   body->confid_offset);
-	wpa_printf(MSG_DEBUG, "\tBody Length...........: %zu", body_len);
+	wpa_printf(MSG_INFO, "\tBody Length...........: %zu", body_len);
 	if (!body_len)
 		return;
 
-	wpa_printf(MSG_DEBUG, "\tKey Number............: %d",
+	wpa_printf(MSG_INFO, "\tKey Number............: %d",
 		   be_to_host32(body->kn));
-	/* TODO: Other than GCM-AES-128 case: MACsec Cipher Suite */
-	wpa_hexdump(MSG_DEBUG, "\tAES Key Wrap of SAK...:", body->sak, 24);
+	wpa_hexdump(MSG_INFO, "\tAES Key Wrap of SAK...:", body->sak, 24);
 }
 
 
@@ -243,32 +218,33 @@
 	if (body == NULL)
 		return;
 
-	/* IEEE Std 802.1X-2010, Figure 11-10 */
 	body_len = get_mka_param_body_len(body);
-	wpa_printf(MSG_DEBUG, "MACsec SAK Use parameter set");
+	wpa_printf(MSG_DEBUG, "*** MACsec SAK Use ***");
 	wpa_printf(MSG_DEBUG, "\tLatest Key AN....: %d", body->lan);
 	wpa_printf(MSG_DEBUG, "\tLatest Key Tx....: %s", yes_no(body->ltx));
 	wpa_printf(MSG_DEBUG, "\tLatest Key Rx....: %s", yes_no(body->lrx));
-	wpa_printf(MSG_DEBUG, "\tOld Key AN.......: %d", body->oan);
-	wpa_printf(MSG_DEBUG, "\tOld Key Tx.......: %s", yes_no(body->otx));
-	wpa_printf(MSG_DEBUG, "\tOld Key Rx.......: %s", yes_no(body->orx));
-	wpa_printf(MSG_DEBUG, "\tPlain Tx.........: %s", yes_no(body->ptx));
-	wpa_printf(MSG_DEBUG, "\tPlain Rx.........: %s", yes_no(body->prx));
+	wpa_printf(MSG_DEBUG, "\tOld Key AN....: %d", body->oan);
+	wpa_printf(MSG_DEBUG, "\tOld Key Tx....: %s", yes_no(body->otx));
+	wpa_printf(MSG_DEBUG, "\tOld Key Rx....: %s", yes_no(body->orx));
+	wpa_printf(MSG_DEBUG, "\tPlain Key Tx....: %s", yes_no(body->ptx));
+	wpa_printf(MSG_DEBUG, "\tPlain Key Rx....: %s", yes_no(body->prx));
 	wpa_printf(MSG_DEBUG, "\tDelay Protect....: %s",
 		   yes_no(body->delay_protect));
 	wpa_printf(MSG_DEBUG, "\tBody Length......: %d", body_len);
 	if (!body_len)
 		return;
 
-	wpa_printf(MSG_DEBUG, "\tKey Server MI....: %s", mi_txt(body->lsrv_mi));
+	wpa_hexdump(MSG_DEBUG, "\tKey Server MI....:",
+		    body->lsrv_mi, sizeof(body->lsrv_mi));
 	wpa_printf(MSG_DEBUG, "\tKey Number.......: %u",
 		   be_to_host32(body->lkn));
 	wpa_printf(MSG_DEBUG, "\tLowest PN........: %u",
 		   be_to_host32(body->llpn));
-	wpa_printf(MSG_DEBUG, "\tOld Key Server MI: %s", mi_txt(body->osrv_mi));
-	wpa_printf(MSG_DEBUG, "\tOld Key Number...: %u",
+	wpa_hexdump_ascii(MSG_DEBUG, "\tOld Key Server MI....:",
+			  body->osrv_mi, sizeof(body->osrv_mi));
+	wpa_printf(MSG_DEBUG, "\tOld Key Number.......: %u",
 		   be_to_host32(body->okn));
-	wpa_printf(MSG_DEBUG, "\tOld Lowest PN....: %u",
+	wpa_printf(MSG_DEBUG, "\tOld Lowest PN........: %u",
 		   be_to_host32(body->olpn));
 }
 
@@ -395,7 +371,7 @@
  */
 static struct macsec_ciphersuite *
 ieee802_1x_kay_get_cipher_suite(struct ieee802_1x_mka_participant *participant,
-				const u8 *cs_id, unsigned int *idx)
+				const u8 *cs_id)
 {
 	unsigned int i;
 	u64 cs;
@@ -405,10 +381,8 @@
 	cs = be_to_host64(_cs);
 
 	for (i = 0; i < CS_TABLE_SIZE; i++) {
-		if (cipher_suite_tbl[i].id == cs) {
-			*idx = i;
+		if (cipher_suite_tbl[i].id == cs)
 			return &cipher_suite_tbl[i];
-		}
 	}
 
 	return NULL;
@@ -490,7 +464,7 @@
 
 	dl_list_add(&psc->sa_list, &psa->list);
 	wpa_printf(MSG_DEBUG,
-		   "KaY: Create receive SA(an: %hhu lowest_pn: %u) of SC",
+		   "KaY: Create receive SA(AN: %hhu lowest_pn: %u of SC",
 		   an, lowest_pn);
 
 	return psa;
@@ -537,8 +511,8 @@
 	psc->receiving = FALSE;
 
 	dl_list_init(&psc->sa_list);
-	wpa_printf(MSG_DEBUG, "KaY: Create receive SC: SCI %s",
-		   sci_txt(&psc->sci));
+	wpa_printf(MSG_DEBUG, "KaY: Create receive SC");
+	wpa_hexdump(MSG_DEBUG, "SCI: ", (u8 *)psci, sizeof(*psci));
 
 	return psc;
 }
@@ -575,8 +549,10 @@
 
 static void ieee802_1x_kay_dump_peer(struct ieee802_1x_kay_peer *peer)
 {
-	wpa_printf(MSG_DEBUG, "\tMI: %s  MN: %d  SCI: %s",
-		   mi_txt(peer->mi), peer->mn, sci_txt(&peer->sci));
+	wpa_hexdump(MSG_DEBUG, "\tMI: ", peer->mi, sizeof(peer->mi));
+	wpa_printf(MSG_DEBUG, "\tMN: %d", peer->mn);
+	wpa_hexdump(MSG_DEBUG, "\tSCI Addr: ", peer->sci.addr, ETH_ALEN);
+	wpa_printf(MSG_DEBUG, "\tPort: %d", peer->sci.port);
 }
 
 
@@ -595,7 +571,6 @@
 	peer->mn = mn;
 	peer->expire = time(NULL) + MKA_LIFE_TIME / 1000;
 	peer->sak_used = FALSE;
-	peer->missing_sak_use_count = 0;
 
 	return peer;
 }
@@ -624,13 +599,9 @@
 		return NULL;
 	}
 
-	if (secy_create_receive_sc(participant->kay, rxsc)) {
-		os_free(rxsc);
-		os_free(peer);
-		return NULL;
-	}
 	dl_list_add(&participant->live_peers, &peer->list);
 	dl_list_add(&participant->rxsc_list, &rxsc->list);
+	secy_create_receive_sc(participant->kay, rxsc);
 
 	wpa_printf(MSG_DEBUG, "KaY: Live peer created");
 	ieee802_1x_kay_dump_peer(peer);
@@ -654,7 +625,7 @@
 
 	dl_list_add(&participant->potential_peers, &peer->list);
 
-	wpa_printf(MSG_DEBUG, "KaY: Potential peer created");
+	wpa_printf(MSG_DEBUG, "KaY: potential peer created");
 	ieee802_1x_kay_dump_peer(peer);
 
 	return peer;
@@ -684,19 +655,14 @@
 	peer->mn = mn;
 	peer->expire = time(NULL) + MKA_LIFE_TIME / 1000;
 
-	wpa_printf(MSG_DEBUG, "KaY: Move potential peer to live peer");
+	wpa_printf(MSG_DEBUG, "KaY: move potential peer to live peer");
 	ieee802_1x_kay_dump_peer(peer);
 
 	dl_list_del(&peer->list);
-	if (secy_create_receive_sc(participant->kay, rxsc)) {
-		wpa_printf(MSG_ERROR, "KaY: Can't create SC, discard peer");
-		os_free(rxsc);
-		os_free(peer);
-		return NULL;
-	}
 	dl_list_add_tail(&participant->live_peers, &peer->list);
 
 	dl_list_add(&participant->rxsc_list, &rxsc->list);
+	secy_create_receive_sc(participant->kay, rxsc);
 
 	return peer;
 }
@@ -738,15 +704,12 @@
 {
 	struct ieee802_1x_mka_basic_body *body;
 	struct ieee802_1x_kay *kay = participant->kay;
-	unsigned int length = sizeof(struct ieee802_1x_mka_basic_body);
+	unsigned int length = ieee802_1x_mka_basic_body_length(participant);
 
-	length += participant->ckn.len;
-	body = wpabuf_put(buf, MKA_ALIGN_LENGTH(length));
+	body = wpabuf_put(buf, length);
 
 	body->version = kay->mka_version;
 	body->priority = kay->actor_priority;
-	/* The Key Server flag is set if and only if the participant has not
-	 * decided that another participant is or will be the Key Server. */
 	if (participant->is_elected)
 		body->key_server = participant->is_key_server;
 	else
@@ -802,11 +765,11 @@
 
 	if (body->version > MKA_VERSION_ID) {
 		wpa_printf(MSG_DEBUG,
-			   "KaY: Peer's version(%d) greater than MKA current version(%d)",
+			   "KaY: peer's version(%d) greater than mka current version(%d)",
 			   body->version, MKA_VERSION_ID);
 	}
 	if (kay->is_obliged_key_server && body->key_server) {
-		wpa_printf(MSG_DEBUG, "KaY: I must be key server - ignore MKPDU claiming to be from a key server");
+		wpa_printf(MSG_DEBUG, "I must be as key server");
 		return NULL;
 	}
 
@@ -820,8 +783,7 @@
 	    (sizeof(struct ieee802_1x_mka_basic_body) - MKA_HDR_LEN);
 	participant = ieee802_1x_kay_get_participant(kay, body->ckn, ckn_len);
 	if (!participant) {
-		wpa_printf(MSG_DEBUG,
-			   "KaY: Peer is not included in my CA - ignore MKPDU");
+		wpa_printf(MSG_DEBUG, "Peer is not included in my CA");
 		return NULL;
 	}
 
@@ -829,9 +791,6 @@
 	if (os_memcmp(body->actor_mi, participant->mi, MI_LEN) == 0) {
 		if (!reset_participant_mi(participant))
 			return NULL;
-		wpa_printf(MSG_DEBUG,
-			   "KaY: Peer using my MI - selected a new random MI: %s",
-			   mi_txt(participant->mi));
 	}
 
 	os_memcpy(participant->current_peer_id.mi, body->actor_mi, MI_LEN);
@@ -843,48 +802,24 @@
 	/* handler peer */
 	peer = ieee802_1x_kay_get_peer(participant, body->actor_mi);
 	if (!peer) {
-		/* Check duplicated SCI
-		 *
-		 * A duplicated SCI indicates either an active attacker or
-		 * a valid peer whose MI is being changed. The latter scenario
-		 * is more likely because to have gotten this far the received
-		 * MKPDU must have had a valid ICV, indicating the peer holds
-		 * the same CAK as our participant.
-		 *
-		 * Before creating a new peer object for the new MI we must
-		 * clean up the resources (SCs and SAs) associated with the
-		 * old peer. An easy way to do this is to ignore MKPDUs with
-		 * the new MI's for now and just wait for the old peer to
-		 * time out and clean itself up (within MKA_LIFE_TIME).
-		 *
-		 * This method is preferable to deleting the old peer here
-		 * and now and continuing on with processing because if this
-		 * MKPDU is from an attacker it's better to ignore the MKPDU
-		 * than to process it (and delete a valid peer as well).
+		/* Check duplicated SCI */
+		/* TODO: What policy should be applied to detect duplicated SCI
+		 * is active attacker or a valid peer whose MI is be changed?
 		 */
 		peer = ieee802_1x_kay_get_peer_sci(participant,
 						   &body->actor_sci);
 		if (peer) {
-			time_t new_expire;
-
 			wpa_printf(MSG_WARNING,
-				   "KaY: duplicated SCI detected - maybe active attacker or peer selected new MI - ignore MKPDU");
-			/* Reduce timeout to speed up this process but left the
-			 * chance for old one to prove aliveness. */
-			new_expire = time(NULL) + MKA_HELLO_TIME * 1.5 / 1000;
-			if (peer->expire > new_expire)
-				peer->expire = new_expire;
-			return NULL;
+				   "KaY: duplicated SCI detected, Maybe active attacker");
+			dl_list_del(&peer->list);
+			os_free(peer);
 		}
 
 		peer = ieee802_1x_kay_create_potential_peer(
 			participant, body->actor_mi,
 			be_to_host32(body->actor_mn));
-		if (!peer) {
-			wpa_printf(MSG_DEBUG,
-				   "KaY: No potential peer entry found - ignore MKPDU");
+		if (!peer)
 			return NULL;
-		}
 
 		peer->macsec_desired = body->macsec_desired;
 		peer->macsec_capability = body->macsec_capability;
@@ -892,13 +827,13 @@
 		peer->key_server_priority = body->priority;
 	} else if (peer->mn < be_to_host32(body->actor_mn)) {
 		peer->mn = be_to_host32(body->actor_mn);
+		peer->expire = time(NULL) + MKA_LIFE_TIME / 1000;
 		peer->macsec_desired = body->macsec_desired;
 		peer->macsec_capability = body->macsec_capability;
 		peer->is_key_server = (Boolean) body->key_server;
 		peer->key_server_priority = body->priority;
 	} else {
-		wpa_printf(MSG_WARNING,
-			   "KaY: The peer MN did not increase - ignore MKPDU");
+		wpa_printf(MSG_WARNING, "KaY: The peer MN have received");
 		return NULL;
 	}
 
@@ -1043,8 +978,8 @@
 
 	for (pos = mka_msg, left_len = msg_len;
 	     left_len > MKA_HDR_LEN + DEFAULT_ICV_LEN;
-	     left_len -= MKA_ALIGN_LENGTH(body_len) + MKA_HDR_LEN,
-		     pos += MKA_ALIGN_LENGTH(body_len) + MKA_HDR_LEN) {
+	     left_len -= body_len + MKA_HDR_LEN,
+		     pos += body_len + MKA_HDR_LEN) {
 		hdr = (struct ieee802_1x_mka_hdr *) pos;
 		body_len = get_mka_param_body_len(hdr);
 		body_type = get_mka_param_body_type(hdr);
@@ -1079,15 +1014,9 @@
 			peer_mi = (const struct ieee802_1x_mka_peer_id *)
 				(pos + MKA_HDR_LEN + i);
 			if (os_memcmp(peer_mi->mi, participant->mi,
-				      MI_LEN) == 0) {
-				u32 mn = be_to_host32(peer_mi->mn);
-
-				wpa_printf(MSG_DEBUG,
-					   "KaY: My MI - received MN %u, most recently transmitted MN %u",
-					   mn, participant->mn);
-				if (mn == participant->mn)
-					return TRUE;
-			}
+				      MI_LEN) == 0 &&
+			    be_to_host32(peer_mi->mn) == participant->mn)
+				return TRUE;
 		}
 	}
 
@@ -1143,6 +1072,7 @@
 		peer = ieee802_1x_kay_get_peer(participant, peer_mi->mi);
 		if (peer) {
 			peer->mn = peer_mn;
+			peer->expire = time(NULL) + MKA_LIFE_TIME / 1000;
 		} else if (!ieee802_1x_kay_create_potential_peer(
 				participant, peer_mi->mi, peer_mn)) {
 			return -1;
@@ -1224,38 +1154,27 @@
 
 
 /**
- * ieee802_1x_mka_get_lpn
+ *
  */
 static u32
 ieee802_1x_mka_get_lpn(struct ieee802_1x_mka_participant *principal,
 		       struct ieee802_1x_mka_ki *ki)
 {
-	struct transmit_sa *txsa;
+	struct receive_sa *rxsa;
+	struct receive_sc *rxsc;
 	u32 lpn = 0;
 
-	dl_list_for_each(txsa, &principal->txsc->sa_list,
-			 struct transmit_sa, list) {
-		if (is_ki_equal(&txsa->pkey->key_identifier, ki)) {
-			/* Per IEEE Std 802.1X-2010, Clause 9, "Each SecY uses
-			 * MKA to communicate the lowest PN used for
-			 * transmission with the SAK within the last two
-			 * seconds".  Achieve this 2 second delay by setting the
-			 * lpn using the transmit next PN (i.e., txsa->next_pn)
-			 * that was read last time here (i.e., mka_hello_time
-			 * 2 seconds ago).
-			 *
-			 * The lowest acceptable PN is the same as the last
-			 * transmitted PN, which is one less than the next
-			 * transmit PN.
-			 *
-			 * NOTE: This method only works if mka_hello_time is 2s.
-			 */
-			lpn = (txsa->next_pn > 0) ? (txsa->next_pn - 1) : 0;
+	dl_list_for_each(rxsc, &principal->rxsc_list, struct receive_sc, list) {
+		dl_list_for_each(rxsa, &rxsc->sa_list, struct receive_sa, list)
+		{
+			if (is_ki_equal(&rxsa->pkey->key_identifier, ki)) {
+				secy_get_receive_lowest_pn(principal->kay,
+							   rxsa);
 
-			/* Now read the current transmit next PN for use next
-			 * time through. */
-			secy_get_transmit_next_pn(principal->kay, txsa);
-			break;
+				lpn = lpn > rxsa->lowest_pn ?
+					lpn : rxsa->lowest_pn;
+				break;
+			}
 		}
 	}
 
@@ -1295,9 +1214,8 @@
 		return 0;
 	}
 
-	/* data delay protect */
-	body->delay_protect = kay->mka_hello_time <= MKA_BOUNDED_HELLO_TIME;
-	/* lowest accept packet number */
+	/* data protect, lowest accept packet number */
+	body->delay_protect = kay->macsec_replay_protect;
 	pn = ieee802_1x_mka_get_lpn(participant, &participant->lki);
 	if (pn > kay->pn_exhaustion) {
 		wpa_printf(MSG_WARNING, "KaY: My LPN exhaustion");
@@ -1358,8 +1276,7 @@
 	struct ieee802_1x_mka_hdr *hdr;
 	struct ieee802_1x_mka_sak_use_body *body;
 	struct ieee802_1x_kay_peer *peer;
-	struct receive_sc *rxsc;
-	struct receive_sa *rxsa;
+	struct transmit_sa *txsa;
 	struct data_key *sa_key = NULL;
 	size_t body_len;
 	struct ieee802_1x_mka_ki ki;
@@ -1375,9 +1292,7 @@
 	peer = ieee802_1x_kay_get_live_peer(participant,
 					    participant->current_peer_id.mi);
 	if (!peer) {
-		wpa_printf(MSG_WARNING,
-			   "KaY: The peer (%s) is not my live peer - ignore MACsec SAK Use parameter set",
-			   mi_txt(participant->current_peer_id.mi));
+		wpa_printf(MSG_WARNING, "KaY: the peer is not my live peer");
 		return -1;
 	}
 
@@ -1421,7 +1336,7 @@
 			}
 		}
 		if (!found) {
-			wpa_printf(MSG_INFO, "KaY: Latest key is invalid");
+			wpa_printf(MSG_WARNING, "KaY: Latest key is invalid");
 			return -1;
 		}
 		if (os_memcmp(participant->lki.mi, body->lsrv_mi,
@@ -1451,7 +1366,7 @@
 	if (body->delay_protect &&
 	    (!be_to_host32(body->llpn) || !be_to_host32(body->olpn))) {
 		wpa_printf(MSG_WARNING,
-			   "KaY: Lowest packet number should be greater than 0 when delay_protect is TRUE");
+			   "KaY: Lowest packet number should greater than 0 when delay_protect is TRUE");
 		return -1;
 	}
 
@@ -1470,7 +1385,7 @@
 		ieee802_1x_cp_sm_step(kay->cp);
 	}
 
-	/* if I'm key server, and detects peer member pn exhaustion, rekey. */
+	/* if i'm key server, and detects peer member pn exhaustion, rekey.*/
 	lpn = be_to_host32(body->llpn);
 	if (lpn > kay->pn_exhaustion) {
 		if (participant->is_key_server) {
@@ -1479,41 +1394,26 @@
 		}
 	}
 
-	if (sa_key)
-		sa_key->next_pn = lpn;
 	found = FALSE;
-	dl_list_for_each(rxsc, &participant->rxsc_list, struct receive_sc,
-			 list) {
-		dl_list_for_each(rxsa, &rxsc->sa_list, struct receive_sa,
-				 list) {
-			if (sa_key && rxsa->pkey == sa_key) {
-				found = TRUE;
-				break;
-			}
-		}
-		if (found)
+	dl_list_for_each(txsa, &participant->txsc->sa_list,
+			 struct transmit_sa, list) {
+		if (sa_key != NULL && txsa->pkey == sa_key) {
+			found = TRUE;
 			break;
+		}
 	}
 	if (!found) {
-		wpa_printf(MSG_WARNING, "KaY: Can't find rxsa");
+		wpa_printf(MSG_WARNING, "KaY: Can't find txsa");
 		return -1;
 	}
 
-	if (body->delay_protect) {
-		secy_get_receive_lowest_pn(participant->kay, rxsa);
-		if (lpn > rxsa->lowest_pn) {
-			/* Delay protect window (communicated via MKA) is
-			 * tighter than SecY's current replay protect window,
-			 * so tell SecY the new (and higher) lpn. */
-			rxsa->lowest_pn = lpn;
-			secy_set_receive_lowest_pn(participant->kay, rxsa);
-			wpa_printf(MSG_DEBUG, "KaY: update lpn =0x%x", lpn);
-		}
-		/* FIX: Delay protection for olpn not implemented.
-		 * Note that Old Key is only active for MKA_SAK_RETIRE_TIME
-		 * (3 seconds) and delay protection does allow PN's within
-		 * a 2 seconds window, so olpn would be a lot of work for
-		 * just 1 second's worth of protection. */
+	/* FIXME: Secy creates txsa with default npn. If MKA detected Latest Key
+	 * npn is larger than txsa's npn, set it to txsa.
+	 */
+	secy_get_transmit_next_pn(kay, txsa);
+	if (lpn > txsa->next_pn) {
+		secy_set_transmit_next_pn(kay, txsa);
+		wpa_printf(MSG_INFO, "KaY: update lpn =0x%x", lpn);
 	}
 
 	return 0;
@@ -1527,8 +1427,7 @@
 ieee802_1x_mka_dist_sak_body_present(
 	struct ieee802_1x_mka_participant *participant)
 {
-	return participant->is_key_server && participant->to_dist_sak &&
-		participant->new_key;
+	return participant->to_dist_sak && participant->new_key;
 }
 
 
@@ -1579,11 +1478,6 @@
 	}
 
 	sak = participant->new_key;
-	if (!sak) {
-		wpa_printf(MSG_DEBUG,
-			   "KaY: No SAK available to build Distributed SAK parameter set");
-		return -1;
-	}
 	body->confid_offset = sak->confidentiality_offset;
 	body->dan = sak->an;
 	body->kn = host_to_be32(sak->key_identifier.kn);
@@ -1598,7 +1492,7 @@
 		os_memcpy(body->sak, &cs, CS_ID_LEN);
 		sak_pos = CS_ID_LEN;
 	}
-	if (aes_wrap(participant->kek.key, participant->kek.len,
+	if (aes_wrap(participant->kek.key, 16,
 		     cipher_suite_tbl[cs_index].sak_len / 8,
 		     sak->key, body->sak + sak_pos)) {
 		wpa_printf(MSG_ERROR, "KaY: AES wrap failed");
@@ -1620,7 +1514,6 @@
 	pkey->receives = TRUE;
 	os_get_time(&pkey->created_time);
 
-	pkey->next_pn = 1;
 	pkey->user = 1;
 }
 
@@ -1660,7 +1553,7 @@
 	}
 	if (participant->is_key_server) {
 		wpa_printf(MSG_ERROR,
-			   "KaY: Reject distributed SAK since I'm a key server");
+			   "KaY: I can't accept the distributed SAK as myself is key server ");
 		return -1;
 	}
 	if (!kay->macsec_desired ||
@@ -1689,7 +1582,7 @@
 		participant->advised_desired = FALSE;
 		ieee802_1x_cp_connect_authenticated(kay->cp);
 		ieee802_1x_cp_sm_step(kay->cp);
-		wpa_printf(MSG_WARNING, "KaY: The Key server advise no MACsec");
+		wpa_printf(MSG_WARNING, "KaY:The Key server advise no MACsec");
 		participant->to_use_sak = FALSE;
 		return 0;
 	}
@@ -1708,8 +1601,7 @@
 		if (os_memcmp(sa_key->key_identifier.mi,
 			      participant->current_peer_id.mi, MI_LEN) == 0 &&
 		    sa_key->key_identifier.kn == be_to_host32(body->kn)) {
-			wpa_printf(MSG_DEBUG,
-				   "KaY: SAK has already been installed - do not set it again");
+			wpa_printf(MSG_WARNING, "KaY:The Key has installed");
 			return 0;
 		}
 	}
@@ -1720,10 +1612,7 @@
 		kay->macsec_csindex = DEFAULT_CS_INDEX;
 		cs = &cipher_suite_tbl[kay->macsec_csindex];
 	} else {
-		unsigned int idx;
-
-		cs = ieee802_1x_kay_get_cipher_suite(participant, body->sak,
-						     &idx);
+		cs = ieee802_1x_kay_get_cipher_suite(participant, body->sak);
 		if (!cs) {
 			wpa_printf(MSG_ERROR,
 				   "KaY: I can't support the Cipher Suite advised by key server");
@@ -1731,7 +1620,7 @@
 		}
 		sak_len = cs->sak_len;
 		wrap_sak = body->sak + CS_ID_LEN;
-		kay->macsec_csindex = idx;
+		kay->macsec_csindex = cs->index;
 	}
 
 	unwrap_sak = os_zalloc(sak_len);
@@ -1739,13 +1628,13 @@
 		wpa_printf(MSG_ERROR, "KaY-%s: Out of memory", __func__);
 		return -1;
 	}
-	if (aes_unwrap(participant->kek.key, participant->kek.len,
-		       sak_len >> 3, wrap_sak, unwrap_sak)) {
+	if (aes_unwrap(participant->kek.key, 16, sak_len >> 3, wrap_sak,
+		       unwrap_sak)) {
 		wpa_printf(MSG_ERROR, "KaY: AES unwrap failed");
 		os_free(unwrap_sak);
 		return -1;
 	}
-	wpa_hexdump_key(MSG_DEBUG, "\tAES Key Unwrap of SAK.:",
+	wpa_hexdump_key(MSG_DEBUG, "\tAES Key Unwrap of SAK:",
 			unwrap_sak, sak_len);
 
 	sa_key = os_zalloc(sizeof(*sa_key));
@@ -1802,12 +1691,7 @@
 {
 	int length;
 
-	/* Determine if we need space for the ICV Indicator */
-	if (mka_alg_tbl[participant->kay->mka_algindex].icv_len !=
-	    DEFAULT_ICV_LEN)
-		length = sizeof(struct ieee802_1x_mka_icv_body);
-	else
-		length = 0;
+	length = sizeof(struct ieee802_1x_mka_icv_body);
 	length += mka_alg_tbl[participant->kay->mka_algindex].icv_len;
 
 	return MKA_ALIGN_LENGTH(length);
@@ -1826,23 +1710,20 @@
 	u8 cmac[MAX_ICV_LEN];
 
 	length = ieee802_1x_mka_get_icv_length(participant);
-	if (mka_alg_tbl[participant->kay->mka_algindex].icv_len !=
-	    DEFAULT_ICV_LEN)  {
-		wpa_printf(MSG_DEBUG, "KaY: ICV Indicator");
+	if (length != DEFAULT_ICV_LEN)  {
 		body = wpabuf_put(buf, MKA_HDR_LEN);
 		body->type = MKA_ICV_INDICATOR;
-		length -= MKA_HDR_LEN;
-		set_mka_param_body_len(body, length);
+		set_mka_param_body_len(body, length - MKA_HDR_LEN);
 	}
 
 	if (mka_alg_tbl[participant->kay->mka_algindex].icv_hash(
-		    participant->ick.key, participant->ick.len,
-		    wpabuf_head(buf), wpabuf_len(buf), cmac)) {
-		wpa_printf(MSG_ERROR, "KaY: failed to calculate ICV");
+		    participant->ick.key, wpabuf_head(buf), buf->used, cmac)) {
+		wpa_printf(MSG_ERROR, "KaY, omac1_aes_128 failed");
 		return -1;
 	}
-	wpa_hexdump(MSG_DEBUG, "KaY: ICV", cmac, length);
 
+	if (length != DEFAULT_ICV_LEN)
+		length -= MKA_HDR_LEN;
 	os_memcpy(wpabuf_put(buf, length), cmac, length);
 
 	return 0;
@@ -1851,12 +1732,12 @@
 /**
  * ieee802_1x_mka_decode_icv_body -
  */
-static const u8 *
+static u8 *
 ieee802_1x_mka_decode_icv_body(struct ieee802_1x_mka_participant *participant,
 			       const u8 *mka_msg, size_t msg_len)
 {
-	const struct ieee802_1x_mka_hdr *hdr;
-	const struct ieee802_1x_mka_icv_body *body;
+	struct ieee802_1x_mka_hdr *hdr;
+	struct ieee802_1x_mka_icv_body *body;
 	size_t body_len;
 	size_t left_len;
 	u8 body_type;
@@ -1864,12 +1745,12 @@
 
 	pos = mka_msg;
 	left_len = msg_len;
-	while (left_len > MKA_HDR_LEN + DEFAULT_ICV_LEN) {
-		hdr = (const struct ieee802_1x_mka_hdr *) pos;
-		body_len = MKA_ALIGN_LENGTH(get_mka_param_body_len(hdr));
+	while (left_len > (MKA_HDR_LEN + DEFAULT_ICV_LEN)) {
+		hdr = (struct ieee802_1x_mka_hdr *) pos;
+		body_len = get_mka_param_body_len(hdr);
 		body_type = get_mka_param_body_type(hdr);
 
-		if (left_len < body_len + MKA_HDR_LEN)
+		if (left_len < (body_len + MKA_HDR_LEN))
 			break;
 
 		if (body_type != MKA_ICV_INDICATOR) {
@@ -1878,15 +1759,16 @@
 			continue;
 		}
 
-		body = (const struct ieee802_1x_mka_icv_body *) pos;
+		body = (struct ieee802_1x_mka_icv_body *)pos;
 		if (body_len
-		    < mka_alg_tbl[participant->kay->mka_algindex].icv_len)
+			< mka_alg_tbl[participant->kay->mka_algindex].icv_len) {
 			return NULL;
+		}
 
 		return body->icv;
 	}
 
-	return mka_msg + msg_len - DEFAULT_ICV_LEN;
+	return (u8 *) (mka_msg + msg_len - DEFAULT_ICV_LEN);
 }
 
 
@@ -1905,7 +1787,7 @@
 	body_len = get_mka_param_body_len(hdr);
 	if (body_len < 28) {
 		wpa_printf(MSG_ERROR,
-			   "KaY: MKA Use CAK Packet Body Length (%zu bytes) should be 28 or more octets",
+			   "KaY: MKA Use SAK Packet Body Length (%zu bytes) should be 28 or more octets",
 			   body_len);
 		return -1;
 	}
@@ -1929,7 +1811,7 @@
 	body_len = get_mka_param_body_len(hdr);
 	if (body_len < 5) {
 		wpa_printf(MSG_ERROR,
-			   "KaY: MKA Use KMD Packet Body Length (%zu bytes) should be 5 or more octets",
+			   "KaY: MKA Use SAK Packet Body Length (%zu bytes) should be 5 or more octets",
 			   body_len);
 		return -1;
 	}
@@ -1960,7 +1842,7 @@
 
 
 static struct mka_param_body_handler mka_body_handler[] = {
-	/* Basic parameter set */
+	/* basic parameter set */
 	{
 		.body_tx      = ieee802_1x_mka_encode_basic_body,
 		.body_rx      = NULL,
@@ -1968,7 +1850,7 @@
 		.body_present = ieee802_1x_mka_basic_body_present
 	},
 
-	/* Live Peer List parameter set */
+	/* live peer list parameter set */
 	{
 		.body_tx      = ieee802_1x_mka_encode_live_peer_body,
 		.body_rx      = ieee802_1x_mka_decode_live_peer_body,
@@ -1976,7 +1858,7 @@
 		.body_present = ieee802_1x_mka_live_peer_body_present
 	},
 
-	/* Potential Peer List parameter set */
+	/* potential peer list parameter set */
 	{
 		.body_tx      = ieee802_1x_mka_encode_potential_peer_body,
 		.body_rx      = ieee802_1x_mka_decode_potential_peer_body,
@@ -1984,7 +1866,7 @@
 		.body_present = ieee802_1x_mka_potential_peer_body_present
 	},
 
-	/* MACsec SAK Use parameter set */
+	/* sak use parameter set */
 	{
 		.body_tx      = ieee802_1x_mka_encode_sak_use_body,
 		.body_rx      = ieee802_1x_mka_decode_sak_use_body,
@@ -1992,7 +1874,7 @@
 		.body_present = ieee802_1x_mka_sak_use_body_present
 	},
 
-	/* Distributed SAK parameter set */
+	/* distribute sak parameter set */
 	{
 		.body_tx      = ieee802_1x_mka_encode_dist_sak_body,
 		.body_rx      = ieee802_1x_mka_decode_dist_sak_body,
@@ -2000,7 +1882,7 @@
 		.body_present = ieee802_1x_mka_dist_sak_body_present
 	},
 
-	/* Distribute CAK parameter set */
+	/* distribute cak parameter set */
 	{
 		.body_tx      = NULL,
 		.body_rx      = ieee802_1x_mka_decode_dist_cak_body,
@@ -2008,7 +1890,7 @@
 		.body_present = NULL
 	},
 
-	/* KMD parameter set */
+	/* kmd parameter set */
 	{
 		.body_tx      = NULL,
 		.body_rx      = ieee802_1x_mka_decode_kmd_body,
@@ -2016,7 +1898,7 @@
 		.body_present = NULL
 	},
 
-	/* Announcement parameter set */
+	/* announce parameter set */
 	{
 		.body_tx      = NULL,
 		.body_rx      = ieee802_1x_mka_decode_announce_body,
@@ -2024,7 +1906,7 @@
 		.body_present = NULL
 	},
 
-	/* ICV Indicator parameter set */
+	/* icv parameter set */
 	{
 		.body_tx      = ieee802_1x_mka_encode_icv_body,
 		.body_rx      = NULL,
@@ -2083,7 +1965,7 @@
 	 */
 	if (dl_list_empty(&participant->live_peers)) {
 		wpa_printf(MSG_ERROR,
-			   "KaY: Live peers list must not be empty when generating fresh SAK");
+			   "KaY: Live peers list must not empty when generating fresh SAK");
 		return -1;
 	}
 
@@ -2097,7 +1979,7 @@
 	 */
 	if ((time(NULL) - kay->dist_time) < MKA_LIFE_TIME / 1000) {
 		wpa_printf(MSG_ERROR,
-			   "KaY: Life time has not elapsed since prior SAK distributed");
+			   "KaY: Life time have not elapsed since prior SAK distributed");
 		return -1;
 	}
 
@@ -2134,17 +2016,14 @@
 	ctx_offset += sizeof(participant->mi);
 	os_memcpy(context + ctx_offset, &kay->dist_kn, sizeof(kay->dist_kn));
 
-	if (key_len == 16 || key_len == 32) {
-		if (ieee802_1x_sak_aes_cmac(participant->cak.key,
-					    participant->cak.len,
-					    context, ctx_len,
-					    key, key_len)) {
-			wpa_printf(MSG_ERROR, "KaY: Failed to generate SAK");
-			goto fail;
-		}
+	if (key_len == 16) {
+		ieee802_1x_sak_128bits_aes_cmac(participant->cak.key,
+						context, ctx_len, key);
+	} else if (key_len == 32) {
+		ieee802_1x_sak_128bits_aes_cmac(participant->cak.key,
+						context, ctx_len, key);
 	} else {
-		wpa_printf(MSG_ERROR, "KaY: SAK Length(%u) not supported",
-			   key_len);
+		wpa_printf(MSG_ERROR, "KaY: SAK Length not support");
 		goto fail;
 	}
 	wpa_hexdump_key(MSG_DEBUG, "KaY: generated new SAK", key, key_len);
@@ -2276,7 +2155,7 @@
 		participant->is_key_server = TRUE;
 		participant->principal = TRUE;
 		participant->new_sak = TRUE;
-		wpa_printf(MSG_DEBUG, "KaY: I am elected as key server");
+		wpa_printf(MSG_DEBUG, "KaY: I is elected as key server");
 		participant->to_dist_sak = FALSE;
 		participant->is_elected = TRUE;
 
@@ -2284,9 +2163,6 @@
 			  sizeof(kay->key_server_sci));
 		kay->key_server_priority = kay->actor_priority;
 	} else if (key_server) {
-		wpa_printf(MSG_DEBUG,
-			   "KaY: Peer %s was elected as the key server",
-			   mi_txt(key_server->mi));
 		ieee802_1x_cp_set_electedself(kay->cp, FALSE);
 		if (!sci_equal(&kay->key_server_sci, &key_server->sci)) {
 			ieee802_1x_cp_signal_chgdserver(kay->cp);
@@ -2405,19 +2281,11 @@
 	os_memcpy(ether_hdr->src, participant->kay->actor_sci.addr,
 		  sizeof(ether_hdr->dest));
 	ether_hdr->ethertype = host_to_be16(ETH_P_EAPOL);
-	wpa_printf(MSG_DEBUG, "KaY: Ethernet header: DA=" MACSTR " SA=" MACSTR
-		   " Ethertype=0x%x",
-		   MAC2STR(ether_hdr->dest), MAC2STR(ether_hdr->src),
-		   be_to_host16(ether_hdr->ethertype));
 
 	eapol_hdr = wpabuf_put(pbuf, sizeof(*eapol_hdr));
 	eapol_hdr->version = EAPOL_VERSION;
 	eapol_hdr->type = IEEE802_1X_TYPE_EAPOL_MKA;
-	eapol_hdr->length = host_to_be16(wpabuf_tailroom(pbuf));
-	wpa_printf(MSG_DEBUG,
-		   "KaY: Common EAPOL PDU structure: Protocol Version=%u Packet Type=%u Packet Body Length=%u",
-		   eapol_hdr->version, eapol_hdr->type,
-		   be_to_host16(eapol_hdr->length));
+	eapol_hdr->length = host_to_be16(pbuf->size - pbuf->used);
 
 	for (i = 0; i < ARRAY_SIZE(mka_body_handler); i++) {
 		if (mka_body_handler[i].body_present &&
@@ -2430,7 +2298,6 @@
 	return 0;
 }
 
-
 /**
  * ieee802_1x_participant_send_mkpdu -
  */
@@ -2443,8 +2310,7 @@
 	size_t length = 0;
 	unsigned int i;
 
-	wpa_printf(MSG_DEBUG, "KaY: Encode and send an MKPDU (ifname=%s)",
-		   kay->if_name);
+	wpa_printf(MSG_DEBUG, "KaY: to enpacket and send the MKPDU");
 	length += sizeof(struct ieee802_1x_hdr) + sizeof(struct ieee8023_hdr);
 	for (i = 0; i < ARRAY_SIZE(mka_body_handler); i++) {
 		if (mka_body_handler[i].body_present &&
@@ -2459,11 +2325,10 @@
 	}
 
 	if (ieee802_1x_kay_encode_mkpdu(participant, buf)) {
-		wpa_printf(MSG_ERROR, "KaY: encode mkpdu fail");
+		wpa_printf(MSG_ERROR, "KaY: encode mkpdu fail!");
 		return -1;
 	}
 
-	wpa_hexdump_buf(MSG_MSGDUMP, "KaY: Outgoing MKPDU", buf);
 	l2_packet_send(kay->l2_mka, NULL, 0, wpabuf_head(buf), wpabuf_len(buf));
 	wpabuf_free(buf);
 
@@ -2500,8 +2365,6 @@
 
 	participant = (struct ieee802_1x_mka_participant *)eloop_ctx;
 	kay = participant->kay;
-	wpa_printf(MSG_DEBUG, "KaY: Participant timer (ifname=%s)",
-		   kay->if_name);
 	if (participant->cak_life) {
 		if (now > participant->cak_life)
 			goto delete_mka;
@@ -2589,7 +2452,7 @@
 		}
 	}
 
-	if (participant->new_sak && participant->is_key_server) {
+	if (participant->new_sak) {
 		if (!ieee802_1x_kay_generate_new_sak(participant))
 			participant->to_dist_sak = TRUE;
 
@@ -2602,7 +2465,7 @@
 		participant->retry_count++;
 	}
 
-	eloop_register_timeout(kay->mka_hello_time / 1000, 0,
+	eloop_register_timeout(MKA_HELLO_TIME / 1000, 0,
 			       ieee802_1x_participant_timer,
 			       participant, NULL);
 
@@ -2651,7 +2514,7 @@
 
 	dl_list_add(&psc->sa_list, &psa->list);
 	wpa_printf(MSG_DEBUG,
-		   "KaY: Create transmit SA(an: %hhu, next_pn: %u) of SC",
+		   "KaY: Create transmit SA(an: %hhu, next_PN: %u) of SC",
 		   an, next_PN);
 
 	return psa;
@@ -2694,8 +2557,8 @@
 	psc->enciphering_sa = FALSE;
 
 	dl_list_init(&psc->sa_list);
-	wpa_printf(MSG_DEBUG, "KaY: Create transmit SC - SCI: %s",
-		   sci_txt(&psc->sci));
+	wpa_printf(MSG_DEBUG, "KaY: Create transmit SC");
+	wpa_hexdump(MSG_DEBUG, "SCI: ", (u8 *)sci , sizeof(*sci));
 
 	return psc;
 }
@@ -2846,7 +2709,7 @@
 		}
 	}
 	if (!latest_sak) {
-		wpa_printf(MSG_ERROR, "KaY: lki related sak not found");
+		wpa_printf(MSG_ERROR, "lki related sak not found");
 		return -1;
 	}
 
@@ -2867,9 +2730,7 @@
 		ieee802_1x_delete_transmit_sa(kay, txsa);
 
 	txsa = ieee802_1x_kay_init_transmit_sa(principal->txsc, latest_sak->an,
-					       latest_sak->next_pn ?
-					       latest_sak->next_pn : 1,
-					       latest_sak);
+					       1, latest_sak);
 	if (!txsa)
 		return -1;
 
@@ -2918,12 +2779,12 @@
 	dl_list_for_each_safe(sa_key, pre_key, &principal->sak_list,
 			      struct data_key, list) {
 		if (is_ki_equal(&sa_key->key_identifier, ki)) {
-			if (principal->new_key == sa_key)
-				principal->new_key = NULL;
 			dl_list_del(&sa_key->list);
 			ieee802_1x_kay_deinit_data_key(sa_key);
 			break;
 		}
+		if (principal->new_key == sa_key)
+			principal->new_key = NULL;
 	}
 
 	return 0;
@@ -3011,8 +2872,7 @@
 
 /**
  * ieee802_1x_kay_mkpdu_sanity_check -
- * Sanity checks specified in IEEE Std 802.1X-2010, 11.11.2 (Validation of
- * MKPDUs)
+ *     sanity check specified in clause 11.11.2 of IEEE802.1X-2010
  */
 static int ieee802_1x_kay_mkpdu_sanity_check(struct ieee802_1x_kay *kay,
 					     const u8 *buf, size_t len)
@@ -3026,49 +2886,34 @@
 	size_t body_len;
 	size_t ckn_len;
 	u8 icv[MAX_ICV_LEN];
-	const u8 *msg_icv;
+	u8 *msg_icv;
 
-	/* len > eth+eapol header already verified in kay_l2_receive();
-	 * likewise, eapol_hdr->length validated there */
 	eth_hdr = (struct ieee8023_hdr *) buf;
 	eapol_hdr = (struct ieee802_1x_hdr *) (eth_hdr + 1);
 	mka_hdr = (struct ieee802_1x_mka_hdr *) (eapol_hdr + 1);
 
-	wpa_printf(MSG_DEBUG, "KaY: Ethernet header: DA=" MACSTR " SA=" MACSTR
-		   " Ethertype=0x%x",
-		   MAC2STR(eth_hdr->dest), MAC2STR(eth_hdr->src),
-		   be_to_host16(eth_hdr->ethertype));
-
-	/* the destination address shall not be an individual address */
+	/* destination address should be not individual address */
 	if (os_memcmp(eth_hdr->dest, pae_group_addr, ETH_ALEN) != 0) {
-		wpa_printf(MSG_DEBUG,
+		wpa_printf(MSG_MSGDUMP,
 			   "KaY: ethernet destination address is not PAE group address");
 		return -1;
 	}
 
-	wpa_printf(MSG_DEBUG,
-		   "KaY: Common EAPOL PDU structure: Protocol Version=%u Packet Type=%u Packet Body Length=%u",
-		   eapol_hdr->version, eapol_hdr->type,
-		   be_to_host16(eapol_hdr->length));
-
-	/* MKPDU shall not be less than 32 octets */
+	/* MKPDU should not be less than 32 octets */
 	mka_msg_len = be_to_host16(eapol_hdr->length);
 	if (mka_msg_len < 32) {
-		wpa_printf(MSG_DEBUG, "KaY: MKPDU is less than 32 octets");
+		wpa_printf(MSG_MSGDUMP, "KaY: MKPDU is less than 32 octets");
 		return -1;
 	}
-	/* MKPDU shall be a multiple of 4 octets */
+	/* MKPDU should be a multiple of 4 octets */
 	if ((mka_msg_len % 4) != 0) {
-		wpa_printf(MSG_DEBUG,
+		wpa_printf(MSG_MSGDUMP,
 			   "KaY: MKPDU is not multiple of 4 octets");
 		return -1;
 	}
 
-	wpa_hexdump(MSG_MSGDUMP, "KaY: EAPOL-MKA Packet Body (MKPDU)",
-		    mka_hdr, mka_msg_len);
-
-	/* Room for body_len already verified in kay_l2_receive() */
 	body = (struct ieee802_1x_mka_basic_body *) mka_hdr;
+	ieee802_1x_mka_dump_basic_body(body);
 	body_len = get_mka_param_body_len(body);
 	/* EAPOL-MKA body should comprise basic parameter set and ICV */
 	if (mka_msg_len < MKA_HDR_LEN + body_len + DEFAULT_ICV_LEN) {
@@ -3087,27 +2932,24 @@
 	ckn_len = body_len -
 		(sizeof(struct ieee802_1x_mka_basic_body) - MKA_HDR_LEN);
 	if (ckn_len < 1 || ckn_len > MAX_CKN_LEN) {
-		wpa_printf(MSG_WARNING,
+		wpa_printf(MSG_ERROR,
 			   "KaY: Received EAPOL-MKA CKN Length (%zu bytes) is out of range (<= %u bytes)",
 			   ckn_len, MAX_CKN_LEN);
 		return -1;
 	}
 
-	ieee802_1x_mka_dump_basic_body(body);
-
 	/* CKN should be owned by I */
 	participant = ieee802_1x_kay_get_participant(kay, body->ckn, ckn_len);
 	if (!participant) {
-		wpa_printf(MSG_DEBUG, "KaY: CKN is not included in my CA");
+		wpa_printf(MSG_DEBUG, "CKN is not included in my CA");
 		return -1;
 	}
 
 	/* algorithm agility check */
 	if (os_memcmp(body->algo_agility, mka_algo_agility,
 		      sizeof(body->algo_agility)) != 0) {
-		wpa_printf(MSG_INFO,
-			   "KaY: Peer's algorithm agility (%s) not supported",
-			   algo_agility_txt(body->algo_agility));
+		wpa_printf(MSG_ERROR,
+			   "KaY: peer's algorithm agility not supported for me");
 		return -1;
 	}
 
@@ -3117,29 +2959,23 @@
 	 * its size, not the fixed length 16 octets, indicated by the EAPOL
 	 * packet body length.
 	 */
-	if (len < mka_alg_tbl[kay->mka_algindex].icv_len ||
-	    mka_alg_tbl[kay->mka_algindex].icv_hash(
-		    participant->ick.key, participant->ick.len,
+	if (mka_alg_tbl[kay->mka_algindex].icv_hash(
+		    participant->ick.key,
 		    buf, len - mka_alg_tbl[kay->mka_algindex].icv_len, icv)) {
-		wpa_printf(MSG_ERROR, "KaY: Failed to calculate ICV");
+		wpa_printf(MSG_ERROR, "KaY: omac1_aes_128 failed");
 		return -1;
 	}
 
-	msg_icv = ieee802_1x_mka_decode_icv_body(participant,
-						 (const u8 *) mka_hdr,
+	msg_icv = ieee802_1x_mka_decode_icv_body(participant, (u8 *) mka_hdr,
 						 mka_msg_len);
 	if (!msg_icv) {
-		wpa_printf(MSG_WARNING, "KaY: No ICV in MKPDU - ignore it");
+		wpa_printf(MSG_ERROR, "KaY: No ICV");
 		return -1;
 	}
-	wpa_hexdump(MSG_DEBUG, "KaY: Received ICV",
-		    msg_icv, mka_alg_tbl[kay->mka_algindex].icv_len);
 	if (os_memcmp_const(msg_icv, icv,
 			    mka_alg_tbl[kay->mka_algindex].icv_len) != 0) {
-		wpa_printf(MSG_WARNING,
+		wpa_printf(MSG_ERROR,
 			   "KaY: Computed ICV is not equal to Received ICV");
-		wpa_hexdump(MSG_DEBUG, "KaY: Calculated ICV",
-			    icv, mka_alg_tbl[kay->mka_algindex].icv_len);
 		return -1;
 	}
 
@@ -3155,19 +2991,13 @@
 {
 	struct ieee802_1x_mka_participant *participant;
 	struct ieee802_1x_mka_hdr *hdr;
-	struct ieee802_1x_kay_peer *peer;
 	size_t body_len;
 	size_t left_len;
 	u8 body_type;
 	int i;
 	const u8 *pos;
 	Boolean handled[256];
-	Boolean bad_sak_use = FALSE; /* Error detected while processing SAK Use
-				      * parameter set */
-	Boolean i_in_peerlist, is_in_live_peer, is_in_potential_peer;
 
-	wpa_printf(MSG_DEBUG, "KaY: Decode received MKPDU (ifname=%s)",
-		   kay->if_name);
 	if (ieee802_1x_kay_mkpdu_sanity_check(kay, buf, len))
 		return -1;
 
@@ -3181,24 +3011,17 @@
 
 	/* to skip basic parameter set */
 	hdr = (struct ieee802_1x_mka_hdr *) pos;
-	body_len = MKA_ALIGN_LENGTH(get_mka_param_body_len(hdr));
-	if (left_len < body_len + MKA_HDR_LEN)
-		return -1;
+	body_len = get_mka_param_body_len(hdr);
 	pos += body_len + MKA_HDR_LEN;
 	left_len -= body_len + MKA_HDR_LEN;
 
 	/* check i am in the peer's peer list */
-	i_in_peerlist = ieee802_1x_mka_i_in_peerlist(participant, pos,
-						     left_len);
-	is_in_live_peer = ieee802_1x_kay_is_in_live_peer(
-		participant, participant->current_peer_id.mi);
-	wpa_printf(MSG_DEBUG, "KaY: i_in_peerlist=%s is_in_live_peer=%s",
-		   yes_no(i_in_peerlist), yes_no(is_in_live_peer));
-	if (i_in_peerlist && !is_in_live_peer) {
+	if (ieee802_1x_mka_i_in_peerlist(participant, pos, left_len) &&
+	    !ieee802_1x_kay_is_in_live_peer(participant,
+					    participant->current_peer_id.mi)) {
 		/* accept the peer as live peer */
-		is_in_potential_peer = ieee802_1x_kay_is_in_potential_peer(
-			participant, participant->current_peer_id.mi);
-		if (is_in_potential_peer) {
+		if (ieee802_1x_kay_is_in_potential_peer(
+			    participant, participant->current_peer_id.mi)) {
 			if (!ieee802_1x_kay_move_live_peer(
 				    participant,
 				    participant->current_peer_id.mi,
@@ -3228,7 +3051,7 @@
 	     pos += body_len + MKA_HDR_LEN,
 		     left_len -= body_len + MKA_HDR_LEN) {
 		hdr = (struct ieee802_1x_mka_hdr *) pos;
-		body_len = MKA_ALIGN_LENGTH(get_mka_param_body_len(hdr));
+		body_len = get_mka_param_body_len(hdr);
 		body_type = get_mka_param_body_type(hdr);
 
 		if (body_type == MKA_ICV_INDICATOR)
@@ -3242,103 +3065,21 @@
 			return -1;
 		}
 
-		if (handled[body_type]) {
-			wpa_printf(MSG_DEBUG,
-				   "KaY: Ignore duplicated body type %u",
-				   body_type);
+		if (handled[body_type])
 			continue;
-		}
 
 		handled[body_type] = TRUE;
 		if (body_type < ARRAY_SIZE(mka_body_handler) &&
 		    mka_body_handler[body_type].body_rx) {
-			if (mka_body_handler[body_type].body_rx
-				(participant, pos, left_len) != 0) {
-				/* Handle parameter set failure */
-				if (body_type != MKA_SAK_USE) {
-					wpa_printf(MSG_INFO,
-						   "KaY: Discarding Rx MKPDU: decode of parameter set type (%d) failed",
-						   body_type);
-					return -1;
-				}
-
-				/* Ideally DIST-SAK should be processed before
-				 * SAK-USE. Unfortunately IEEE Std 802.1X-2010,
-				 * 11.11.3 (Encoding MKPDUs) states SAK-USE(3)
-				 * must always be encoded before DIST-SAK(4).
-				 * Rather than redesigning mka_body_handler so
-				 * that it somehow processes DIST-SAK before
-				 * SAK-USE, just ignore SAK-USE failures if
-				 * DIST-SAK is also present in this MKPDU. */
-				bad_sak_use = TRUE;
-			}
+			mka_body_handler[body_type].body_rx
+				(participant, pos, left_len);
 		} else {
 			wpa_printf(MSG_ERROR,
-				   "KaY: The body type %d is not supported in this MKA version %d",
+				   "The type %d is not supported in this MKA version %d",
 				   body_type, MKA_VERSION_ID);
 		}
 	}
 
-	if (bad_sak_use && !handled[MKA_DISTRIBUTED_SAK]) {
-		wpa_printf(MSG_INFO,
-			   "KaY: Discarding Rx MKPDU: decode of parameter set type (%d) failed",
-			   MKA_SAK_USE);
-		if (!reset_participant_mi(participant))
-			wpa_printf(MSG_DEBUG, "KaY: Could not update mi");
-		else
-			wpa_printf(MSG_DEBUG,
-				   "KaY: Selected a new random MI: %s",
-				   mi_txt(participant->mi));
-		return -1;
-	}
-
-	/* Detect missing parameter sets */
-	peer = ieee802_1x_kay_get_live_peer(participant,
-					    participant->current_peer_id.mi);
-	if (peer) {
-		/* MKPDU is from live peer */
-		if (!handled[MKA_SAK_USE]) {
-			/* Once a live peer starts sending SAK-USE, it should be
-			 * sent every time. */
-			if (peer->sak_used) {
-				wpa_printf(MSG_INFO,
-					   "KaY: Discarding Rx MKPDU: Live Peer stopped sending SAK-USE");
-				return -1;
-			}
-
-			/* Live peer is probably hung if it hasn't sent SAK-USE
-			 * after a reasonable number of MKPDUs. Drop the MKPDU,
-			 * which will eventually force an timeout. */
-			if (++peer->missing_sak_use_count >
-			    MAX_MISSING_SAK_USE) {
-				wpa_printf(MSG_INFO,
-					   "KaY: Discarding Rx MKPDU: Live Peer not sending SAK-USE");
-				return -1;
-			}
-		} else {
-			peer->missing_sak_use_count = 0;
-
-			/* Only update live peer watchdog after successful
-			 * decode of all parameter sets */
-			peer->expire = time(NULL) + MKA_LIFE_TIME / 1000;
-		}
-	} else {
-		/* MKPDU is from new or potential peer */
-		peer = ieee802_1x_kay_get_peer(participant,
-					       participant->current_peer_id.mi);
-		if (!peer) {
-			wpa_printf(MSG_DEBUG, "KaY: No peer entry found");
-			return -1;
-		}
-
-		/* Do not update potential peer watchdog. Per IEEE Std
-		 * 802.1X-2010, 9.4.3, potential peers need to show liveness by
-		 * including our MI/MN in their transmitted MKPDU (within
-		 * potential or live parameter sets). Whena potential peer does
-		 * include our MI/MN in an MKPDU, we respond by moving the peer
-		 * from 'potential_peers' to 'live_peers'. */
-	}
-
 	kay->active = TRUE;
 	participant->retry_count = 0;
 	participant->active = TRUE;
@@ -3354,9 +3095,6 @@
 	struct ieee802_1x_kay *kay = ctx;
 	struct ieee8023_hdr *eth_hdr;
 	struct ieee802_1x_hdr *eapol_hdr;
-	size_t calc_len;
-
-	/* IEEE Std 802.1X-2010, 11.4 (Validation of received EAPOL PDUs) */
 
 	/* must contain at least ieee8023_hdr + ieee802_1x_hdr */
 	if (len < sizeof(*eth_hdr) + sizeof(*eapol_hdr)) {
@@ -3367,21 +3105,13 @@
 
 	eth_hdr = (struct ieee8023_hdr *) buf;
 	eapol_hdr = (struct ieee802_1x_hdr *) (eth_hdr + 1);
-	calc_len = sizeof(*eth_hdr) + sizeof(*eapol_hdr) +
-		be_to_host16(eapol_hdr->length);
-	if (len < calc_len) {
-		wpa_printf(MSG_MSGDUMP, "KaY: EAPOL MPDU is invalid: (received len %lu, calculated len %lu, EAPOL length %u)",
+	if (len != sizeof(*eth_hdr) + sizeof(*eapol_hdr) +
+	    be_to_host16(eapol_hdr->length)) {
+		wpa_printf(MSG_MSGDUMP, "KAY: EAPOL MPDU is invalid: (%lu-%lu)",
 			   (unsigned long) len,
-			   (unsigned long) calc_len,
-			   be_to_host16(eapol_hdr->length));
+			   (unsigned long) be_to_host16(eapol_hdr->length));
 		return;
 	}
-	if (len > calc_len) {
-		wpa_hexdump(MSG_DEBUG,
-			    "KaY: Ignore extra octets following the Packey Body field",
-			    &buf[calc_len], len - calc_len);
-		len = calc_len;
-	}
 
 	if (eapol_hdr->version < EAPOL_VERSION) {
 		wpa_printf(MSG_MSGDUMP, "KaY: version %d does not support MKA",
@@ -3390,12 +3120,11 @@
 	}
 	if (be_to_host16(eth_hdr->ethertype) != ETH_P_PAE ||
 	    eapol_hdr->type != IEEE802_1X_TYPE_EAPOL_MKA)
-		return; /* ignore other EAPOL types silently here */
+		return;
 
-	wpa_hexdump(MSG_DEBUG, "KaY: RX EAPOL-MKA", buf, len);
+	wpa_hexdump(MSG_DEBUG, "RX EAPOL-MKA: ", buf, len);
 	if (dl_list_empty(&kay->participant_list)) {
-		wpa_printf(MSG_ERROR,
-			   "KaY: No MKA participant instance - ignore EAPOL-MKA");
+		wpa_printf(MSG_ERROR, "KaY: no MKA participant instance");
 		return;
 	}
 
@@ -3408,14 +3137,10 @@
  */
 struct ieee802_1x_kay *
 ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
-		    Boolean macsec_replay_protect, u32 macsec_replay_window,
 		    u16 port, u8 priority, const char *ifname, const u8 *addr)
 {
 	struct ieee802_1x_kay *kay;
 
-	wpa_printf(MSG_DEBUG, "KaY: Initialize - ifname=%s addr=" MACSTR
-		   " port=%u priority=%u",
-		   ifname, MAC2STR(addr), port, priority);
 	kay = os_zalloc(sizeof(*kay));
 	if (!kay) {
 		wpa_printf(MSG_ERROR, "KaY-%s: out of memory", __func__);
@@ -3436,8 +3161,6 @@
 	os_strlcpy(kay->if_name, ifname, IFNAMSIZ);
 	os_memcpy(kay->actor_sci.addr, addr, ETH_ALEN);
 	kay->actor_sci.port = host_to_be16(port ? port : 0x0001);
-	wpa_printf(MSG_DEBUG, "KaY: Generated SCI: %s",
-		   sci_txt(&kay->actor_sci));
 	kay->actor_priority = priority;
 
 	/* While actor acts as a key server, shall distribute sakey */
@@ -3464,27 +3187,21 @@
 		kay->macsec_capable = MACSEC_CAP_NOT_IMPLEMENTED;
 		kay->macsec_desired = FALSE;
 		kay->macsec_protect = FALSE;
-		kay->macsec_encrypt = FALSE;
 		kay->macsec_validate = Disabled;
 		kay->macsec_replay_protect = FALSE;
 		kay->macsec_replay_window = 0;
 		kay->macsec_confidentiality = CONFIDENTIALITY_NONE;
-		kay->mka_hello_time = MKA_HELLO_TIME;
 	} else {
 		kay->macsec_desired = TRUE;
 		kay->macsec_protect = TRUE;
-		if (kay->macsec_capable >= MACSEC_CAP_INTEG_AND_CONF &&
-		    policy == SHOULD_ENCRYPT) {
-			kay->macsec_encrypt = TRUE;
-			kay->macsec_confidentiality = CONFIDENTIALITY_OFFSET_0;
-		} else { /* SHOULD_SECURE */
-			kay->macsec_encrypt = FALSE;
-			kay->macsec_confidentiality = CONFIDENTIALITY_NONE;
-		}
+		kay->macsec_encrypt = policy == SHOULD_ENCRYPT;
 		kay->macsec_validate = Strict;
-		kay->macsec_replay_protect = macsec_replay_protect;
-		kay->macsec_replay_window = macsec_replay_window;
-		kay->mka_hello_time = MKA_HELLO_TIME;
+		kay->macsec_replay_protect = FALSE;
+		kay->macsec_replay_window = 0;
+		if (kay->macsec_capable >= MACSEC_CAP_INTEG_AND_CONF)
+			kay->macsec_confidentiality = CONFIDENTIALITY_OFFSET_0;
+		else
+			kay->macsec_confidentiality = CONFIDENTIALITY_NONE;
 	}
 
 	wpa_printf(MSG_DEBUG, "KaY: state machine created");
@@ -3556,19 +3273,6 @@
 }
 
 
-static const char * mode_txt(enum mka_created_mode mode)
-{
-	switch (mode) {
-	case PSK:
-		return "PSK";
-	case EAP_EXCHANGE:
-		return "EAP";
-	}
-
-	return "?";
-}
-
-
 /**
  * ieee802_1x_kay_create_mka -
  */
@@ -3581,22 +3285,17 @@
 	struct ieee802_1x_mka_participant *participant;
 	unsigned int usecs;
 
-	wpa_printf(MSG_DEBUG,
-		   "KaY: Create MKA (ifname=%s mode=%s authenticator=%s)",
-		   kay->if_name, mode_txt(mode), yes_no(is_authenticator));
-
 	if (!kay || !ckn || !cak) {
 		wpa_printf(MSG_ERROR, "KaY: ckn or cak is null");
 		return NULL;
 	}
 
-	if (cak->len != 16 && cak->len != 32) {
-		wpa_printf(MSG_ERROR, "KaY: Unexpected CAK length %u",
-			   (unsigned int) cak->len);
+	if (cak->len != mka_alg_tbl[kay->mka_algindex].cak_len) {
+		wpa_printf(MSG_ERROR, "KaY: CAK length not follow key schema");
 		return NULL;
 	}
 	if (ckn->len > MAX_CKN_LEN) {
-		wpa_printf(MSG_ERROR, "KaY: CKN is out of range (>32 bytes)");
+		wpa_printf(MSG_ERROR, "KaY: CKN is out of range(<=32 bytes)");
 		return NULL;
 	}
 	if (!kay->enable) {
@@ -3612,12 +3311,8 @@
 
 	participant->ckn.len = ckn->len;
 	os_memcpy(participant->ckn.name, ckn->name, ckn->len);
-	wpa_hexdump(MSG_DEBUG, "KaY: CKN", participant->ckn.name,
-		    participant->ckn.len);
 	participant->cak.len = cak->len;
 	os_memcpy(participant->cak.key, cak->key, cak->len);
-	wpa_hexdump_key(MSG_DEBUG, "KaY: CAK", participant->cak.key,
-			participant->cak.len);
 	if (life)
 		participant->cak_life = life + time(NULL);
 
@@ -3667,8 +3362,6 @@
 
 	if (!reset_participant_mi(participant))
 		goto fail;
-	wpa_printf(MSG_DEBUG, "KaY: Selected random MI: %s",
-		   mi_txt(participant->mi));
 
 	participant->lrx = FALSE;
 	participant->ltx = FALSE;
@@ -3684,40 +3377,37 @@
 	secy_cp_control_protect_frames(kay, kay->macsec_protect);
 	secy_cp_control_replay(kay, kay->macsec_replay_protect,
 			       kay->macsec_replay_window);
-	if (secy_create_transmit_sc(kay, participant->txsc))
-		goto fail;
+	secy_create_transmit_sc(kay, participant->txsc);
 
 	/* to derive KEK from CAK and CKN */
-	participant->kek.len = participant->cak.len;
+	participant->kek.len = mka_alg_tbl[kay->mka_algindex].kek_len;
 	if (mka_alg_tbl[kay->mka_algindex].kek_trfm(participant->cak.key,
-						    participant->cak.len,
 						    participant->ckn.name,
 						    participant->ckn.len,
-						    participant->kek.key,
-						    participant->kek.len)) {
-		wpa_printf(MSG_ERROR, "KaY: KEK derivation failed");
+						    participant->kek.key)) {
+		wpa_printf(MSG_ERROR, "KaY: Derived KEK failed");
 		goto fail;
 	}
 	wpa_hexdump_key(MSG_DEBUG, "KaY: Derived KEK",
 			participant->kek.key, participant->kek.len);
 
 	/* to derive ICK from CAK and CKN */
-	participant->ick.len = participant->cak.len;
+	participant->ick.len = mka_alg_tbl[kay->mka_algindex].ick_len;
 	if (mka_alg_tbl[kay->mka_algindex].ick_trfm(participant->cak.key,
-						    participant->cak.len,
 						    participant->ckn.name,
 						    participant->ckn.len,
-						    participant->ick.key,
-						    participant->ick.len)) {
-		wpa_printf(MSG_ERROR, "KaY: ICK derivation failed");
+						    participant->ick.key)) {
+		wpa_printf(MSG_ERROR, "KaY: Derived ICK failed");
 		goto fail;
 	}
 	wpa_hexdump_key(MSG_DEBUG, "KaY: Derived ICK",
 			participant->ick.key, participant->ick.len);
 
 	dl_list_add(&kay->participant_list, &participant->list);
+	wpa_hexdump(MSG_DEBUG, "KaY: Participant created:",
+		    ckn->name, ckn->len);
 
-	usecs = os_random() % (kay->mka_hello_time * 1000);
+	usecs = os_random() % (MKA_HELLO_TIME * 1000);
 	eloop_register_timeout(0, usecs, ieee802_1x_participant_timer,
 			       participant, NULL);
 
@@ -3735,7 +3425,6 @@
 	return participant;
 
 fail:
-	os_free(participant->txsc);
 	os_free(participant);
 	return NULL;
 }
@@ -3891,7 +3580,6 @@
 
 
 #ifdef CONFIG_CTRL_IFACE
-
 /**
  * ieee802_1x_kay_get_status - Get IEEE 802.1X KaY status details
  * @sm: Pointer to KaY allocated with ieee802_1x_kay_init()
@@ -3900,24 +3588,19 @@
  * @verbose: Whether to include verbose status information
  * Returns: Number of bytes written to buf.
  *
- * Query KaY status information. This function fills in a text area with current
+ * Query KAY status information. This function fills in a text area with current
  * status information. If the buffer (buf) is not large enough, status
  * information will be truncated to fit the buffer.
  */
 int ieee802_1x_kay_get_status(struct ieee802_1x_kay *kay, char *buf,
 			      size_t buflen)
 {
-	char *pos, *end;
-	int res, count;
-	struct ieee802_1x_mka_participant *p;
+	int len;
 
 	if (!kay)
 		return 0;
 
-	pos = buf;
-	end = buf + buflen;
-
-	res = os_snprintf(pos, end - pos,
+	len = os_snprintf(buf, buflen,
 			  "PAE KaY status=%s\n"
 			  "Authenticated=%s\n"
 			  "Secured=%s\n"
@@ -3926,8 +3609,7 @@
 			  "Key Server Priority=%u\n"
 			  "Is Key Server=%s\n"
 			  "Number of Keys Distributed=%u\n"
-			  "Number of Keys Received=%u\n"
-			  "MKA Hello Time=%u\n",
+			  "Number of Keys Received=%u\n",
 			  kay->active ? "Active" : "Not-Active",
 			  kay->authenticated ? "Yes" : "No",
 			  kay->secured ? "Yes" : "No",
@@ -3936,162 +3618,10 @@
 			  kay->key_server_priority,
 			  kay->is_key_server ? "Yes" : "No",
 			  kay->dist_kn - 1,
-			  kay->rcvd_keys,
-			  kay->mka_hello_time);
-	if (os_snprintf_error(buflen, res))
-		return 0;
-	pos += res;
-
-	res = os_snprintf(pos, end - pos,
-			  "actor_sci=%s\n", sci_txt(&kay->actor_sci));
-	if (os_snprintf_error(buflen, res))
-		return end - pos;
-	pos += res;
-
-	res = os_snprintf(pos, end - pos,
-			  "key_server_sci=%s\n", sci_txt(&kay->key_server_sci));
-	if (os_snprintf_error(buflen, res))
-		return end - pos;
-	pos += res;
-
-	count = 0;
-	dl_list_for_each(p, &kay->participant_list,
-			 struct ieee802_1x_mka_participant, list) {
-		char *pos2 = pos;
-
-		res = os_snprintf(pos2, end - pos2, "participant_idx=%d\nckn=",
-			count);
-		if (os_snprintf_error(buflen, res))
-			return end - pos;
-		pos2 += res;
-		count++;
-
-		pos2 += wpa_snprintf_hex(pos2, end - pos2, p->ckn.name,
-					 p->ckn.len);
-
-		res = os_snprintf(pos2, end - pos2,
-				  "\nmi=%s\n"
-				  "mn=%u\n"
-				  "active=%s\n"
-				  "participant=%s\n"
-				  "retain=%s\n"
-				  "live_peers=%u\n"
-				  "potential_peers=%u\n"
-				  "is_key_server=%s\n"
-				  "is_elected=%s\n",
-				  mi_txt(p->mi), p->mn,
-				  yes_no(p->active),
-				  yes_no(p->participant),
-				  yes_no(p->retain),
-				  dl_list_len(&p->live_peers),
-				  dl_list_len(&p->potential_peers),
-				  yes_no(p->is_key_server),
-				  yes_no(p->is_elected));
-		if (os_snprintf_error(buflen, res))
-			return end - pos;
-		pos2 += res;
-		pos = pos2;
-	}
-
-	return pos - buf;
-}
-
-
-static const char * true_false(Boolean val)
-{
-	return val ? "true" : "false";
-}
-
-
-static const char * activate_control_txt(enum activate_ctrl activate)
-{
-	switch (activate) {
-	case DEFAULT:
-		return "default";
-	case DISABLED:
-		return "disabled";
-	case ON_OPER_UP:
-		return "onOperUp";
-	case ALWAYS:
-		return "always";
-	}
-
-	return "?";
-}
-
-
-static char * mka_mib_peer(struct dl_list *peers, Boolean live, char *buf,
-			   char *end)
-{
-	char *pos = buf;
-	struct ieee802_1x_kay_peer *p;
-	int res;
-
-	dl_list_for_each(p, peers, struct ieee802_1x_kay_peer, list) {
-		res = os_snprintf(pos, end - pos,
-				  "ieee8021XKayMkaPeerListMI=%s\n"
-				  "ieee8021XKayMkaPeerListMN=%u\n"
-				  "ieee8021XKayMkaPeerListType=%u\n"
-				  "ieee8021XKayMkaPeerListSCI=%s\n",
-				  mi_txt(p->mi),
-				  p->mn,
-				  live ? 1 : 2,
-				  sci_txt(&p->sci));
-		if (os_snprintf_error(end - pos, res))
-			return pos;
-		pos += res;
-	}
-
-	return pos;
-}
-
-
-int ieee802_1x_kay_get_mib(struct ieee802_1x_kay *kay, char *buf,
-			   size_t buflen)
-{
-	char *pos, *end;
-	int res;
-	struct ieee802_1x_mka_participant *p;
-
-	if (!kay)
+			  kay->rcvd_keys);
+	if (os_snprintf_error(buflen, len))
 		return 0;
 
-	pos = buf;
-	end = buf + buflen;
-
-	dl_list_for_each(p, &kay->participant_list,
-			 struct ieee802_1x_mka_participant, list) {
-		char *pos2 = pos;
-
-		res = os_snprintf(pos2, end - pos2, "ieee8021XKayMkaPartCKN=");
-		if (os_snprintf_error(buflen, res))
-			return end - pos;
-		pos2 += res;
-
-		pos2 += wpa_snprintf_hex(pos2, end - pos2, p->ckn.name,
-					 p->ckn.len);
-
-		res = os_snprintf(pos2, end - pos2,
-				  "\nieee8021XKayMkaPartCached=%s\n"
-				  "ieee8021XKayMkaPartActive=%s\n"
-				  "ieee8021XKayMkaPartRetain=%s\n"
-				  "ieee8021XKayMkaPartActivateControl=%s\n"
-				  "ieee8021XKayMkaPartPrincipal=%s\n",
-				  true_false(p->cached),
-				  true_false(p->active),
-				  true_false(p->retain),
-				  activate_control_txt(p->activate),
-				  true_false(p->principal));
-		if (os_snprintf_error(buflen, res))
-			return end - pos;
-		pos2 += res;
-		pos = pos2;
-
-		pos = mka_mib_peer(&p->live_peers, TRUE, pos, end);
-		pos = mka_mib_peer(&p->potential_peers, FALSE, pos, end);
-	}
-
-	return pos - buf;
+	return len;
 }
-
 #endif /* CONFIG_CTRL_IFACE */
diff --git a/src/pae/ieee802_1x_kay.h b/src/pae/ieee802_1x_kay.h
index 3367d3a..b265059 100644
--- a/src/pae/ieee802_1x_kay.h
+++ b/src/pae/ieee802_1x_kay.h
@@ -21,7 +21,6 @@
 
 /* MKA timer, unit: millisecond */
 #define MKA_HELLO_TIME		2000
-#define MKA_BOUNDED_HELLO_TIME	 500
 #define MKA_LIFE_TIME		6000
 #define MKA_SAK_RETIRE_TIME	3000
 
@@ -39,7 +38,7 @@
 struct ieee802_1x_mka_sci {
 	u8 addr[ETH_ALEN];
 	be16 port;
-} STRUCT_PACKED;
+};
 
 struct mka_key {
 	u8 key[MAX_KEY_LEN];
@@ -150,7 +149,6 @@
 	int (*get_receive_lowest_pn)(void *ctx, struct receive_sa *sa);
 	int (*get_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
 	int (*set_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
-	int (*set_receive_lowest_pn)(void *ctx, struct receive_sa *sa);
 	int (*create_receive_sc)(void *ctx, struct receive_sc *sc,
 				 enum validate_frames vf,
 				 enum confidentiality_offset co);
@@ -189,7 +187,6 @@
 	u32 macsec_replay_window;
 	enum validate_frames macsec_validate;
 	enum confidentiality_offset macsec_confidentiality;
-	u32 mka_hello_time;
 
 	u32 ltx_kn;
 	u8 ltx_an;
@@ -239,7 +236,6 @@
 
 struct ieee802_1x_kay *
 ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
-		    Boolean macsec_replay_protect, u32 macsec_replay_window,
 		    u16 port, u8 priority, const char *ifname, const u8 *addr);
 void ieee802_1x_kay_deinit(struct ieee802_1x_kay *kay);
 
@@ -275,7 +271,5 @@
 int ieee802_1x_kay_enable_new_info(struct ieee802_1x_kay *kay);
 int ieee802_1x_kay_get_status(struct ieee802_1x_kay *kay, char *buf,
 			      size_t buflen);
-int ieee802_1x_kay_get_mib(struct ieee802_1x_kay *kay, char *buf,
-			   size_t buflen);
 
 #endif /* IEEE802_1X_KAY_H */
diff --git a/src/pae/ieee802_1x_kay_i.h b/src/pae/ieee802_1x_kay_i.h
index 1d1589c..bc522d8 100644
--- a/src/pae/ieee802_1x_kay_i.h
+++ b/src/pae/ieee802_1x_kay_i.h
@@ -15,7 +15,7 @@
 
 #define MKA_VERSION_ID              1
 
-/* IEEE Std 802.1X-2010, 11.11.1, Table 11-7 (MKPDU parameter sets) */
+/* IEEE Std 802.1X-2010, 11.11.1, Table 11-7 */
 enum mka_packet_type {
 	MKA_BASIC_PARAMETER_SET = MKA_VERSION_ID,
 	MKA_LIVE_PEER_LIST = 1,
@@ -51,7 +51,6 @@
 	Boolean macsec_desired;
 	enum macsec_cap macsec_capability;
 	Boolean sak_used;
-	int missing_sak_use_count;
 	struct dl_list list;
 };
 
@@ -60,24 +59,25 @@
 	char name[32];
 	enum macsec_cap capable;
 	int sak_len; /* unit: byte */
+
+	u32 index;
 };
 
 struct mka_alg {
 	u8 parameter[4];
+	size_t cak_len;
+	size_t kek_len;
+	size_t ick_len;
 	size_t icv_len;
 
-	int (*cak_trfm)(const u8 *msk, size_t msk_bytes, const u8 *mac1,
-			const u8 *mac2, u8 *cak, size_t cak_bytes);
-	int (*ckn_trfm)(const u8 *msk, size_t msk_bytes, const u8 *mac1,
-			const u8 *mac2, const u8 *sid, size_t sid_len, u8 *ckn);
-	int (*kek_trfm)(const u8 *cak, size_t cak_bytes,
-			const u8 *ckn, size_t ckn_len,
-			u8 *kek, size_t kek_bytes);
-	int (*ick_trfm)(const u8 *cak, size_t cak_bytes,
-			const u8 *ckn, size_t ckn_len,
-			u8 *ick, size_t ick_bytes);
-	int (*icv_hash)(const u8 *ick, size_t ick_bytes,
-			const u8 *msg, size_t msg_len, u8 *icv);
+	int (*cak_trfm)(const u8 *msk, const u8 *mac1, const u8 *mac2, u8 *cak);
+	int (*ckn_trfm)(const u8 *msk, const u8 *mac1, const u8 *mac2,
+			const u8 *sid, size_t sid_len, u8 *ckn);
+	int (*kek_trfm)(const u8 *cak, const u8 *ckn, size_t ckn_len, u8 *kek);
+	int (*ick_trfm)(const u8 *cak, const u8 *ckn, size_t ckn_len, u8 *ick);
+	int (*icv_hash)(const u8 *ick, const u8 *msg, size_t msg_len, u8 *icv);
+
+	int index; /* index for configuring */
 };
 
 #define DEFAULT_MKA_ALG_INDEX 0
@@ -95,7 +95,7 @@
 	Boolean retain;
 	enum mka_created_mode mode;
 
-	enum activate_ctrl { DEFAULT, DISABLED, ON_OPER_UP, ALWAYS } activate;
+	enum { DEFAULT, DISABLED, ON_OPER_UP, ALWAYS } activate;
 
 	/* used for active participant */
 	Boolean principal;
@@ -131,10 +131,8 @@
 	u8 mi[MI_LEN];
 	u32 mn;
 
-	/* Current peer MI and SCI during MKPDU processing */
 	struct ieee802_1x_mka_peer_id current_peer_id;
 	struct ieee802_1x_mka_sci current_peer_sci;
-
 	time_t cak_life;
 	time_t mka_life;
 	Boolean to_dist_sak;
@@ -167,7 +165,7 @@
 #endif
 	/* octet 4 */
 	u8 length1;
-} STRUCT_PACKED;
+};
 
 #define MKA_HDR_LEN sizeof(struct ieee802_1x_mka_hdr)
 
@@ -212,9 +210,9 @@
 	be32 actor_mn;
 	u8 algo_agility[4];
 
-	/* followed by CAK Name */
+	/* followed by CAK Name*/
 	u8 ckn[0];
-} STRUCT_PACKED;
+};
 
 /**
  * struct ieee802_1x_mka_peer_body - Live Peer List and Potential Peer List
@@ -240,9 +238,9 @@
 	/* octet 4 */
 	u8 length1;
 
-	/* followed by Peers */
 	u8 peer[0];
-} STRUCT_PACKED;
+	/* followed by Peers */
+};
 
 /**
  * struct ieee802_1x_mka_sak_use_body - MACsec SAK Use parameter set (Figure
@@ -317,7 +315,7 @@
 	be32 okn;
 	/* octet 41 - 44 */
 	be32 olpn;
-} STRUCT_PACKED;
+};
 
 /**
  * struct ieee802_1x_mka_dist_sak_body - Distributed SAK parameter set
@@ -364,7 +362,7 @@
 	 * for other cipher suite: octet 9-16: cipher suite id, octet 17-: SAK
 	 */
 	u8 sak[0];
-} STRUCT_PACKED;
+};
 
 /**
  * struct ieee802_1x_mka_dist_cak_body - Distributed CAK parameter set (Figure
@@ -400,7 +398,7 @@
 
 	/* followed by CAK Name, 29- */
 	u8 ckn[0];
-} STRUCT_PACKED;
+};
 
 struct ieee802_1x_mka_icv_body {
 	/* octet 1 */
@@ -420,6 +418,6 @@
 
 	/* octet 5 - */
 	u8 icv[0];
-} STRUCT_PACKED;
+};
 
 #endif /* IEEE802_1X_KAY_I_H */
diff --git a/src/pae/ieee802_1x_key.c b/src/pae/ieee802_1x_key.c
index d63ca7f..9a8d923 100644
--- a/src/pae/ieee802_1x_key.c
+++ b/src/pae/ieee802_1x_key.c
@@ -31,9 +31,8 @@
 
 
 /* IEEE Std 802.1X-2010, 6.2.1 KDF */
-static int aes_kdf(const u8 *kdk, size_t kdk_bits,
-		   const char *label, const u8 *context,
-		   int ctx_bits, int ret_bits, u8 *ret)
+static int aes_kdf_128(const u8 *kdk, const char *label, const u8 *context,
+		       int ctx_bits, int ret_bits, u8 *ret)
 {
 	const int h = 128;
 	const int r = 8;
@@ -41,9 +40,6 @@
 	int lab_len, ctx_len, ret_len, buf_len;
 	u8 *buf;
 
-	if (kdk_bits != 128 && kdk_bits != 256)
-		return -1;
-
 	lab_len = os_strlen(label);
 	ctx_len = (ctx_bits + 7) / 8;
 	ret_len = ((ret_bits & 0xffff) + 7) / 8;
@@ -64,14 +60,8 @@
 	WPA_PUT_BE16(&buf[buf_len - 2], ret_bits);
 
 	for (i = 0; i < n; i++) {
-		int res;
-
 		buf[0] = (u8) (i + 1);
-		if (kdk_bits == 128)
-			res = omac1_aes_128(kdk, buf, buf_len, ret);
-		else
-			res = omac1_aes_256(kdk, buf, buf_len, ret);
-		if (res) {
+		if (omac1_aes_128(kdk, buf, buf_len, ret)) {
 			os_free(buf);
 			return -1;
 		}
@@ -82,32 +72,33 @@
 }
 
 
+/********** AES-CMAC-128 **********/
 /**
- * ieee802_1x_cak_aes_cmac
+ * ieee802_1x_cak_128bits_aes_cmac
  *
  * IEEE Std 802.1X-2010, 6.2.2
  * CAK = KDF(Key, Label, mac1 | mac2, CAKlength)
  */
-int ieee802_1x_cak_aes_cmac(const u8 *msk, size_t msk_bytes, const u8 *mac1,
-			    const u8 *mac2, u8 *cak, size_t cak_bytes)
+int ieee802_1x_cak_128bits_aes_cmac(const u8 *msk, const u8 *mac1,
+				    const u8 *mac2, u8 *cak)
 {
 	u8 context[2 * ETH_ALEN];
 
 	joint_two_mac(mac1, mac2, context);
-	return aes_kdf(msk, 8 * msk_bytes, "IEEE8021 EAP CAK",
-		       context, sizeof(context) * 8, 8 * cak_bytes, cak);
+	return aes_kdf_128(msk, "IEEE8021 EAP CAK",
+			   context, sizeof(context) * 8, 128, cak);
 }
 
 
 /**
- * ieee802_1x_ckn_aes_cmac
+ * ieee802_1x_ckn_128bits_aes_cmac
  *
  * IEEE Std 802.1X-2010, 6.2.2
  * CKN = KDF(Key, Label, ID | mac1 | mac2, CKNlength)
  */
-int ieee802_1x_ckn_aes_cmac(const u8 *msk, size_t msk_bytes, const u8 *mac1,
-			    const u8 *mac2, const u8 *sid,
-			    size_t sid_bytes, u8 *ckn)
+int ieee802_1x_ckn_128bits_aes_cmac(const u8 *msk, const u8 *mac1,
+				    const u8 *mac2, const u8 *sid,
+				    size_t sid_bytes, u8 *ckn)
 {
 	int res;
 	u8 *context;
@@ -121,21 +112,21 @@
 	os_memcpy(context, sid, sid_bytes);
 	joint_two_mac(mac1, mac2, context + sid_bytes);
 
-	res = aes_kdf(msk, 8 * msk_bytes, "IEEE8021 EAP CKN",
-		      context, ctx_len * 8, 128, ckn);
+	res = aes_kdf_128(msk, "IEEE8021 EAP CKN", context, ctx_len * 8,
+			  128, ckn);
 	os_free(context);
 	return res;
 }
 
 
 /**
- * ieee802_1x_kek_aes_cmac
+ * ieee802_1x_kek_128bits_aes_cmac
  *
  * IEEE Std 802.1X-2010, 9.3.3
  * KEK = KDF(Key, Label, Keyid, KEKLength)
  */
-int ieee802_1x_kek_aes_cmac(const u8 *cak, size_t cak_bytes, const u8 *ckn,
-			    size_t ckn_bytes, u8 *kek, size_t kek_bytes)
+int ieee802_1x_kek_128bits_aes_cmac(const u8 *cak, const u8 *ckn,
+				    size_t ckn_bytes, u8 *kek)
 {
 	u8 context[16];
 
@@ -143,20 +134,19 @@
 	os_memset(context, 0, sizeof(context));
 	os_memcpy(context, ckn, (ckn_bytes < 16) ? ckn_bytes : 16);
 
-	return aes_kdf(cak, 8 * cak_bytes, "IEEE8021 KEK",
-		       context, sizeof(context) * 8,
-		       8 * kek_bytes, kek);
+	return aes_kdf_128(cak, "IEEE8021 KEK", context, sizeof(context) * 8,
+			   128, kek);
 }
 
 
 /**
- * ieee802_1x_ick_aes_cmac
+ * ieee802_1x_ick_128bits_aes_cmac
  *
  * IEEE Std 802.1X-2010, 9.3.3
  * ICK = KDF(Key, Label, Keyid, ICKLength)
  */
-int ieee802_1x_ick_aes_cmac(const u8 *cak, size_t cak_bytes, const u8 *ckn,
-			    size_t ckn_bytes, u8 *ick, size_t ick_bytes)
+int ieee802_1x_ick_128bits_aes_cmac(const u8 *cak, const u8 *ckn,
+				    size_t ckn_bytes, u8 *ick)
 {
 	u8 context[16];
 
@@ -164,32 +154,22 @@
 	os_memset(context, 0, sizeof(context));
 	os_memcpy(context, ckn, (ckn_bytes < 16) ? ckn_bytes : 16);
 
-	return aes_kdf(cak, 8 *cak_bytes, "IEEE8021 ICK",
-		       context, sizeof(context) * 8,
-		       8 * ick_bytes, ick);
+	return aes_kdf_128(cak, "IEEE8021 ICK", context, sizeof(context) * 8,
+			   128, ick);
 }
 
 
 /**
- * ieee802_1x_icv_aes_cmac
+ * ieee802_1x_icv_128bits_aes_cmac
  *
  * IEEE Std 802.1X-2010, 9.4.1
  * ICV = AES-CMAC(ICK, M, 128)
  */
-int ieee802_1x_icv_aes_cmac(const u8 *ick, size_t ick_bytes, const u8 *msg,
-			    size_t msg_bytes, u8 *icv)
+int ieee802_1x_icv_128bits_aes_cmac(const u8 *ick, const u8 *msg,
+				    size_t msg_bytes, u8 *icv)
 {
-	int res;
-
-	if (ick_bytes == 16)
-		res = omac1_aes_128(ick, msg, msg_bytes, icv);
-	else if (ick_bytes == 32)
-		res = omac1_aes_256(ick, msg, msg_bytes, icv);
-	else
-		return -1;
-	if (res) {
-		wpa_printf(MSG_ERROR,
-			   "MKA: AES-CMAC failed for ICV calculation");
+	if (omac1_aes_128(ick, msg, msg_bytes, icv)) {
+		wpa_printf(MSG_ERROR, "MKA: omac1_aes_128 failed");
 		return -1;
 	}
 	return 0;
@@ -197,14 +177,13 @@
 
 
 /**
- * ieee802_1x_sak_aes_cmac
+ * ieee802_1x_sak_128bits_aes_cmac
  *
  * IEEE Std 802.1X-2010, 9.8.1
  * SAK = KDF(Key, Label, KS-nonce | MI-value list | KN, SAKLength)
  */
-int ieee802_1x_sak_aes_cmac(const u8 *cak, size_t cak_bytes, const u8 *ctx,
-			    size_t ctx_bytes, u8 *sak, size_t sak_bytes)
+int ieee802_1x_sak_128bits_aes_cmac(const u8 *cak, const u8 *ctx,
+				    size_t ctx_bytes, u8 *sak)
 {
-	return aes_kdf(cak, cak_bytes * 8, "IEEE8021 SAK", ctx, ctx_bytes * 8,
-		       sak_bytes * 8, sak);
+	return aes_kdf_128(cak, "IEEE8021 SAK", ctx, ctx_bytes * 8, 128, sak);
 }
diff --git a/src/pae/ieee802_1x_key.h b/src/pae/ieee802_1x_key.h
index 1f9058d..ea318ea 100644
--- a/src/pae/ieee802_1x_key.h
+++ b/src/pae/ieee802_1x_key.h
@@ -9,18 +9,18 @@
 #ifndef IEEE802_1X_KEY_H
 #define IEEE802_1X_KEY_H
 
-int ieee802_1x_cak_aes_cmac(const u8 *msk, size_t msk_bytes, const u8 *mac1,
-			    const u8 *mac2, u8 *cak, size_t cak_bytes);
-int ieee802_1x_ckn_aes_cmac(const u8 *msk, size_t msk_bytes, const u8 *mac1,
-			    const u8 *mac2, const u8 *sid,
-			    size_t sid_bytes, u8 *ckn);
-int ieee802_1x_kek_aes_cmac(const u8 *cak, size_t cak_bytes, const u8 *ckn,
-			    size_t ckn_bytes, u8 *kek, size_t kek_bytes);
-int ieee802_1x_ick_aes_cmac(const u8 *cak, size_t cak_bytes, const u8 *ckn,
-			    size_t ckn_bytes, u8 *ick, size_t ick_bytes);
-int ieee802_1x_icv_aes_cmac(const u8 *ick, size_t ick_bytes, const u8 *msg,
-			    size_t msg_bytes, u8 *icv);
-int ieee802_1x_sak_aes_cmac(const u8 *cak, size_t cak_bytes, const u8 *ctx,
-			    size_t ctx_bytes, u8 *sak, size_t sak_bytes);
+int ieee802_1x_cak_128bits_aes_cmac(const u8 *msk, const u8 *mac1,
+				    const u8 *mac2, u8 *cak);
+int ieee802_1x_ckn_128bits_aes_cmac(const u8 *msk, const u8 *mac1,
+				    const u8 *mac2, const u8 *sid,
+				    size_t sid_bytes, u8 *ckn);
+int ieee802_1x_kek_128bits_aes_cmac(const u8 *cak, const u8 *ckn,
+				    size_t ckn_bytes, u8 *kek);
+int ieee802_1x_ick_128bits_aes_cmac(const u8 *cak, const u8 *ckn,
+				    size_t ckn_bytes, u8 *ick);
+int ieee802_1x_icv_128bits_aes_cmac(const u8 *ick, const u8 *msg,
+				    size_t msg_bytes, u8 *icv);
+int ieee802_1x_sak_128bits_aes_cmac(const u8 *cak, const u8 *ctx,
+				    size_t ctx_bytes, u8 *sak);
 
 #endif /* IEEE802_1X_KEY_H */
diff --git a/src/pae/ieee802_1x_secy_ops.c b/src/pae/ieee802_1x_secy_ops.c
index 84ee42b..ab5339b 100644
--- a/src/pae/ieee802_1x_secy_ops.c
+++ b/src/pae/ieee802_1x_secy_ops.c
@@ -187,7 +187,7 @@
 	ops = kay->ctx;
 	if (!ops || !ops->get_transmit_next_pn) {
 		wpa_printf(MSG_ERROR,
-			   "KaY: secy get_transmit_next_pn operation not supported");
+			   "KaY: secy get_receive_lowest_pn operation not supported");
 		return -1;
 	}
 
@@ -208,7 +208,7 @@
 	ops = kay->ctx;
 	if (!ops || !ops->set_transmit_next_pn) {
 		wpa_printf(MSG_ERROR,
-			   "KaY: secy set_transmit_next_pn operation not supported");
+			   "KaY: secy get_receive_lowest_pn operation not supported");
 		return -1;
 	}
 
@@ -216,27 +216,6 @@
 }
 
 
-int secy_set_receive_lowest_pn(struct ieee802_1x_kay *kay,
-			       struct receive_sa *rxsa)
-{
-	struct ieee802_1x_kay_ctx *ops;
-
-	if (!kay || !rxsa) {
-		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
-		return -1;
-	}
-
-	ops = kay->ctx;
-	if (!ops || !ops->set_receive_lowest_pn) {
-		wpa_printf(MSG_ERROR,
-			   "KaY: secy set_receive_lowest_pn operation not supported");
-		return -1;
-	}
-
-	return ops->set_receive_lowest_pn(ops->ctx, rxsa);
-}
-
-
 int secy_create_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
 {
 	struct ieee802_1x_kay_ctx *ops;
diff --git a/src/pae/ieee802_1x_secy_ops.h b/src/pae/ieee802_1x_secy_ops.h
index 2d112ba..9fb29c3 100644
--- a/src/pae/ieee802_1x_secy_ops.h
+++ b/src/pae/ieee802_1x_secy_ops.h
@@ -36,8 +36,6 @@
 			      struct transmit_sa *txsa);
 int secy_set_transmit_next_pn(struct ieee802_1x_kay *kay,
 			      struct transmit_sa *txsa);
-int secy_set_receive_lowest_pn(struct ieee802_1x_kay *kay,
-			       struct receive_sa *txsa);
 int secy_create_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc);
 int secy_delete_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc);
 int secy_create_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa);
diff --git a/src/radius/radius_client.c b/src/radius/radius_client.c
index a3db404..a87ee74 100644
--- a/src/radius/radius_client.c
+++ b/src/radius/radius_client.c
@@ -26,12 +26,12 @@
 #define RADIUS_CLIENT_MAX_WAIT 120
 
 /**
- * RADIUS_CLIENT_MAX_FAILOVER - RADIUS client maximum retries
+ * RADIUS_CLIENT_MAX_RETRIES - RADIUS client maximum retries
  *
- * Maximum number of server failovers before the entry is removed from
+ * Maximum number of retransmit attempts before the entry is removed from
  * retransmit list.
  */
-#define RADIUS_CLIENT_MAX_FAILOVER 3
+#define RADIUS_CLIENT_MAX_RETRIES 10
 
 /**
  * RADIUS_CLIENT_MAX_ENTRIES - RADIUS client maximum pending messages
@@ -110,16 +110,11 @@
 	os_time_t next_try;
 
 	/**
-	 * attempts - Number of transmission attempts for one server
+	 * attempts - Number of transmission attempts
 	 */
 	int attempts;
 
 	/**
-	 * accu_attempts - Number of accumulated attempts
-	 */
-	int accu_attempts;
-
-	/**
 	 * next_wait - Next retransmission wait time in seconds
 	 */
 	int next_wait;
@@ -372,11 +367,9 @@
 	size_t prev_num_msgs;
 	u8 *acct_delay_time;
 	size_t acct_delay_time_len;
-	int num_servers;
 
 	if (entry->msg_type == RADIUS_ACCT ||
 	    entry->msg_type == RADIUS_ACCT_INTERIM) {
-		num_servers = conf->num_acct_servers;
 		if (radius->acct_sock < 0)
 			radius_client_init_acct(radius);
 		if (radius->acct_sock < 0 && conf->num_acct_servers > 1) {
@@ -393,7 +386,6 @@
 			conf->acct_server->retransmissions++;
 		}
 	} else {
-		num_servers = conf->num_auth_servers;
 		if (radius->auth_sock < 0)
 			radius_client_init_auth(radius);
 		if (radius->auth_sock < 0 && conf->num_auth_servers > 1) {
@@ -457,15 +449,7 @@
 	}
 
 	/* retransmit; remove entry if too many attempts */
-	if (entry->accu_attempts > RADIUS_CLIENT_MAX_FAILOVER *
-	    RADIUS_CLIENT_NUM_FAILOVER * num_servers) {
-		wpa_printf(MSG_INFO,
-			   "RADIUS: Removing un-ACKed message due to too many failed retransmit attempts");
-		return 1;
-	}
-
 	entry->attempts++;
-	entry->accu_attempts++;
 	hostapd_logger(radius->ctx, entry->addr, HOSTAPD_MODULE_RADIUS,
 		       HOSTAPD_LEVEL_DEBUG, "Resending RADIUS message (id=%d)",
 		       radius_msg_get_hdr(entry->msg)->identifier);
@@ -482,6 +466,10 @@
 	entry->next_wait *= 2;
 	if (entry->next_wait > RADIUS_CLIENT_MAX_WAIT)
 		entry->next_wait = RADIUS_CLIENT_MAX_WAIT;
+	if (entry->attempts >= RADIUS_CLIENT_MAX_RETRIES) {
+		wpa_printf(MSG_INFO, "RADIUS: Removing un-ACKed message due to too many failed retransmit attempts");
+		return 1;
+	}
 
 	return 0;
 }
@@ -502,30 +490,6 @@
 		return;
 
 	os_get_reltime(&now);
-
-	while (entry) {
-		if (now.sec >= entry->next_try) {
-			s = entry->msg_type == RADIUS_AUTH ? radius->auth_sock :
-				radius->acct_sock;
-			if (entry->attempts > RADIUS_CLIENT_NUM_FAILOVER ||
-			    (s < 0 && entry->attempts > 0)) {
-				if (entry->msg_type == RADIUS_ACCT ||
-				    entry->msg_type == RADIUS_ACCT_INTERIM)
-					acct_failover++;
-				else
-					auth_failover++;
-			}
-		}
-		entry = entry->next;
-	}
-
-	if (auth_failover)
-		radius_client_auth_failover(radius);
-
-	if (acct_failover)
-		radius_client_acct_failover(radius);
-
-	entry = radius->msgs;
 	first = 0;
 
 	prev = NULL;
@@ -553,6 +517,17 @@
 			continue;
 		}
 
+		s = entry->msg_type == RADIUS_AUTH ? radius->auth_sock :
+			radius->acct_sock;
+		if (entry->attempts > RADIUS_CLIENT_NUM_FAILOVER ||
+		    (s < 0 && entry->attempts > 0)) {
+			if (entry->msg_type == RADIUS_ACCT ||
+			    entry->msg_type == RADIUS_ACCT_INTERIM)
+				acct_failover++;
+			else
+				auth_failover++;
+		}
+
 		if (first == 0 || entry->next_try < first)
 			first = entry->next_try;
 
@@ -563,7 +538,6 @@
 	if (radius->msgs) {
 		if (first < now.sec)
 			first = now.sec;
-		eloop_cancel_timeout(radius_client_timer, radius, NULL);
 		eloop_register_timeout(first - now.sec, 0,
 				       radius_client_timer, radius, NULL);
 		hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS,
@@ -571,6 +545,12 @@
 			       "retransmit in %ld seconds",
 			       (long int) (first - now.sec));
 	}
+
+	if (auth_failover)
+		radius_client_auth_failover(radius);
+
+	if (acct_failover)
+		radius_client_acct_failover(radius);
 }
 
 
@@ -694,10 +674,7 @@
 	entry->first_try = entry->last_attempt.sec;
 	entry->next_try = entry->first_try + RADIUS_CLIENT_FIRST_WAIT;
 	entry->attempts = 1;
-	entry->accu_attempts = 1;
 	entry->next_wait = RADIUS_CLIENT_FIRST_WAIT * 2;
-	if (entry->next_wait > RADIUS_CLIENT_MAX_WAIT)
-		entry->next_wait = RADIUS_CLIENT_MAX_WAIT;
 	entry->next = radius->msgs;
 	radius->msgs = entry;
 	radius_client_update_timeout(radius);
@@ -736,9 +713,9 @@
  *
  * The message is added on the retransmission queue and will be retransmitted
  * automatically until a response is received or maximum number of retries
- * (RADIUS_CLIENT_MAX_FAILOVER * RADIUS_CLIENT_NUM_FAILOVER) is reached. No
- * such retries are used with RADIUS_ACCT_INTERIM, i.e., such a pending message
- * is removed from the queue automatically on transmission failure.
+ * (RADIUS_CLIENT_MAX_RETRIES) is reached. No such retries are used with
+ * RADIUS_ACCT_INTERIM, i.e., such a pending message is removed from the queue
+ * automatically on transmission failure.
  *
  * The related device MAC address can be used to identify pending messages that
  * can be removed with radius_client_flush_auth().
@@ -1110,13 +1087,14 @@
 		}
 	}
 
-	/* Reset retry counters */
-	for (entry = radius->msgs; oserv && entry; entry = entry->next) {
+	/* Reset retry counters for the new server */
+	for (entry = radius->msgs; oserv && oserv != nserv && entry;
+	     entry = entry->next) {
 		if ((auth && entry->msg_type != RADIUS_AUTH) ||
 		    (!auth && entry->msg_type != RADIUS_ACCT))
 			continue;
 		entry->next_try = entry->first_try + RADIUS_CLIENT_FIRST_WAIT;
-		entry->attempts = 1;
+		entry->attempts = 0;
 		entry->next_wait = RADIUS_CLIENT_FIRST_WAIT * 2;
 	}
 
diff --git a/src/radius/radius_server.c b/src/radius/radius_server.c
index aa78cba..e3afc0d 100644
--- a/src/radius/radius_server.c
+++ b/src/radius/radius_server.c
@@ -357,7 +357,6 @@
 
 	char *subscr_remediation_url;
 	u8 subscr_remediation_method;
-	char *hs20_sim_provisioning_url;
 
 	char *t_c_server_url;
 
@@ -381,44 +380,6 @@
 static void radius_server_session_remove_timeout(void *eloop_ctx,
 						 void *timeout_ctx);
 
-#ifdef CONFIG_SQLITE
-#ifdef CONFIG_HS20
-
-static int db_table_exists(sqlite3 *db, const char *name)
-{
-	char cmd[128];
-
-	os_snprintf(cmd, sizeof(cmd), "SELECT 1 FROM %s;", name);
-	return sqlite3_exec(db, cmd, NULL, NULL, NULL) == SQLITE_OK;
-}
-
-
-static int db_table_create_sim_provisioning(sqlite3 *db)
-{
-	char *err = NULL;
-	const char *sql =
-		"CREATE TABLE sim_provisioning("
-		" mobile_identifier_hash TEXT PRIMARY KEY,"
-		" imsi TEXT,"
-		" mac_addr TEXT,"
-		" eap_method TEXT,"
-		" timestamp TEXT"
-		");";
-
-	RADIUS_DEBUG("Adding database table for SIM provisioning information");
-	if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
-		RADIUS_ERROR("SQLite error: %s", err);
-		sqlite3_free(err);
-		return -1;
-	}
-
-	return 0;
-}
-
-#endif /* CONFIG_HS20 */
-#endif /* CONFIG_SQLITE */
-
-
 void srv_log(struct radius_session *sess, const char *fmt, ...)
 PRINTF_FORMAT(2, 3);
 
@@ -905,117 +866,6 @@
 }
 
 
-#ifdef CONFIG_HS20
-
-static int radius_server_is_sim_method(struct radius_session *sess)
-{
-	const char *name;
-
-	name = eap_get_method(sess->eap);
-	return name &&
-		(os_strcmp(name, "SIM") == 0 ||
-		 os_strcmp(name, "AKA") == 0 ||
-		 os_strcmp(name, "AKA'") == 0);
-}
-
-
-static int radius_server_hs20_missing_sim_pps(struct radius_msg *request)
-{
-	u8 *buf, *pos, *end, type, sublen;
-	size_t len;
-
-	buf = NULL;
-	for (;;) {
-		if (radius_msg_get_attr_ptr(request,
-					    RADIUS_ATTR_VENDOR_SPECIFIC,
-					    &buf, &len, buf) < 0)
-			return 0;
-		if (len < 6)
-			continue;
-		pos = buf;
-		end = buf + len;
-		if (WPA_GET_BE32(pos) != RADIUS_VENDOR_ID_WFA)
-			continue;
-		pos += 4;
-
-		type = *pos++;
-		sublen = *pos++;
-		if (sublen < 2)
-			continue; /* invalid length */
-		sublen -= 2; /* skip header */
-		if (pos + sublen > end)
-			continue; /* invalid WFA VSA */
-
-		if (type != RADIUS_VENDOR_ATTR_WFA_HS20_STA_VERSION)
-			continue;
-
-		RADIUS_DUMP("HS2.0 mobile device version", pos, sublen);
-		if (sublen < 1 + 2)
-			continue;
-		if (pos[0] == 0)
-			continue; /* Release 1 STA does not support provisioning
-
-				   */
-		/* UpdateIdentifier 0 indicates no PPS MO */
-		return WPA_GET_BE16(pos + 1) == 0;
-	}
-}
-
-
-#define HS20_MOBILE_ID_HASH_LEN 16
-
-static int radius_server_sim_provisioning_session(struct radius_session *sess,
-						  const u8 *hash)
-{
-#ifdef CONFIG_SQLITE
-	char *sql;
-	char addr_txt[ETH_ALEN * 3];
-	char hash_txt[2 * HS20_MOBILE_ID_HASH_LEN + 1];
-	struct os_time now;
-	int res;
-	const char *imsi, *eap_method;
-
-	if (!sess->server->db ||
-	    (!db_table_exists(sess->server->db, "sim_provisioning") &&
-	     db_table_create_sim_provisioning(sess->server->db) < 0))
-		return -1;
-
-	imsi = eap_get_imsi(sess->eap);
-	if (!imsi)
-		return -1;
-
-	eap_method = eap_get_method(sess->eap);
-	if (!eap_method)
-		return -1;
-
-	os_snprintf(addr_txt, sizeof(addr_txt), MACSTR,
-		    MAC2STR(sess->mac_addr));
-	wpa_snprintf_hex(hash_txt, sizeof(hash_txt), hash,
-			 HS20_MOBILE_ID_HASH_LEN);
-
-	os_get_time(&now);
-	sql = sqlite3_mprintf("INSERT INTO sim_provisioning(mobile_identifier_hash,imsi,mac_addr,eap_method,timestamp) VALUES (%Q,%Q,%Q,%Q,%u)",
-			      hash_txt, imsi, addr_txt, eap_method, now.sec);
-	if (!sql)
-		return -1;
-
-	if (sqlite3_exec(sess->server->db, sql, NULL, NULL, NULL) !=
-	    SQLITE_OK) {
-		RADIUS_ERROR("Failed to add SIM provisioning entry into sqlite database: %s",
-			     sqlite3_errmsg(sess->server->db));
-		res = -1;
-	} else {
-		res = 0;
-	}
-	sqlite3_free(sql);
-	return res;
-#endif /* CONFIG_SQLITE */
-	return -1;
-}
-
-#endif /* CONFIG_HS20 */
-
-
 static struct radius_msg *
 radius_server_encapsulate_eap(struct radius_server_data *data,
 			      struct radius_client *client,
@@ -1129,48 +979,6 @@
 			    buf, 0)) {
 			RADIUS_DEBUG("Failed to add WFA-HS20-SubscrRem");
 		}
-	} else if (code == RADIUS_CODE_ACCESS_ACCEPT &&
-		   data->hs20_sim_provisioning_url &&
-		   radius_server_is_sim_method(sess) &&
-		   radius_server_hs20_missing_sim_pps(request)) {
-		u8 *buf, *pos, hash[HS20_MOBILE_ID_HASH_LEN];
-		size_t prefix_len, url_len;
-
-		RADIUS_DEBUG("Device needs HS 2.0 SIM provisioning");
-
-		if (os_get_random(hash, HS20_MOBILE_ID_HASH_LEN) < 0) {
-			radius_msg_free(msg);
-			return NULL;
-		}
-		RADIUS_DUMP("hotspot2dot0-mobile-identifier-hash",
-			    hash, HS20_MOBILE_ID_HASH_LEN);
-
-		if (radius_server_sim_provisioning_session(sess, hash) < 0) {
-			radius_msg_free(msg);
-			return NULL;
-		}
-
-		prefix_len = os_strlen(data->hs20_sim_provisioning_url);
-		url_len = prefix_len + 2 * HS20_MOBILE_ID_HASH_LEN;
-		buf = os_malloc(1 + url_len + 1);
-		if (!buf) {
-			radius_msg_free(msg);
-			return NULL;
-		}
-		pos = buf;
-		*pos++ = data->subscr_remediation_method;
-		os_memcpy(pos, data->hs20_sim_provisioning_url, prefix_len);
-		pos += prefix_len;
-		wpa_snprintf_hex((char *) pos, 2 * HS20_MOBILE_ID_HASH_LEN + 1,
-				 hash, HS20_MOBILE_ID_HASH_LEN);
-		RADIUS_DEBUG("HS 2.0 subscription remediation URL: %s",
-			     (char *) &buf[1]);
-		if (!radius_msg_add_wfa(
-			    msg, RADIUS_VENDOR_ATTR_WFA_HS20_SUBSCR_REMEDIATION,
-			    buf, 1 + url_len)) {
-			RADIUS_DEBUG("Failed to add WFA-HS20-SubscrRem");
-		}
-		os_free(buf);
 	}
 
 	if (code == RADIUS_CODE_ACCESS_ACCEPT && sess->t_c_filtering) {
@@ -2365,9 +2173,6 @@
 			os_strdup(conf->subscr_remediation_url);
 	}
 	data->subscr_remediation_method = conf->subscr_remediation_method;
-	if (conf->hs20_sim_provisioning_url)
-		data->hs20_sim_provisioning_url =
-			os_strdup(conf->hs20_sim_provisioning_url);
 
 	if (conf->t_c_server_url)
 		data->t_c_server_url = os_strdup(conf->t_c_server_url);
@@ -2488,7 +2293,6 @@
 	os_free(data->dump_msk_file);
 #endif /* CONFIG_RADIUS_TEST */
 	os_free(data->subscr_remediation_url);
-	os_free(data->hs20_sim_provisioning_url);
 	os_free(data->t_c_server_url);
 
 #ifdef CONFIG_SQLITE
diff --git a/src/radius/radius_server.h b/src/radius/radius_server.h
index 53728f9..167bbf5 100644
--- a/src/radius/radius_server.h
+++ b/src/radius/radius_server.h
@@ -233,7 +233,6 @@
 
 	char *subscr_remediation_url;
 	u8 subscr_remediation_method;
-	char *hs20_sim_provisioning_url;
 
 	char *t_c_server_url;
 };
diff --git a/src/rsn_supp/tdls.c b/src/rsn_supp/tdls.c
index 345b0c8..14b346a 100644
--- a/src/rsn_supp/tdls.c
+++ b/src/rsn_supp/tdls.c
@@ -2159,11 +2159,11 @@
 		eloop_register_timeout(lifetime, 0, wpa_tdls_tpk_timeout,
 				       sm, peer);
 #ifdef CONFIG_TDLS_TESTING
-		if (tdls_testing & TDLS_TESTING_NO_TPK_EXPIRATION) {
-			wpa_printf(MSG_DEBUG,
-				   "TDLS: Testing - disable TPK expiration");
-			eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer);
-		}
+	if (tdls_testing & TDLS_TESTING_NO_TPK_EXPIRATION) {
+		wpa_printf(MSG_DEBUG, "TDLS: Testing - disable TPK "
+			   "expiration");
+		eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer);
+	}
 #endif /* CONFIG_TDLS_TESTING */
 	}
 
diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c
index 9b1f098..72a2d66 100644
--- a/src/rsn_supp/wpa.c
+++ b/src/rsn_supp/wpa.c
@@ -20,10 +20,8 @@
 #include "crypto/sha512.h"
 #include "common/ieee802_11_defs.h"
 #include "common/ieee802_11_common.h"
-#include "common/ocv.h"
 #include "eap_common/eap_defs.h"
 #include "eapol_supp/eapol_supp_sm.h"
-#include "drivers/driver.h"
 #include "wpa.h"
 #include "eloop.h"
 #include "preauth.h"
@@ -620,33 +618,6 @@
 	kde = sm->assoc_wpa_ie;
 	kde_len = sm->assoc_wpa_ie_len;
 
-#ifdef CONFIG_OCV
-	if (wpa_sm_ocv_enabled(sm)) {
-		struct wpa_channel_info ci;
-		u8 *pos;
-
-		if (wpa_sm_channel_info(sm, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info for OCI element in EAPOL-Key 2/4");
-			goto failed;
-		}
-
-		kde_buf = os_malloc(kde_len + 2 + RSN_SELECTOR_LEN + 3);
-		if (!kde_buf) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to allocate memory for KDE with OCI in EAPOL-Key 2/4");
-			goto failed;
-		}
-
-		os_memcpy(kde_buf, kde, kde_len);
-		kde = kde_buf;
-		pos = kde + kde_len;
-		if (ocv_insert_oci_kde(&ci, &pos) < 0)
-			goto failed;
-		kde_len = pos - kde;
-	}
-#endif /* CONFIG_OCV */
-
 #ifdef CONFIG_P2P
 	if (sm->p2p) {
 		kde_buf = os_malloc(kde_len + 2 + RSN_SELECTOR_LEN + 1);
@@ -1447,26 +1418,6 @@
 	}
 #endif /* CONFIG_P2P */
 
-#ifdef CONFIG_OCV
-	if (wpa_sm_ocv_enabled(sm)) {
-		struct wpa_channel_info ci;
-
-		if (wpa_sm_channel_info(sm, &ci) != 0) {
-			wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
-				"Failed to get channel info to validate received OCI in EAPOL-Key 3/4");
-			return;
-		}
-
-		if (ocv_verify_tx_params(ie.oci, ie.oci_len, &ci,
-					 channel_width_to_int(ci.chanwidth),
-					 ci.seg1_idx) != 0) {
-			wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, "%s",
-				ocv_errorstr);
-			return;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	if (wpa_supplicant_send_4_of_4(sm, sm->bssid, key, ver, key_info,
 				       &sm->ptk) < 0) {
 		goto failed;
@@ -1560,26 +1511,6 @@
 	}
 	maxkeylen = gd->gtk_len = ie.gtk_len - 2;
 
-#ifdef CONFIG_OCV
-	if (wpa_sm_ocv_enabled(sm)) {
-		struct wpa_channel_info ci;
-
-		if (wpa_sm_channel_info(sm, &ci) != 0) {
-			wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
-				"Failed to get channel info to validate received OCI in EAPOL-Key group msg 1/2");
-			return -1;
-		}
-
-		if (ocv_verify_tx_params(ie.oci, ie.oci_len, &ci,
-					 channel_width_to_int(ci.chanwidth),
-					 ci.seg1_idx) != 0) {
-			wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, "%s",
-				ocv_errorstr);
-			return -1;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	if (wpa_supplicant_check_group_cipher(sm, sm->group_cipher,
 					      gd->gtk_len, maxkeylen,
 					      &gd->key_rsc_len, &gd->alg))
@@ -1700,17 +1631,11 @@
 	size_t mic_len, hdrlen, rlen;
 	struct wpa_eapol_key *reply;
 	u8 *rbuf, *key_mic;
-	size_t kde_len = 0;
-
-#ifdef CONFIG_OCV
-	if (wpa_sm_ocv_enabled(sm))
-		kde_len = OCV_OCI_KDE_LEN;
-#endif /* CONFIG_OCV */
 
 	mic_len = wpa_mic_len(sm->key_mgmt, sm->pmk_len);
 	hdrlen = sizeof(*reply) + mic_len + 2;
 	rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
-				  hdrlen + kde_len, &rlen, (void *) &reply);
+				  hdrlen, &rlen, (void *) &reply);
 	if (rbuf == NULL)
 		return -1;
 
@@ -1732,27 +1657,7 @@
 		  WPA_REPLAY_COUNTER_LEN);
 
 	key_mic = (u8 *) (reply + 1);
-	WPA_PUT_BE16(key_mic + mic_len, kde_len); /* Key Data Length */
-
-#ifdef CONFIG_OCV
-	if (wpa_sm_ocv_enabled(sm)) {
-		struct wpa_channel_info ci;
-		u8 *pos;
-
-		if (wpa_sm_channel_info(sm, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info for OCI element in EAPOL-Key 2/2");
-			os_free(rbuf);
-			return -1;
-		}
-
-		pos = key_mic + mic_len + 2; /* Key Data */
-		if (ocv_insert_oci_kde(&ci, &pos) < 0) {
-			os_free(rbuf);
-			return -1;
-		}
-	}
-#endif /* CONFIG_OCV */
+	WPA_PUT_BE16(key_mic + mic_len, 0);
 
 	wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Sending EAPOL-Key 2/2");
 	return wpa_eapol_key_send(sm, &sm->ptk, ver, sm->bssid, ETH_P_EAPOL,
@@ -2959,9 +2864,6 @@
 	case WPA_PARAM_MFP:
 		sm->mfp = value;
 		break;
-	case WPA_PARAM_OCV:
-		sm->ocv = value;
-		break;
 	default:
 		break;
 	}
@@ -3036,19 +2938,6 @@
 }
 
 
-int wpa_sm_ocv_enabled(struct wpa_sm *sm)
-{
-	struct wpa_ie_data rsn;
-
-	if (!sm->ocv || !sm->ap_rsn_ie)
-		return 0;
-
-	return wpa_parse_wpa_ie_rsn(sm->ap_rsn_ie, sm->ap_rsn_ie_len,
-				    &rsn) >= 0 &&
-		(rsn.capabilities & WPA_CAPABILITY_OCVC);
-}
-
-
 /**
  * wpa_sm_set_assoc_wpa_ie_default - Generate own WPA/RSN IE from configuration
  * @sm: Pointer to WPA state machine data from wpa_sm_init()
@@ -3928,8 +3817,6 @@
 	if (sm->mgmt_group_cipher == WPA_CIPHER_AES_128_CMAC)
 		capab |= WPA_CAPABILITY_MFPC;
 #endif /* CONFIG_IEEE80211W */
-	if (sm->ocv)
-		capab |= WPA_CAPABILITY_OCVC;
 	wpabuf_put_le16(buf, capab);
 
 	/* PMKID Count */
@@ -4064,26 +3951,6 @@
 
 	/* TODO: FILS IP Address Assignment */
 
-#ifdef CONFIG_OCV
-	if (wpa_sm_ocv_enabled(sm)) {
-		struct wpa_channel_info ci;
-		u8 *pos;
-
-		if (wpa_sm_channel_info(sm, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "FILS: Failed to get channel info for OCI element");
-			wpabuf_free(buf);
-			return NULL;
-		}
-
-		pos = wpabuf_put(buf, OCV_OCI_EXTENDED_LEN);
-		if (ocv_insert_extended_oci(&ci, pos) < 0) {
-			wpabuf_free(buf);
-			return NULL;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	wpa_hexdump_buf(MSG_DEBUG, "FILS: Association Request plaintext", buf);
 
 	*kek = sm->ptk.kek;
@@ -4247,25 +4114,6 @@
 		goto fail;
 	}
 
-#ifdef CONFIG_OCV
-	if (wpa_sm_ocv_enabled(sm)) {
-		struct wpa_channel_info ci;
-
-		if (wpa_sm_channel_info(sm, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info to validate received OCI in FILS (Re)Association Response frame");
-			goto fail;
-		}
-
-		if (ocv_verify_tx_params(elems.oci, elems.oci_len, &ci,
-					 channel_width_to_int(ci.chanwidth),
-					 ci.seg1_idx) != 0) {
-			wpa_printf(MSG_WARNING, "FILS: %s", ocv_errorstr);
-			goto fail;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	/* Key Delivery */
 	if (!elems.key_delivery) {
 		wpa_printf(MSG_DEBUG, "FILS: No Key Delivery element");
diff --git a/src/rsn_supp/wpa.h b/src/rsn_supp/wpa.h
index 9eee383..21f4b17 100644
--- a/src/rsn_supp/wpa.h
+++ b/src/rsn_supp/wpa.h
@@ -18,7 +18,6 @@
 struct eapol_sm;
 struct wpa_config_blob;
 struct hostapd_freq_params;
-struct wpa_channel_info;
 
 struct wpa_sm_ctx {
 	void *ctx; /* pointer to arbitrary upper level context */
@@ -83,7 +82,6 @@
 	int (*key_mgmt_set_pmk)(void *ctx, const u8 *pmk, size_t pmk_len);
 	void (*fils_hlp_rx)(void *ctx, const u8 *dst, const u8 *src,
 			    const u8 *pkt, size_t pkt_len);
-	int (*channel_info)(void *ctx, struct wpa_channel_info *ci);
 };
 
 
@@ -97,8 +95,7 @@
 	WPA_PARAM_KEY_MGMT,
 	WPA_PARAM_MGMT_GROUP,
 	WPA_PARAM_RSN_ENABLED,
-	WPA_PARAM_MFP,
-	WPA_PARAM_OCV
+	WPA_PARAM_MFP
 };
 
 struct rsn_supp_config {
@@ -144,7 +141,6 @@
 int wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen,
 		      int verbose);
 int wpa_sm_pmf_enabled(struct wpa_sm *sm);
-int wpa_sm_ocv_enabled(struct wpa_sm *sm);
 
 void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise);
 
@@ -283,11 +279,6 @@
 	return 0;
 }
 
-static inline int wpa_sm_ocv_enabled(struct wpa_sm *sm)
-{
-	return 0;
-}
-
 static inline void wpa_sm_key_request(struct wpa_sm *sm, int error,
 				      int pairwise)
 {
diff --git a/src/rsn_supp/wpa_ft.c b/src/rsn_supp/wpa_ft.c
index 7dcb104..b8d60e3 100644
--- a/src/rsn_supp/wpa_ft.c
+++ b/src/rsn_supp/wpa_ft.c
@@ -14,8 +14,6 @@
 #include "crypto/random.h"
 #include "common/ieee802_11_defs.h"
 #include "common/ieee802_11_common.h"
-#include "common/ocv.h"
-#include "drivers/driver.h"
 #include "wpa.h"
 #include "wpa_i.h"
 
@@ -244,8 +242,6 @@
 	    sm->mgmt_group_cipher == WPA_CIPHER_BIP_CMAC_256)
 		capab |= WPA_CAPABILITY_MFPC;
 #endif /* CONFIG_IEEE80211W */
-	if (sm->ocv)
-		capab |= WPA_CAPABILITY_OCVC;
 	WPA_PUT_LE16(pos, capab);
 	pos += 2;
 
@@ -327,26 +323,6 @@
 	*pos++ = sm->r0kh_id_len;
 	os_memcpy(pos, sm->r0kh_id, sm->r0kh_id_len);
 	pos += sm->r0kh_id_len;
-#ifdef CONFIG_OCV
-	if (kck && wpa_sm_ocv_enabled(sm)) {
-		/* OCI sub-element in the third FT message */
-		struct wpa_channel_info ci;
-
-		if (wpa_sm_channel_info(sm, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info for OCI element in FTE");
-			os_free(buf);
-			return NULL;
-		}
-
-		*pos++ = FTIE_SUBELEM_OCI;
-		*pos++ = OCV_OCI_LEN;
-		if (ocv_insert_oci(&ci, &pos) < 0) {
-			os_free(buf);
-			return NULL;
-		}
-	}
-#endif /* CONFIG_OCV */
 	*ftie_len = pos - ftie_len - 1;
 
 	if (ric_ies) {
@@ -985,25 +961,6 @@
 		return -1;
 	}
 
-#ifdef CONFIG_OCV
-	if (wpa_sm_ocv_enabled(sm)) {
-		struct wpa_channel_info ci;
-
-		if (wpa_sm_channel_info(sm, &ci) != 0) {
-			wpa_printf(MSG_WARNING,
-				   "Failed to get channel info to validate received OCI in (Re)Assoc Response");
-			return -1;
-		}
-
-		if (ocv_verify_tx_params(parse.oci, parse.oci_len, &ci,
-					 channel_width_to_int(ci.chanwidth),
-					 ci.seg1_idx) != 0) {
-			wpa_printf(MSG_WARNING, "%s", ocv_errorstr);
-			return -1;
-		}
-	}
-#endif /* CONFIG_OCV */
-
 	sm->ft_reassoc_completed = 1;
 
 	if (wpa_ft_process_gtk_subelem(sm, parse.gtk, parse.gtk_len) < 0)
diff --git a/src/rsn_supp/wpa_i.h b/src/rsn_supp/wpa_i.h
index e1a213b..b94b17a 100644
--- a/src/rsn_supp/wpa_i.h
+++ b/src/rsn_supp/wpa_i.h
@@ -86,7 +86,6 @@
 
 	int rsn_enabled; /* Whether RSN is enabled in configuration */
 	int mfp; /* 0 = disabled, 1 = optional, 2 = mandatory */
-	int ocv; /* Operating Channel Validation */
 
 	u8 *assoc_wpa_ie; /* Own WPA/RSN IE from (Re)AssocReq */
 	size_t assoc_wpa_ie_len;
@@ -396,14 +395,6 @@
 		sm->ctx->fils_hlp_rx(sm->ctx->ctx, dst, src, pkt, pkt_len);
 }
 
-static inline int wpa_sm_channel_info(struct wpa_sm *sm,
-				      struct wpa_channel_info *ci)
-{
-	if (!sm->ctx->channel_info)
-		return -1;
-	return sm->ctx->channel_info(sm->ctx->ctx, ci);
-}
-
 
 int wpa_eapol_key_send(struct wpa_sm *sm, struct wpa_ptk *ptk,
 		       int ver, const u8 *dest, u16 proto,
diff --git a/src/rsn_supp/wpa_ie.c b/src/rsn_supp/wpa_ie.c
index ae9f4ca..a3410d1 100644
--- a/src/rsn_supp/wpa_ie.c
+++ b/src/rsn_supp/wpa_ie.c
@@ -223,8 +223,6 @@
 	if (sm->mfp == 2)
 		capab |= WPA_CAPABILITY_MFPR;
 #endif /* CONFIG_IEEE80211W */
-	if (sm->ocv)
-		capab |= WPA_CAPABILITY_OCVC;
 	WPA_PUT_LE16(pos, capab);
 	pos += 2;
 
@@ -465,17 +463,6 @@
 	}
 #endif /* CONFIG_P2P */
 
-#ifdef CONFIG_OCV
-	if (pos[1] >= RSN_SELECTOR_LEN + 1 &&
-	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_OCI) {
-		ie->oci = pos + 2 + RSN_SELECTOR_LEN;
-		ie->oci_len = pos[1] - RSN_SELECTOR_LEN;
-		wpa_hexdump(MSG_DEBUG, "WPA: OCI KDE in EAPOL-Key",
-			    pos, pos[1] + 2);
-		return 0;
-	}
-#endif /* CONFIG_OCV */
-
 	return 0;
 }
 
diff --git a/src/rsn_supp/wpa_ie.h b/src/rsn_supp/wpa_ie.h
index 9d53973..0e72af5 100644
--- a/src/rsn_supp/wpa_ie.h
+++ b/src/rsn_supp/wpa_ie.h
@@ -53,10 +53,6 @@
 	const u8 *ip_addr_req;
 	const u8 *ip_addr_alloc;
 #endif /* CONFIG_P2P */
-#ifdef CONFIG_OCV
-	const u8 *oci;
-	size_t oci_len;
-#endif /* CONFIG_OCV */
 };
 
 int wpa_supplicant_parse_ies(const u8 *buf, size_t len,
diff --git a/src/utils/browser.c b/src/utils/browser.c
index ad0b382..9cf6152 100644
--- a/src/utils/browser.c
+++ b/src/utils/browser.c
@@ -166,7 +166,8 @@
 	g_object_set(G_OBJECT(s), "ssl-strict", FALSE, NULL);
 
 	ctx.win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-	gtk_window_set_role(GTK_WINDOW(ctx.win), "Hotspot 2.0 client");
+	gtk_window_set_wmclass(GTK_WINDOW(ctx.win), "Hotspot 2.0 client",
+			       "Hotspot 2.0 client");
 	gtk_window_set_default_size(GTK_WINDOW(ctx.win), 800, 600);
 
 	scroll = gtk_scrolled_window_new(NULL, NULL);
diff --git a/src/utils/eloop.c b/src/utils/eloop.c
index bb375be..436bc8c 100644
--- a/src/utils/eloop.c
+++ b/src/utils/eloop.c
@@ -224,25 +224,22 @@
 
 
 #ifdef CONFIG_ELOOP_KQUEUE
-
-static short event_type_kevent_filter(eloop_event_type type)
-{
-	switch (type) {
-	case EVENT_TYPE_READ:
-		return EVFILT_READ;
-	case EVENT_TYPE_WRITE:
-		return EVFILT_WRITE;
-	default:
-		return 0;
-	}
-}
-
-
 static int eloop_sock_queue(int sock, eloop_event_type type)
 {
+	int filter;
 	struct kevent ke;
 
-	EV_SET(&ke, sock, event_type_kevent_filter(type), EV_ADD, 0, 0, 0);
+	switch (type) {
+	case EVENT_TYPE_READ:
+		filter = EVFILT_READ;
+		break;
+	case EVENT_TYPE_WRITE:
+		filter = EVFILT_WRITE;
+		break;
+	default:
+		filter = 0;
+	}
+	EV_SET(&ke, sock, filter, EV_ADD, 0, 0, 0);
 	if (kevent(eloop.kqueuefd, &ke, 1, NULL, 0, NULL) == -1) {
 		wpa_printf(MSG_ERROR, "%s: kevent(ADD) for fd=%d failed: %s",
 			   __func__, sock, strerror(errno));
@@ -250,7 +247,6 @@
 	}
 	return 0;
 }
-
 #endif /* CONFIG_ELOOP_KQUEUE */
 
 
@@ -305,7 +301,7 @@
 #endif /* CONFIG_ELOOP_POLL */
 #if defined(CONFIG_ELOOP_EPOLL) || defined(CONFIG_ELOOP_KQUEUE)
 	if (new_max_sock >= eloop.max_fd) {
-		next = new_max_sock + 16;
+		next = eloop.max_fd == 0 ? 16 : eloop.max_fd * 2;
 		temp_table = os_realloc_array(eloop.fd_table, next,
 					      sizeof(struct eloop_sock));
 		if (temp_table == NULL)
@@ -415,8 +411,7 @@
 	os_memset(&eloop.fd_table[sock], 0, sizeof(struct eloop_sock));
 #endif /* CONFIG_ELOOP_EPOLL */
 #ifdef CONFIG_ELOOP_KQUEUE
-	EV_SET(&ke, sock, event_type_kevent_filter(table->type), EV_DELETE, 0,
-	       0, 0);
+	EV_SET(&ke, sock, 0, EV_DELETE, 0, 0, 0);
 	if (kevent(eloop.kqueuefd, &ke, 1, NULL, 0, NULL) < 0) {
 		wpa_printf(MSG_ERROR, "%s: kevent(DEL) for fd=%d failed: %s",
 			   __func__, sock, strerror(errno));
diff --git a/src/utils/http_curl.c b/src/utils/http_curl.c
index e62fbf9..58519ea 100644
--- a/src/utils/http_curl.c
+++ b/src/utils/http_curl.c
@@ -31,14 +31,6 @@
 #endif /* EAP_TLS_OPENSSL */
 
 
-#if OPENSSL_VERSION_NUMBER < 0x10100000L
-static const unsigned char * ASN1_STRING_get0_data(const ASN1_STRING *x)
-{
-	return ASN1_STRING_data((ASN1_STRING *) x);
-}
-#endif /* OpenSSL < 1.1.0 */
-
-
 struct http_ctx {
 	void *ctx;
 	struct xml_node_ctx *xml;
@@ -454,7 +446,6 @@
 #define sk_ASN1_IA5STRING_value(st, i) (ASN1_IA5STRING *) \
 sk_value(CHECKED_CAST(_STACK *, const STACK_OF(ASN1_IA5STRING) *, (st)), (i))
 #else /* OPENSSL_IS_BORINGSSL */
-#if OPENSSL_VERSION_NUMBER < 0x10100000L
 #define sk_LogotypeInfo_num(st) SKM_sk_num(LogotypeInfo, (st))
 #define sk_LogotypeInfo_value(st, i) SKM_sk_value(LogotypeInfo, (st), (i))
 #define sk_LogotypeImage_num(st) SKM_sk_num(LogotypeImage, (st))
@@ -465,13 +456,6 @@
 #define sk_HashAlgAndValue_value(st, i) SKM_sk_value(HashAlgAndValue, (st), (i))
 #define sk_ASN1_IA5STRING_num(st) SKM_sk_num(ASN1_IA5STRING, (st))
 #define sk_ASN1_IA5STRING_value(st, i) SKM_sk_value(ASN1_IA5STRING, (st), (i))
-#else
-DEFINE_STACK_OF(LogotypeInfo)
-DEFINE_STACK_OF(LogotypeImage)
-DEFINE_STACK_OF(LogotypeAudio)
-DEFINE_STACK_OF(HashAlgAndValue)
-DEFINE_STACK_OF(ASN1_IA5STRING)
-#endif
 #endif /* OPENSSL_IS_BORINGSSL */
 
 
@@ -502,8 +486,7 @@
 		return;
 
 	n->hash_len = ASN1_STRING_length(hash->hashValue);
-	n->hash = os_memdup(ASN1_STRING_get0_data(hash->hashValue),
-			    n->hash_len);
+	n->hash = os_memdup(ASN1_STRING_data(hash->hashValue), n->hash_len);
 	if (n->hash == NULL) {
 		os_free(n->alg_oid);
 		return;
@@ -516,7 +499,7 @@
 		os_free(n->hash);
 		return;
 	}
-	os_memcpy(n->uri, ASN1_STRING_get0_data(uri), len);
+	os_memcpy(n->uri, ASN1_STRING_data(uri), len);
 	n->uri[len] = '\0';
 
 	hcert->num_logo++;
@@ -831,9 +814,9 @@
 	}
 
 	wpa_hexdump(MSG_DEBUG, "logotypeExtn",
-		    ASN1_STRING_get0_data(os), ASN1_STRING_length(os));
+		    ASN1_STRING_data(os), ASN1_STRING_length(os));
 
-	data = ASN1_STRING_get0_data(os);
+	data = ASN1_STRING_data(os);
 	logo = d2i_LogotypeExtn(NULL, &data, ASN1_STRING_length(os));
 	if (logo == NULL) {
 		wpa_printf(MSG_INFO, "Failed to parse logotypeExtn");
@@ -1153,7 +1136,7 @@
 		return 0;
 	}
 
-	store = SSL_CTX_get_cert_store(SSL_get_SSL_CTX(s));
+	store = SSL_CTX_get_cert_store(s->ctx);
 	if (ctx->peer_issuer) {
 		wpa_printf(MSG_DEBUG, "OpenSSL: Add issuer");
 		debug_dump_cert("OpenSSL: Issuer certificate",
@@ -1289,13 +1272,12 @@
 }
 
 
-#if OPENSSL_VERSION_NUMBER < 0x10100000L
 static SSL_METHOD patch_ssl_method;
 static const SSL_METHOD *real_ssl_method;
 
 static int curl_patch_ssl_new(SSL *s)
 {
-	SSL_CTX *ssl = SSL_get_SSL_CTX(s);
+	SSL_CTX *ssl = s->ctx;
 	int ret;
 
 	ssl->method = real_ssl_method;
@@ -1306,7 +1288,6 @@
 
 	return ret;
 }
-#endif /* OpenSSL < 1.1.0 */
 
 #endif /* HAVE_OCSP */
 
@@ -1325,7 +1306,6 @@
 		SSL_CTX_set_tlsext_status_cb(ssl, ocsp_resp_cb);
 		SSL_CTX_set_tlsext_status_arg(ssl, ctx);
 
-#if OPENSSL_VERSION_NUMBER < 0x10100000L
 		/*
 		 * Use a temporary SSL_METHOD to get a callback on SSL_new()
 		 * from libcurl since there is no proper callback registration
@@ -1335,7 +1315,6 @@
 		patch_ssl_method.ssl_new = curl_patch_ssl_new;
 		real_ssl_method = ssl->method;
 		ssl->method = &patch_ssl_method;
-#endif /* OpenSSL < 1.1.0 */
 	}
 #endif /* HAVE_OCSP */
 
@@ -1372,7 +1351,7 @@
 #ifdef EAP_TLS_OPENSSL
 		curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, curl_cb_ssl);
 		curl_easy_setopt(curl, CURLOPT_SSL_CTX_DATA, ctx);
-#if defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+#ifdef OPENSSL_IS_BORINGSSL
 		/* For now, using the CURLOPT_SSL_VERIFYSTATUS option only
 		 * with BoringSSL since the OpenSSL specific callback hack to
 		 * enable OCSP is not available with BoringSSL. The OCSP
diff --git a/src/utils/wpa_debug.c b/src/utils/wpa_debug.c
index c437000..a56462b 100644
--- a/src/utils/wpa_debug.c
+++ b/src/utils/wpa_debug.c
@@ -422,12 +422,6 @@
 #ifdef CONFIG_ANDROID_LOG
 	_wpa_hexdump(level, title, buf, len, show);
 #else /* CONFIG_ANDROID_LOG */
-#ifdef CONFIG_DEBUG_SYSLOG
-	if (wpa_debug_syslog) {
-		_wpa_hexdump(level, title, buf, len, show);
-		return;
-	}
-#endif /* CONFIG_DEBUG_SYSLOG */
 	wpa_debug_print_timestamp();
 #ifdef CONFIG_DEBUG_FILE
 	if (out_file) {
diff --git a/src/wps/wps_attr_build.c b/src/wps/wps_attr_build.c
index 7dfa95b..770f5e9 100644
--- a/src/wps/wps_attr_build.c
+++ b/src/wps/wps_attr_build.c
@@ -60,8 +60,7 @@
 		}
 		wps->dh_privkey = wpabuf_dup(wps->wps->ap_nfc_dh_privkey);
 		pubkey = wpabuf_dup(wps->wps->ap_nfc_dh_pubkey);
-		if (wps->dh_privkey && pubkey)
-			wps->dh_ctx = dh5_init_fixed(wps->dh_privkey, pubkey);
+		wps->dh_ctx = dh5_init_fixed(wps->dh_privkey, pubkey);
 #endif /* CONFIG_WPS_NFC */
 	} else {
 		wpa_printf(MSG_DEBUG, "WPS: Generate new DH keys");
diff --git a/src/wps/wps_validate.c b/src/wps/wps_validate.c
index 5c12bce..267b565 100644
--- a/src/wps/wps_validate.c
+++ b/src/wps/wps_validate.c
@@ -1057,7 +1057,7 @@
 }
 
 
-static int wps_validate_credential(const u8 *cred[], u16 len[], size_t num,
+static int wps_validate_credential(const u8 *cred[], size_t len[], size_t num,
 				   int mandatory)
 {
 	size_t i;
