[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