[PATCH 73/97] NAN: Skip peer schedule update when local schedule update is pending
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Tue Apr 28 13:06:14 PDT 2026
When a local NAN schedule update is in progress (deferred mode due to
active NDP), peer schedule changes may trigger peer schedule reconfiguration
to the kernel. Since the kernel may already have processed the new
schedule, and the supplicant still uses the previous local schedule for
peer channel filtering, it may result in inclusion of peer channels that were
already removed from the local schedule. The kernel rejects such
updates and this may result in NDP disconnection.
To prevent this race, skip the kernel peer schedule update when a local
deferred schedule update is in progress. The peer availability info
is still stored, and when the driver confirms the local schedule update,
all peers are updated anyway with the correct local schedule intersection.
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
src/nan/nan.c | 19 ++++++++++++++++++-
src/nan/nan.h | 1 +
src/nan/nan_i.h | 2 ++
wpa_supplicant/nan_supplicant.c | 3 +++
4 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/src/nan/nan.c b/src/nan/nan.c
index f347588f09..0d7110c98a 100644
--- a/src/nan/nan.c
+++ b/src/nan/nan.c
@@ -1517,7 +1517,14 @@ int nan_configure_peer_schedule(struct nan_data *nan, struct nan_peer *peer,
struct nan_peer_schedule sched;
struct bitfield *common_bf;
- wpa_printf(MSG_DEBUG, "NAN: Configure peer schedule");
+ wpa_printf(MSG_DEBUG, "NAN: Configure peer schedule for " MACSTR,
+ MAC2STR(peer->nmi_addr));
+
+ if (nan->sched_update_pending) {
+ wpa_printf(MSG_DEBUG,
+ "NAN: Skip peer schedule config - local schedule update pending");
+ return 0;
+ }
os_memset(&sched, 0, sizeof(sched));
common_bf = nan_peer_schedule_intersection(nan, peer, local_sched);
@@ -3364,6 +3371,16 @@ bool nan_has_active_ndp(struct nan_data *nan)
}
+void nan_set_sched_update_pending(struct nan_data *nan, bool pending)
+{
+ if (!nan)
+ return;
+
+ wpa_printf(MSG_DEBUG, "NAN: Set sched_update_pending to %d", pending);
+ nan->sched_update_pending = pending;
+}
+
+
void nan_local_sched_update(struct nan_data *nan, struct nan_schedule *sched)
{
struct nan_peer *peer;
diff --git a/src/nan/nan.h b/src/nan/nan.h
index 1b25783506..811516ac53 100644
--- a/src/nan/nan.h
+++ b/src/nan/nan.h
@@ -844,6 +844,7 @@ int nan_convert_sched_to_avail_attrs(struct nan_data *nan, u8 sequence_id,
struct wpabuf *buf,
bool include_potential);
void nan_local_sched_update(struct nan_data *nan, struct nan_schedule *sched);
+void nan_set_sched_update_pending(struct nan_data *nan, bool pending);
bool nan_peer_pairing_supported(struct nan_data *nan, const u8 *addr);
bool nan_peer_npk_nik_caching_supported(struct nan_data *nan, const u8 *addr);
int nan_get_peer_ndc_freq(struct nan_data *nan,
diff --git a/src/nan/nan_i.h b/src/nan/nan_i.h
index f4fad1bd39..3c8e94958c 100644
--- a/src/nan/nan_i.h
+++ b/src/nan/nan_i.h
@@ -568,6 +568,7 @@ struct nan_peer {
* struct nan_data - Internal data structure for NAN
* @cfg: Pointer to the NAN configuration structure
* @nan_started: Flag indicating if NAN has been started
+ * @sched_update_pending: Local schedule update is pending driver confirmation
* @peer_list: List of known peers
* @ndp_id_counter: NDP identifier counter. Incremented for each NDP request,
* and is used to set ndp_id in &struct nan_ndp.
@@ -587,6 +588,7 @@ struct nan_peer {
struct nan_data {
struct nan_config *cfg;
u8 nan_started:1;
+ u8 sched_update_pending:1;
struct dl_list peer_list;
u8 ndp_id_counter;
diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c
index eb2ac88e4a..c5626d7dcc 100644
--- a/wpa_supplicant/nan_supplicant.c
+++ b/wpa_supplicant/nan_supplicant.c
@@ -2218,6 +2218,7 @@ int wpas_nan_sched_config_map(struct wpa_supplicant *wpa_s, const char *cmd)
wpa_printf(MSG_DEBUG, "NAN: Set schedule config as deferred");
sched_cfg->deferred = true;
wpa_s->nan_sched_update.map_id = map_id;
+ nan_set_sched_update_pending(wpa_s->nan, true);
}
nan_dump_sched_config("NAN: Set schedule config", sched_cfg);
@@ -2228,6 +2229,7 @@ int wpas_nan_sched_config_map(struct wpa_supplicant *wpa_s, const char *cmd)
map_id);
os_memcpy(&wpa_s->nan_sched[map_id - 1], &old_sched_cfg,
sizeof(old_sched_cfg));
+ nan_set_sched_update_pending(wpa_s->nan, false);
goto out;
}
@@ -3406,6 +3408,7 @@ void wpas_nan_sched_update_done(struct wpa_supplicant *wpa_s,
return;
}
+ nan_set_sched_update_pending(wpa_s->nan, false);
wpas_notify_nan_sched_update_done(wpa_s, success);
if (!success) {
--
2.53.0
More information about the Hostap
mailing list