From: Peddolla Harshavardhan Reddy Date: Sat, 26 Apr 2025 17:52:36 +0000 (+0530) Subject: PR: Proximity Ranging element construction for USD X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e0f02753ce8dc90676fd03b4bfbb69eb2cc9907;p=thirdparty%2Fhostap.git PR: Proximity Ranging element construction for USD Signed-off-by: Peddolla Harshavardhan Reddy --- diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h index ae5fdefb7..9782acfb6 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -1495,6 +1495,9 @@ struct ieee80211_ampe_ie { #define RSNE_OVERRIDE_2_IE_VENDOR_TYPE 0x506f9a2a #define RSNXE_OVERRIDE_IE_VENDOR_TYPE 0x506f9a2b #define RSN_SELECTION_IE_VENDOR_TYPE 0x506f9a2c +/* Proximity Ranging (PR) */ +#define PR_IE_VENDOR_TYPE 0x506f9a2e +#define PR_OUI_TYPE 0x2e #define MULTI_AP_SUB_ELEM_TYPE 0x06 #define MULTI_AP_PROFILE_SUB_ELEM_TYPE 0x07 diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c index 1f8b4e3d9..5c566f606 100644 --- a/src/common/proximity_ranging.c +++ b/src/common/proximity_ranging.c @@ -9,6 +9,7 @@ #include "includes.h" #include "utils/common.h" +#include "common/ieee802_11_defs.h" #include "proximity_ranging.h" @@ -48,3 +49,53 @@ void pr_deinit(struct pr_data *pr) os_free(pr); wpa_printf(MSG_DEBUG, "PR: Deinit done"); } + + +static struct wpabuf * pr_encaps_elem(const struct wpabuf *subelems, + u32 ie_type) +{ + struct wpabuf *ie = NULL; + const u8 *pos, *end; + size_t len = 0; + + if (!subelems) + return NULL; + + len = wpabuf_len(subelems) + 1000; + ie = wpabuf_alloc(len); + if (!ie) + return NULL; + + pos = wpabuf_head(subelems); + end = pos + wpabuf_len(subelems); + + while (end > pos) { + size_t frag_len = end - pos; + + if (frag_len > 251) + frag_len = 251; + wpabuf_put_u8(ie, WLAN_EID_VENDOR_SPECIFIC); + wpabuf_put_u8(ie, 4 + frag_len); + wpabuf_put_be32(ie, ie_type); + wpabuf_put_data(ie, pos, frag_len); + pos += frag_len; + } + return ie; +} + + +struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr) +{ + u32 ie_type; + struct wpabuf *buf, *buf2; + + buf = wpabuf_alloc(1000); + if (!buf) + return NULL; + + ie_type = (OUI_WFA << 8) | PR_OUI_TYPE; + buf2 = pr_encaps_elem(buf, ie_type); + wpabuf_free(buf); + + return buf2; +} diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h index f26952fc2..04336e018 100644 --- a/src/common/proximity_ranging.h +++ b/src/common/proximity_ranging.h @@ -178,5 +178,6 @@ struct pr_data { struct pr_data * pr_init(const struct pr_config *cfg); void pr_deinit(struct pr_data *pr); +struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr); #endif /* PROXIMITY_RANGING_H */