diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 5ae12dc01..ad06e6a3f 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -2383,6 +2383,32 @@ static void hostapd_eapol_tx_status(struct hostapd_data *hapd, const u8 *dst, #endif /* NEED_AP_MLME */ +#ifdef CONFIG_IEEE80211AX +static void hostapd_event_color_change(struct hostapd_data *hapd, bool success) +{ + struct hostapd_data *bss; + size_t i; + + for (i = 0; i < hapd->iface->num_bss; i++) { + bss = hapd->iface->bss[i]; + if (bss->cca_color == 0) + continue; + + if (success) + hapd->iface->conf->he_op.he_bss_color = bss->cca_color; + + bss->cca_in_progress = 0; + if (ieee802_11_set_beacon(bss)) { + wpa_printf(MSG_ERROR, "Failed to remove BCCA element"); + bss->cca_in_progress = 1; + } else { + hostapd_cleanup_cca_params(bss); + } + } +} +#endif /* CONFIG_IEEE80211AX */ + + void wpa_supplicant_event(void *ctx, enum wpa_event_type event, union wpa_event_data *data) { @@ -2720,14 +2746,12 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, case EVENT_CCA_ABORTED_NOTIFY: wpa_printf(MSG_DEBUG, "CCA aborted on %s", hapd->conf->iface); - hostapd_cleanup_cca_params(hapd); + hostapd_event_color_change(hapd, false); break; case EVENT_CCA_NOTIFY: wpa_printf(MSG_DEBUG, "CCA finished on %s", hapd->conf->iface); - if (hapd->cca_color) - hapd->iface->conf->he_op.he_bss_color = hapd->cca_color; - hostapd_cleanup_cca_params(hapd); + hostapd_event_color_change(hapd, true); break; #endif /* CONFIG_IEEE80211AX */ default: