/* * Copyright (C) 2016 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 <android-base/logging.h> #include "hidl_return_util.h" #include "hidl_struct_util.h" #include "wifi_nan_iface.h" #include "wifi_status_util.h" namespace android { namespace hardware { namespace wifi { namespace V1_2 { namespace implementation { using hidl_return_util::validateAndCall; WifiNanIface::WifiNanIface( const std::string& ifname, const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal) : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) { // 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; android::wp<WifiNanIface> weak_ptr_this(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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } WifiNanStatus wifiNanStatus; if (!hidl_struct_util::convertLegacyNanResponseHeaderToHidl( msg, &wifiNanStatus)) { 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, wifiNanStatus) .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, wifiNanStatus) .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, wifiNanStatus, 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, wifiNanStatus) .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, wifiNanStatus) .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, wifiNanStatus, 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, wifiNanStatus) .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, wifiNanStatus) .isOk()) { LOG(ERROR) << "Failed to invoke the callback"; } } break; } case legacy_hal::NAN_GET_CAPABILITIES: { NanCapabilities hidl_struct; if (!hidl_struct_util:: convertLegacyNanCapabilitiesResponseToHidl( msg.body.nan_capabilities, &hidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback ->notifyCapabilitiesResponse(id, wifiNanStatus, hidl_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, wifiNanStatus) .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, wifiNanStatus) .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, wifiNanStatus, 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, wifiNanStatus) .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, wifiNanStatus) .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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } NanClusterEventInd hidl_struct; // event types defined identically - hence can be cast hidl_struct.eventType = (NanClusterEventType)msg.event_type; hidl_struct.addr = msg.data.mac_addr.addr; for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventClusterEvent(hidl_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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } WifiNanStatus status; hidl_struct_util::convertToWifiNanStatus( 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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } WifiNanStatus status; hidl_struct_util::convertToWifiNanStatus( 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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } WifiNanStatus status; hidl_struct_util::convertToWifiNanStatus( 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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } NanMatchInd hidl_struct; if (!hidl_struct_util::convertLegacyNanMatchIndToHidl( msg, &hidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventMatch(hidl_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.promote(); 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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } NanFollowupReceivedInd hidl_struct; if (!hidl_struct_util::convertLegacyNanFollowupIndToHidl( msg, &hidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventFollowupReceived(hidl_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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } WifiNanStatus status; hidl_struct_util::convertToWifiNanStatus( 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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } NanDataPathRequestInd hidl_struct; if (!hidl_struct_util::convertLegacyNanDataPathRequestIndToHidl( msg, &hidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { if (!callback->eventDataPathRequest(hidl_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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } NanDataPathConfirmInd hidl_struct; if (!hidl_struct_util::convertLegacyNanDataPathConfirmIndToHidl( msg, &hidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks_1_2()) { if (!callback->eventDataPathConfirm_1_2(hidl_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.promote(); 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_beacon_sdf_payload = [weak_ptr_this](const legacy_hal::NanBeaconSdfPayloadInd& /* msg */) { LOG(ERROR) << "on_event_beacon_sdf_payload - should not be called"; }; callback_handlers.on_event_range_request = [weak_ptr_this](const legacy_hal::NanRangeRequestInd& /* msg */) { LOG(ERROR) << "on_event_range_request - should not be called"; }; callback_handlers.on_event_range_report = [weak_ptr_this](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.promote(); if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) { LOG(ERROR) << "Callback invoked on an invalid object"; return; } NanDataPathScheduleUpdateInd hidl_struct; if (!hidl_struct_util::convertLegacyNanDataPathScheduleUpdateIndToHidl( msg, &hidl_struct)) { LOG(ERROR) << "Failed to convert nan capabilities response"; return; } for (const auto& callback : shared_ptr_this->getEventCallbacks_1_2()) { if (!callback->eventDataPathScheduleUpdate(hidl_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(); } } void WifiNanIface::invalidate() { // 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"); legacy_hal_.reset(); event_cb_handler_.invalidate(); event_cb_handler_1_2_.invalidate(); is_valid_ = false; } bool WifiNanIface::isValid() { return is_valid_; } std::string WifiNanIface::getName() { return ifname_; } std::set<sp<V1_0::IWifiNanIfaceEventCallback>> WifiNanIface::getEventCallbacks() { return event_cb_handler_.getCallbacks(); } std::set<sp<V1_2::IWifiNanIfaceEventCallback>> WifiNanIface::getEventCallbacks_1_2() { return event_cb_handler_1_2_.getCallbacks(); } Return<void> WifiNanIface::getName(getName_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::getNameInternal, hidl_status_cb); } Return<void> WifiNanIface::getType(getType_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::getTypeInternal, hidl_status_cb); } Return<void> WifiNanIface::registerEventCallback( const sp<V1_0::IWifiNanIfaceEventCallback>& callback, registerEventCallback_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::registerEventCallbackInternal, hidl_status_cb, callback); } Return<void> WifiNanIface::getCapabilitiesRequest( uint16_t cmd_id, getCapabilitiesRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::getCapabilitiesRequestInternal, hidl_status_cb, cmd_id); } Return<void> WifiNanIface::enableRequest(uint16_t cmd_id, const NanEnableRequest& msg, enableRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::enableRequestInternal, hidl_status_cb, cmd_id, msg); } Return<void> WifiNanIface::configRequest(uint16_t cmd_id, const NanConfigRequest& msg, configRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::configRequestInternal, hidl_status_cb, cmd_id, msg); } Return<void> WifiNanIface::disableRequest(uint16_t cmd_id, disableRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::disableRequestInternal, hidl_status_cb, cmd_id); } Return<void> WifiNanIface::startPublishRequest( uint16_t cmd_id, const NanPublishRequest& msg, startPublishRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::startPublishRequestInternal, hidl_status_cb, cmd_id, msg); } Return<void> WifiNanIface::stopPublishRequest( uint16_t cmd_id, uint8_t sessionId, stopPublishRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::stopPublishRequestInternal, hidl_status_cb, cmd_id, sessionId); } Return<void> WifiNanIface::startSubscribeRequest( uint16_t cmd_id, const NanSubscribeRequest& msg, startSubscribeRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::startSubscribeRequestInternal, hidl_status_cb, cmd_id, msg); } Return<void> WifiNanIface::stopSubscribeRequest( uint16_t cmd_id, uint8_t sessionId, stopSubscribeRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::stopSubscribeRequestInternal, hidl_status_cb, cmd_id, sessionId); } Return<void> WifiNanIface::transmitFollowupRequest( uint16_t cmd_id, const NanTransmitFollowupRequest& msg, transmitFollowupRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::transmitFollowupRequestInternal, hidl_status_cb, cmd_id, msg); } Return<void> WifiNanIface::createDataInterfaceRequest( uint16_t cmd_id, const hidl_string& iface_name, createDataInterfaceRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::createDataInterfaceRequestInternal, hidl_status_cb, cmd_id, iface_name); } Return<void> WifiNanIface::deleteDataInterfaceRequest( uint16_t cmd_id, const hidl_string& iface_name, deleteDataInterfaceRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::deleteDataInterfaceRequestInternal, hidl_status_cb, cmd_id, iface_name); } Return<void> WifiNanIface::initiateDataPathRequest( uint16_t cmd_id, const NanInitiateDataPathRequest& msg, initiateDataPathRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::initiateDataPathRequestInternal, hidl_status_cb, cmd_id, msg); } Return<void> WifiNanIface::respondToDataPathIndicationRequest( uint16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg, respondToDataPathIndicationRequest_cb hidl_status_cb) { return validateAndCall( this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::respondToDataPathIndicationRequestInternal, hidl_status_cb, cmd_id, msg); } Return<void> WifiNanIface::terminateDataPathRequest( uint16_t cmd_id, uint32_t ndpInstanceId, terminateDataPathRequest_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::terminateDataPathRequestInternal, hidl_status_cb, cmd_id, ndpInstanceId); } Return<void> WifiNanIface::registerEventCallback_1_2( const sp<IWifiNanIfaceEventCallback>& callback, registerEventCallback_1_2_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::registerEventCallback_1_2Internal, hidl_status_cb, callback); } Return<void> WifiNanIface::enableRequest_1_2( uint16_t cmd_id, const NanEnableRequest& msg1, const NanConfigRequestSupplemental& msg2, enableRequest_1_2_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::enableRequest_1_2Internal, hidl_status_cb, cmd_id, msg1, msg2); } Return<void> WifiNanIface::configRequest_1_2( uint16_t cmd_id, const NanConfigRequest& msg1, const NanConfigRequestSupplemental& msg2, configRequest_1_2_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiNanIface::configRequest_1_2Internal, hidl_status_cb, cmd_id, msg1, msg2); } std::pair<WifiStatus, std::string> WifiNanIface::getNameInternal() { return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_}; } std::pair<WifiStatus, IfaceType> WifiNanIface::getTypeInternal() { return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::NAN}; } WifiStatus WifiNanIface::registerEventCallbackInternal( const sp<V1_0::IWifiNanIfaceEventCallback>& callback) { if (!event_cb_handler_.addCallback(callback)) { return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); } return createWifiStatus(WifiStatusCode::SUCCESS); } WifiStatus WifiNanIface::getCapabilitiesRequestInternal(uint16_t cmd_id) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanGetCapabilities(ifname_, cmd_id); return createWifiStatusFromLegacyError(legacy_status); } WifiStatus WifiNanIface::enableRequestInternal( uint16_t /* cmd_id */, const NanEnableRequest& /* msg */) { return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED); } WifiStatus WifiNanIface::configRequestInternal( uint16_t /* cmd_id */, const NanConfigRequest& /* msg */) { return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED); } WifiStatus WifiNanIface::disableRequestInternal(uint16_t cmd_id) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanDisableRequest(ifname_, cmd_id); return createWifiStatusFromLegacyError(legacy_status); } WifiStatus WifiNanIface::startPublishRequestInternal( uint16_t cmd_id, const NanPublishRequest& msg) { legacy_hal::NanPublishRequest legacy_msg; if (!hidl_struct_util::convertHidlNanPublishRequestToLegacy(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); } WifiStatus WifiNanIface::stopPublishRequestInternal(uint16_t cmd_id, uint8_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); } WifiStatus WifiNanIface::startSubscribeRequestInternal( uint16_t cmd_id, const NanSubscribeRequest& msg) { legacy_hal::NanSubscribeRequest legacy_msg; if (!hidl_struct_util::convertHidlNanSubscribeRequestToLegacy( 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); } WifiStatus WifiNanIface::stopSubscribeRequestInternal(uint16_t cmd_id, uint8_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); } WifiStatus WifiNanIface::transmitFollowupRequestInternal( uint16_t cmd_id, const NanTransmitFollowupRequest& msg) { legacy_hal::NanTransmitFollowupRequest legacy_msg; if (!hidl_struct_util::convertHidlNanTransmitFollowupRequestToLegacy( 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); } WifiStatus WifiNanIface::createDataInterfaceRequestInternal( uint16_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); } WifiStatus WifiNanIface::deleteDataInterfaceRequestInternal( uint16_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); } WifiStatus WifiNanIface::initiateDataPathRequestInternal( uint16_t cmd_id, const NanInitiateDataPathRequest& msg) { legacy_hal::NanDataPathInitiatorRequest legacy_msg; if (!hidl_struct_util::convertHidlNanDataPathInitiatorRequestToLegacy( 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); } WifiStatus WifiNanIface::respondToDataPathIndicationRequestInternal( uint16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg) { legacy_hal::NanDataPathIndicationResponse legacy_msg; if (!hidl_struct_util::convertHidlNanDataPathIndicationResponseToLegacy( 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); } WifiStatus WifiNanIface::terminateDataPathRequestInternal( uint16_t cmd_id, uint32_t ndpInstanceId) { legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->nanDataEnd(ifname_, cmd_id, ndpInstanceId); return createWifiStatusFromLegacyError(legacy_status); } WifiStatus WifiNanIface::registerEventCallback_1_2Internal( const sp<V1_2::IWifiNanIfaceEventCallback>& callback) { sp<V1_0::IWifiNanIfaceEventCallback> callback_1_0 = callback; if (!event_cb_handler_.addCallback(callback_1_0)) { return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); } if (!event_cb_handler_1_2_.addCallback(callback)) { return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); } return createWifiStatus(WifiStatusCode::SUCCESS); } WifiStatus WifiNanIface::enableRequest_1_2Internal( uint16_t cmd_id, const NanEnableRequest& msg1, const NanConfigRequestSupplemental& msg2) { legacy_hal::NanEnableRequest legacy_msg; if (!hidl_struct_util::convertHidlNanEnableRequest_1_2ToLegacy( 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); } WifiStatus WifiNanIface::configRequest_1_2Internal( uint16_t cmd_id, const NanConfigRequest& msg1, const NanConfigRequestSupplemental& msg2) { legacy_hal::NanConfigRequest legacy_msg; if (!hidl_struct_util::convertHidlNanConfigRequest_1_2ToLegacy( 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); } } // namespace implementation } // namespace V1_2 } // namespace wifi } // namespace hardware } // namespace android