diff options
author | Sunil Ravi <sunilravi@google.com> | 2023-06-09 18:11:41 +0000 |
---|---|---|
committer | Sunil Ravi <sunilravi@google.com> | 2023-06-14 22:34:50 +0000 |
commit | 1de410d064b7656a45f70782ed085862e9f443a9 (patch) | |
tree | 0d5f3a940e39ff53276f6d1419b4b9559e49131f | |
parent | da8e9fb66ad5a3f11d3c6e8c2ad30b0f5e6956c6 (diff) | |
download | wpa_supplicant_8-1de410d064b7656a45f70782ed085862e9f443a9.tar.gz |
Map extension AKMs in AIDL to main AKMandroid14-dev
Supplicant sends the connected AKM type in state
change event "COMPLETED". And this AKM is used to map to the
security type. There are some extension AKMs which are not
defined in AIDL interface. When STA connects to AP in those
extended AKMs, framework fails to find the AKM and derive the
security type. So to fix the issue, mapped the undefined extension
AKMs to main AKM.
Bug: 285633920
Test: Connect STA to AP in WPA2, WPA3, WPA3 enterprise, WPA2 enterprise
passpoint & WPA3 192 bit mode.
Change-Id: I99d4bb7e3ca85135193bb455a08c8638d4858485
-rw-r--r-- | wpa_supplicant/aidl/aidl_manager.cpp | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/wpa_supplicant/aidl/aidl_manager.cpp b/wpa_supplicant/aidl/aidl_manager.cpp index 8c061a0c..4d5ac29d 100644 --- a/wpa_supplicant/aidl/aidl_manager.cpp +++ b/wpa_supplicant/aidl/aidl_manager.cpp @@ -646,6 +646,59 @@ int AidlManager::unregisterNetwork( return 0; } +// Some of the undefined AKMs in AIDL (Mostly extension AKMs like FT AKMs) +// are mapped to the main AKM. This is for the framework to map the AKM to +// correct security type. +KeyMgmtMask convertSupplicantSelectedKeyMgmtForConnectionToAidl(int key_mgmt) +{ + switch (key_mgmt) { + case WPA_KEY_MGMT_IEEE8021X: + return KeyMgmtMask::WPA_EAP; + case WPA_KEY_MGMT_PSK: + return KeyMgmtMask::WPA_PSK; + case WPA_KEY_MGMT_NONE: + return KeyMgmtMask::NONE; + case WPA_KEY_MGMT_IEEE8021X_NO_WPA: + return KeyMgmtMask::IEEE8021X; + case WPA_KEY_MGMT_FT_IEEE8021X: + return KeyMgmtMask::FT_EAP; + case WPA_KEY_MGMT_FT_PSK: + return KeyMgmtMask::FT_PSK; + case WPA_KEY_MGMT_IEEE8021X_SHA256: + return KeyMgmtMask::WPA_EAP_SHA256; + case WPA_KEY_MGMT_PSK_SHA256: + return KeyMgmtMask::WPA_PSK_SHA256; + case WPA_KEY_MGMT_SAE: + case WPA_KEY_MGMT_FT_SAE: + case WPA_KEY_MGMT_SAE_EXT_KEY: + case WPA_KEY_MGMT_FT_SAE_EXT_KEY: + return KeyMgmtMask::SAE; + case WPA_KEY_MGMT_WAPI_PSK: + return KeyMgmtMask::WAPI_PSK; + case WPA_KEY_MGMT_WAPI_CERT: + return KeyMgmtMask::WAPI_CERT; + case WPA_KEY_MGMT_OSEN: + return KeyMgmtMask::OSEN; + case WPA_KEY_MGMT_IEEE8021X_SUITE_B_192: + case WPA_KEY_MGMT_FT_IEEE8021X_SHA384: + return KeyMgmtMask::SUITE_B_192; + case WPA_KEY_MGMT_FILS_SHA256: + case WPA_KEY_MGMT_FT_FILS_SHA256: + return KeyMgmtMask::FILS_SHA256; + case WPA_KEY_MGMT_FILS_SHA384: + case WPA_KEY_MGMT_FT_FILS_SHA384: + return KeyMgmtMask::FILS_SHA384; + case WPA_KEY_MGMT_OWE: + return KeyMgmtMask::OWE; + case WPA_KEY_MGMT_DPP: + return KeyMgmtMask::DPP; + default: + wpa_printf(MSG_INFO, "Unable to convert supplicant key_mgmt 0x%x to AIDL", + key_mgmt); + return (KeyMgmtMask) key_mgmt; + } +} + /** * Notify all listeners about any state changes on a particular interface. * @@ -690,10 +743,17 @@ int AidlManager::notifyStateChange(struct wpa_supplicant *wpa_s) (wpa_auth_alg_fils(wpa_s->auth_alg) && !dl_list_empty(&wpa_s->fils_hlp_req) && (wpa_s->wpa_state == WPA_COMPLETED)) ? true : false; - aidl_state_change_data.keyMgmtMask = (KeyMgmtMask) wpa_s->key_mgmt; - // wpa_supplicant sets the frequency on receiving the EVENT_ASSOC. - aidl_state_change_data.frequencyMhz = - wpa_s->wpa_state >= WPA_ASSOCIATED ? wpa_s->assoc_freq : 0; + if (wpa_s->wpa_state >= WPA_ASSOCIATED) { + // wpa_supplicant sets the frequency on receiving the EVENT_ASSOC. + aidl_state_change_data.frequencyMhz = wpa_s->assoc_freq; + // The key_mgmt is selected prior to sending the connect command + // to driver. But in case of CROSS-AKM Connection/Roaming, the + // key_mgmt is updated with the one from association IE. So the + // selected key_mgmt is accurate only after moving to + // associated state. + aidl_state_change_data.keyMgmtMask = + convertSupplicantSelectedKeyMgmtForConnectionToAidl(wpa_s->key_mgmt); + } // Invoke the |onStateChanged| method on all registered callbacks. std::function< |