From 7e792611bb61c379f10d4c5c060505ecd6adb75c Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Fri, 16 Oct 2020 14:09:47 +0800 Subject: [PATCH] wifi: add enable SAE PK only mode API Bug: 160642415 Test: atest VtsHalWifiSupplicantV1_4TargetTest Change-Id: I9e9fe69bf5ebc1127085b568f02f44a2ab1b08af --- wifi/supplicant/1.3/vts/functional/Android.bp | 1 + .../supplicant_sta_iface_hidl_test.cpp | 37 ++++++++++++++++--- wifi/supplicant/1.4/ISupplicantStaIface.hal | 11 ++++++ wifi/supplicant/1.4/ISupplicantStaNetwork.hal | 28 ++++++++++++++ wifi/supplicant/1.4/types.hal | 11 ++++++ .../supplicant_sta_iface_hidl_test.cpp | 10 +++++ .../supplicant_sta_network_hidl_test.cpp | 31 ++++++++++++++++ 7 files changed, 123 insertions(+), 6 deletions(-) diff --git a/wifi/supplicant/1.3/vts/functional/Android.bp b/wifi/supplicant/1.3/vts/functional/Android.bp index 68c29293ee..1784fad60c 100644 --- a/wifi/supplicant/1.3/vts/functional/Android.bp +++ b/wifi/supplicant/1.3/vts/functional/Android.bp @@ -54,6 +54,7 @@ cc_test { "android.hardware.wifi.supplicant@1.1", "android.hardware.wifi.supplicant@1.2", "android.hardware.wifi.supplicant@1.3", + "android.hardware.wifi.supplicant@1.4", "android.hardware.wifi@1.0", "android.hardware.wifi@1.1", "libgmock", diff --git a/wifi/supplicant/1.3/vts/functional/supplicant_sta_iface_hidl_test.cpp b/wifi/supplicant/1.3/vts/functional/supplicant_sta_iface_hidl_test.cpp index 6dc267c1c6..189e2b9717 100644 --- a/wifi/supplicant/1.3/vts/functional/supplicant_sta_iface_hidl_test.cpp +++ b/wifi/supplicant/1.3/vts/functional/supplicant_sta_iface_hidl_test.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -61,6 +63,10 @@ class SupplicantStaIfaceHidlTest : public SupplicantHidlTestBaseV1_3 { SupplicantHidlTestBaseV1_3::SetUp(); sta_iface_ = getSupplicantStaIface_1_3(supplicant_); ASSERT_NE(sta_iface_.get(), nullptr); + + /* Variable used to check the underlying HAL version. */ + sta_iface_v1_4_ = ::android::hardware::wifi::supplicant::V1_4:: + ISupplicantStaIface::castFrom(sta_iface_); } int64_t pmkCacheExpirationTimeInSec; @@ -108,6 +114,8 @@ class SupplicantStaIfaceHidlTest : public SupplicantHidlTestBaseV1_3 { protected: // ISupplicantStaIface object used for all tests in this fixture. sp sta_iface_; + sp<::android::hardware::wifi::supplicant::V1_4::ISupplicantStaIface> + sta_iface_v1_4_ = nullptr; bool isDppSupported() { uint32_t keyMgmtMask = 0; @@ -342,9 +350,12 @@ TEST_P(SupplicantStaIfaceHidlTest, GetConnectionCapabilities) { * GetWpaDriverCapabilities */ TEST_P(SupplicantStaIfaceHidlTest, GetWpaDriverCapabilities) { + SupplicantStatusCode expectedCode = + (nullptr != sta_iface_v1_4_) ? SupplicantStatusCode::FAILURE_UNKNOWN + : SupplicantStatusCode::SUCCESS; sta_iface_->getWpaDriverCapabilities( [&](const SupplicantStatus& status, uint32_t) { - EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code); + EXPECT_EQ(expectedCode, status.code); }); } @@ -355,12 +366,26 @@ TEST_P(SupplicantStaIfaceHidlTest, SetMboCellularDataStatus) { uint32_t driverCapMask = 0; // Get MBO support from the device. - sta_iface_->getWpaDriverCapabilities( - [&](const SupplicantStatus& status, uint32_t driverCapMaskInternal) { - EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code); + if (nullptr != sta_iface_v1_4_) { + sta_iface_v1_4_->getWpaDriverCapabilities_1_4( + [&](const ::android::hardware::wifi::supplicant::V1_4:: + SupplicantStatus& status, + uint32_t driverCapMaskInternal) { + EXPECT_EQ(::android::hardware::wifi::supplicant::V1_4:: + SupplicantStatusCode::SUCCESS, + status.code); - driverCapMask = driverCapMaskInternal; - }); + driverCapMask = driverCapMaskInternal; + }); + } else { + sta_iface_->getWpaDriverCapabilities( + [&](const SupplicantStatus& status, + uint32_t driverCapMaskInternal) { + EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code); + + driverCapMask = driverCapMaskInternal; + }); + } SupplicantStatusCode expectedStatusCode = (driverCapMask & WpaDriverCapabilitiesMask::MBO) diff --git a/wifi/supplicant/1.4/ISupplicantStaIface.hal b/wifi/supplicant/1.4/ISupplicantStaIface.hal index db9a35b28d..f9e4c9b696 100644 --- a/wifi/supplicant/1.4/ISupplicantStaIface.hal +++ b/wifi/supplicant/1.4/ISupplicantStaIface.hal @@ -73,4 +73,15 @@ interface ISupplicantStaIface extends @1.3::ISupplicantStaIface { */ initiateVenueUrlAnqpQuery(MacAddress macAddress) generates (SupplicantStatus status); + + /** + * Get wpa driver capabilities. + * + * @return status Status of the operation, and a bitmap of wpa driver features. + * Possible status codes: + * |SupplicantStatusCode.SUCCESS|, + * |SupplicantStatusCode.FAILURE_UNKNOWN|, + */ + getWpaDriverCapabilities_1_4() generates (SupplicantStatus status, + bitfield driverCapabilitiesMask); }; diff --git a/wifi/supplicant/1.4/ISupplicantStaNetwork.hal b/wifi/supplicant/1.4/ISupplicantStaNetwork.hal index 42958792b6..80beedf7f7 100644 --- a/wifi/supplicant/1.4/ISupplicantStaNetwork.hal +++ b/wifi/supplicant/1.4/ISupplicantStaNetwork.hal @@ -24,6 +24,16 @@ import @1.4::ISupplicantStaNetworkCallback; * configuration it controls. */ interface ISupplicantStaNetwork extends @1.3::ISupplicantStaNetwork { + /** + * Possible mask of values for KeyMgmt param. + */ + enum KeyMgmtMask : @1.3::ISupplicantStaNetwork.KeyMgmtMask { + /** + * SAE PK mode + */ + SAE_PK, + }; + /** * Possible mask of values for PairwiseCipher param. */ @@ -160,4 +170,22 @@ interface ISupplicantStaNetwork extends @1.3::ISupplicantStaNetwork { * |SupplicantStatusCode.FAILURE_NETWORK_INVALID| */ enableSaeH2eOnlyMode(bool enable) generates (SupplicantStatus status); + + /** + * Set whether to enable SAE PK (Public Key) only mode to enable public AP validation. + * When enabled, only SAE PK network is allowed; otherwise PK is optional. + * If this API is not called before connecting to an SAE + * network, SAE PK mode depends on SAE PK config in wpa_supplicant configuration. + * If SAE PK config of wpa_supplicant configuration is not set, + * the default mode is optional (support for both PK and standard mode). + * + * @param enable true to set, false otherwise. + * @return status Status of the operation. + * Possible status codes: + * |SupplicantStatusCode.SUCCESS|, + * |SupplicantStatusCode.FAILURE_UNKNOWN|, + * |SupplicantStatusCode.FAILURE_NETWORK_INVALID|, + * |SupplicantStatusCode.FAILURE_UNSUPPORTED| + */ + enableSaePkOnlyMode(bool enable) generates (SupplicantStatus status); }; diff --git a/wifi/supplicant/1.4/types.hal b/wifi/supplicant/1.4/types.hal index b4b6a365b9..18af8fe393 100644 --- a/wifi/supplicant/1.4/types.hal +++ b/wifi/supplicant/1.4/types.hal @@ -18,6 +18,7 @@ package android.hardware.wifi.supplicant@1.4; import @1.0::SupplicantStatusCode; import @1.3::ConnectionCapabilities; +import @1.3::WpaDriverCapabilitiesMask; /** * Detailed network mode for legacy network @@ -71,3 +72,13 @@ struct SupplicantStatus { */ string debugMessage; }; + +/** + * WPA Driver capability. + */ +enum WpaDriverCapabilitiesMask : @1.3::WpaDriverCapabilitiesMask { + /** + * + */ + SAE_PK = 1 << 2, +}; diff --git a/wifi/supplicant/1.4/vts/functional/supplicant_sta_iface_hidl_test.cpp b/wifi/supplicant/1.4/vts/functional/supplicant_sta_iface_hidl_test.cpp index e079abca48..c0b5a70434 100644 --- a/wifi/supplicant/1.4/vts/functional/supplicant_sta_iface_hidl_test.cpp +++ b/wifi/supplicant/1.4/vts/functional/supplicant_sta_iface_hidl_test.cpp @@ -245,6 +245,16 @@ TEST_P(SupplicantStaIfaceHidlTest, InitiateVenueUrlAnqpQuery) { }); } +/* + * GetWpaDriverCapabilities + */ +TEST_P(SupplicantStaIfaceHidlTest, GetWpaDriverCapabilities) { + sta_iface_->getWpaDriverCapabilities_1_4( + [&](const SupplicantStatusV1_4& status, uint32_t) { + EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code); + }); +} + GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SupplicantStaIfaceHidlTest); INSTANTIATE_TEST_CASE_P( PerInstance, SupplicantStaIfaceHidlTest, diff --git a/wifi/supplicant/1.4/vts/functional/supplicant_sta_network_hidl_test.cpp b/wifi/supplicant/1.4/vts/functional/supplicant_sta_network_hidl_test.cpp index 86314e2451..0e38c4b26b 100644 --- a/wifi/supplicant/1.4/vts/functional/supplicant_sta_network_hidl_test.cpp +++ b/wifi/supplicant/1.4/vts/functional/supplicant_sta_network_hidl_test.cpp @@ -46,11 +46,15 @@ using SupplicantStatusV1_4 = ::android::hardware::wifi::supplicant::V1_4::SupplicantStatus; using SupplicantStatusCodeV1_4 = ::android::hardware::wifi::supplicant::V1_4::SupplicantStatusCode; +using WpaDriverCapabilitiesMaskV1_4 = + ::android::hardware::wifi::supplicant::V1_4::WpaDriverCapabilitiesMask; class SupplicantStaNetworkHidlTest : public SupplicantHidlTestBaseV1_4 { public: virtual void SetUp() override { SupplicantHidlTestBaseV1_4::SetUp(); + sta_iface_ = getSupplicantStaIface_1_4(supplicant_); + ASSERT_NE(nullptr, sta_iface_.get()); sta_network_ = createSupplicantStaNetwork(supplicant_); ASSERT_NE(sta_network_.get(), nullptr); /* variable used to check if the underlying HAL version is 1.4 or @@ -61,10 +65,21 @@ class SupplicantStaNetworkHidlTest : public SupplicantHidlTestBaseV1_4 { } protected: + sp<::android::hardware::wifi::supplicant::V1_4::ISupplicantStaIface> + sta_iface_; sp<::android::hardware::wifi::supplicant::V1_4::ISupplicantStaNetwork> v1_4 = nullptr; // ISupplicantStaNetwork object used for all tests in this fixture. sp sta_network_; + bool isSaePkSupported() { + uint32_t caps; + sta_iface_->getWpaDriverCapabilities_1_4( + [&](const SupplicantStatusV1_4& status, uint32_t capsInternal) { + EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code); + caps = capsInternal; + }); + return !!(caps & WpaDriverCapabilitiesMaskV1_4::SAE_PK); + } }; class NetworkCallback : public ISupplicantStaNetworkCallback { @@ -106,6 +121,22 @@ TEST_P(SupplicantStaNetworkHidlTest, EnableSaeH2eOnlyMode) { }); } +/* + * enable SAE PK only mode + */ +TEST_P(SupplicantStaNetworkHidlTest, EnableSaePkOnlyMode) { + LOG(INFO) << "SAE-PK Supported: " << isSaePkSupported(); + SupplicantStatusCodeV1_4 expectedCode = + isSaePkSupported() ? SupplicantStatusCodeV1_4::SUCCESS + : SupplicantStatusCodeV1_4::FAILURE_UNSUPPORTED; + v1_4->enableSaePkOnlyMode(true, [&](const SupplicantStatusV1_4& status) { + EXPECT_EQ(expectedCode, status.code); + }); + v1_4->enableSaePkOnlyMode(false, [&](const SupplicantStatusV1_4& status) { + EXPECT_EQ(expectedCode, status.code); + }); +} + GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SupplicantStaNetworkHidlTest); INSTANTIATE_TEST_CASE_P( PerInstance, SupplicantStaNetworkHidlTest,