13e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius/*
23e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * Copyright (C) 2016 The Android Open Source Project
33e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius *
43e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * Licensed under the Apache License, Version 2.0 (the "License");
53e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * you may not use this file except in compliance with the License.
63e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * You may obtain a copy of the License at
73e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius *
83e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius *      http://www.apache.org/licenses/LICENSE-2.0
93e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius *
103e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * Unless required by applicable law or agreed to in writing, software
113e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * distributed under the License is distributed on an "AS IS" BASIS,
123e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * See the License for the specific language governing permissions and
143e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius * limitations under the License.
153e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius */
163e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius
173e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius#include <android-base/logging.h>
183e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius
19907d4a234da9806cde5169c17236a0501805b70aRoshan Pius#include "hidl_return_util.h"
20f5f51fd039786bd45035b7f10520a6c6a15a73aaRoshan Pius#include "hidl_struct_util.h"
21907d4a234da9806cde5169c17236a0501805b70aRoshan Pius#include "wifi_nan_iface.h"
22734fea0d98213d2f721f8f8988114d0cf397d436Roshan Pius#include "wifi_status_util.h"
233e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius
243e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Piusnamespace android {
253e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Piusnamespace hardware {
263e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Piusnamespace wifi {
276ce509085453637ddd3d0a1a88a26fed18072167Etan Cohennamespace V1_2 {
283e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Piusnamespace implementation {
29907d4a234da9806cde5169c17236a0501805b70aRoshan Piususing hidl_return_util::validateAndCall;
303e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius
316cedc97e95b3b3ee49fe0860ac8cfd8c5de2a2abRoshan PiusWifiNanIface::WifiNanIface(
326cedc97e95b3b3ee49fe0860ac8cfd8c5de2a2abRoshan Pius    const std::string& ifname,
336cedc97e95b3b3ee49fe0860ac8cfd8c5de2a2abRoshan Pius    const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal)
34f5f51fd039786bd45035b7f10520a6c6a15a73aaRoshan Pius    : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) {
35abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    // Register all the callbacks here. these should be valid for the lifetime
36abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    // of the object. Whenever the mode changes legacy HAL will remove
37abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    // all of these callbacks.
38abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::NanCallbackHandlers callback_handlers;
39abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    android::wp<WifiNanIface> weak_ptr_this(this);
40abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
41abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    // Callback for response.
42abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers
43abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        .on_notify_response = [weak_ptr_this](
44abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                  legacy_hal::transaction_id id,
45abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                  const legacy_hal::NanResponseMsg& msg) {
46abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        const auto shared_ptr_this = weak_ptr_this.promote();
47abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
48abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            LOG(ERROR) << "Callback invoked on an invalid object";
49f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen            return;
50f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen        }
51abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        WifiNanStatus wifiNanStatus;
52abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        if (!hidl_struct_util::convertLegacyNanResponseHeaderToHidl(
53abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                msg, &wifiNanStatus)) {
54abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            LOG(ERROR) << "Failed to convert nan response header";
55abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            return;
56f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen        }
57abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
58abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        switch (msg.response_type) {
59abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_ENABLED: {
60abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
61abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
62abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback->notifyEnableResponse(id, wifiNanStatus)
63abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
64abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
65abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
66abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
67abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
68abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
69abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_DISABLED: {
70abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
71abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
72abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback->notifyDisableResponse(id, wifiNanStatus)
73abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
74abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
75abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
76abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
77abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
78abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
79abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_PUBLISH: {
80abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
81abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
82abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
83abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyStartPublishResponse(
84abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                 id, wifiNanStatus,
85abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                 msg.body.publish_response.publish_id)
86abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
87abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
88abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
89abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
90abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
91abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
92abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_PUBLISH_CANCEL: {
93abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
94abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
95abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback->notifyStopPublishResponse(id, wifiNanStatus)
96abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
97abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
98abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
99abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
100abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
101abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
102abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_TRANSMIT_FOLLOWUP: {
103abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
104abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
105abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
106abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyTransmitFollowupResponse(id, wifiNanStatus)
107abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
108abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
109abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
110abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
111abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
112abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
113abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_SUBSCRIBE: {
114abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
115abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
116abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
117abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyStartSubscribeResponse(
118abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                 id, wifiNanStatus,
119abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                 msg.body.subscribe_response.subscribe_id)
120abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
121abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
122abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
123abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
124abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
125abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
126abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_SUBSCRIBE_CANCEL: {
127abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
128abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
129abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
130abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyStopSubscribeResponse(id, wifiNanStatus)
131abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
132abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
133abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
134abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
135abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
136f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen            }
137abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_CONFIG: {
138abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
139abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
140abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback->notifyConfigResponse(id, wifiNanStatus)
141abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
142abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
143abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
144abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
145abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
146abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
147abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_GET_CAPABILITIES: {
148abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                NanCapabilities hidl_struct;
149abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!hidl_struct_util::
150abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        convertLegacyNanCapabilitiesResponseToHidl(
151abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                            msg.body.nan_capabilities, &hidl_struct)) {
152abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to convert nan capabilities response";
153abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    return;
154abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
155abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
156abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
157abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
158abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyCapabilitiesResponse(id, wifiNanStatus,
159abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                          hidl_struct)
160abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
161abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
162abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
163abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
164abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
165abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
166abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_DP_INTERFACE_CREATE: {
167abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
168abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
169abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
170abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyCreateDataInterfaceResponse(id,
171abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                                 wifiNanStatus)
172abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
173abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
174abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
175abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
176abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
177abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
178abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_DP_INTERFACE_DELETE: {
179abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
180abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
181abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
182abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyDeleteDataInterfaceResponse(id,
183abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                                 wifiNanStatus)
184abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
185abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
186abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
187abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
188abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
189abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
190abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_DP_INITIATOR_RESPONSE: {
191abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
192abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
193abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
194abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyInitiateDataPathResponse(
195abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                 id, wifiNanStatus,
196abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                 msg.body.data_request_response.ndp_instance_id)
197abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
198abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
199abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
200abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
201abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
202abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
203abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_DP_RESPONDER_RESPONSE: {
204abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
205abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
206abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
207abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyRespondToDataPathIndicationResponse(
208abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                 id, wifiNanStatus)
209abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
210abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
211abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
212abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
213abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
214abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
215abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_DP_END: {
216abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (const auto& callback :
217abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                     shared_ptr_this->getEventCallbacks()) {
218abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
219abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->notifyTerminateDataPathResponse(id,
220abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                               wifiNanStatus)
221abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
222abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
223abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
224abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
225abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                break;
226abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
227abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_BEACON_SDF_PAYLOAD:
228abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            /* fall through */
229abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_TCA:
230abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            /* fall through */
231abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_STATS:
232abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            /* fall through */
233abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            case legacy_hal::NAN_RESPONSE_ERROR:
234abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            /* fall through */
235abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            default:
236abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Unknown or unhandled response type: "
237abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           << msg.response_type;
238abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
239f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen        }
240abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    };
241abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
242abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_disc_eng_event =
243abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanDiscEngEventInd& msg) {
244abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
245abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
246abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
247abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
248abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
249abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            NanClusterEventInd hidl_struct;
250abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            // event types defined identically - hence can be cast
251abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            hidl_struct.eventType = (NanClusterEventType)msg.event_type;
252abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            hidl_struct.addr = msg.data.mac_addr.addr;
253abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
254abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
255abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback->eventClusterEvent(hidl_struct).isOk()) {
256abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
257abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
258abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
259abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
260abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
261abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_disabled =
262abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanDisabledInd& msg) {
263abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
264abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
265abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
266abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
267abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
268abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            WifiNanStatus status;
269abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            hidl_struct_util::convertToWifiNanStatus(
270abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status);
271abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
272abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
273abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback->eventDisabled(status).isOk()) {
274abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
275abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
276abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
277abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
278abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
279abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_publish_terminated =
280abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanPublishTerminatedInd& msg) {
281abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
282abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
283abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
284abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
285abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
286abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            WifiNanStatus status;
287abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            hidl_struct_util::convertToWifiNanStatus(
288abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status);
289abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
290abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
291abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback->eventPublishTerminated(msg.publish_id, status)
292abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                         .isOk()) {
293abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
294abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
295abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
296abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
297abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
298abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_subscribe_terminated =
299abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanSubscribeTerminatedInd& msg) {
300abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
301abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
302abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
303abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
304abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
305abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            WifiNanStatus status;
306abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            hidl_struct_util::convertToWifiNanStatus(
307abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status);
308abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
309abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
310abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback
311abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                         ->eventSubscribeTerminated(msg.subscribe_id, status)
312abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                         .isOk()) {
313abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
314abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
315abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
316abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
317abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
318abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_match =
319abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanMatchInd& msg) {
320abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
321abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
322abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
323abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
324abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
325abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            NanMatchInd hidl_struct;
326abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!hidl_struct_util::convertLegacyNanMatchIndToHidl(
327abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    msg, &hidl_struct)) {
328abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Failed to convert nan capabilities response";
329abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
330abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
331f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen
332abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
333abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback->eventMatch(hidl_struct).isOk()) {
334abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
335abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
336abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
337abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
338abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
339abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_match_expired =
340abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanMatchExpiredInd& msg) {
341abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
342abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
343abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
344abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
345abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
346abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
347abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback
348abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                         ->eventMatchExpired(msg.publish_subscribe_id,
349abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                             msg.requestor_instance_id)
350abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                         .isOk()) {
351abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
352abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
353abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
354abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
355abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
356abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_followup =
357abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanFollowupInd& msg) {
358abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
359abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
360abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
361abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
362abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
363abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            NanFollowupReceivedInd hidl_struct;
364abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!hidl_struct_util::convertLegacyNanFollowupIndToHidl(
365abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    msg, &hidl_struct)) {
366abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Failed to convert nan capabilities response";
367abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
368abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
369f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen
370abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
371abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback->eventFollowupReceived(hidl_struct).isOk()) {
372abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
373abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
374abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
375abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
376abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
377abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_transmit_follow_up =
378abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanTransmitFollowupInd& msg) {
379abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
380abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
381abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
382abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
383abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
384abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            WifiNanStatus status;
385abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            hidl_struct_util::convertToWifiNanStatus(
386abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status);
387abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
388abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
389abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback->eventTransmitFollowup(msg.id, status).isOk()) {
390abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
391abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
392abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
393abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
394abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
395abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_data_path_request =
396abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanDataPathRequestInd& msg) {
397abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
398abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
399abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
400abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
401abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
402abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            NanDataPathRequestInd hidl_struct;
403abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!hidl_struct_util::convertLegacyNanDataPathRequestIndToHidl(
404abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    msg, &hidl_struct)) {
405abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Failed to convert nan capabilities response";
406abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
407abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
408c190f93111e7bd92809a4b298a6ad4754f08675eEtan Cohen
409abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
410abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                if (!callback->eventDataPathRequest(hidl_struct).isOk()) {
411abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
412abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
413abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
414abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
415abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
416abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_data_path_confirm =
417abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanDataPathConfirmInd& msg) {
418abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
419abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
420abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
421abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
422abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
423abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            NanDataPathConfirmInd hidl_struct;
424abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!hidl_struct_util::convertLegacyNanDataPathConfirmIndToHidl(
425abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    msg, &hidl_struct)) {
426abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Failed to convert nan capabilities response";
427abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
428abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
429c190f93111e7bd92809a4b298a6ad4754f08675eEtan Cohen
43044a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen            for (const auto& callback :
43144a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen                 shared_ptr_this->getEventCallbacks_1_2()) {
432c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen                if (!callback->eventDataPathConfirm_1_2(hidl_struct).isOk()) {
433abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    LOG(ERROR) << "Failed to invoke the callback";
434abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
435abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
436abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
437abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
438abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_data_path_end =
439abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanDataPathEndInd& msg) {
440abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            const auto shared_ptr_this = weak_ptr_this.promote();
441abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
442abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                LOG(ERROR) << "Callback invoked on an invalid object";
443abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                return;
444abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
445abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
446abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                for (int i = 0; i < msg.num_ndp_instances; ++i) {
447abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    if (!callback
448abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             ->eventDataPathTerminated(msg.ndp_instance_id[i])
449abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                             .isOk()) {
450abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                        LOG(ERROR) << "Failed to invoke the callback";
451abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                    }
452abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                }
453abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            }
454abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
455abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
456abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_beacon_sdf_payload =
457abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanBeaconSdfPayloadInd& /* msg */) {
458abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            LOG(ERROR) << "on_event_beacon_sdf_payload - should not be called";
459abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
460abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
461abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_range_request =
462abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanRangeRequestInd& /* msg */) {
463abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            LOG(ERROR) << "on_event_range_request - should not be called";
464abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
465abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
466abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    callback_handlers.on_event_range_report =
467abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        [weak_ptr_this](const legacy_hal::NanRangeReportInd& /* msg */) {
468abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            LOG(ERROR) << "on_event_range_report - should not be called";
469abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        };
470abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
471c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen    callback_handlers
472c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        .on_event_schedule_update = [weak_ptr_this](
473c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen                                        const legacy_hal::
474c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen                                            NanDataPathScheduleUpdateInd& msg) {
475c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        const auto shared_ptr_this = weak_ptr_this.promote();
476c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
477c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen            LOG(ERROR) << "Callback invoked on an invalid object";
478c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen            return;
479c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        }
480c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        NanDataPathScheduleUpdateInd hidl_struct;
481c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        if (!hidl_struct_util::convertLegacyNanDataPathScheduleUpdateIndToHidl(
482c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen                msg, &hidl_struct)) {
483c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen            LOG(ERROR) << "Failed to convert nan capabilities response";
484c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen            return;
485c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        }
486c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen
48744a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen        for (const auto& callback : shared_ptr_this->getEventCallbacks_1_2()) {
488c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen            if (!callback->eventDataPathScheduleUpdate(hidl_struct).isOk()) {
489c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen                LOG(ERROR) << "Failed to invoke the callback";
490c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen            }
491c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        }
492c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen    };
4931bf15f1c579c67e5c86f3ad61b1089caa51a5876Etan Cohen
494abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
495abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanRegisterCallbackHandlers(ifname_,
496abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                        callback_handlers);
497abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    if (legacy_status != legacy_hal::WIFI_SUCCESS) {
498abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        LOG(ERROR) << "Failed to register nan callbacks. Invalidating object";
499abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        invalidate();
500abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    }
501f5f51fd039786bd45035b7f10520a6c6a15a73aaRoshan Pius}
5023e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius
5033e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Piusvoid WifiNanIface::invalidate() {
504abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    // send commands to HAL to actually disable and destroy interfaces
505abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal_.lock()->nanDisableRequest(ifname_, 0xFFFF);
506abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, 0xFFFE, "aware_data0");
507abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, 0xFFFD, "aware_data1");
508c4d9f87f66130c1e0b598fd0903ea2f99e8dfb5eEtan Cohen
509abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal_.reset();
510abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    event_cb_handler_.invalidate();
51144a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    event_cb_handler_1_2_.invalidate();
512abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    is_valid_ = false;
5133e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius}
5143e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius
515abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Piusbool WifiNanIface::isValid() { return is_valid_; }
516907d4a234da9806cde5169c17236a0501805b70aRoshan Pius
517675609baa6d2d8ec0a08a8b24d3173f4768459e2Roshan Piusstd::string WifiNanIface::getName() { return ifname_; }
518675609baa6d2d8ec0a08a8b24d3173f4768459e2Roshan Pius
51944a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohenstd::set<sp<V1_0::IWifiNanIfaceEventCallback>>
52044a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan CohenWifiNanIface::getEventCallbacks() {
521abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return event_cb_handler_.getCallbacks();
522d37341f1e57b91a5f8bf6fe85b99861717720e5fRoshan Pius}
523d37341f1e57b91a5f8bf6fe85b99861717720e5fRoshan Pius
52444a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohenstd::set<sp<V1_2::IWifiNanIfaceEventCallback>>
52544a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan CohenWifiNanIface::getEventCallbacks_1_2() {
52644a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    return event_cb_handler_1_2_.getCallbacks();
52744a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen}
52844a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen
529734fea0d98213d2f721f8f8988114d0cf397d436Roshan PiusReturn<void> WifiNanIface::getName(getName_cb hidl_status_cb) {
530abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
531abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::getNameInternal, hidl_status_cb);
5323e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius}
5333e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius
534f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::getType(getType_cb hidl_status_cb) {
535abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
536abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::getTypeInternal, hidl_status_cb);
537f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen}
538f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen
5390c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan PiusReturn<void> WifiNanIface::registerEventCallback(
540c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen    const sp<V1_0::IWifiNanIfaceEventCallback>& callback,
5410c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius    registerEventCallback_cb hidl_status_cb) {
542abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
543abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::registerEventCallbackInternal,
544abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, callback);
5450c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
5460c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
547abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan PiusReturn<void> WifiNanIface::getCapabilitiesRequest(
548abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, getCapabilitiesRequest_cb hidl_status_cb) {
549abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
550abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::getCapabilitiesRequestInternal,
551abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id);
5520c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
5530c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
554f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::enableRequest(uint16_t cmd_id,
555f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen                                         const NanEnableRequest& msg,
556f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen                                         enableRequest_cb hidl_status_cb) {
557abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
558abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::enableRequestInternal, hidl_status_cb,
559abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           cmd_id, msg);
5600c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
5610c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
562f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::configRequest(uint16_t cmd_id,
563f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen                                         const NanConfigRequest& msg,
564f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen                                         configRequest_cb hidl_status_cb) {
565abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
566abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::configRequestInternal, hidl_status_cb,
567abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           cmd_id, msg);
5680c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
5690c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
570f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::disableRequest(uint16_t cmd_id,
571f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen                                          disableRequest_cb hidl_status_cb) {
572abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
573abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::disableRequestInternal,
574abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id);
5750c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
5760c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
577abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan PiusReturn<void> WifiNanIface::startPublishRequest(
578abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, const NanPublishRequest& msg,
579abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    startPublishRequest_cb hidl_status_cb) {
580abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
581abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::startPublishRequestInternal,
582abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, msg);
5830c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
5840c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
585f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::stopPublishRequest(
586abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, uint8_t sessionId, stopPublishRequest_cb hidl_status_cb) {
587abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
588abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::stopPublishRequestInternal,
589abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, sessionId);
5900c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
5910c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
592f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::startSubscribeRequest(
593abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, const NanSubscribeRequest& msg,
594f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    startSubscribeRequest_cb hidl_status_cb) {
595abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
596abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::startSubscribeRequestInternal,
597abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, msg);
5980c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
5990c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
600f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::stopSubscribeRequest(
601abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, uint8_t sessionId,
602f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    stopSubscribeRequest_cb hidl_status_cb) {
603abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
604abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::stopSubscribeRequestInternal,
605abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, sessionId);
6060c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
6070c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
608f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::transmitFollowupRequest(
609abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, const NanTransmitFollowupRequest& msg,
610f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    transmitFollowupRequest_cb hidl_status_cb) {
611abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
612abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::transmitFollowupRequestInternal,
613abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, msg);
6140c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
6150c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
616f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::createDataInterfaceRequest(
617abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, const hidl_string& iface_name,
618f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    createDataInterfaceRequest_cb hidl_status_cb) {
619abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
620abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::createDataInterfaceRequestInternal,
621abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, iface_name);
6220c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
6230c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
624f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::deleteDataInterfaceRequest(
625abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, const hidl_string& iface_name,
626f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    deleteDataInterfaceRequest_cb hidl_status_cb) {
627abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
628abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::deleteDataInterfaceRequestInternal,
629abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, iface_name);
6300c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
6310c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
632f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::initiateDataPathRequest(
633abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, const NanInitiateDataPathRequest& msg,
634f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    initiateDataPathRequest_cb hidl_status_cb) {
635abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
636abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::initiateDataPathRequestInternal,
637abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, msg);
6380c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
6390c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
640f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenReturn<void> WifiNanIface::respondToDataPathIndicationRequest(
641abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg,
642f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    respondToDataPathIndicationRequest_cb hidl_status_cb) {
643abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(
644abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
645abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        &WifiNanIface::respondToDataPathIndicationRequestInternal,
646abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        hidl_status_cb, cmd_id, msg);
6470c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
6480c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
649abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan PiusReturn<void> WifiNanIface::terminateDataPathRequest(
650abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    uint16_t cmd_id, uint32_t ndpInstanceId,
651f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    terminateDataPathRequest_cb hidl_status_cb) {
652abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
653abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           &WifiNanIface::terminateDataPathRequestInternal,
654abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                           hidl_status_cb, cmd_id, ndpInstanceId);
6550c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
6560c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
657c7bd0f718c63f5aef9b265a1e02950097d98d342Etan CohenReturn<void> WifiNanIface::registerEventCallback_1_2(
658c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen    const sp<IWifiNanIfaceEventCallback>& callback,
659c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen    registerEventCallback_1_2_cb hidl_status_cb) {
660c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
661c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen                           &WifiNanIface::registerEventCallback_1_2Internal,
662c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen                           hidl_status_cb, callback);
663c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen}
664c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen
6659e7a40573346196af56f70edde6aa54355f7f760Etan CohenReturn<void> WifiNanIface::enableRequest_1_2(
6669e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    uint16_t cmd_id, const NanEnableRequest& msg1,
6679e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    const NanConfigRequestSupplemental& msg2,
6689e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    enableRequest_1_2_cb hidl_status_cb) {
6699e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
6709e7a40573346196af56f70edde6aa54355f7f760Etan Cohen                           &WifiNanIface::enableRequest_1_2Internal,
6719e7a40573346196af56f70edde6aa54355f7f760Etan Cohen                           hidl_status_cb, cmd_id, msg1, msg2);
6729e7a40573346196af56f70edde6aa54355f7f760Etan Cohen}
6739e7a40573346196af56f70edde6aa54355f7f760Etan Cohen
6749e7a40573346196af56f70edde6aa54355f7f760Etan CohenReturn<void> WifiNanIface::configRequest_1_2(
6759e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    uint16_t cmd_id, const NanConfigRequest& msg1,
6769e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    const NanConfigRequestSupplemental& msg2,
6779e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    configRequest_1_2_cb hidl_status_cb) {
6789e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
6799e7a40573346196af56f70edde6aa54355f7f760Etan Cohen                           &WifiNanIface::configRequest_1_2Internal,
6809e7a40573346196af56f70edde6aa54355f7f760Etan Cohen                           hidl_status_cb, cmd_id, msg1, msg2);
6819e7a40573346196af56f70edde6aa54355f7f760Etan Cohen}
6829e7a40573346196af56f70edde6aa54355f7f760Etan Cohen
683907d4a234da9806cde5169c17236a0501805b70aRoshan Piusstd::pair<WifiStatus, std::string> WifiNanIface::getNameInternal() {
684abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
685907d4a234da9806cde5169c17236a0501805b70aRoshan Pius}
686907d4a234da9806cde5169c17236a0501805b70aRoshan Pius
687907d4a234da9806cde5169c17236a0501805b70aRoshan Piusstd::pair<WifiStatus, IfaceType> WifiNanIface::getTypeInternal() {
688abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::NAN};
6893e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius}
6903e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius
6910c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan PiusWifiStatus WifiNanIface::registerEventCallbackInternal(
69244a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    const sp<V1_0::IWifiNanIfaceEventCallback>& callback) {
69344a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    if (!event_cb_handler_.addCallback(callback)) {
69444a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen        return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
69544a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    }
69644a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    return createWifiStatus(WifiStatusCode::SUCCESS);
6970c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
6980c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
699f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenWifiStatus WifiNanIface::getCapabilitiesRequestInternal(uint16_t cmd_id) {
700abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
701acededbcd1c6d08f1bb087da7a074474e9a52dd9Roshan Pius        legacy_hal_.lock()->nanGetCapabilities(ifname_, cmd_id);
702abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
703f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen}
704f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen
7059e7a40573346196af56f70edde6aa54355f7f760Etan CohenWifiStatus WifiNanIface::enableRequestInternal(
7069e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    uint16_t /* cmd_id */, const NanEnableRequest& /* msg */) {
7079e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
708abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius}
709abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius
7109e7a40573346196af56f70edde6aa54355f7f760Etan CohenWifiStatus WifiNanIface::configRequestInternal(
7119e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    uint16_t /* cmd_id */, const NanConfigRequest& /* msg */) {
7129e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
713f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen}
714f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen
715f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenWifiStatus WifiNanIface::disableRequestInternal(uint16_t cmd_id) {
716abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
717abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanDisableRequest(ifname_, cmd_id);
718abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
7190c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
7200c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
721acededbcd1c6d08f1bb087da7a074474e9a52dd9Roshan PiusWifiStatus WifiNanIface::startPublishRequestInternal(
722acededbcd1c6d08f1bb087da7a074474e9a52dd9Roshan Pius    uint16_t cmd_id, const NanPublishRequest& msg) {
723abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::NanPublishRequest legacy_msg;
724abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    if (!hidl_struct_util::convertHidlNanPublishRequestToLegacy(msg,
725abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                                &legacy_msg)) {
726abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
727abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    }
728abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
729abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanPublishRequest(ifname_, cmd_id, legacy_msg);
730abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
7310c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
7320c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius
733abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan PiusWifiStatus WifiNanIface::stopPublishRequestInternal(uint16_t cmd_id,
734abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                    uint8_t sessionId) {
735abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::NanPublishCancelRequest legacy_msg;
736abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_msg.publish_id = sessionId;
737abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
738abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanPublishCancelRequest(ifname_, cmd_id,
739abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                    legacy_msg);
740abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
7410c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
742f5f51fd039786bd45035b7f10520a6c6a15a73aaRoshan Pius
743f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenWifiStatus WifiNanIface::startSubscribeRequestInternal(
744f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    uint16_t cmd_id, const NanSubscribeRequest& msg) {
745abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::NanSubscribeRequest legacy_msg;
746abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    if (!hidl_struct_util::convertHidlNanSubscribeRequestToLegacy(
747abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            msg, &legacy_msg)) {
748abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
749abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    }
750abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
751abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanSubscribeRequest(ifname_, cmd_id, legacy_msg);
752abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
7530c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
754f5f51fd039786bd45035b7f10520a6c6a15a73aaRoshan Pius
755abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan PiusWifiStatus WifiNanIface::stopSubscribeRequestInternal(uint16_t cmd_id,
756abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                      uint8_t sessionId) {
757abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::NanSubscribeCancelRequest legacy_msg;
758abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_msg.subscribe_id = sessionId;
759abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
760abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanSubscribeCancelRequest(ifname_, cmd_id,
761abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                      legacy_msg);
762abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
7630c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
764f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen
7650c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan PiusWifiStatus WifiNanIface::transmitFollowupRequestInternal(
766f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    uint16_t cmd_id, const NanTransmitFollowupRequest& msg) {
767abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::NanTransmitFollowupRequest legacy_msg;
768abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    if (!hidl_struct_util::convertHidlNanTransmitFollowupRequestToLegacy(
769abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            msg, &legacy_msg)) {
770abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
771abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    }
772abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
773abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanTransmitFollowupRequest(ifname_, cmd_id,
774abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                       legacy_msg);
775abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
7760c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
777f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen
778f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenWifiStatus WifiNanIface::createDataInterfaceRequestInternal(
779f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    uint16_t cmd_id, const std::string& iface_name) {
780abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
781abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanDataInterfaceCreate(ifname_, cmd_id, iface_name);
782abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
7830c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
784f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenWifiStatus WifiNanIface::deleteDataInterfaceRequestInternal(
785f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    uint16_t cmd_id, const std::string& iface_name) {
786abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
787abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, cmd_id, iface_name);
788abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
7890c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
790f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenWifiStatus WifiNanIface::initiateDataPathRequestInternal(
791f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    uint16_t cmd_id, const NanInitiateDataPathRequest& msg) {
792abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::NanDataPathInitiatorRequest legacy_msg;
793abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    if (!hidl_struct_util::convertHidlNanDataPathInitiatorRequestToLegacy(
794abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            msg, &legacy_msg)) {
795abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
796abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    }
797abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
798abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanDataRequestInitiator(ifname_, cmd_id,
799abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                    legacy_msg);
800abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
8010c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
802f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenWifiStatus WifiNanIface::respondToDataPathIndicationRequestInternal(
803f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    uint16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg) {
804abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::NanDataPathIndicationResponse legacy_msg;
805abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    if (!hidl_struct_util::convertHidlNanDataPathIndicationResponseToLegacy(
806abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius            msg, &legacy_msg)) {
807abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
808abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    }
809abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
810abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanDataIndicationResponse(ifname_, cmd_id,
811abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius                                                      legacy_msg);
812abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
8130c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
814f01bcaa9a3708e579f3facdfe0988217d689c68eEtan CohenWifiStatus WifiNanIface::terminateDataPathRequestInternal(
815f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen    uint16_t cmd_id, uint32_t ndpInstanceId) {
816abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    legacy_hal::wifi_error legacy_status =
817abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius        legacy_hal_.lock()->nanDataEnd(ifname_, cmd_id, ndpInstanceId);
818abcf78fe9056edb405db4f8f00bf7e6cd6700621Roshan Pius    return createWifiStatusFromLegacyError(legacy_status);
8190c92d446a26d3aeff57b3e62d6454addb9ac76feRoshan Pius}
820f01bcaa9a3708e579f3facdfe0988217d689c68eEtan Cohen
821c7bd0f718c63f5aef9b265a1e02950097d98d342Etan CohenWifiStatus WifiNanIface::registerEventCallback_1_2Internal(
82244a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    const sp<V1_2::IWifiNanIfaceEventCallback>& callback) {
82344a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    sp<V1_0::IWifiNanIfaceEventCallback> callback_1_0 = callback;
82444a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    if (!event_cb_handler_.addCallback(callback_1_0)) {
82544a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen        return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
82644a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    }
82744a8bf9806d125c5a66e9dde1f8f1087ff476d98Etan Cohen    if (!event_cb_handler_1_2_.addCallback(callback)) {
828c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen        return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
829c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen    }
830c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen    return createWifiStatus(WifiStatusCode::SUCCESS);
831c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen}
832c7bd0f718c63f5aef9b265a1e02950097d98d342Etan Cohen
8339e7a40573346196af56f70edde6aa54355f7f760Etan CohenWifiStatus WifiNanIface::enableRequest_1_2Internal(
8349e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    uint16_t cmd_id, const NanEnableRequest& msg1,
8359e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    const NanConfigRequestSupplemental& msg2) {
8369e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    legacy_hal::NanEnableRequest legacy_msg;
8379e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    if (!hidl_struct_util::convertHidlNanEnableRequest_1_2ToLegacy(
8389e7a40573346196af56f70edde6aa54355f7f760Etan Cohen            msg1, msg2, &legacy_msg)) {
8399e7a40573346196af56f70edde6aa54355f7f760Etan Cohen        return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
8409e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    }
8419e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    legacy_hal::wifi_error legacy_status =
8429e7a40573346196af56f70edde6aa54355f7f760Etan Cohen        legacy_hal_.lock()->nanEnableRequest(ifname_, cmd_id, legacy_msg);
8439e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    return createWifiStatusFromLegacyError(legacy_status);
8449e7a40573346196af56f70edde6aa54355f7f760Etan Cohen}
8459e7a40573346196af56f70edde6aa54355f7f760Etan Cohen
8469e7a40573346196af56f70edde6aa54355f7f760Etan CohenWifiStatus WifiNanIface::configRequest_1_2Internal(
8479e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    uint16_t cmd_id, const NanConfigRequest& msg1,
8489e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    const NanConfigRequestSupplemental& msg2) {
8499e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    legacy_hal::NanConfigRequest legacy_msg;
8509e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    if (!hidl_struct_util::convertHidlNanConfigRequest_1_2ToLegacy(
8519e7a40573346196af56f70edde6aa54355f7f760Etan Cohen            msg1, msg2, &legacy_msg)) {
8529e7a40573346196af56f70edde6aa54355f7f760Etan Cohen        return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
8539e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    }
8549e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    legacy_hal::wifi_error legacy_status =
8559e7a40573346196af56f70edde6aa54355f7f760Etan Cohen        legacy_hal_.lock()->nanConfigRequest(ifname_, cmd_id, legacy_msg);
8569e7a40573346196af56f70edde6aa54355f7f760Etan Cohen    return createWifiStatusFromLegacyError(legacy_status);
8579e7a40573346196af56f70edde6aa54355f7f760Etan Cohen}
8589e7a40573346196af56f70edde6aa54355f7f760Etan Cohen
8593e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius}  // namespace implementation
8606ce509085453637ddd3d0a1a88a26fed18072167Etan Cohen}  // namespace V1_2
8613e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius}  // namespace wifi
8623e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius}  // namespace hardware
8633e2d671a4cd81dc7f13fa3465494b547ed5a5626Roshan Pius}  // namespace android
864