[PATCH v2] nl80211: Pass "global" events to all interfaces

Cermak Dominik Dominik.Cermak at joynext.com
Thu Aug 29 01:01:21 PDT 2024


Extending commit f136837202393a7e1f3182e9efdbf1aaa0c1a5c2.

We got connection failures because of outdated channel information.
That's because the NL80211_CMD_REG_CHANGE event is important for all
interfaces, but the early termination still kicks in because it is not
directed to a specific wiphy.
Therefore 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 at joynext.com>
---
 src/drivers/driver_nl80211_event.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index 903207067..8e79b5848 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -4257,7 +4257,13 @@ 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.
+				 * Or in other words, terminate early only if it 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,
-- 
2.44.1



More information about the Hostap mailing list