]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
BSS coloring: Fix CCA with multiple BSS
authorFelix Fietkau <nbd@nbd.name>
Mon, 7 Aug 2023 19:59:47 +0000 (21:59 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 11 Aug 2023 08:50:34 +0000 (11:50 +0300)
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 <nbd@nbd.name>
src/ap/drv_callbacks.c
src/drivers/driver_nl80211_event.c

index 612802b1169c67d9cf52ff03d2098e1b41c30515..5bc8402dbf82bf3769edcb63c4b9ce0383cc44c3 100644 (file)
@@ -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 */
index 03b395bca611593fd57aa5df0275de7126d532c2..9d39703e0bf6572ec05faa29c5c857d2ef862ae2 100644 (file)
@@ -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: