From a685d84139e68aff8289a1a40ee191e2950fda61 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 7 Aug 2023 21:59:47 +0200 Subject: [PATCH] BSS coloring: Fix CCA with multiple BSS Pass bss->ctx instead of drv->ctx in order to avoid multiple reports for the first bss. The first report would otherwise clear hapd->cca_color and subsequent reports would cause the iface bss color to be set to 0. In order to avoid any issues with cancellations, only overwrite the color based on hapd->cca_color if it was actually set. Fixes: 33c4dd26cd11 ("BSS coloring: Handle the collision and CCA events coming from the kernel") Signed-off-by: Felix Fietkau --- src/ap/drv_callbacks.c | 3 ++- src/drivers/driver_nl80211_event.c | 27 ++++++++++++--------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 612802b11..5bc8402db 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -2471,7 +2471,8 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, case EVENT_CCA_NOTIFY: wpa_printf(MSG_DEBUG, "CCA finished on on %s", hapd->conf->iface); - hapd->iface->conf->he_op.he_bss_color = hapd->cca_color; + if (hapd->cca_color) + hapd->iface->conf->he_op.he_bss_color = hapd->cca_color; hostapd_cleanup_cca_params(hapd); break; #endif /* CONFIG_IEEE80211AX */ diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c index 03b395bca..9d39703e0 100644 --- a/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c @@ -3720,7 +3720,7 @@ static void nl80211_assoc_comeback(struct wpa_driver_nl80211_data *drv, #ifdef CONFIG_IEEE80211AX -static void nl80211_obss_color_collision(struct wpa_driver_nl80211_data *drv, +static void nl80211_obss_color_collision(struct i802_bss *bss, struct nlattr *tb[]) { union wpa_event_data data; @@ -3734,37 +3734,34 @@ static void nl80211_obss_color_collision(struct wpa_driver_nl80211_data *drv, wpa_printf(MSG_DEBUG, "nl80211: BSS color collision - bitmap %08llx", (long long unsigned int) data.bss_color_collision.bitmap); - wpa_supplicant_event(drv->ctx, EVENT_BSS_COLOR_COLLISION, &data); + wpa_supplicant_event(bss->ctx, EVENT_BSS_COLOR_COLLISION, &data); } -static void -nl80211_color_change_announcement_started(struct wpa_driver_nl80211_data *drv) +static void nl80211_color_change_announcement_started(struct i802_bss *bss) { union wpa_event_data data = {}; wpa_printf(MSG_DEBUG, "nl80211: CCA started"); - wpa_supplicant_event(drv->ctx, EVENT_CCA_STARTED_NOTIFY, &data); + wpa_supplicant_event(bss->ctx, EVENT_CCA_STARTED_NOTIFY, &data); } -static void -nl80211_color_change_announcement_aborted(struct wpa_driver_nl80211_data *drv) +static void nl80211_color_change_announcement_aborted(struct i802_bss *bss) { union wpa_event_data data = {}; wpa_printf(MSG_DEBUG, "nl80211: CCA aborted"); - wpa_supplicant_event(drv->ctx, EVENT_CCA_ABORTED_NOTIFY, &data); + wpa_supplicant_event(bss->ctx, EVENT_CCA_ABORTED_NOTIFY, &data); } -static void -nl80211_color_change_announcement_completed(struct wpa_driver_nl80211_data *drv) +static void nl80211_color_change_announcement_completed(struct i802_bss *bss) { union wpa_event_data data = {}; wpa_printf(MSG_DEBUG, "nl80211: CCA completed"); - wpa_supplicant_event(drv->ctx, EVENT_CCA_NOTIFY, &data); + wpa_supplicant_event(bss->ctx, EVENT_CCA_NOTIFY, &data); } #endif /* CONFIG_IEEE80211AX */ @@ -4024,16 +4021,16 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd, break; #ifdef CONFIG_IEEE80211AX case NL80211_CMD_OBSS_COLOR_COLLISION: - nl80211_obss_color_collision(drv, tb); + nl80211_obss_color_collision(bss, tb); break; case NL80211_CMD_COLOR_CHANGE_STARTED: - nl80211_color_change_announcement_started(drv); + nl80211_color_change_announcement_started(bss); break; case NL80211_CMD_COLOR_CHANGE_ABORTED: - nl80211_color_change_announcement_aborted(drv); + nl80211_color_change_announcement_aborted(bss); break; case NL80211_CMD_COLOR_CHANGE_COMPLETED: - nl80211_color_change_announcement_completed(drv); + nl80211_color_change_announcement_completed(bss); break; #endif /* CONFIG_IEEE80211AX */ default: