[PATCH 64/97] NAN: Modify nan_peer_schedule_intersects() to return the common slots
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Tue Apr 28 13:06:05 PDT 2026
From: Avraham Stern <avraham.stern at intel.com>
Modify nan_peer_schedule_intersects() to return a bitfield of the
common slots with a given peer, or NULL if there are no common slots.
Rename it to nan_peer_schedule_intersection() to better reflect its
new purpose.
Signed-off-by: Avraham Stern <avraham.stern at intel.com>
---
src/nan/nan.c | 7 +++++-
src/nan/nan_i.h | 6 ++---
src/nan/nan_util.c | 62 ++++++++++++++++++++++++++++++++++++++--------
3 files changed, 60 insertions(+), 15 deletions(-)
diff --git a/src/nan/nan.c b/src/nan/nan.c
index b23b64a6e6..1e8325a140 100644
--- a/src/nan/nan.c
+++ b/src/nan/nan.c
@@ -9,6 +9,7 @@
#include "includes.h"
#include "common.h"
#include "utils/eloop.h"
+#include "utils/bitfield.h"
#include "common/ieee802_11_common.h"
#include "pasn/pasn_common.h"
#include "nan.h"
@@ -1438,16 +1439,20 @@ int nan_configure_peer_schedule(struct nan_data *nan, struct nan_peer *peer,
struct nan_dev_capa_entry *cur;
struct nan_device_capabilities *capa = NULL;
struct nan_peer_schedule sched;
+ struct bitfield *common_bf;
wpa_printf(MSG_DEBUG, "NAN: Configure peer schedule");
os_memset(&sched, 0, sizeof(sched));
- if (nan_peer_schedule_intersects(nan, peer, local_sched))
+ common_bf = nan_peer_schedule_intersection(nan, peer, local_sched);
+ if (common_bf)
nan_peer_get_committed_avail(nan, peer, local_sched, &sched);
else
wpa_printf(MSG_DEBUG,
"NAN: Cannot configure peer schedule since there is no intersection");
+ bitfield_free(common_bf);
+
dl_list_for_each(cur, &peer->info.dev_capa,
struct nan_dev_capa_entry, list) {
/*
diff --git a/src/nan/nan_i.h b/src/nan/nan_i.h
index 592268aa4a..ff36fa04af 100644
--- a/src/nan/nan_i.h
+++ b/src/nan/nan_i.h
@@ -731,9 +731,9 @@ int nan_ndl_add_avail_attrs(struct nan_data *nan, const struct nan_peer *peer,
void nan_ndl_add_elem_container_attr(const struct nan_data *nan,
const struct nan_peer *peer,
struct wpabuf *buf);
-bool nan_peer_schedule_intersects(struct nan_data *nan,
- const struct nan_peer *peer,
- const struct nan_schedule *sched);
+struct bitfield *nan_peer_schedule_intersection(
+ struct nan_data *nan, const struct nan_peer *peer,
+ const struct nan_schedule *sched);
int nan_convert_chan_sched_to_bf(struct nan_data *nan,
const struct nan_chan_schedule *chan,
struct bitfield **avail_bf, u8 *map_id,
diff --git a/src/nan/nan_util.c b/src/nan/nan_util.c
index d55baebe81..da9337092a 100644
--- a/src/nan/nan_util.c
+++ b/src/nan/nan_util.c
@@ -1914,21 +1914,26 @@ int nan_convert_chan_sched_to_bf(struct nan_data *nan,
/*
- * nan_peer_schedule_intersects - Check if local and peer schedules intersect
+ * nan_peer_schedule_intersection - Get local and peer schedules intersection
*
* @nan: NAN module context from nan_init()
* @peer: The peer with whom to intersect the schedule
* @sched: Local device schedule
- * Returns: true if schedules intersect, false otherwise
+ * Returns: Bitfield representing the intersection of schedules, or NULL if
+ * no intersection
*
* The function checks if the local device schedule intersects with the peer
- * device schedule.
+ * device schedule and returns a bitfield representing the intersection,
+ * or NULL if no intersection.
*/
-bool nan_peer_schedule_intersects(struct nan_data *nan,
- const struct nan_peer *peer,
- const struct nan_schedule *sched)
+struct bitfield *nan_peer_schedule_intersection(
+ struct nan_data *nan,
+ const struct nan_peer *peer,
+ const struct nan_schedule *sched)
{
size_t i;
+ struct bitfield *common_bf = NULL;
+ bool intersects = false;
/*
* Iterate over all the channels included in the local schedule. For
@@ -1955,7 +1960,7 @@ bool nan_peer_schedule_intersects(struct nan_data *nan,
if (ret) {
wpa_printf(MSG_DEBUG,
"NAN: NDL: Failed to convert chan sched to bitfield");
- return false;
+ return NULL;
}
/* Get the peer availability for the current channel */
@@ -1968,16 +1973,51 @@ bool nan_peer_schedule_intersects(struct nan_data *nan,
continue;
}
- ret = bitfield_intersects(own_chan_bf, peer_chan_bf);
+ intersects |= bitfield_intersects(own_chan_bf, peer_chan_bf);
+
+ ret = bitfield_intersect_in_place(own_chan_bf, peer_chan_bf);
+ if (ret < 0) {
+ wpa_printf(MSG_DEBUG,
+ "NAN: Failed to intersect own and peer chan bitfields");
+ bitfield_free(own_chan_bf);
+ bitfield_free(peer_chan_bf);
+ bitfield_free(common_bf);
+ return NULL;
+ }
bitfield_free(peer_chan_bf);
+
+ if (common_bf) {
+ ret = bitfield_union_in_place(common_bf, own_chan_bf);
+ if (ret) {
+ wpa_printf(MSG_DEBUG,
+ "NAN: Failed to unify own chan bitfields");
+
+ bitfield_free(own_chan_bf);
+ bitfield_free(common_bf);
+ return NULL;
+ }
+ } else {
+ common_bf = bitfield_dup(own_chan_bf);
+ if (!common_bf) {
+ wpa_printf(MSG_DEBUG,
+ "NAN: Failed to dup own chan bitfield");
+
+ bitfield_free(own_chan_bf);
+ bitfield_free(common_bf);
+ return NULL;
+ }
+ }
+
bitfield_free(own_chan_bf);
+ }
- if (ret == 1)
- return true;
+ if (!intersects) {
+ bitfield_free(common_bf);
+ return NULL;
}
- return false;
+ return common_bf;
}
--
2.53.0
More information about the Hostap
mailing list