aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunil Ravi <sunilravi@google.com>2023-12-01 00:18:02 +0000
committerSunil Ravi <sunilravi@google.com>2023-12-01 02:00:47 +0000
commitc3a5d4b96346d1cb4b36aca15ec947525b2b3fff (patch)
tree2911aa8c4acd605686baad9a74573303cec2e7ff
parent0dd195094cd39bbd711dd2a974ba07bec506bb4d (diff)
downloadwpa_supplicant_8-c3a5d4b96346d1cb4b36aca15ec947525b2b3fff.tar.gz
Added AIDL interface version check for backward compatibility
In the trunk-stable model the HAL implementation should be backward compatible with the wifi mainline module. So call the newer/modified callback function based on the AIDL interface version. Added the version check in three event paths, 1. AP-STA-CONNECTED event 2. AP-STA-DISCONNECTED event 3. Provision discovery frame handler Bug: 313582342 Bug: 310534969 Test: Ran P2P connection tests between Trunk build (version 2) and next build (version 3). Verfied from the logs that the version is set correctly. Also verified that the right APIs are called. Change-Id: I27140e10d37149b632d770124a39d0edd207ba66
-rw-r--r--wpa_supplicant/aidl/aidl_manager.cpp127
1 files changed, 86 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(