]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Pass "global" events to all interfaces
authorCermak Dominik <Dominik.Cermak@joynext.com>
Thu, 29 Aug 2024 08:01:21 +0000 (08:01 +0000)
committerJouni Malinen <j@w1.fi>
Sun, 1 Sep 2024 12:39:36 +0000 (15:39 +0300)
We got connection failures because of outdated channel information.
That's because the NL80211_CMD_REG_CHANGE event is important for all
interfaces.

Commit f13683720239 ("nl80211: Pass wiphy events to all affected
interfaces") skips the early termination for events directed to a wiphy,
but that doesn't cover the regulatory change event because it doesn't
have a wiphy set either. Therefore the early termination still kicks in
and from three interfaces, only one got the updated channel list.

Fix this by changing the early termination logic to only apply to events
directed either to a specific interface index for wdev.

Signed-off-by: Dominik Cermak <dominik.cermak@joynext.com>
src/drivers/driver_nl80211_event.c

index 9032070673223b76e049f7ac99e02ba6a6bf3aac..849666f5c46377099aba93f794581e9d1ad4055f 100644 (file)
@@ -4257,7 +4257,16 @@ int process_global_event(struct nl_msg *msg, void *arg)
                             wdev_id == bss->wdev_id)) {
                                processed = true;
                                do_process_drv_event(bss, gnlh->cmd, tb);
-                               if (!wiphy_idx_set)
+                               /* There are two types of events that may need
+                                * to be delivered to multiple interfaces:
+                                * 1. Events for a wiphy, as it can have
+                                * multiple interfaces.
+                                * 2. "Global" events, like
+                                * NL80211_CMD_REG_CHANGE.
+                                *
+                                * Terminate early only if the event is directed
+                                * to a specific interface or wdev. */
+                               if (ifidx != -1 || wdev_id_set)
                                        return NL_SKIP;
                                /* The driver instance could have been removed,
                                 * e.g., due to NL80211_CMD_RADAR_DETECT event,