blob: 68be2a7aa9645009ce06c8ff930a5fd50cc46dd2 [file] [log] [blame]
Roshan Pius3e2d6712016-10-06 13:16:23 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Roshan Pius3e2d6712016-10-06 13:16:23 -070017#include <android-base/logging.h>
18
Roshan Pius907d4a22016-10-27 12:48:12 -070019#include "hidl_return_util.h"
Roshan Piusf5f51fd2016-12-01 13:54:24 -080020#include "hidl_struct_util.h"
Roshan Pius907d4a22016-10-27 12:48:12 -070021#include "wifi_nan_iface.h"
Roshan Pius734fea02016-10-11 08:30:28 -070022#include "wifi_status_util.h"
Roshan Pius3e2d6712016-10-06 13:16:23 -070023
24namespace android {
25namespace hardware {
26namespace wifi {
27namespace V1_0 {
28namespace implementation {
Roshan Pius907d4a22016-10-27 12:48:12 -070029using hidl_return_util::validateAndCall;
Roshan Pius3e2d6712016-10-06 13:16:23 -070030
Roshan Pius6cedc972016-10-28 10:11:17 -070031WifiNanIface::WifiNanIface(
32 const std::string& ifname,
33 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal)
Roshan Piusf5f51fd2016-12-01 13:54:24 -080034 : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) {
35 // Register all the callbacks here. these should be valid for the lifetime
36 // of the object. Whenever the mode changes legacy HAL will remove
37 // all of these callbacks.
38 legacy_hal::NanCallbackHandlers callback_handlers;
Etan Cohenf01bcaa2016-12-25 09:42:21 -080039 android::wp<WifiNanIface> weak_ptr_this(this);
Roshan Piusf5f51fd2016-12-01 13:54:24 -080040
41 // Callback for response.
Etan Cohenf01bcaa2016-12-25 09:42:21 -080042 callback_handlers.on_notify_response = [weak_ptr_this](
Roshan Piusf5f51fd2016-12-01 13:54:24 -080043 legacy_hal::transaction_id id, const legacy_hal::NanResponseMsg& msg) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -080044 const auto shared_ptr_this = weak_ptr_this.promote();
45 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
46 LOG(ERROR) << "Callback invoked on an invalid object";
47 return;
48 }
49 WifiNanStatus wifiNanStatus;
Roshan Piusf5f51fd2016-12-01 13:54:24 -080050 if (!hidl_struct_util::convertLegacyNanResponseHeaderToHidl(msg,
Etan Cohenf01bcaa2016-12-25 09:42:21 -080051 &wifiNanStatus)) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -080052 LOG(ERROR) << "Failed to convert nan response header";
53 return;
54 }
Etan Cohenf01bcaa2016-12-25 09:42:21 -080055
56 switch (msg.response_type) {
57 case legacy_hal::NAN_RESPONSE_ENABLED: {
Roshan Piusd37341f2017-01-31 13:13:28 -080058 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -080059 if (!callback->notifyEnableResponse(id, wifiNanStatus).isOk()) {
60 LOG(ERROR) << "Failed to invoke the callback";
61 }
62 }
Etan Cohen4bbc2092017-01-30 13:28:37 -080063 break;
Roshan Piusf5f51fd2016-12-01 13:54:24 -080064 }
Etan Cohenf01bcaa2016-12-25 09:42:21 -080065 case legacy_hal::NAN_RESPONSE_DISABLED: {
Roshan Piusd37341f2017-01-31 13:13:28 -080066 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -080067 if (!callback->notifyDisableResponse(id, wifiNanStatus).isOk()) {
68 LOG(ERROR) << "Failed to invoke the callback";
69 }
70 }
Etan Cohen4bbc2092017-01-30 13:28:37 -080071 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -080072 }
73 case legacy_hal::NAN_RESPONSE_PUBLISH: {
Roshan Piusd37341f2017-01-31 13:13:28 -080074 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -080075 if (!callback->notifyStartPublishResponse(id, wifiNanStatus,
76 msg.body.publish_response.publish_id).isOk()) {
77 LOG(ERROR) << "Failed to invoke the callback";
78 }
79 }
Etan Cohen4bbc2092017-01-30 13:28:37 -080080 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -080081 }
82 case legacy_hal::NAN_RESPONSE_PUBLISH_CANCEL: {
Roshan Piusd37341f2017-01-31 13:13:28 -080083 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -080084 if (!callback->notifyStopPublishResponse(id, wifiNanStatus).isOk()) {
85 LOG(ERROR) << "Failed to invoke the callback";
86 }
87 }
Etan Cohen4bbc2092017-01-30 13:28:37 -080088 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -080089 }
90 case legacy_hal::NAN_RESPONSE_TRANSMIT_FOLLOWUP: {
Roshan Piusd37341f2017-01-31 13:13:28 -080091 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -080092 if (!callback->notifyTransmitFollowupResponse(id, wifiNanStatus).isOk()) {
93 LOG(ERROR) << "Failed to invoke the callback";
94 }
95 }
Etan Cohen4bbc2092017-01-30 13:28:37 -080096 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -080097 }
98 case legacy_hal::NAN_RESPONSE_SUBSCRIBE: {
Roshan Piusd37341f2017-01-31 13:13:28 -080099 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800100 if (!callback->notifyStartSubscribeResponse(id, wifiNanStatus,
101 msg.body.subscribe_response.subscribe_id).isOk()) {
102 LOG(ERROR) << "Failed to invoke the callback";
103 }
104 }
Etan Cohen4bbc2092017-01-30 13:28:37 -0800105 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800106 }
107 case legacy_hal::NAN_RESPONSE_SUBSCRIBE_CANCEL: {
Roshan Piusd37341f2017-01-31 13:13:28 -0800108 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800109 if (!callback->notifyStopSubscribeResponse(id, wifiNanStatus).isOk()) {
110 LOG(ERROR) << "Failed to invoke the callback";
111 }
112 }
Etan Cohen4bbc2092017-01-30 13:28:37 -0800113 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800114 }
115 case legacy_hal::NAN_RESPONSE_CONFIG: {
Roshan Piusd37341f2017-01-31 13:13:28 -0800116 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800117 if (!callback->notifyConfigResponse(id, wifiNanStatus).isOk()) {
118 LOG(ERROR) << "Failed to invoke the callback";
119 }
120 }
Etan Cohen4bbc2092017-01-30 13:28:37 -0800121 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800122 }
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800123 case legacy_hal::NAN_GET_CAPABILITIES: {
124 NanCapabilities hidl_struct;
125 if (!hidl_struct_util::convertLegacyNanCapabilitiesResponseToHidl(
126 msg.body.nan_capabilities, &hidl_struct)) {
127 LOG(ERROR) << "Failed to convert nan capabilities response";
128 return;
129 }
Roshan Piusd37341f2017-01-31 13:13:28 -0800130 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800131 if (!callback->notifyCapabilitiesResponse(id, wifiNanStatus,
132 hidl_struct).isOk()) {
133 LOG(ERROR) << "Failed to invoke the callback";
134 }
135 }
Etan Cohen4bbc2092017-01-30 13:28:37 -0800136 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800137 }
138 case legacy_hal::NAN_DP_INTERFACE_CREATE: {
Roshan Piusd37341f2017-01-31 13:13:28 -0800139 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800140 if (!callback->notifyCreateDataInterfaceResponse(id, wifiNanStatus).isOk()) {
141 LOG(ERROR) << "Failed to invoke the callback";
142 }
143 }
Etan Cohen4bbc2092017-01-30 13:28:37 -0800144 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800145 }
146 case legacy_hal::NAN_DP_INTERFACE_DELETE: {
Roshan Piusd37341f2017-01-31 13:13:28 -0800147 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800148 if (!callback->notifyDeleteDataInterfaceResponse(id, wifiNanStatus).isOk()) {
149 LOG(ERROR) << "Failed to invoke the callback";
150 }
151 }
Etan Cohen4bbc2092017-01-30 13:28:37 -0800152 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800153 }
154 case legacy_hal::NAN_DP_INITIATOR_RESPONSE: {
Roshan Piusd37341f2017-01-31 13:13:28 -0800155 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohen4bbc2092017-01-30 13:28:37 -0800156 if (!callback->notifyInitiateDataPathResponse(id, wifiNanStatus,
157 msg.body.data_request_response.ndp_instance_id).isOk()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800158 LOG(ERROR) << "Failed to invoke the callback";
159 }
160 }
Etan Cohen4bbc2092017-01-30 13:28:37 -0800161 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800162 }
163 case legacy_hal::NAN_DP_RESPONDER_RESPONSE: {
Roshan Piusd37341f2017-01-31 13:13:28 -0800164 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohen4bbc2092017-01-30 13:28:37 -0800165 if (!callback->notifyRespondToDataPathIndicationResponse(id, wifiNanStatus).isOk()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800166 LOG(ERROR) << "Failed to invoke the callback";
167 }
168 }
169 }
170 case legacy_hal::NAN_DP_END: {
Roshan Piusd37341f2017-01-31 13:13:28 -0800171 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800172 if (!callback->notifyTerminateDataPathResponse(id, wifiNanStatus).isOk()) {
173 LOG(ERROR) << "Failed to invoke the callback";
174 }
175 }
Etan Cohen4bbc2092017-01-30 13:28:37 -0800176 break;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800177 }
Etan Cohenccb15622017-02-09 09:35:35 -0800178 case legacy_hal::NAN_RESPONSE_BEACON_SDF_PAYLOAD:
179 /* fall through */
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800180 case legacy_hal::NAN_RESPONSE_TCA:
181 /* fall through */
182 case legacy_hal::NAN_RESPONSE_STATS:
183 /* fall through */
184 case legacy_hal::NAN_RESPONSE_ERROR:
185 /* fall through */
186 default:
187 LOG(ERROR) << "Unknown or unhandled response type: " << msg.response_type;
188 return;
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800189 }
190 };
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800191
192 callback_handlers.on_event_disc_eng_event = [weak_ptr_this](
193 const legacy_hal::NanDiscEngEventInd& msg) {
194 const auto shared_ptr_this = weak_ptr_this.promote();
195 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
196 LOG(ERROR) << "Callback invoked on an invalid object";
197 return;
198 }
199 NanClusterEventInd hidl_struct;
200 // event types defined identically - hence can be cast
201 hidl_struct.eventType = (NanClusterEventType) msg.event_type;
202 hidl_struct.addr = msg.data.mac_addr.addr;
203
Roshan Piusd37341f2017-01-31 13:13:28 -0800204 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800205 if (!callback->eventClusterEvent(hidl_struct).isOk()) {
206 LOG(ERROR) << "Failed to invoke the callback";
207 }
208 }
209 };
210
211 callback_handlers.on_event_disabled = [weak_ptr_this](
212 const legacy_hal::NanDisabledInd& msg) {
213 const auto shared_ptr_this = weak_ptr_this.promote();
214 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
215 LOG(ERROR) << "Callback invoked on an invalid object";
216 return;
217 }
218 WifiNanStatus status;
219 status.status = hidl_struct_util::convertLegacyNanStatusTypeToHidl(msg.reason);
220 status.description = msg.nan_reason;
221
Roshan Piusd37341f2017-01-31 13:13:28 -0800222 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800223 if (!callback->eventDisabled(status).isOk()) {
224 LOG(ERROR) << "Failed to invoke the callback";
225 }
226 }
227 };
228
229 callback_handlers.on_event_publish_terminated = [weak_ptr_this](
230 const legacy_hal::NanPublishTerminatedInd& msg) {
231 const auto shared_ptr_this = weak_ptr_this.promote();
232 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
233 LOG(ERROR) << "Callback invoked on an invalid object";
234 return;
235 }
236 WifiNanStatus status;
237 status.status = hidl_struct_util::convertLegacyNanStatusTypeToHidl(msg.reason);
238 status.description = msg.nan_reason;
239
Roshan Piusd37341f2017-01-31 13:13:28 -0800240 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800241 if (!callback->eventPublishTerminated(msg.publish_id, status).isOk()) {
242 LOG(ERROR) << "Failed to invoke the callback";
243 }
244 }
245 };
246
247 callback_handlers.on_event_subscribe_terminated = [weak_ptr_this](
248 const legacy_hal::NanSubscribeTerminatedInd& msg) {
249 const auto shared_ptr_this = weak_ptr_this.promote();
250 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
251 LOG(ERROR) << "Callback invoked on an invalid object";
252 return;
253 }
254 WifiNanStatus status;
255 status.status = hidl_struct_util::convertLegacyNanStatusTypeToHidl(msg.reason);
256 status.description = msg.nan_reason;
257
Roshan Piusd37341f2017-01-31 13:13:28 -0800258 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800259 if (!callback->eventSubscribeTerminated(msg.subscribe_id, status).isOk()) {
260 LOG(ERROR) << "Failed to invoke the callback";
261 }
262 }
263 };
264
265 callback_handlers.on_event_match = [weak_ptr_this](
266 const legacy_hal::NanMatchInd& msg) {
267 const auto shared_ptr_this = weak_ptr_this.promote();
268 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
269 LOG(ERROR) << "Callback invoked on an invalid object";
270 return;
271 }
272 NanMatchInd hidl_struct;
273 if (!hidl_struct_util::convertLegacyNanMatchIndToHidl(
274 msg, &hidl_struct)) {
275 LOG(ERROR) << "Failed to convert nan capabilities response";
276 return;
277 }
278
Roshan Piusd37341f2017-01-31 13:13:28 -0800279 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800280 if (!callback->eventMatch(hidl_struct).isOk()) {
281 LOG(ERROR) << "Failed to invoke the callback";
282 }
283 }
284 };
285
286 callback_handlers.on_event_match_expired = [weak_ptr_this](
287 const legacy_hal::NanMatchExpiredInd& msg) {
288 const auto shared_ptr_this = weak_ptr_this.promote();
289 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
290 LOG(ERROR) << "Callback invoked on an invalid object";
291 return;
292 }
Roshan Piusd37341f2017-01-31 13:13:28 -0800293 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800294 if (!callback->eventMatchExpired(msg.publish_subscribe_id,
295 msg.requestor_instance_id).isOk()) {
296 LOG(ERROR) << "Failed to invoke the callback";
297 }
298 }
299 };
300
301 callback_handlers.on_event_followup = [weak_ptr_this](
302 const legacy_hal::NanFollowupInd& msg) {
303 const auto shared_ptr_this = weak_ptr_this.promote();
304 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
305 LOG(ERROR) << "Callback invoked on an invalid object";
306 return;
307 }
308 NanFollowupReceivedInd hidl_struct;
309 if (!hidl_struct_util::convertLegacyNanFollowupIndToHidl(
310 msg, &hidl_struct)) {
311 LOG(ERROR) << "Failed to convert nan capabilities response";
312 return;
313 }
314
Roshan Piusd37341f2017-01-31 13:13:28 -0800315 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800316 if (!callback->eventFollowupReceived(hidl_struct).isOk()) {
317 LOG(ERROR) << "Failed to invoke the callback";
318 }
319 }
320 };
321
322 callback_handlers.on_event_transmit_follow_up = [weak_ptr_this](
323 const legacy_hal::NanTransmitFollowupInd& msg) {
324 const auto shared_ptr_this = weak_ptr_this.promote();
325 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
326 LOG(ERROR) << "Callback invoked on an invalid object";
327 return;
328 }
329 WifiNanStatus status;
330 status.status = hidl_struct_util::convertLegacyNanStatusTypeToHidl(msg.reason);
331 status.description = msg.nan_reason;
332
Roshan Piusd37341f2017-01-31 13:13:28 -0800333 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800334 if (!callback->eventTransmitFollowup(msg.id, status).isOk()) {
335 LOG(ERROR) << "Failed to invoke the callback";
336 }
337 }
338 };
339
340 callback_handlers.on_event_data_path_request = [weak_ptr_this](
341 const legacy_hal::NanDataPathRequestInd& msg) {
342 const auto shared_ptr_this = weak_ptr_this.promote();
343 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
344 LOG(ERROR) << "Callback invoked on an invalid object";
345 return;
346 }
347 NanDataPathRequestInd hidl_struct;
348 if (!hidl_struct_util::convertLegacyNanDataPathRequestIndToHidl(
349 msg, &hidl_struct)) {
350 LOG(ERROR) << "Failed to convert nan capabilities response";
351 return;
352 }
353
Roshan Piusd37341f2017-01-31 13:13:28 -0800354 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800355 if (!callback->eventDataPathRequest(hidl_struct).isOk()) {
356 LOG(ERROR) << "Failed to invoke the callback";
357 }
358 }
359 };
360
361 callback_handlers.on_event_data_path_confirm = [weak_ptr_this](
362 const legacy_hal::NanDataPathConfirmInd& msg) {
363 const auto shared_ptr_this = weak_ptr_this.promote();
364 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
365 LOG(ERROR) << "Callback invoked on an invalid object";
366 return;
367 }
368 NanDataPathConfirmInd hidl_struct;
369 if (!hidl_struct_util::convertLegacyNanDataPathConfirmIndToHidl(
370 msg, &hidl_struct)) {
371 LOG(ERROR) << "Failed to convert nan capabilities response";
372 return;
373 }
374
Roshan Piusd37341f2017-01-31 13:13:28 -0800375 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800376 if (!callback->eventDataPathConfirm(hidl_struct).isOk()) {
377 LOG(ERROR) << "Failed to invoke the callback";
378 }
379 }
380 };
381
382 callback_handlers.on_event_data_path_end = [weak_ptr_this](
383 const legacy_hal::NanDataPathEndInd& msg) {
384 const auto shared_ptr_this = weak_ptr_this.promote();
385 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
386 LOG(ERROR) << "Callback invoked on an invalid object";
387 return;
388 }
Roshan Piusd37341f2017-01-31 13:13:28 -0800389 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800390 for (int i = 0; i < msg.num_ndp_instances; ++i) {
391 if (!callback->eventDataPathTerminated(msg.ndp_instance_id[i]).isOk()) {
392 LOG(ERROR) << "Failed to invoke the callback";
393 }
394 }
395 }
396 };
397
398 callback_handlers.on_event_beacon_sdf_payload = [weak_ptr_this](
Etan Cohenccb15622017-02-09 09:35:35 -0800399 const legacy_hal::NanBeaconSdfPayloadInd& /* msg */) {
400 LOG(ERROR) << "on_event_beacon_sdf_payload - should not be called";
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800401 };
402
Etan Cohenc190f932017-02-17 13:06:55 -0800403 callback_handlers.on_event_range_request = [weak_ptr_this](
404 const legacy_hal::NanRangeRequestInd& /* msg */) {
405 LOG(ERROR) << "on_event_range_request - should not be called";
406 };
407
408 callback_handlers.on_event_range_report = [weak_ptr_this](
409 const legacy_hal::NanRangeReportInd& /* msg */) {
410 LOG(ERROR) << "on_event_range_report - should not be called";
411 };
412
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800413 legacy_hal::wifi_error legacy_status =
414 legacy_hal_.lock()->nanRegisterCallbackHandlers(callback_handlers);
415 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
416 LOG(ERROR) << "Failed to register nan callbacks. Invalidating object";
417 invalidate();
418 }
419}
Roshan Pius3e2d6712016-10-06 13:16:23 -0700420
421void WifiNanIface::invalidate() {
422 legacy_hal_.reset();
Roshan Piusd37341f2017-01-31 13:13:28 -0800423 event_cb_handler_.invalidate();
Roshan Pius3e2d6712016-10-06 13:16:23 -0700424 is_valid_ = false;
425}
426
Roshan Pius907d4a22016-10-27 12:48:12 -0700427bool WifiNanIface::isValid() {
428 return is_valid_;
429}
430
Roshan Piusd37341f2017-01-31 13:13:28 -0800431std::set<sp<IWifiNanIfaceEventCallback>> WifiNanIface::getEventCallbacks() {
432 return event_cb_handler_.getCallbacks();
433}
434
Roshan Pius734fea02016-10-11 08:30:28 -0700435Return<void> WifiNanIface::getName(getName_cb hidl_status_cb) {
Roshan Pius907d4a22016-10-27 12:48:12 -0700436 return validateAndCall(this,
437 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
438 &WifiNanIface::getNameInternal,
439 hidl_status_cb);
Roshan Pius3e2d6712016-10-06 13:16:23 -0700440}
441
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800442Return<void> WifiNanIface::getType(getType_cb hidl_status_cb) {
443 return validateAndCall(this,
444 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
445 &WifiNanIface::getTypeInternal,
446 hidl_status_cb);
447}
448
Roshan Pius0c92d442016-10-27 17:38:53 -0700449Return<void> WifiNanIface::registerEventCallback(
450 const sp<IWifiNanIfaceEventCallback>& callback,
451 registerEventCallback_cb hidl_status_cb) {
452 return validateAndCall(this,
453 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
454 &WifiNanIface::registerEventCallbackInternal,
455 hidl_status_cb,
456 callback);
457}
458
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800459Return<void> WifiNanIface::getCapabilitiesRequest(uint16_t cmd_id,
460 getCapabilitiesRequest_cb hidl_status_cb) {
461 return validateAndCall(this,
462 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
463 &WifiNanIface::getCapabilitiesRequestInternal,
464 hidl_status_cb,
465 cmd_id);
466}
467
468Return<void> WifiNanIface::enableRequest(uint16_t cmd_id,
Roshan Pius0c92d442016-10-27 17:38:53 -0700469 const NanEnableRequest& msg,
470 enableRequest_cb hidl_status_cb) {
471 return validateAndCall(this,
472 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
473 &WifiNanIface::enableRequestInternal,
474 hidl_status_cb,
475 cmd_id,
476 msg);
477}
478
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800479Return<void> WifiNanIface::configRequest(uint16_t cmd_id,
Roshan Pius0c92d442016-10-27 17:38:53 -0700480 const NanConfigRequest& msg,
481 configRequest_cb hidl_status_cb) {
482 return validateAndCall(this,
483 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
484 &WifiNanIface::configRequestInternal,
485 hidl_status_cb,
486 cmd_id,
487 msg);
488}
489
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800490Return<void> WifiNanIface::disableRequest(uint16_t cmd_id,
491 disableRequest_cb hidl_status_cb) {
492 return validateAndCall(this,
493 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
494 &WifiNanIface::disableRequestInternal,
495 hidl_status_cb,
496 cmd_id);
497}
498
499Return<void> WifiNanIface::startPublishRequest(uint16_t cmd_id,
500 const NanPublishRequest& msg,
501 startPublishRequest_cb hidl_status_cb) {
502 return validateAndCall(this,
503 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
504 &WifiNanIface::startPublishRequestInternal,
505 hidl_status_cb,
506 cmd_id,
507 msg);
508}
509
510Return<void> WifiNanIface::stopPublishRequest(
511 uint16_t cmd_id,
Etan Cohen073bb992017-02-09 10:05:59 -0800512 uint8_t sessionId,
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800513 stopPublishRequest_cb hidl_status_cb) {
514 return validateAndCall(this,
515 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
516 &WifiNanIface::stopPublishRequestInternal,
517 hidl_status_cb,
518 cmd_id,
519 sessionId);
520}
521
522Return<void> WifiNanIface::startSubscribeRequest(
523 uint16_t cmd_id,
524 const NanSubscribeRequest& msg,
525 startSubscribeRequest_cb hidl_status_cb) {
526 return validateAndCall(this,
527 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
528 &WifiNanIface::startSubscribeRequestInternal,
529 hidl_status_cb,
530 cmd_id,
531 msg);
532}
533
534Return<void> WifiNanIface::stopSubscribeRequest(
535 uint16_t cmd_id,
Etan Cohen073bb992017-02-09 10:05:59 -0800536 uint8_t sessionId,
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800537 stopSubscribeRequest_cb hidl_status_cb) {
538 return validateAndCall(this,
539 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
540 &WifiNanIface::stopSubscribeRequestInternal,
541 hidl_status_cb,
542 cmd_id,
543 sessionId);
544}
545
546Return<void> WifiNanIface::transmitFollowupRequest(
547 uint16_t cmd_id,
548 const NanTransmitFollowupRequest& msg,
549 transmitFollowupRequest_cb hidl_status_cb) {
550 return validateAndCall(this,
551 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
552 &WifiNanIface::transmitFollowupRequestInternal,
553 hidl_status_cb,
554 cmd_id,
555 msg);
556}
557
558Return<void> WifiNanIface::createDataInterfaceRequest(
559 uint16_t cmd_id,
560 const hidl_string& iface_name,
561 createDataInterfaceRequest_cb hidl_status_cb) {
562 return validateAndCall(this,
563 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
564 &WifiNanIface::createDataInterfaceRequestInternal,
565 hidl_status_cb,
566 cmd_id,
567 iface_name);
568}
569
570Return<void> WifiNanIface::deleteDataInterfaceRequest(
571 uint16_t cmd_id,
572 const hidl_string& iface_name,
573 deleteDataInterfaceRequest_cb hidl_status_cb) {
574 return validateAndCall(this,
575 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
576 &WifiNanIface::deleteDataInterfaceRequestInternal,
577 hidl_status_cb,
578 cmd_id,
579 iface_name);
580}
581
582Return<void> WifiNanIface::initiateDataPathRequest(
583 uint16_t cmd_id,
584 const NanInitiateDataPathRequest& msg,
585 initiateDataPathRequest_cb hidl_status_cb) {
586 return validateAndCall(this,
587 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
588 &WifiNanIface::initiateDataPathRequestInternal,
589 hidl_status_cb,
590 cmd_id,
591 msg);
592}
593
594Return<void> WifiNanIface::respondToDataPathIndicationRequest(
595 uint16_t cmd_id,
596 const NanRespondToDataPathIndicationRequest& msg,
597 respondToDataPathIndicationRequest_cb hidl_status_cb) {
598 return validateAndCall(this,
599 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
600 &WifiNanIface::respondToDataPathIndicationRequestInternal,
601 hidl_status_cb,
602 cmd_id,
603 msg);
604}
605
606Return<void> WifiNanIface::terminateDataPathRequest(uint16_t cmd_id, uint32_t ndpInstanceId,
607 terminateDataPathRequest_cb hidl_status_cb) {
608 return validateAndCall(this,
609 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
610 &WifiNanIface::terminateDataPathRequestInternal,
611 hidl_status_cb,
612 cmd_id,
613 ndpInstanceId);
614}
615
Roshan Pius907d4a22016-10-27 12:48:12 -0700616std::pair<WifiStatus, std::string> WifiNanIface::getNameInternal() {
617 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
618}
619
620std::pair<WifiStatus, IfaceType> WifiNanIface::getTypeInternal() {
621 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::NAN};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700622}
623
Roshan Pius0c92d442016-10-27 17:38:53 -0700624WifiStatus WifiNanIface::registerEventCallbackInternal(
625 const sp<IWifiNanIfaceEventCallback>& callback) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800626 if (!event_cb_handler_.addCallback(callback)) {
627 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
628 }
Roshan Pius0c92d442016-10-27 17:38:53 -0700629 return createWifiStatus(WifiStatusCode::SUCCESS);
630}
631
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800632WifiStatus WifiNanIface::getCapabilitiesRequestInternal(uint16_t cmd_id) {
633 legacy_hal::wifi_error legacy_status =
634 legacy_hal_.lock()->nanGetCapabilities(cmd_id);
635 return createWifiStatusFromLegacyError(legacy_status);
636}
637
638WifiStatus WifiNanIface::enableRequestInternal(uint16_t cmd_id,
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800639 const NanEnableRequest& msg) {
640 legacy_hal::NanEnableRequest legacy_msg;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800641 if (!hidl_struct_util::convertHidlNanEnableRequestToLegacy(msg, &legacy_msg)) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800642 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
643 }
644 legacy_hal::wifi_error legacy_status =
645 legacy_hal_.lock()->nanEnableRequest(cmd_id, legacy_msg);
646 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700647}
648
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800649WifiStatus WifiNanIface::configRequestInternal(
650 uint16_t cmd_id, const NanConfigRequest& msg) {
651 legacy_hal::NanConfigRequest legacy_msg;
652 if (!hidl_struct_util::convertHidlNanConfigRequestToLegacy(msg,
653 &legacy_msg)) {
654 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
655 }
656 legacy_hal::wifi_error legacy_status =
657 legacy_hal_.lock()->nanConfigRequest(cmd_id, legacy_msg);
658 return createWifiStatusFromLegacyError(legacy_status);
659}
660
661WifiStatus WifiNanIface::disableRequestInternal(uint16_t cmd_id) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800662 legacy_hal::wifi_error legacy_status =
663 legacy_hal_.lock()->nanDisableRequest(cmd_id);
664 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700665}
666
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800667WifiStatus WifiNanIface::startPublishRequestInternal(uint16_t cmd_id,
668 const NanPublishRequest& msg) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800669 legacy_hal::NanPublishRequest legacy_msg;
670 if (!hidl_struct_util::convertHidlNanPublishRequestToLegacy(msg,
671 &legacy_msg)) {
672 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
673 }
674 legacy_hal::wifi_error legacy_status =
675 legacy_hal_.lock()->nanPublishRequest(cmd_id, legacy_msg);
676 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700677}
678
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800679WifiStatus WifiNanIface::stopPublishRequestInternal(
Etan Cohen073bb992017-02-09 10:05:59 -0800680 uint16_t cmd_id, uint8_t sessionId) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800681 legacy_hal::NanPublishCancelRequest legacy_msg;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800682 legacy_msg.publish_id = sessionId;
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800683 legacy_hal::wifi_error legacy_status =
684 legacy_hal_.lock()->nanPublishCancelRequest(cmd_id, legacy_msg);
685 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700686}
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800687
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800688WifiStatus WifiNanIface::startSubscribeRequestInternal(
689 uint16_t cmd_id, const NanSubscribeRequest& msg) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800690 legacy_hal::NanSubscribeRequest legacy_msg;
691 if (!hidl_struct_util::convertHidlNanSubscribeRequestToLegacy(msg,
692 &legacy_msg)) {
693 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
694 }
695 legacy_hal::wifi_error legacy_status =
696 legacy_hal_.lock()->nanSubscribeRequest(cmd_id, legacy_msg);
697 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700698}
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800699
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800700WifiStatus WifiNanIface::stopSubscribeRequestInternal(
Etan Cohen073bb992017-02-09 10:05:59 -0800701 uint16_t cmd_id, uint8_t sessionId) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800702 legacy_hal::NanSubscribeCancelRequest legacy_msg;
703 legacy_msg.subscribe_id = sessionId;
704 legacy_hal::wifi_error legacy_status =
705 legacy_hal_.lock()->nanSubscribeCancelRequest(cmd_id, legacy_msg);
706 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700707}
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800708
Roshan Pius0c92d442016-10-27 17:38:53 -0700709WifiStatus WifiNanIface::transmitFollowupRequestInternal(
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800710 uint16_t cmd_id, const NanTransmitFollowupRequest& msg) {
711 legacy_hal::NanTransmitFollowupRequest legacy_msg;
712 if (!hidl_struct_util::convertHidlNanTransmitFollowupRequestToLegacy(msg, &legacy_msg)) {
713 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
714 }
715 legacy_hal::wifi_error legacy_status =
716 legacy_hal_.lock()->nanTransmitFollowupRequest(cmd_id, legacy_msg);
717 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700718}
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800719
720WifiStatus WifiNanIface::createDataInterfaceRequestInternal(
721 uint16_t cmd_id, const std::string& iface_name) {
722 legacy_hal::wifi_error legacy_status =
723 legacy_hal_.lock()->nanDataInterfaceCreate(cmd_id, iface_name);
724 return createWifiStatusFromLegacyError(legacy_status);
725}
726WifiStatus WifiNanIface::deleteDataInterfaceRequestInternal(
727 uint16_t cmd_id, const std::string& iface_name) {
728 legacy_hal::wifi_error legacy_status =
729 legacy_hal_.lock()->nanDataInterfaceDelete(cmd_id, iface_name);
730 return createWifiStatusFromLegacyError(legacy_status);
731}
732WifiStatus WifiNanIface::initiateDataPathRequestInternal(
733 uint16_t cmd_id, const NanInitiateDataPathRequest& msg) {
734 legacy_hal::NanDataPathInitiatorRequest legacy_msg;
735 if (!hidl_struct_util::convertHidlNanDataPathInitiatorRequestToLegacy(msg, &legacy_msg)) {
736 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
737 }
738 legacy_hal::wifi_error legacy_status =
739 legacy_hal_.lock()->nanDataRequestInitiator(cmd_id, legacy_msg);
740 return createWifiStatusFromLegacyError(legacy_status);
741}
742WifiStatus WifiNanIface::respondToDataPathIndicationRequestInternal(
743 uint16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg) {
744 legacy_hal::NanDataPathIndicationResponse legacy_msg;
745 if (!hidl_struct_util::convertHidlNanDataPathIndicationResponseToLegacy(msg, &legacy_msg)) {
746 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
747 }
748 legacy_hal::wifi_error legacy_status =
749 legacy_hal_.lock()->nanDataIndicationResponse(cmd_id, legacy_msg);
750 return createWifiStatusFromLegacyError(legacy_status);
751}
752WifiStatus WifiNanIface::terminateDataPathRequestInternal(
753 uint16_t cmd_id, uint32_t ndpInstanceId) {
754 legacy_hal::NanDataPathEndRequest* legacy_msg = (legacy_hal::NanDataPathEndRequest*)malloc(
755 sizeof(legacy_hal::NanDataPathEndRequest) + sizeof(uint32_t));
756 legacy_msg->num_ndp_instances = 1;
757 legacy_msg->ndp_instance_id[0] = ndpInstanceId;
758
759 legacy_hal::wifi_error legacy_status =
760 legacy_hal_.lock()->nanDataEnd(cmd_id, *legacy_msg);
761 free(legacy_msg);
762 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700763}
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800764
Roshan Pius3e2d6712016-10-06 13:16:23 -0700765} // namespace implementation
766} // namespace V1_0
767} // namespace wifi
768} // namespace hardware
769} // namespace android