Add support for SAE-FT
Bug:149449646
Test: Tested on Android-R and verified on sniffer.
Signed-off-by: Mir Ali <mir-khizer.ali@broadcom.com>
Change-Id: I57d5642386dc7cbbcc162f4049721413c78a47ab
diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c
index 6c6de80..d028e95 100644
--- a/src/rsn_supp/wpa.c
+++ b/src/rsn_supp/wpa.c
@@ -3824,6 +3824,20 @@
pmksa_cache_flush(sm->pmksa, network_ctx, NULL, 0);
}
+#ifdef CONFIG_DRIVER_NL80211_BRCM
+void wpa_sm_install_pmk(struct wpa_sm *sm)
+{
+ /* In case the driver wants to handle re-assocs, pass it down the PMK. */
+ if (wpa_sm_set_key(sm, wpa_cipher_to_alg(sm->pairwise_cipher), NULL, 0, 0, NULL, 0,
+ (u8*)sm->pmk, sm->pmk_len, KEY_FLAG_PMK) < 0) {
+ wpa_hexdump(MSG_DEBUG, "PSK: Install PMK to the driver for driver reassociations",
+ (u8*)sm->pmk, sm->pmk_len);
+ /* No harm if the driver doesn't support. */
+ wpa_msg(sm->ctx->msg_ctx, MSG_DEBUG,
+ "WPA: Failed to set PMK to the driver");
+ }
+}
+#endif /* CONFIG_DRIVER_NL80211_BRCM */
#ifdef CONFIG_WNM
int wpa_wnmsleep_install_key(struct wpa_sm *sm, u8 subelem_id, u8 *buf)
diff --git a/src/rsn_supp/wpa.h b/src/rsn_supp/wpa.h
index 2142772..5fc7ed6 100644
--- a/src/rsn_supp/wpa.h
+++ b/src/rsn_supp/wpa.h
@@ -198,6 +198,10 @@
int wpa_sm_get_p2p_ip_addr(struct wpa_sm *sm, u8 *buf);
+#ifdef CONFIG_DRIVER_NL80211_BRCM
+void wpa_sm_install_pmk(struct wpa_sm *sm);
+#endif /* CONFIG_DRIVER_NL80211_BRCM */
+
void wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm, const u8 *rx_replay_counter);
void wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm,
const u8 *ptk_kck, size_t ptk_kck_len,
@@ -410,6 +414,7 @@
const u8 *ric_ies, size_t ric_ies_len);
int wpa_ft_is_completed(struct wpa_sm *sm);
void wpa_reset_ft_completed(struct wpa_sm *sm);
+void wpa_set_ft_completed(struct wpa_sm *sm);
int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
size_t ies_len, const u8 *src_addr);
int wpa_ft_start_over_ds(struct wpa_sm *sm, const u8 *target_ap,
@@ -451,6 +456,10 @@
{
}
+static inline void wpa_set_ft_completed(struct wpa_sm *sm)
+{
+}
+
static inline int
wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
const u8 *src_addr)
diff --git a/src/rsn_supp/wpa_ft.c b/src/rsn_supp/wpa_ft.c
index bf73376..d7e3685 100644
--- a/src/rsn_supp/wpa_ft.c
+++ b/src/rsn_supp/wpa_ft.c
@@ -718,6 +718,12 @@
}
+void wpa_set_ft_completed(struct wpa_sm *sm)
+{
+ if (sm != NULL)
+ sm->ft_completed = 1;
+}
+
static int wpa_ft_process_gtk_subelem(struct wpa_sm *sm, const u8 *gtk_elem,
size_t gtk_elem_len)
{