]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
PR: Process Capability Attribute from USD PR element
authorPeddolla Harshavardhan Reddy <peddolla@qti.qualcomm.com>
Sat, 26 Apr 2025 19:47:31 +0000 (01:17 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 17 Oct 2025 10:22:51 +0000 (13:22 +0300)
Parse part of Proximity Ranging element corresponding to the Proximity
Ranging Capability Attribute and store the corresponding data in a
structure. This attribute contains capabilities such as EDCA based
ranging support, NTB based ranging support, and such.

Signed-off-by: Peddolla Harshavardhan Reddy <peddolla@qti.qualcomm.com>
src/common/proximity_ranging.c
src/common/proximity_ranging.h

index f0b3f90f8485ffc157111ece8020ef3b50219406..9e734224e4369033bbab10d4795e9d73eb49f8d9 100644 (file)
@@ -714,6 +714,50 @@ static int pr_parse_elements(const u8 *data, size_t len, struct pr_message *msg)
 }
 
 
+static void pr_process_ranging_capabilities(const u8 *caps, size_t caps_len,
+                                           struct pr_capabilities *pr_caps)
+{
+       const u8 *pos;
+
+       if (!caps || caps_len < 3 + WPS_DEV_NAME_MAX_LEN) {
+               wpa_printf(MSG_INFO,
+                          "PR: Invalid Proximity Ranging Capability Attribute");
+               return;
+       }
+
+       pos = caps;
+
+       /* Ranging Protocol Type */
+       if (*pos & PR_EDCA_BASED_RANGING)
+               pr_caps->edca_support = true;
+       if (*pos & PR_NTB_SECURE_LTF_BASED_RANGING) {
+               pr_caps->secure_he_ltf = true;
+               pr_caps->ntb_support = true;
+       }
+       if (*pos & PR_NTB_OPEN_BASED_RANGING)
+               pr_caps->ntb_support = true;
+
+       pos++;
+       /* PASN Type */
+       pr_caps->pasn_type = *pos;
+
+       pos++;
+       /* 6GHz band */
+       pr_caps->support_6ghz = *pos & BIT(0);
+
+       pos++;
+       /* Device Name */
+       os_memset(pr_caps->device_name, 0, WPS_DEV_NAME_MAX_LEN + 1);
+       os_memcpy(pr_caps->device_name, pos, WPS_DEV_NAME_MAX_LEN);
+
+       wpa_printf(MSG_DEBUG,
+                  "PR: Device name=%s, edca capability=%x, ntb capability=%x, secure LTF capability=%u, 6GHz=%u",
+                  pr_caps->device_name, pr_caps->edca_support,
+                  pr_caps->ntb_support, pr_caps->secure_he_ltf,
+                  pr_caps->support_6ghz);
+}
+
+
 void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
                          const u8 *peer_addr, unsigned int freq)
 {
@@ -730,6 +774,14 @@ void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
                return;
        }
 
+       if (!msg.pr_capability) {
+               wpa_printf(MSG_DEBUG,
+                          "PR: Ranging caps not present, ignoring proximity device "
+                          MACSTR, MAC2STR(peer_addr));
+               pr_parse_free(&msg);
+               return;
+       }
+
        dev = pr_create_device(pr, peer_addr);
        if (!dev) {
                pr_parse_free(&msg);
@@ -740,5 +792,8 @@ void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
        os_get_reltime(&dev->last_seen);
        dev->listen_freq = freq;
 
+       pr_process_ranging_capabilities(msg.pr_capability,
+                                       msg.pr_capability_len, &dev->pr_caps);
+
        pr_parse_free(&msg);
 }
index 2737dea30ceec16235e4047c381d741a2274cb83..cc7fea3d5e7c9e3c03b901112068131d3a12b929 100644 (file)
@@ -248,6 +248,8 @@ struct pr_device {
         */
        u8 pr_device_addr[ETH_ALEN];
 
+       struct pr_capabilities pr_caps;
+
        /* Password to be used in PASN-SAE by the Seeker.
         * This is updated with valid password if DIRA matches for the peer.
         */