/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "wifi_nan_iface.h" #include #include "aidl_return_util.h" #include "aidl_struct_util.h" #include "wifi_status_util.h" namespace aidl { namespace android { namespace hardware { namespace wifi { using aidl_return_util::validateAndCall; WifiNanIface::WifiNanIface(const std::string& ifname, bool is_dedicated_iface, const std::weak_ptr legacy_hal, const std::weak_ptr iface_util) : ifname_(ifname), is_dedicated_iface_(is_dedicated_iface), legacy_hal_(legacy_hal), iface_util_(iface_util), is_valid_(true) {} std::shared_ptr WifiNanIface::create( const std::string& ifname, bool is_dedicated_iface, const std::weak_ptr legacy_hal, const std::weak_ptr iface_util) { std::shared_ptr ptr = ndk::SharedRefBase::make( ifname, is_dedicated_iface, legacy_hal, iface_util); if (is_dedicated_iface) { // If using a dedicated iface, set the iface up first. if (!iface_util.lock()->setUpState(ifname, true)) { // Fatal failure, invalidate the iface object. ptr->invalidate(); return nullptr; } } std::weak_ptr weak_ptr_this(ptr); ptr->setWeakPtr(weak_ptr_this); ptr->registerCallbackHandlers(); return ptr; } void WifiNanIface::registerCallbackHandlers() { // Register all the callbacks here. These should be valid for the lifetime // of the object. Whenever the mode changes legacy HAL will remove // all of these callbacks. legacy_hal::NanCallbackHandlers callback_handlers; std::weak_ptr weak_ptr_this = weak_ptr_this_; // Callback for response. callback_handlers.on_notify_response = [weak_ptr_this](legacy_hal::transaction_id id, const legacy_hal::NanResponseMsg& msg) { 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; } NanStatus nanStatus; if (!aidl_struct_util::convertLegacyNanResponseHeaderToAidl(msg, &nanStatus)) { LOG(ERROR) << "Failed to convert nan response header"; return; } switch (msg.response_type) { case legacy_hal::NAN_RESPONSE_ENABLED: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyEnableResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESPONSE_DISABLED: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyDisableResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESPONSE_PUBLISH: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyStartPublishResponse(id, nanStatus, msg.body.publish_response.publish_id) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESPONSE_PUBLISH_CANCEL: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyStopPublishResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESPONSE_TRANSMIT_FOLLOWUP: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyTransmitFollowupResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESPONSE_SUBSCRIBE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyStartSubscribeResponse( id, nanStatus, msg.body.subscribe_response.subscribe_id) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESPONSE_SUBSCRIBE_CANCEL: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyStopSubscribeResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESPONSE_CONFIG: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyConfigResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_GET_CAPABILITIES: { NanCapabilities aidl_struct; if (!aidl_struct_util::convertLegacyNanCapabilitiesResponseToAidl( msg.body.nan_capabilities, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyCapabilitiesResponse(id, nanStatus, aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_DP_INTERFACE_CREATE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyCreateDataInterfaceResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_DP_INTERFACE_DELETE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyDeleteDataInterfaceResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_DP_INITIATOR_RESPONSE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyInitiateDataPathResponse( id, nanStatus, msg.body.data_request_response.ndp_instance_id) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_DP_RESPONDER_RESPONSE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyRespondToDataPathIndicationResponse(id, nanStatus) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_DP_END: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyTerminateDataPathResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_PAIRING_INITIATOR_RESPONSE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyInitiatePairingResponse( id, nanStatus, msg.body.pairing_request_response.paring_instance_id) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_PAIRING_RESPONDER_RESPONSE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyRespondToPairingIndicationResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_PAIRING_END: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyTerminatePairingResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_BOOTSTRAPPING_INITIATOR_RESPONSE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyInitiateBootstrappingResponse( id, nanStatus, msg.body.bootstrapping_request_response .bootstrapping_instance_id) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_BOOTSTRAPPING_RESPONDER_RESPONSE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyRespondToBootstrappingIndicationResponse(id, nanStatus) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_SUSPEND_REQUEST_RESPONSE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifySuspendResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESUME_REQUEST_RESPONSE: { for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->notifyResumeResponse(id, nanStatus).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_RESPONSE_BEACON_SDF_PAYLOAD: /* fall through */ case legacy_hal::NAN_RESPONSE_TCA: /* fall through */ case legacy_hal::NAN_RESPONSE_STATS: /* fall through */ case legacy_hal::NAN_RESPONSE_ERROR: /* fall through */ default: LOG(ERROR) << "Unknown or unhandled response type: " << msg.response_type; return; } }; callback_handlers.on_event_disc_eng_event = [weak_ptr_this]( const legacy_hal::NanDiscEngEventInd& msg) { 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; } NanClusterEventInd aidl_struct; // event types defined identically - hence can be cast aidl_struct.eventType = (NanClusterEventType)msg.event_type; aidl_struct.addr = std::array(); std::copy(msg.data.mac_addr.addr, msg.data.mac_addr.addr + 6, std::begin(aidl_struct.addr)); for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventClusterEvent(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_disabled = [weak_ptr_this](const legacy_hal::NanDisabledInd& msg) { 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; } NanStatus status; aidl_struct_util::convertToNanStatus(msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status); for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventDisabled(status).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_publish_terminated = [weak_ptr_this](const legacy_hal::NanPublishTerminatedInd& msg) { 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; } NanStatus status; aidl_struct_util::convertToNanStatus(msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status); for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventPublishTerminated(msg.publish_id, status).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_subscribe_terminated = [weak_ptr_this](const legacy_hal::NanSubscribeTerminatedInd& msg) { 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; } NanStatus status; aidl_struct_util::convertToNanStatus(msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status); for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventSubscribeTerminated(msg.subscribe_id, status).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_match = [weak_ptr_this](const legacy_hal::NanMatchInd& msg) { 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; } NanMatchInd aidl_struct; if (!aidl_struct_util::convertLegacyNanMatchIndToAidl(msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventMatch(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_match_expired = [weak_ptr_this]( const legacy_hal::NanMatchExpiredInd& msg) { 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->eventMatchExpired(msg.publish_subscribe_id, msg.requestor_instance_id) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_followup = [weak_ptr_this](const legacy_hal::NanFollowupInd& msg) { 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; } NanFollowupReceivedInd aidl_struct; if (!aidl_struct_util::convertLegacyNanFollowupIndToAidl(msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventFollowupReceived(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_transmit_follow_up = [weak_ptr_this](const legacy_hal::NanTransmitFollowupInd& msg) { 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; } NanStatus status; aidl_struct_util::convertToNanStatus(msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status); for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventTransmitFollowup(msg.id, status).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_data_path_request = [weak_ptr_this](const legacy_hal::NanDataPathRequestInd& msg) { 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; } NanDataPathRequestInd aidl_struct; if (!aidl_struct_util::convertLegacyNanDataPathRequestIndToAidl(msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventDataPathRequest(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_data_path_confirm = [weak_ptr_this](const legacy_hal::NanDataPathConfirmInd& msg) { 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; } NanDataPathConfirmInd aidl_struct; if (!aidl_struct_util::convertLegacyNanDataPathConfirmIndToAidl(msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventDataPathConfirm(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_data_path_end = [weak_ptr_this](const legacy_hal::NanDataPathEndInd& msg) { 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()) { for (int i = 0; i < msg.num_ndp_instances; ++i) { if (!callback->eventDataPathTerminated(msg.ndp_instance_id[i]).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } } }; callback_handlers.on_event_pairing_request = [weak_ptr_this](const legacy_hal::NanPairingRequestInd& msg) { 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; } NanPairingRequestInd aidl_struct; if (!aidl_struct_util::convertLegacyNanPairingRequestIndToAidl(msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventPairingRequest(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_pairing_confirm = [weak_ptr_this](const legacy_hal::NanPairingConfirmInd& msg) { 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; } NanPairingConfirmInd aidl_struct; if (!aidl_struct_util::convertLegacyNanPairingConfirmIndToAidl(msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventPairingConfirm(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_bootstrapping_request = [weak_ptr_this](const legacy_hal::NanBootstrappingRequestInd& msg) { 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; } NanBootstrappingRequestInd aidl_struct; if (!aidl_struct_util::convertLegacyNanBootstrappingRequestIndToAidl( msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventBootstrappingRequest(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_bootstrapping_confirm = [weak_ptr_this](const legacy_hal::NanBootstrappingConfirmInd& msg) { 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; } NanBootstrappingConfirmInd aidl_struct; if (!aidl_struct_util::convertLegacyNanBootstrappingConfirmIndToAidl( msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventBootstrappingConfirm(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_beacon_sdf_payload = [](const legacy_hal::NanBeaconSdfPayloadInd& /* msg */) { LOG(ERROR) << "on_event_beacon_sdf_payload - should not be called"; }; callback_handlers.on_event_range_request = [](const legacy_hal::NanRangeRequestInd& /* msg */) { LOG(ERROR) << "on_event_range_request - should not be called"; }; callback_handlers.on_event_range_report = [](const legacy_hal::NanRangeReportInd& /* msg */) { LOG(ERROR) << "on_event_range_report - should not be called"; }; callback_handlers.on_event_schedule_update = [weak_ptr_this](const legacy_hal::NanDataPathScheduleUpdateInd& msg) { 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; } NanDataPathScheduleUpdateInd aidl_struct; if (!aidl_struct_util::convertLegacyNanDataPathScheduleUpdateIndToAidl( msg, &aidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventDataPathScheduleUpdate(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; callback_handlers.on_event_suspension_mode_change = [weak_ptr_this](const legacy_hal::NanSuspensionModeChangeInd& msg) { 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; } NanSuspensionModeChangeInd aidl_struct; aidl_struct.isSuspended = msg.is_suspended; for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventSuspensionModeChanged(aidl_struct).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanRegisterCallbackHandlers(ifname_, callback_handlers); if (legacy_status != legacy_hal::WIFI_SUCCESS) { LOG(ERROR) << "Failed to register nan callbacks. Invalidating object"; invalidate(); } // Register for iface state toggle events. iface_util::IfaceEventHandlers event_handlers = {}; #ifndef WIFI_SKIP_STATE_TOGGLE_OFF_ON_FOR_NAN event_handlers.on_state_toggle_off_on = [weak_ptr_this](const std::string& /* iface_name */) { 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; } // Tell framework that NAN has been disabled. NanStatus status = {NanStatusCode::UNSUPPORTED_CONCURRENCY_NAN_DISABLED, ""}; for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventDisabled(status).isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } }; #endif iface_util_.lock()->registerIfaceEventHandlers(ifname_, event_handlers); } void WifiNanIface::setWeakPtr(std::weak_ptr ptr) { weak_ptr_this_ = ptr; } void WifiNanIface::invalidate() { if (!isValid()) { return; } // send commands to HAL to actually disable and destroy interfaces legacy_hal_.lock()->nanDisableRequest(ifname_, 0xFFFF); legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, 0xFFFE, "aware_data0"); legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, 0xFFFD, "aware_data1"); iface_util_.lock()->unregisterIfaceEventHandlers(ifname_); legacy_hal_.reset(); event_cb_handler_.invalidate(); is_valid_ = false; if (is_dedicated_iface_) { // If using a dedicated iface, set the iface down. iface_util_.lock()->setUpState(ifname_, false); } } bool WifiNanIface::isValid() { return is_valid_; } std::string WifiNanIface::getName() { return ifname_; } std::set> WifiNanIface::getEventCallbacks() { LOG(ERROR) << "Using original getEventCallbacks"; return event_cb_handler_.getCallbacks(); } ndk::ScopedAStatus WifiNanIface::getName(std::string* _aidl_return) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::getNameInternal, _aidl_return); } ndk::ScopedAStatus WifiNanIface::registerEventCallback( const std::shared_ptr& callback) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::registerEventCallbackInternal, callback); } ndk::ScopedAStatus WifiNanIface::getCapabilitiesRequest(char16_t in_cmdId) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::getCapabilitiesRequestInternal, in_cmdId); } ndk::ScopedAStatus WifiNanIface::enableRequest(char16_t in_cmdId, const NanEnableRequest& in_msg1, const NanConfigRequestSupplemental& in_msg2) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::enableRequestInternal, in_cmdId, in_msg1, in_msg2); } ndk::ScopedAStatus WifiNanIface::configRequest(char16_t in_cmdId, const NanConfigRequest& in_msg1, const NanConfigRequestSupplemental& in_msg2) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::configRequestInternal, in_cmdId, in_msg1, in_msg2); } ndk::ScopedAStatus WifiNanIface::disableRequest(char16_t in_cmdId) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::disableRequestInternal, in_cmdId); } ndk::ScopedAStatus WifiNanIface::startPublishRequest(char16_t in_cmdId, const NanPublishRequest& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::startPublishRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::stopPublishRequest(char16_t in_cmdId, int8_t in_sessionId) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::stopPublishRequestInternal, in_cmdId, in_sessionId); } ndk::ScopedAStatus WifiNanIface::startSubscribeRequest(char16_t in_cmdId, const NanSubscribeRequest& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::startSubscribeRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::stopSubscribeRequest(char16_t in_cmdId, int8_t in_sessionId) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::stopSubscribeRequestInternal, in_cmdId, in_sessionId); } ndk::ScopedAStatus WifiNanIface::transmitFollowupRequest(char16_t in_cmdId, const NanTransmitFollowupRequest& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::transmitFollowupRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::createDataInterfaceRequest(char16_t in_cmdId, const std::string& in_ifaceName) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::createDataInterfaceRequestInternal, in_cmdId, in_ifaceName); } ndk::ScopedAStatus WifiNanIface::deleteDataInterfaceRequest(char16_t in_cmdId, const std::string& in_ifaceName) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::deleteDataInterfaceRequestInternal, in_cmdId, in_ifaceName); } ndk::ScopedAStatus WifiNanIface::initiateDataPathRequest(char16_t in_cmdId, const NanInitiateDataPathRequest& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::initiateDataPathRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::respondToDataPathIndicationRequest( char16_t in_cmdId, const NanRespondToDataPathIndicationRequest& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::respondToDataPathIndicationRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::terminateDataPathRequest(char16_t in_cmdId, int32_t in_ndpInstanceId) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::terminateDataPathRequestInternal, in_cmdId, in_ndpInstanceId); } ndk::ScopedAStatus WifiNanIface::initiatePairingRequest(char16_t in_cmdId, const NanPairingRequest& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::initiatePairingRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::respondToPairingIndicationRequest( char16_t in_cmdId, const NanRespondToPairingIndicationRequest& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::respondToPairingIndicationRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::terminatePairingRequest(char16_t in_cmdId, int32_t in_ndpInstanceId) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::terminatePairingRequestInternal, in_cmdId, in_ndpInstanceId); } ndk::ScopedAStatus WifiNanIface::initiateBootstrappingRequest( char16_t in_cmdId, const NanBootstrappingRequest& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::initiateBootstrappingRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::respondToBootstrappingIndicationRequest( char16_t in_cmdId, const NanBootstrappingResponse& in_msg) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::respondToBootstrappingIndicationRequestInternal, in_cmdId, in_msg); } ndk::ScopedAStatus WifiNanIface::suspendRequest(char16_t in_cmdId, int8_t in_sessionId) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::suspendRequestInternal, in_cmdId, in_sessionId); } ndk::ScopedAStatus WifiNanIface::resumeRequest(char16_t in_cmdId, int8_t in_sessionId) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::resumeRequestInternal, in_cmdId, in_sessionId); } std::pair WifiNanIface::getNameInternal() { return {ifname_, ndk::ScopedAStatus::ok()}; } ndk::ScopedAStatus WifiNanIface::registerEventCallbackInternal( const std::shared_ptr& callback) { if (!event_cb_handler_.addCallback(callback)) { return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); } return ndk::ScopedAStatus::ok(); } ndk::ScopedAStatus WifiNanIface::getCapabilitiesRequestInternal(char16_t cmd_id) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanGetCapabilities(ifname_, cmd_id); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::enableRequestInternal(char16_t cmd_id, const NanEnableRequest& msg1, const NanConfigRequestSupplemental& msg2) { legacy_hal::NanEnableRequest legacy_msg; if (!aidl_struct_util::convertAidlNanEnableRequestToLegacy(msg1, msg2, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanEnableRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::configRequestInternal(char16_t cmd_id, const NanConfigRequest& msg1, const NanConfigRequestSupplemental& msg2) { legacy_hal::NanConfigRequest legacy_msg; if (!aidl_struct_util::convertAidlNanConfigRequestToLegacy(msg1, msg2, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanConfigRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::disableRequestInternal(char16_t cmd_id) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanDisableRequest(ifname_, cmd_id); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::startPublishRequestInternal(char16_t cmd_id, const NanPublishRequest& msg) { legacy_hal::NanPublishRequest legacy_msg; if (!aidl_struct_util::convertAidlNanPublishRequestToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanPublishRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::stopPublishRequestInternal(char16_t cmd_id, int8_t sessionId) { legacy_hal::NanPublishCancelRequest legacy_msg; legacy_msg.publish_id = sessionId; legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanPublishCancelRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::startSubscribeRequestInternal(char16_t cmd_id, const NanSubscribeRequest& msg) { legacy_hal::NanSubscribeRequest legacy_msg; if (!aidl_struct_util::convertAidlNanSubscribeRequestToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanSubscribeRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::stopSubscribeRequestInternal(char16_t cmd_id, int8_t sessionId) { legacy_hal::NanSubscribeCancelRequest legacy_msg; legacy_msg.subscribe_id = sessionId; legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanSubscribeCancelRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::transmitFollowupRequestInternal( char16_t cmd_id, const NanTransmitFollowupRequest& msg) { legacy_hal::NanTransmitFollowupRequest legacy_msg; if (!aidl_struct_util::convertAidlNanTransmitFollowupRequestToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanTransmitFollowupRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::createDataInterfaceRequestInternal(char16_t cmd_id, const std::string& iface_name) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanDataInterfaceCreate(ifname_, cmd_id, iface_name); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::deleteDataInterfaceRequestInternal(char16_t cmd_id, const std::string& iface_name) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, cmd_id, iface_name); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::initiateDataPathRequestInternal( char16_t cmd_id, const NanInitiateDataPathRequest& msg) { legacy_hal::NanDataPathInitiatorRequest legacy_msg; if (!aidl_struct_util::convertAidlNanDataPathInitiatorRequestToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanDataRequestInitiator(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::respondToDataPathIndicationRequestInternal( char16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg) { legacy_hal::NanDataPathIndicationResponse legacy_msg; if (!aidl_struct_util::convertAidlNanDataPathIndicationResponseToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanDataIndicationResponse(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::terminateDataPathRequestInternal(char16_t cmd_id, int32_t ndpInstanceId) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanDataEnd(ifname_, cmd_id, ndpInstanceId); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::initiatePairingRequestInternal(char16_t cmd_id, const NanPairingRequest& msg) { legacy_hal::NanPairingRequest legacy_msg; if (!aidl_struct_util::convertAidlNanPairingInitiatorRequestToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanPairingRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::respondToPairingIndicationRequestInternal( char16_t cmd_id, const NanRespondToPairingIndicationRequest& msg) { legacy_hal::NanPairingIndicationResponse legacy_msg; if (!aidl_struct_util::convertAidlNanPairingIndicationResponseToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanPairingIndicationResponse(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::terminatePairingRequestInternal(char16_t cmd_id, int32_t ndpInstanceId) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanPairingEnd(ifname_, cmd_id, ndpInstanceId); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::initiateBootstrappingRequestInternal( char16_t cmd_id, const NanBootstrappingRequest& msg) { legacy_hal::NanBootstrappingRequest legacy_msg; if (!aidl_struct_util::convertAidlNanBootstrappingInitiatorRequestToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanBootstrappingRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::respondToBootstrappingIndicationRequestInternal( char16_t cmd_id, const NanBootstrappingResponse& msg) { legacy_hal::NanBootstrappingIndicationResponse legacy_msg; if (!aidl_struct_util::convertAidlNanBootstrappingIndicationResponseToLegacy(msg, &legacy_msg)) { return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS); } legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanBootstrappingIndicationResponse(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::suspendRequestInternal(char16_t cmd_id, int8_t sessionId) { legacy_hal::NanSuspendRequest legacy_msg; legacy_msg.publish_subscribe_id = sessionId; legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanSuspendRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } ndk::ScopedAStatus WifiNanIface::resumeRequestInternal(char16_t cmd_id, int8_t sessionId) { legacy_hal::NanResumeRequest legacy_msg; legacy_msg.publish_subscribe_id = sessionId; legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanResumeRequest(ifname_, cmd_id, legacy_msg); return createWifiStatusFromLegacyError(legacy_status); } } // namespace wifi } // namespace hardware } // namespace android } // namespace aidl