]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Propagate newly introduced parameters for PASN events
authorPeddolla Harshavardhan Reddy <peddolla@qti.qualcomm.com>
Sat, 14 Jun 2025 05:58:53 +0000 (11:28 +0530)
committerJouni Malinen <j@w1.fi>
Tue, 24 Jun 2025 17:38:25 +0000 (20:38 +0300)
Allow the driver to initiate PASN Authentication using user-preferred
AKMP, cipher for secure ranging, and password for SAE-tunneled PASN
authentication in the cases that use driver event to trigger PASN.

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

index 54a3b694d837c46d99e9e291825354947efeb490..8f6f9d61a87c7bac54298774bc0a760cf9d7b4ae 100644 (file)
@@ -3053,6 +3053,7 @@ enum pasn_status {
  * @akmp: Authentication key management protocol type supported.
  * @cipher: Cipher suite.
  * @group: Finite cyclic group. Default group used is 19 (ECC).
+ * @password: Password of user requested network.
  * @ltf_keyseed_required: Indicates whether LTF keyseed generation is required
  * @status: PASN response status, %PASN_STATUS_SUCCESS for successful
  *     authentication, use %PASN_STATUS_FAILURE if PASN authentication
@@ -3066,6 +3067,7 @@ struct pasn_peer {
        int akmp;
        int cipher;
        int group;
+       char *password;
        bool ltf_keyseed_required;
        enum pasn_status status;
 };
index 91d3fd41a256260d2989fe281a86e0fee306cbf8..3bba2af8c90117a54f2dc7f457431465a18bfd50 100644 (file)
@@ -3332,10 +3332,11 @@ static void qca_nl80211_pasn_auth(struct i802_bss *bss, u8 *data, size_t len)
        struct nlattr *attr;
        struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1];
        struct nlattr *cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_MAX + 1];
-       unsigned int n_peers = 0, idx = 0;
+       unsigned int n_peers = 0, idx = 0, i;
        int rem_conf;
        enum qca_wlan_vendor_pasn_action action;
        union wpa_event_data event;
+       char *pw[WPAS_MAX_PASN_PEERS];
 
        if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_PASN_MAX,
                      (struct nlattr *) data, len, NULL) ||
@@ -3344,6 +3345,7 @@ static void qca_nl80211_pasn_auth(struct i802_bss *bss, u8 *data, size_t len)
                return;
        }
 
+       os_memset(&pw, 0, sizeof(pw));
        os_memset(&event, 0, sizeof(event));
        action = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_PASN_ACTION]);
        switch (action) {
@@ -3385,7 +3387,43 @@ static void qca_nl80211_pasn_auth(struct i802_bss *bss, u8 *data, size_t len)
                                  nla_data(nl_peer), ETH_ALEN);
                if (cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_LTF_KEYSEED_REQUIRED])
                        event.pasn_auth.peer[idx].ltf_keyseed_required = true;
+               if (cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_AKM]) {
+                       u32 akmp = nla_get_u32(
+                               cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_AKM]);
+
+                       event.pasn_auth.peer[idx].akmp =
+                               rsn_key_mgmt_to_wpa_akm(akmp);
+               }
+               if (cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_CIPHER]) {
+                       u32 cipher = nla_get_u32(
+                               cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_CIPHER]);
+
+                       event.pasn_auth.peer[idx].cipher =
+                               rsn_cipher_suite_to_wpa_cipher(cipher);
+               }
+               if (cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_PASSWORD]) {
+                       const char *password;
+                       size_t password_len;
+
+                       password_len = nla_len(
+                               cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_PASSWORD]);
+                       password = nla_data(
+                               cfg[QCA_WLAN_VENDOR_ATTR_PASN_PEER_PASSWORD]);
+                       pw[idx] = os_zalloc(password_len + 1);
+                       if (!pw[idx])
+                               goto fail;
+                       os_memcpy(pw[idx], password, password_len);
+                       event.pasn_auth.peer[idx].password = pw[idx];
+               }
+
+               wpa_printf(MSG_DEBUG, "nl80211: PASN auth action: peer addr "
+                          MACSTR " AKMP 0x%x cipher 0x%x",
+                          MAC2STR(event.pasn_auth.peer[idx].peer_addr),
+                          event.pasn_auth.peer[idx].akmp,
+                          event.pasn_auth.peer[idx].cipher);
                idx++;
+               if (idx == WPAS_MAX_PASN_PEERS)
+                       break;
        }
        event.pasn_auth.num_peers = n_peers;
 
@@ -3394,6 +3432,9 @@ static void qca_nl80211_pasn_auth(struct i802_bss *bss, u8 *data, size_t len)
                   event.pasn_auth.action,
                   event.pasn_auth.num_peers);
        wpa_supplicant_event(bss->ctx, EVENT_PASN_AUTH, &event);
+fail:
+       for (i = 0; i < idx; i++)
+               str_clear_free(pw[i]);
 }
 
 #endif /* CONFIG_PASN */