Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10d39ed5 authored by Mahesh KKV's avatar Mahesh KKV Committed by Android (Google) Code Review
Browse files

Merge "Revert^2 "Add an explicit TWT register events call"" into main

parents 9c38c561 3375df8b
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -1867,9 +1867,8 @@ std::pair<wifi_twt_capabilities, wifi_error> WifiLegacyHal::twtGetCapabilities(
    return {capabs, status};
}

wifi_error WifiLegacyHal::twtSessionSetup(
        const std::string& ifaceName, uint32_t cmdId, const wifi_twt_request& request,
        const on_twt_failure& on_twt_failure_user_callback,
wifi_error WifiLegacyHal::twtRegisterEvents(
        const std::string& ifaceName, const on_twt_failure& on_twt_failure_user_callback,
        const on_twt_session_create& on_twt_session_create_user_callback,
        const on_twt_session_update& on_twt_session_update_user_callback,
        const on_twt_session_teardown& on_twt_session_teardown_user_callback,
@@ -1921,13 +1920,18 @@ wifi_error WifiLegacyHal::twtSessionSetup(
        on_twt_session_resume_user_callback(id, session_id);
    };

    return global_func_table_.wifi_twt_session_setup(
            cmdId, getIfaceHandle(ifaceName), request,
    return global_func_table_.wifi_twt_register_events(
            getIfaceHandle(ifaceName),
            {onAsyncTwtError, onAsyncTwtSessionCreate, onAsyncTwtSessionUpdate,
             onAsyncTwtSessionTeardown, onAsyncTwtSessionStats, onAsyncTwtSessionSuspend,
             onAsyncTwtSessionResume});
}

wifi_error WifiLegacyHal::twtSessionSetup(const std::string& ifaceName, uint32_t cmdId,
                                          const wifi_twt_request& request) {
    return global_func_table_.wifi_twt_session_setup(cmdId, getIfaceHandle(ifaceName), request);
}

wifi_error WifiLegacyHal::twtSessionUpdate(const std::string& ifaceName, uint32_t cmdId,
                                           uint32_t sessionId, const wifi_twt_request& request) {
    return global_func_table_.wifi_twt_session_update(cmdId, getIfaceHandle(ifaceName), sessionId,
+10 −9
Original line number Diff line number Diff line
@@ -780,15 +780,16 @@ class WifiLegacyHal {

    // TWT functions
    std::pair<wifi_twt_capabilities, wifi_error> twtGetCapabilities(const std::string& ifaceName);
    wifi_error twtSessionSetup(const std::string& ifaceName, uint32_t cmdId,
                               const wifi_twt_request& request,
                               const on_twt_failure& on_twt_failure_user_callback,
    wifi_error twtRegisterEvents(
            const std::string& ifaceName, const on_twt_failure& on_twt_failure_user_callback,
            const on_twt_session_create& on_twt_session_create_user_callback,
            const on_twt_session_update& on_twt_session_update_user_callback,
            const on_twt_session_teardown& on_twt_session_teardown_user_callback,
            const on_twt_session_stats& on_twt_session_stats_user_callback,
            const on_twt_session_suspend& on_twt_session_suspend_user_callback,
            const on_twt_session_resume& on_twt_session_resume_user_callback);
    wifi_error twtSessionSetup(const std::string& ifaceName, uint32_t cmdId,
                               const wifi_twt_request& request);
    wifi_error twtSessionUpdate(const std::string& ifaceName, uint32_t cmdId, uint32_t sessionId,
                                const wifi_twt_request& request);
    wifi_error twtSessionSuspend(const std::string& ifaceName, uint32_t cmdId, uint32_t sessionId);
@@ -797,7 +798,7 @@ class WifiLegacyHal {
    wifi_error twtSessionGetStats(const std::string& ifaceName, uint32_t cmdId, uint32_t sessionId);

    // Note: Following TWT functions are deprecated
    // Deprecated
    // Deprecated by twtRegisterEvegnts
    wifi_error twtRegisterHandler(const std::string& iface_name,
                                  const TwtCallbackHandlers& handler);
    // Deprecated by twtGetCapabilities
+1 −0
Original line number Diff line number Diff line
@@ -182,6 +182,7 @@ bool initHalFuncTableWithStubs(wifi_hal_fn* hal_fn) {
    populateStubFor(&hal_fn->wifi_get_rtt_capabilities_v3);
    populateStubFor(&hal_fn->wifi_rtt_range_request_v3);
    populateStubFor(&hal_fn->wifi_twt_get_capabilities);
    populateStubFor(&hal_fn->wifi_twt_register_events);
    populateStubFor(&hal_fn->wifi_twt_session_setup);
    populateStubFor(&hal_fn->wifi_twt_session_update);
    populateStubFor(&hal_fn->wifi_twt_session_suspend);
+150 −129
Original line number Diff line number Diff line
@@ -31,7 +31,11 @@ using aidl_return_util::validateAndCall;
WifiStaIface::WifiStaIface(const std::string& ifname,
                           const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
                           const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)
    : ifname_(ifname), legacy_hal_(legacy_hal), iface_util_(iface_util), is_valid_(true) {
    : ifname_(ifname),
      legacy_hal_(legacy_hal),
      iface_util_(iface_util),
      is_valid_(true),
      is_twt_registered_(false) {
    // Turn on DFS channel usage for STA iface.
    legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setDfsFlag(ifname_, true);
    if (legacy_status != legacy_hal::WIFI_SUCCESS) {
@@ -266,11 +270,150 @@ std::pair<std::string, ndk::ScopedAStatus> WifiStaIface::getNameInternal() {
    return {ifname_, ndk::ScopedAStatus::ok()};
}

ndk::ScopedAStatus WifiStaIface::registerTwtEventCallbackInternal() {
    std::weak_ptr<WifiStaIface> weak_ptr_this = weak_ptr_this_;

    // onTwtFailure callback
    const auto& on_twt_failure = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                 legacy_hal::wifi_twt_error_code error_code) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        IWifiStaIfaceEventCallback::TwtErrorCode aidl_error_code =
                aidl_struct_util::convertLegacyHalTwtErrorCodeToAidl(error_code);
        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtFailure(id, aidl_error_code).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtFailure callback";
            }
        }
    };
    // onTwtSessionCreate callback
    const auto& on_twt_session_create = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                        legacy_hal::wifi_twt_session twt_session) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        TwtSession aidl_twt_session;
        if (!aidl_struct_util::convertLegacyHalTwtSessionToAidl(twt_session, &aidl_twt_session)) {
            LOG(ERROR) << "convertLegacyHalTwtSessionToAidl failed";
            return;
        }

        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionCreate(id, aidl_twt_session).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionCreate callback";
            }
        }
    };
    // onTwtSessionUpdate callback
    const auto& on_twt_session_update = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                        legacy_hal::wifi_twt_session twt_session) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        TwtSession aidl_twt_session;
        if (!aidl_struct_util::convertLegacyHalTwtSessionToAidl(twt_session, &aidl_twt_session)) {
            LOG(ERROR) << "convertLegacyHalTwtSessionToAidl failed";
            return;
        }

        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionUpdate(id, aidl_twt_session).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionUpdate callback";
            }
        }
    };
    // onTwtSessionTeardown callback
    const auto& on_twt_session_teardown =
            [weak_ptr_this](legacy_hal::wifi_request_id id, int session_id,
                            legacy_hal::wifi_twt_teardown_reason_code reason_code) {
                const auto shared_ptr_this = weak_ptr_this.lock();
                IWifiStaIfaceEventCallback::TwtTeardownReasonCode aidl_reason_code =
                        aidl_struct_util::convertLegacyHalTwtReasonCodeToAidl(reason_code);
                if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
                    LOG(ERROR) << "Callback invoked on an invalid object";
                    return;
                }
                for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
                    if (!callback->onTwtSessionTeardown(id, session_id, aidl_reason_code).isOk()) {
                        LOG(ERROR) << "Failed to invoke onTwtSessionTeardown callback";
                    }
                }
            };
    // onTwtSessionStats callback
    const auto& on_twt_session_stats = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                       int session_id,
                                                       legacy_hal::wifi_twt_session_stats stats) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        TwtSessionStats aidl_session_stats;
        if (!aidl_struct_util::convertLegacyHalTwtSessionStatsToAidl(stats, &aidl_session_stats)) {
            LOG(ERROR) << "convertLegacyHalTwtSessionStatsToAidl failed";
            return;
        }
        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionStats(id, session_id, aidl_session_stats).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionStats callback";
            }
        }
    };
    // onTwtSessionSuspend callback
    const auto& on_twt_session_suspend = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                         int session_id) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionSuspend(id, session_id).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionSuspend callback";
            }
        }
    };
    // onTwtSessionResume callback
    const auto& on_twt_session_resume = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                        int session_id) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionResume(id, session_id).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionResume callback";
            }
        }
    };

    legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->twtRegisterEvents(
            ifname_, on_twt_failure, on_twt_session_create, on_twt_session_update,
            on_twt_session_teardown, on_twt_session_stats, on_twt_session_suspend,
            on_twt_session_resume);

    if (legacy_status == legacy_hal::WIFI_ERROR_NOT_SUPPORTED) {
        LOG(INFO) << "twtRegisterEvents is not supported" << legacy_status;
    } else if (legacy_status != legacy_hal::WIFI_SUCCESS) {
        LOG(ERROR) << "twtRegisterEvents failed - %d" << legacy_status;
    }
    return createWifiStatusFromLegacyError(legacy_status);
}

