]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: AP MLD: Parse link ID to determine the BSS for color event
authorAditya Kumar Singh <quic_adisi@quicinc.com>
Wed, 12 Jun 2024 14:27:53 +0000 (19:57 +0530)
committerJouni Malinen <j@w1.fi>
Thu, 11 Jul 2024 14:23:47 +0000 (17:23 +0300)
When an HE BSS color event is received from the driver, the event was
delevered to the first link BSS ctx. To support HE BSS color with MLO,
there is a need to identify the correct link for which the event is
intended.

Add link ID parsing support in the event handler and pass the link ID
(if included) down to the event handler so that appropriate link can be
selected.

Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
src/ap/drv_callbacks.c
src/drivers/driver.h
src/drivers/driver_nl80211_event.c

index ad06e6a3f3cf057d78fc8a5fb1ecb2bf61b4ca30..8b49b531e915ffd6644fc4b652e4bfc6c12c6520 100644 (file)
@@ -2734,21 +2734,29 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                /* The BSS color is shared amongst all BBSs on a specific phy.
                 * Therefore we always start the color change on the primary
                 * BSS. */
+               hapd = switch_link_hapd(hapd,
+                                       data->bss_color_collision.link_id);
                wpa_printf(MSG_DEBUG, "BSS color collision on %s",
                           hapd->conf->iface);
                hostapd_switch_color(hapd->iface->bss[0],
                                     data->bss_color_collision.bitmap);
                break;
        case EVENT_CCA_STARTED_NOTIFY:
+               hapd = switch_link_hapd(hapd,
+                                       data->bss_color_collision.link_id);
                wpa_printf(MSG_DEBUG, "CCA started on %s",
                           hapd->conf->iface);
                break;
        case EVENT_CCA_ABORTED_NOTIFY:
+               hapd = switch_link_hapd(hapd,
+                                       data->bss_color_collision.link_id);
                wpa_printf(MSG_DEBUG, "CCA aborted on %s",
                           hapd->conf->iface);
                hostapd_event_color_change(hapd, false);
                break;
        case EVENT_CCA_NOTIFY:
+               hapd = switch_link_hapd(hapd,
+                                       data->bss_color_collision.link_id);
                wpa_printf(MSG_DEBUG, "CCA finished on %s",
                           hapd->conf->iface);
                hostapd_event_color_change(hapd, true);
index 204694dd4dd55ef0eb16b5fc50aa17d7a747c8b2..3e77474899ebb4716c7104d566ceb4f20efe5afb 100644 (file)
@@ -6799,6 +6799,7 @@ union wpa_event_data {
         */
        struct bss_color_collision {
                u64 bitmap;
+               int link_id;
        } bss_color_collision;
 
        /**
index f033e64bf120bcad8d3776bb13dc2409ed68e01d..aee815e9705a3f565d041aa824c54545c39b545a 100644 (file)
@@ -3800,6 +3800,7 @@ static void nl80211_obss_color_event(struct i802_bss *bss,
        enum wpa_event_type event_type;
 
        os_memset(&data, 0, sizeof(data));
+       data.bss_color_collision.link_id = NL80211_DRV_LINK_ID_NA;
 
        switch (cmd) {
        case NL80211_CMD_OBSS_COLOR_COLLISION:
@@ -3830,6 +3831,22 @@ static void nl80211_obss_color_event(struct i802_bss *bss,
                return;
        }
 
+       if (tb[NL80211_ATTR_MLO_LINK_ID]) {
+               data.bss_color_collision.link_id =
+                       nla_get_u8(tb[NL80211_ATTR_MLO_LINK_ID]);
+
+               if (!nl80211_link_valid(bss->valid_links,
+                                       data.bss_color_collision.link_id)) {
+                       wpa_printf(MSG_DEBUG,
+                                  "nl80211: Invalid BSS color event link ID %d",
+                                  data.bss_color_collision.link_id);
+                       return;
+               }
+
+               wpa_printf(MSG_DEBUG, "nl80211: BSS color event - Link ID %d",
+                          data.bss_color_collision.link_id);
+       }
+
        wpa_supplicant_event(bss->ctx, event_type, &data);
 }