diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-12-02 02:16:25 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-12-02 02:16:25 +0000 |
commit | a82e10baa14e4052078f63571f994c8fec983acf (patch) | |
tree | aab14411614ae80b04e6393488b3a66d93c265f0 | |
parent | 35b5c368be3fd01e5ce2aee276063247cc91610c (diff) | |
parent | cb447ba625bcad674a5064dc6de7d3ca43199cc4 (diff) | |
download | wpa_supplicant_8-a82e10baa14e4052078f63571f994c8fec983acf.tar.gz |
Snap for 11169761 from cb447ba625bcad674a5064dc6de7d3ca43199cc4 to 24Q1-release
Change-Id: I71f85271a7ed5cc66b09e51c7590a00531a0aaf7
-rw-r--r-- | wpa_supplicant/aidl/aidl_manager.cpp | 127 | ||||
-rw-r--r-- | wpa_supplicant/aidl/sta_network.cpp | 18 | ||||
-rw-r--r-- | wpa_supplicant/aidl/sta_network.h | 2 |
3 files changed, 106 insertions, 41 deletions
diff --git a/wpa_supplicant/aidl/aidl_manager.cpp b/wpa_supplicant/aidl/aidl_manager.cpp index a0ce54b5..fba84fe4 100644 --- a/wpa_supplicant/aidl/aidl_manager.cpp +++ b/wpa_supplicant/aidl/aidl_manager.cpp @@ -37,11 +37,21 @@ constexpr size_t kGsmRandLenBytes = GSM_RAND_LEN; constexpr size_t kUmtsRandLenBytes = EAP_AKA_RAND_LEN; constexpr size_t kUmtsAutnLenBytes = EAP_AKA_AUTN_LEN; const std::vector<uint8_t> kZeroBssid = {0, 0, 0, 0, 0, 0}; +int32_t aidl_service_version = 0; using aidl::android::hardware::wifi::supplicant::GsmRand; using aidl::android::hardware::wifi::supplicant::KeyMgmtMask; /** + * Check that the AIDL service is running at least the expected version. + * Use to avoid the case where the AIDL interface version + * is greater than the version implemented by the service. + */ +inline int32_t isAidlServiceVersionAtLeast(int32_t expected_version) +{ + return expected_version <= aidl_service_version; +} +/** * Check if the provided |wpa_supplicant| structure represents a P2P iface or * not. */ @@ -407,8 +417,11 @@ int AidlManager::registerAidlService(struct wpa_global *global) { // Create the main aidl service object and register it. wpa_printf(MSG_INFO, "Starting AIDL supplicant"); - wpa_printf(MSG_INFO, "Interface version: %d", Supplicant::version); supplicant_object_ = ndk::SharedRefBase::make<Supplicant>(global); + if (!supplicant_object_->getInterfaceVersion(&aidl_service_version).isOk()) { + aidl_service_version = Supplicant::version; + } + wpa_printf(MSG_INFO, "AIDL Interface version: %d", aidl_service_version); wpa_global_ = global; std::string instance = std::string() + Supplicant::descriptor + "/default"; if (AServiceManager_addService(supplicant_object_->asBinder().get(), @@ -1567,24 +1580,38 @@ void AidlManager::notifyP2pProvisionDiscovery( p2p_iface_object_map_.end()) return; - P2pProvisionDiscoveryCompletedEventParams params; - params.p2pDeviceAddress = macAddrToArray(dev_addr); - params.isRequest = (request == 1); - params.status = static_cast<P2pProvDiscStatusCode>(status); - params.configMethods = static_cast<WpsConfigMethods>(config_methods); + std::string aidl_generated_pin; if (generated_pin > 0) { - params.generatedPin = + aidl_generated_pin = misc_utils::convertWpsPinToString(generated_pin); } - if (group_ifname != NULL) { - params.groupInterfaceName = misc_utils::charBufToString(group_ifname); + bool aidl_is_request = (request == 1); + + if (isAidlServiceVersionAtLeast(3)) { + P2pProvisionDiscoveryCompletedEventParams params; + params.p2pDeviceAddress = macAddrToArray(dev_addr); + params.isRequest = aidl_is_request; + params.status = static_cast<P2pProvDiscStatusCode>(status); + params.configMethods = static_cast<WpsConfigMethods>(config_methods); + params.generatedPin = aidl_generated_pin; + if (group_ifname != NULL) { + params.groupInterfaceName = misc_utils::charBufToString(group_ifname); + } + callWithEachP2pIfaceCallback( + misc_utils::charBufToString(wpa_s->ifname), + std::bind( + &ISupplicantP2pIfaceCallback::onProvisionDiscoveryCompletedEvent, + std::placeholders::_1, params)); + } else { + // Use legacy callback if interface version < 3 + callWithEachP2pIfaceCallback( + misc_utils::charBufToString(wpa_s->ifname), + std::bind( + &ISupplicantP2pIfaceCallback::onProvisionDiscoveryCompleted, + std::placeholders::_1, macAddrToVec(dev_addr), aidl_is_request, + static_cast<P2pProvDiscStatusCode>(status), + static_cast<WpsConfigMethods>(config_methods), aidl_generated_pin)); } - - callWithEachP2pIfaceCallback( - misc_utils::charBufToString(wpa_s->ifname), - std::bind( - &ISupplicantP2pIfaceCallback::onProvisionDiscoveryCompletedEvent, - std::placeholders::_1, params)); } void AidlManager::notifyP2pSdResponse( @@ -1616,23 +1643,31 @@ void AidlManager::notifyApStaAuthorized( if (!wpa_s) return; - int aidl_ip = 0; - if (NULL != ip) { - os_memcpy(&aidl_ip, &ip[0], 4); + if (isAidlServiceVersionAtLeast(3)) { + P2pPeerClientJoinedEventParams params; + params.groupInterfaceName = misc_utils::charBufToString(wpa_group_s->ifname); + params.clientInterfaceAddress = macAddrToArray(sta); + params.clientDeviceAddress = p2p_dev_addr ? + macAddrToArray(p2p_dev_addr) : macAddrToArray(kZeroBssid.data()); + int aidl_ip = 0; + if (NULL != ip) { + os_memcpy(&aidl_ip, &ip[0], 4); + } + params.clientIpAddress = aidl_ip; + callWithEachP2pIfaceCallback( + misc_utils::charBufToString(wpa_s->ifname), + std::bind( + &ISupplicantP2pIfaceCallback::onPeerClientJoined, + std::placeholders::_1, params)); + } else { + // Use legacy callback if interface version < 3 + callWithEachP2pIfaceCallback( + misc_utils::charBufToString(wpa_s->ifname), + std::bind( + &ISupplicantP2pIfaceCallback::onStaAuthorized, + std::placeholders::_1, macAddrToVec(sta), + p2p_dev_addr ? macAddrToVec(p2p_dev_addr) : kZeroBssid)); } - - P2pPeerClientJoinedEventParams params; - params.groupInterfaceName = misc_utils::charBufToString(wpa_group_s->ifname); - params.clientInterfaceAddress = macAddrToArray(sta); - params.clientDeviceAddress = p2p_dev_addr ? - macAddrToArray(p2p_dev_addr) : macAddrToArray(kZeroBssid.data()); - params.clientIpAddress = aidl_ip; - - callWithEachP2pIfaceCallback( - misc_utils::charBufToString(wpa_s->ifname), - std::bind( - &ISupplicantP2pIfaceCallback::onPeerClientJoined, - std::placeholders::_1, params)); } void AidlManager::notifyApStaDeauthorized( @@ -1644,17 +1679,27 @@ void AidlManager::notifyApStaDeauthorized( if (!wpa_s) return; - P2pPeerClientDisconnectedEventParams params; - params.groupInterfaceName = misc_utils::charBufToString(wpa_group_s->ifname); - params.clientInterfaceAddress = macAddrToArray(sta); - params.clientDeviceAddress = p2p_dev_addr ? - macAddrToArray(p2p_dev_addr) : macAddrToArray(kZeroBssid.data()); + if (isAidlServiceVersionAtLeast(3)) { + P2pPeerClientDisconnectedEventParams params; + params.groupInterfaceName = misc_utils::charBufToString(wpa_group_s->ifname); + params.clientInterfaceAddress = macAddrToArray(sta); + params.clientDeviceAddress = p2p_dev_addr ? + macAddrToArray(p2p_dev_addr) : macAddrToArray(kZeroBssid.data()); - callWithEachP2pIfaceCallback( - misc_utils::charBufToString(wpa_s->ifname), - std::bind( - &ISupplicantP2pIfaceCallback::onPeerClientDisconnected, - std::placeholders::_1, params)); + callWithEachP2pIfaceCallback( + misc_utils::charBufToString(wpa_s->ifname), + std::bind( + &ISupplicantP2pIfaceCallback::onPeerClientDisconnected, + std::placeholders::_1, params)); + } else { + // Use legacy callback if interface version < 3 + callWithEachP2pIfaceCallback( + misc_utils::charBufToString(wpa_s->ifname), + std::bind( + &ISupplicantP2pIfaceCallback::onStaDeauthorized, + std::placeholders::_1, macAddrToVec(sta), + p2p_dev_addr ? macAddrToVec(p2p_dev_addr) : kZeroBssid)); + } } void AidlManager::notifyExtRadioWorkStart( diff --git a/wpa_supplicant/aidl/sta_network.cpp b/wpa_supplicant/aidl/sta_network.cpp index 2604d2e2..7b8b6ad7 100644 --- a/wpa_supplicant/aidl/sta_network.cpp +++ b/wpa_supplicant/aidl/sta_network.cpp @@ -891,6 +891,13 @@ ndk::ScopedAStatus StaNetwork::getBssid( &StaNetwork::setMinimumTlsVersionEapPhase1ParamInternal, in_tlsVersion); } +::ndk::ScopedAStatus StaNetwork::disableEht() +{ + return validateAndCall( + this, SupplicantStatusCode::FAILURE_NETWORK_INVALID, + &StaNetwork::disableEhtInternal); +} + std::pair<uint32_t, ndk::ScopedAStatus> StaNetwork::getIdInternal() { return {network_id_, ndk::ScopedAStatus::ok()}; @@ -2698,6 +2705,17 @@ ndk::ScopedAStatus StaNetwork::setMinimumTlsVersionEapPhase1ParamInternal(TlsVer return ndk::ScopedAStatus::ok(); } +ndk::ScopedAStatus StaNetwork::disableEhtInternal() +{ + struct wpa_ssid *wpa_ssid = retrieveNetworkPtr(); + if (wpa_ssid == nullptr ) { + return createStatus(SupplicantStatusCode::FAILURE_NETWORK_INVALID); + } + wpa_ssid->disable_eht = 1; + resetInternalStateAfterParamsUpdate(); + return ndk::ScopedAStatus::ok(); +} + /** * WPA3-Enterprise 192-bit mode workaround to force the connection to EAP-TLSv1.2 due to * interoperability issues in TLSv1.3 which disables the SSL_SIGN_RSA_PKCS1_SHA384 diff --git a/wpa_supplicant/aidl/sta_network.h b/wpa_supplicant/aidl/sta_network.h index 1c24702a..879d8746 100644 --- a/wpa_supplicant/aidl/sta_network.h +++ b/wpa_supplicant/aidl/sta_network.h @@ -178,6 +178,7 @@ public: const std::vector<uint8_t>& in_selectedRcoi) override; ::ndk::ScopedAStatus setMinimumTlsVersionEapPhase1Param( TlsVersion in_tlsVersion) override; + ::ndk::ScopedAStatus disableEht() override; private: // Corresponding worker functions for the AIDL methods. @@ -310,6 +311,7 @@ private: ndk::ScopedAStatus setRoamingConsortiumSelectionInternal( const std::vector<uint8_t>& selectedRcoi); ndk::ScopedAStatus setMinimumTlsVersionEapPhase1ParamInternal(TlsVersion tlsVersion); + ndk::ScopedAStatus disableEhtInternal(); struct wpa_ssid* retrieveNetworkPtr(); struct wpa_supplicant* retrieveIfacePtr(); |