[RFC PATCH 01/34] Initialize Proximity Ranging global context
Peddolla Harshavardhan Reddy
peddolla at qti.qualcomm.com
Thu May 15 00:17:24 PDT 2025
Signed-off-by: Peddolla Harshavardhan Reddy <peddolla at qti.qualcomm.com>
---
src/common/proximity_ranging.c | 53 +++++++++++++++++++++++++
src/common/proximity_ranging.h | 65 +++++++++++++++++++++++++++++++
wpa_supplicant/Android.mk | 6 +++
wpa_supplicant/Makefile | 6 +++
wpa_supplicant/pr_supplicant.c | 52 +++++++++++++++++++++++++
wpa_supplicant/pr_supplicant.h | 31 +++++++++++++++
wpa_supplicant/wpa_supplicant.c | 7 +++-
wpa_supplicant/wpa_supplicant_i.h | 2 +
8 files changed, 221 insertions(+), 1 deletion(-)
create mode 100644 src/common/proximity_ranging.c
create mode 100644 src/common/proximity_ranging.h
create mode 100644 wpa_supplicant/pr_supplicant.c
create mode 100644 wpa_supplicant/pr_supplicant.h
diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c
new file mode 100644
index 000000000..287bff2f7
--- /dev/null
+++ b/src/common/proximity_ranging.c
@@ -0,0 +1,53 @@
+/*
+ * Proxmity Ranging
+ * Copyright (c) 2025, Qualcomm Innovation Center, Inc.
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#include "includes.h"
+
+#include "common.h"
+#include "common/ieee802_11_defs.h"
+#include "common/ieee802_11_common.h"
+#include "common/qca-vendor.h"
+#include "wps/wps_i.h"
+#include "proximity_ranging.h"
+
+struct pr_data * pr_init(const struct pr_config *cfg)
+{
+ struct pr_data *pr;
+
+ pr = os_zalloc(sizeof(*pr) + sizeof(*cfg));
+ if (!pr)
+ return NULL;
+
+ pr->cfg = (struct pr_config *) (pr + 1);
+ os_memcpy(pr->cfg, cfg, sizeof(*cfg));
+ if (cfg->dev_name)
+ pr->cfg->dev_name = os_strdup(cfg->dev_name);
+ else
+ pr->cfg->dev_name = NULL;
+
+ dl_list_init(&pr->devices);
+
+ return pr;
+}
+
+
+void pr_deinit(struct pr_data *pr)
+{
+ struct pr_device *dev, *prev;
+
+ if (!pr)
+ return;
+
+ os_free(pr->cfg->dev_name);
+
+ dl_list_for_each_safe(dev, prev, &pr->devices, struct pr_device, list)
+ dl_list_del(&dev->list);
+
+ os_free(pr);
+ wpa_printf(MSG_DEBUG, "PR: Deinit done");
+}
diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h
new file mode 100644
index 000000000..33a67469b
--- /dev/null
+++ b/src/common/proximity_ranging.h
@@ -0,0 +1,65 @@
+/*
+ * Proxmity Ranging
+ * Copyright (c) 2025, Qualcomm Innovation Center, Inc.
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#ifndef PROXIMITY_RANGING_H
+#define PROXIMITY_RANGING_H
+
+
+#include "utils/list.h"
+#include "drivers/driver.h"
+
+
+/**
+ * PR_MAX_PEER - Maximum number of Proximity Ranging peers that device can store
+ */
+#define PR_MAX_PEER 100
+
+/**
+ * struct pr_device_info - Proximity ranging peer information
+ */
+struct pr_device {
+ struct dl_list list;
+ struct os_reltime last_seen;
+
+ /**
+ * pr_device_addr - PR Device Address of the peer
+ */
+ u8 pr_device_addr[ETH_ALEN];
+};
+
+
+struct pr_config {
+ u8 dev_addr[ETH_ALEN];
+
+ /**
+ * dev_name - Device Name
+ */
+ char *dev_name;
+
+ /**
+ * cb_ctx - Context to use with callback functions
+ */
+ void *cb_ctx;
+};
+
+struct pr_data {
+ /**
+ * cfg - PR module configuration
+ *
+ * This is included in the same memory allocation with the
+ * struct pr_data and as such, must not be freed separately.
+ */
+ struct pr_config *cfg;
+
+ struct dl_list devices;
+};
+
+struct pr_data * pr_init(const struct pr_config *cfg);
+void pr_deinit(struct pr_data *pr);
+
+#endif /* PROXIMITY_RANGING_H */
diff --git a/wpa_supplicant/Android.mk b/wpa_supplicant/Android.mk
index cb07e7364..e09768a9d 100644
--- a/wpa_supplicant/Android.mk
+++ b/wpa_supplicant/Android.mk
@@ -290,6 +290,12 @@ NEED_OFFCHANNEL=y
L_CFLAGS += -DCONFIG_NAN_USD
endif
+ifdef CONFIG_PR
+OBJS += src/common/proximity_ranging.c
+OBJS += pr_supplicant.c
+L_CFLAGS += -DCONFIG_PR
+endif
+
ifdef CONFIG_OWE
L_CFLAGS += -DCONFIG_OWE
NEED_ECC=y
diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile
index fd7d7a0bd..f420e7130 100644
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -324,6 +324,12 @@ NEED_OFFCHANNEL=y
CFLAGS += -DCONFIG_NAN_USD
endif
+ifdef CONFIG_PR
+OBJS += ../src/common/proximity_ranging.o
+OBJS += pr_supplicant.o
+CFLAGS += -DCONFIG_PR
+endif
+
ifdef CONFIG_OWE
CFLAGS += -DCONFIG_OWE
NEED_ECC=y
diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c
new file mode 100644
index 000000000..f35077218
--- /dev/null
+++ b/wpa_supplicant/pr_supplicant.c
@@ -0,0 +1,52 @@
+/*
+ * Proxmity Ranging
+ * Copyright (c) 2025, Qualcomm Innovation Center, Inc.
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#include "includes.h"
+
+#include "common.h"
+#include "eloop.h"
+#include "wpa_supplicant_i.h"
+#include "config.h"
+#include "notify.h"
+#include "driver_i.h"
+#include "common/ieee802_11_common.h"
+#include "common/proximity_ranging.h"
+#include "pr_supplicant.h"
+
+int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
+{
+ struct pr_config pr;
+
+ if (global->pr)
+ return 0;
+
+ os_memset(&pr, 0, sizeof(pr));
+
+ os_memcpy(pr.dev_addr, wpa_s->own_addr, ETH_ALEN);
+ pr.cb_ctx = wpa_s;
+ pr.dev_name = wpa_s->conf->device_name;
+
+ global->pr = pr_init(&pr);
+ if (!global->pr) {
+ wpa_printf(MSG_DEBUG, "PR: Failed to init PR");
+ return -1;
+ }
+ global->pr_init_wpa_s = wpa_s;
+
+ return 0;
+}
+
+
+void wpas_pr_deinit(struct wpa_supplicant *wpa_s)
+{
+ if (wpa_s == wpa_s->global->pr_init_wpa_s) {
+ pr_deinit(wpa_s->global->pr);
+ wpa_s->global->pr = NULL;
+ wpa_s->global->pr_init_wpa_s = NULL;
+ }
+}
diff --git a/wpa_supplicant/pr_supplicant.h b/wpa_supplicant/pr_supplicant.h
new file mode 100644
index 000000000..fc8019dda
--- /dev/null
+++ b/wpa_supplicant/pr_supplicant.h
@@ -0,0 +1,31 @@
+/*
+ * Proxmity Ranging
+ * Copyright (c) 2025, Qualcomm Innovation Center, Inc.
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#ifndef PR_SUPPLICANT_H
+#define PR_SUPPLICANT_H
+
+#include "common/proximity_ranging.h"
+
+#ifdef CONFIG_PR
+
+int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s);
+void wpas_pr_deinit(struct wpa_supplicant *wpa_s);
+#else /* CONFIG_PR */
+static inline int wpas_pr_init(struct wpa_global *global,
+ struct wpa_supplicant *wpa_s)
+{
+ return -1;
+}
+
+static inline void wpas_pr_deinit(struct wpa_supplicant *wpa_s)
+{
+}
+
+#endif /* CONFIG_PR */
+
+#endif /*PR_SUPPLICANT_H */
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index da7ff00c9..fb0da3d67 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -66,6 +66,7 @@
#include "mesh.h"
#include "dpp_supplicant.h"
#include "nan_usd.h"
+#include "pr_supplicant.h"
#ifdef CONFIG_MESH
#include "ap/ap_config.h"
#include "ap/hostapd.h"
@@ -738,6 +739,8 @@ static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
wpas_p2p_deinit(wpa_s);
+ wpas_pr_deinit(wpa_s);
+
#ifdef CONFIG_OFFCHANNEL
offchannel_deinit(wpa_s);
#endif /* CONFIG_OFFCHANNEL */
@@ -7871,7 +7874,6 @@ static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
if (wpas_nan_usd_init(wpa_s) < 0)
return -1;
#endif /* CONFIG_NAN_USD */
-
if (wpa_supplicant_init_eapol(wpa_s) < 0)
return -1;
wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
@@ -7903,6 +7905,9 @@ static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
return -1;
}
+ if (wpas_pr_init(wpa_s->global, wpa_s) < 0)
+ return -1;
+
if (wpa_bss_init(wpa_s) < 0)
return -1;
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 1a7e2148e..078b17759 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -288,9 +288,11 @@ struct wpa_global {
size_t drv_count;
struct os_time suspend_time;
struct p2p_data *p2p;
+ struct pr_data *pr;
struct wpa_supplicant *p2p_init_wpa_s;
struct wpa_supplicant *p2p_group_formation;
struct wpa_supplicant *p2p_invite_group;
+ struct wpa_supplicant *pr_init_wpa_s;
u8 p2p_dev_addr[ETH_ALEN];
struct os_reltime p2p_go_wait_client;
struct dl_list p2p_srv_bonjour; /* struct p2p_srv_bonjour */
--
2.34.1
More information about the Hostap
mailing list