ndk::ScopedAStatus WifiStaIface::registerEventCallbackInternal(
        const std::shared_ptr<IWifiStaIfaceEventCallback>& callback) {
    if (!event_cb_handler_.addCallback(callback)) {
        return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
    }
    is_twt_registered_ = registerTwtEventCallbackInternal().isOk();
    return ndk::ScopedAStatus::ok();
}

@@ -617,138 +760,16 @@ std::pair<TwtCapabilities, ndk::ScopedAStatus> WifiStaIface::twtGetCapabilitiesI

ndk::ScopedAStatus WifiStaIface::twtSessionSetupInternal(int32_t cmdId,
                                                         const TwtRequest& aidlTwtRequest) {
    if (!is_twt_registered_) {
        LOG(INFO) << "twtSessionSetup is not supported as twtRegisterEvents failed";
        return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
    }
    legacy_hal::wifi_twt_request legacyHalTwtRequest;
    if (!aidl_struct_util::convertAidlTwtRequestToLegacy(aidlTwtRequest, &legacyHalTwtRequest)) {
        return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
    }
    std::weak_ptr<WifiStaIface> weak_ptr_this = weak_ptr_this_;

    // onTwtFailure callback
    const auto& on_twt_failure = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                 legacy_hal::wifi_twt_error_code error_code) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        IWifiStaIfaceEventCallback::TwtErrorCode aidl_error_code =
                aidl_struct_util::convertLegacyHalTwtErrorCodeToAidl(error_code);
        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtFailure(id, aidl_error_code).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtFailure callback";
            }
        }
    };
    // onTwtSessionCreate callback
    const auto& on_twt_session_create = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                        legacy_hal::wifi_twt_session twt_session) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        TwtSession aidl_twt_session;
        if (!aidl_struct_util::convertLegacyHalTwtSessionToAidl(twt_session, &aidl_twt_session)) {
            LOG(ERROR) << "convertLegacyHalTwtSessionToAidl failed";
            return;
        }

        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionCreate(id, aidl_twt_session).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionCreate callback";
            }
        }
    };
    // onTwtSessionUpdate callback
    const auto& on_twt_session_update = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                        legacy_hal::wifi_twt_session twt_session) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        TwtSession aidl_twt_session;
        if (!aidl_struct_util::convertLegacyHalTwtSessionToAidl(twt_session, &aidl_twt_session)) {
            LOG(ERROR) << "convertLegacyHalTwtSessionToAidl failed";
            return;
        }

        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionUpdate(id, aidl_twt_session).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionUpdate callback";
            }
        }
    };
    // onTwtSessionTeardown callback
    const auto& on_twt_session_teardown =
            [weak_ptr_this](legacy_hal::wifi_request_id id, int session_id,
                            legacy_hal::wifi_twt_teardown_reason_code reason_code) {
                const auto shared_ptr_this = weak_ptr_this.lock();
                IWifiStaIfaceEventCallback::TwtTeardownReasonCode aidl_reason_code =
                        aidl_struct_util::convertLegacyHalTwtReasonCodeToAidl(reason_code);
                if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
                    LOG(ERROR) << "Callback invoked on an invalid object";
                    return;
                }
                for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
                    if (!callback->onTwtSessionTeardown(id, session_id, aidl_reason_code).isOk()) {
                        LOG(ERROR) << "Failed to invoke onTwtSessionTeardown callback";
                    }
                }
            };
    // onTwtSessionStats callback
    const auto& on_twt_session_stats = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                       int session_id,
                                                       legacy_hal::wifi_twt_session_stats stats) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        TwtSessionStats aidl_session_stats;
        if (!aidl_struct_util::convertLegacyHalTwtSessionStatsToAidl(stats, &aidl_session_stats)) {
            LOG(ERROR) << "convertLegacyHalTwtSessionStatsToAidl failed";
            return;
        }
        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionStats(id, session_id, aidl_session_stats).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionStats callback";
            }
        }
    };
    // onTwtSessionSuspend callback
    const auto& on_twt_session_suspend = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                         int session_id) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionSuspend(id, session_id).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionSuspend callback";
            }
        }
    };
    // onTwtSessionResume callback
    const auto& on_twt_session_resume = [weak_ptr_this](legacy_hal::wifi_request_id id,
                                                        int session_id) {
        const auto shared_ptr_this = weak_ptr_this.lock();
        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
            LOG(ERROR) << "Callback invoked on an invalid object";
            return;
        }
        for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
            if (!callback->onTwtSessionResume(id, session_id).isOk()) {
                LOG(ERROR) << "Failed to invoke onTwtSessionResume callback";
            }
        }
    };

    legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->twtSessionSetup(
            ifname_, cmdId, legacyHalTwtRequest, on_twt_failure, on_twt_session_create,
            on_twt_session_update, on_twt_session_teardown, on_twt_session_stats,
            on_twt_session_suspend, on_twt_session_resume);
    legacy_hal::wifi_error legacy_status =
            legacy_hal_.lock()->twtSessionSetup(ifname_, cmdId, legacyHalTwtRequest);
    return createWifiStatusFromLegacyError(legacy_status);
}

+2 −0
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ class WifiStaIface : public BnWifiStaIface {
  private:
    // Corresponding worker functions for the AIDL methods.
    std::pair<std::string, ndk::ScopedAStatus> getNameInternal();
    ndk::ScopedAStatus registerTwtEventCallbackInternal();
    ndk::ScopedAStatus registerEventCallbackInternal(
            const std::shared_ptr<IWifiStaIfaceEventCallback>& callback);
    std::pair<int32_t, ndk::ScopedAStatus> getFeatureSetInternal();
@@ -157,6 +158,7 @@ class WifiStaIface : public BnWifiStaIface {
    std::weak_ptr<WifiStaIface> weak_ptr_this_;
    bool is_valid_;
    aidl_callback_util::AidlCallbackHandler<IWifiStaIfaceEventCallback> event_cb_handler_;
    bool is_twt_registered_;

    DISALLOW_COPY_AND_ASSIGN(WifiStaIface);
};