[RFC v2 22/99] NAN: Add support for converting NAN schedule entries to availability

Andrei Otcheretianski andrei.otcheretianski at intel.com
Tue Dec 23 03:51:26 PST 2025


From: Ilan Peer <ilan.peer at intel.com>

Add a utility function to convert NAN schedule entries (as defined
by the Wi-Fi Aware specification version 4.0 in Table 104) to NAN
availability entries (as defined internally).

Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
 src/nan/nan.c      |  15 +-----
 src/nan/nan_i.h    |   6 +++
 src/nan/nan_util.c | 114 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 121 insertions(+), 14 deletions(-)

diff --git a/src/nan/nan.c b/src/nan/nan.c
index 1f642ad4d4..d8f4ae9cf1 100644
--- a/src/nan/nan.c
+++ b/src/nan/nan.c
@@ -38,22 +38,9 @@ struct nan_data * nan_init(const struct nan_config *cfg)
 }
 
 
-static void nan_del_avail_entry(struct nan_avail_entry *entry)
-{
-	os_free(entry->band_chan);
-	os_free(entry);
-}
-
-
 static void nan_peer_flush_avail(struct nan_peer_info *info)
 {
-	struct nan_avail_entry *cur, *next;
-
-	dl_list_for_each_safe(cur, next, &info->avail_entries,
-			      struct nan_avail_entry, list) {
-		dl_list_del(&cur->list);
-		nan_del_avail_entry(cur);
-	}
+	nan_flush_avail_entries(&info->avail_entries);
 }
 
 
diff --git a/src/nan/nan_i.h b/src/nan/nan_i.h
index 5c48865b1b..49f6fa86a4 100644
--- a/src/nan/nan_i.h
+++ b/src/nan/nan_i.h
@@ -431,4 +431,10 @@ int nan_add_avail_attrs(struct nan_data *nan, u8 sequence_id,
 			u8 type_for_conditional,
 			size_t n_chans, struct nan_chan_schedule *chans,
 			struct wpabuf *buf);
+void nan_del_avail_entry(struct nan_avail_entry *entry);
+void nan_flush_avail_entries(struct dl_list *avail_entries);
+int nan_sched_entries_to_avail_entries(struct nan_data *nan,
+				       struct dl_list *avail_entries,
+				       u8 *sched_entries,
+				       u16 sched_entries_len);
 #endif
diff --git a/src/nan/nan_util.c b/src/nan/nan_util.c
index cf37545683..bdbc798e1a 100644
--- a/src/nan/nan_util.c
+++ b/src/nan/nan_util.c
@@ -812,3 +812,117 @@ int nan_add_avail_attrs(struct nan_data *nan, u8 sequence_id,
 
 	return 0;
 }
+
+
+/**
+ * nan_del_avail_entry - Delete an availability entry
+ *
+ * @entry: The availability entry to delete
+ */
+void nan_del_avail_entry(struct nan_avail_entry *entry)
+{
+	os_free(entry->band_chan);
+	os_free(entry);
+}
+
+
+/**
+ * nan_flush_avail_entries - Flush a list of availability entries
+ *
+ * @avail_entries: List of availability entries
+ */
+void nan_flush_avail_entries(struct dl_list *avail_entries)
+{
+	struct nan_avail_entry *cur, *next;
+
+	dl_list_for_each_safe(cur, next, avail_entries,
+			      struct nan_avail_entry, list) {
+		dl_list_del(&cur->list);
+		nan_del_avail_entry(cur);
+	}
+}
+
+
+/**
+ * nan_sched_entries_to_avail_entries - Convert NAN schedule entries to NAN
+ * availability entries
+ *
+ * @nan: NAN module context from nan_init()
+ * @avail_entries: On successful return would hold a valid list of availability
+ *     entries
+ * @sched_entries: Buffer holding the schedule entries, each of type
+ *     &struct nan_sched_entry
+ * @sched_entries_len: Length of the sched_entries buffer
+ */
+int nan_sched_entries_to_avail_entries(struct nan_data *nan,
+				       struct dl_list *avail_entries,
+				       u8 *sched_entries,
+				       u16 sched_entries_len)
+{
+	dl_list_init(avail_entries);
+
+	if (!sched_entries || !sched_entries_len)
+		return 0;
+
+	if (sched_entries_len < sizeof(struct nan_sched_entry)) {
+		wpa_printf(MSG_DEBUG,
+			   "NAN: Schedule entry too short=%u",
+			   sched_entries_len);
+		return -1;
+	}
+
+	while (sched_entries_len > 0) {
+		struct nan_sched_entry *sched_entry =
+			(struct nan_sched_entry *)sched_entries;
+		struct nan_avail_entry *avail_entry;
+		u16 ctrl;
+
+		if (sched_entries_len <
+		    sizeof(struct nan_sched_entry) + sched_entry->len) {
+			wpa_printf(MSG_DEBUG,
+				   "NAN: Invalid schedule entry len=%u",
+				   sched_entry->len);
+			goto fail;
+		}
+
+		if (sched_entry->len > NAN_TIME_BITMAP_MAX_LEN)
+			goto fail;
+
+		avail_entry = os_zalloc(sizeof(struct nan_avail_entry));
+		if (!avail_entry)
+			goto fail;
+
+		avail_entry->map_id = sched_entry->map_id;
+		ctrl = le_to_host16(sched_entry->control);
+
+		avail_entry->tbm.duration =
+			BITS(ctrl,
+			     NAN_TIME_BM_CTRL_BIT_DURATION_MASK,
+			     NAN_TIME_BM_CTRL_BIT_DURATION_POS);
+		avail_entry->tbm.period =
+			BITS(ctrl,
+			     NAN_TIME_BM_CTRL_PERIOD_MASK,
+			     NAN_TIME_BM_CTRL_PERIOD_POS);
+		avail_entry->tbm.offset =
+			BITS(ctrl,
+			     NAN_TIME_BM_CTRL_START_OFFSET_MASK,
+			     NAN_TIME_BM_CTRL_START_OFFSET_POS);
+
+		avail_entry->tbm.len = sched_entry->len;
+		os_memcpy(avail_entry->tbm.bitmap, sched_entry->bm,
+			  sched_entry->len);
+
+		dl_list_init(&avail_entry->list);
+		dl_list_add(avail_entries, &avail_entry->list);
+
+		sched_entries_len -= sizeof(struct nan_sched_entry) +
+			sched_entry->len;
+		sched_entries += sizeof(struct nan_sched_entry) +
+			sched_entry->len;
+	}
+
+	return 0;
+fail:
+	nan_flush_avail_entries(avail_entries);
+	return -1;
+}
-- 
2.49.0




More information about the Hostap mailing list