[RFC 22/56] NAN: Add support for converting NAN schedule entries to availability
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Sun Dec 7 03:18:31 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