1 /*
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
17 #include <android-base/logging.h>
18
19 #include "hidl_return_util.h"
20 #include "hidl_struct_util.h"
21 #include "wifi_nan_iface.h"
22 #include "wifi_status_util.h"
23
24 namespace android {
25 namespace hardware {
26 namespace wifi {
27 namespace V1_3 {
28 namespace implementation {
29 using hidl_return_util::validateAndCall;
30
WifiNanIface(const std::string & ifname,const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)31 WifiNanIface::WifiNanIface(
32 const std::string& ifname,
33 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
34 const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)
35 : ifname_(ifname),
36 legacy_hal_(legacy_hal),
37 iface_util_(iface_util),
38 is_valid_(true) {
39 // Register all the callbacks here. these should be valid for the lifetime
40 // of the object. Whenever the mode changes legacy HAL will remove
41 // all of these callbacks.
42 legacy_hal::NanCallbackHandlers callback_handlers;
43 android::wp<WifiNanIface> weak_ptr_this(this);
44
45 // Callback for response.
46 callback_handlers
47 .on_notify_response = [weak_ptr_this](
48 legacy_hal::transaction_id id,
49 const legacy_hal::NanResponseMsg& msg) {
50 const auto shared_ptr_this = weak_ptr_this.promote();
51 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
52 LOG(ERROR) << "Callback invoked on an invalid object";
53 return;
54 }
55 WifiNanStatus wifiNanStatus;
56 if (!hidl_struct_util::convertLegacyNanResponseHeaderToHidl(
57 msg, &wifiNanStatus)) {
58 LOG(ERROR) << "Failed to convert nan response header";
59 return;
60 }
61
62 switch (msg.response_type) {
63 case legacy_hal::NAN_RESPONSE_ENABLED: {
64 for (const auto& callback :
65 shared_ptr_this->getEventCallbacks()) {
66 if (!callback->notifyEnableResponse(id, wifiNanStatus)
67 .isOk()) {
68 LOG(ERROR) << "Failed to invoke the callback";
69 }
70 }
71 break;
72 }
73 case legacy_hal::NAN_RESPONSE_DISABLED: {
74 for (const auto& callback :
75 shared_ptr_this->getEventCallbacks()) {
76 if (!callback->notifyDisableResponse(id, wifiNanStatus)
77 .isOk()) {
78 LOG(ERROR) << "Failed to invoke the callback";
79 }
80 }
81 break;
82 }
83 case legacy_hal::NAN_RESPONSE_PUBLISH: {
84 for (const auto& callback :
85 shared_ptr_this->getEventCallbacks()) {
86 if (!callback
87 ->notifyStartPublishResponse(
88 id, wifiNanStatus,
89 msg.body.publish_response.publish_id)
90 .isOk()) {
91 LOG(ERROR) << "Failed to invoke the callback";
92 }
93 }
94 break;
95 }
96 case legacy_hal::NAN_RESPONSE_PUBLISH_CANCEL: {
97 for (const auto& callback :
98 shared_ptr_this->getEventCallbacks()) {
99 if (!callback->notifyStopPublishResponse(id, wifiNanStatus)
100 .isOk()) {
101 LOG(ERROR) << "Failed to invoke the callback";
102 }
103 }
104 break;
105 }
106 case legacy_hal::NAN_RESPONSE_TRANSMIT_FOLLOWUP: {
107 for (const auto& callback :
108 shared_ptr_this->getEventCallbacks()) {
109 if (!callback
110 ->notifyTransmitFollowupResponse(id, wifiNanStatus)
111 .isOk()) {
112 LOG(ERROR) << "Failed to invoke the callback";
113 }
114 }
115 break;
116 }
117 case legacy_hal::NAN_RESPONSE_SUBSCRIBE: {
118 for (const auto& callback :
119 shared_ptr_this->getEventCallbacks()) {
120 if (!callback
121 ->notifyStartSubscribeResponse(
122 id, wifiNanStatus,
123 msg.body.subscribe_response.subscribe_id)
124 .isOk()) {
125 LOG(ERROR) << "Failed to invoke the callback";
126 }
127 }
128 break;
129 }
130 case legacy_hal::NAN_RESPONSE_SUBSCRIBE_CANCEL: {
131 for (const auto& callback :
132 shared_ptr_this->getEventCallbacks()) {
133 if (!callback
134 ->notifyStopSubscribeResponse(id, wifiNanStatus)
135 .isOk()) {
136 LOG(ERROR) << "Failed to invoke the callback";
137 }
138 }
139 break;
140 }
141 case legacy_hal::NAN_RESPONSE_CONFIG: {
142 for (const auto& callback :
143 shared_ptr_this->getEventCallbacks()) {
144 if (!callback->notifyConfigResponse(id, wifiNanStatus)
145 .isOk()) {
146 LOG(ERROR) << "Failed to invoke the callback";
147 }
148 }
149 break;
150 }
151 case legacy_hal::NAN_GET_CAPABILITIES: {
152 NanCapabilities hidl_struct;
153 if (!hidl_struct_util::
154 convertLegacyNanCapabilitiesResponseToHidl(
155 msg.body.nan_capabilities, &hidl_struct)) {
156 LOG(ERROR) << "Failed to convert nan capabilities response";
157 return;
158 }
159 for (const auto& callback :
160 shared_ptr_this->getEventCallbacks()) {
161 if (!callback
162 ->notifyCapabilitiesResponse(id, wifiNanStatus,
163 hidl_struct)
164 .isOk()) {
165 LOG(ERROR) << "Failed to invoke the callback";
166 }
167 }
168 break;
169 }
170 case legacy_hal::NAN_DP_INTERFACE_CREATE: {
171 for (const auto& callback :
172 shared_ptr_this->getEventCallbacks()) {
173 if (!callback
174 ->notifyCreateDataInterfaceResponse(id,
175 wifiNanStatus)
176 .isOk()) {
177 LOG(ERROR) << "Failed to invoke the callback";
178 }
179 }
180 break;
181 }
182 case legacy_hal::NAN_DP_INTERFACE_DELETE: {
183 for (const auto& callback :
184 shared_ptr_this->getEventCallbacks()) {
185 if (!callback
186 ->notifyDeleteDataInterfaceResponse(id,
187 wifiNanStatus)
188 .isOk()) {
189 LOG(ERROR) << "Failed to invoke the callback";
190 }
191 }
192 break;
193 }
194 case legacy_hal::NAN_DP_INITIATOR_RESPONSE: {
195 for (const auto& callback :
196 shared_ptr_this->getEventCallbacks()) {
197 if (!callback
198 ->notifyInitiateDataPathResponse(
199 id, wifiNanStatus,
200 msg.body.data_request_response.ndp_instance_id)
201 .isOk()) {
202 LOG(ERROR) << "Failed to invoke the callback";
203 }
204 }
205 break;
206 }
207 case legacy_hal::NAN_DP_RESPONDER_RESPONSE: {
208 for (const auto& callback :
209 shared_ptr_this->getEventCallbacks()) {
210 if (!callback
211 ->notifyRespondToDataPathIndicationResponse(
212 id, wifiNanStatus)
213 .isOk()) {
214 LOG(ERROR) << "Failed to invoke the callback";
215 }
216 }
217 break;
218 }
219 case legacy_hal::NAN_DP_END: {
220 for (const auto& callback :
221 shared_ptr_this->getEventCallbacks()) {
222 if (!callback
223 ->notifyTerminateDataPathResponse(id,
224 wifiNanStatus)
225 .isOk()) {
226 LOG(ERROR) << "Failed to invoke the callback";
227 }
228 }
229 break;
230 }
231 case legacy_hal::NAN_RESPONSE_BEACON_SDF_PAYLOAD:
232 /* fall through */
233 case legacy_hal::NAN_RESPONSE_TCA:
234 /* fall through */
235 case legacy_hal::NAN_RESPONSE_STATS:
236 /* fall through */
237 case legacy_hal::NAN_RESPONSE_ERROR:
238 /* fall through */
239 default:
240 LOG(ERROR) << "Unknown or unhandled response type: "
241 << msg.response_type;
242 return;
243 }
244 };
245
246 callback_handlers.on_event_disc_eng_event =
247 [weak_ptr_this](const legacy_hal::NanDiscEngEventInd& msg) {
248 const auto shared_ptr_this = weak_ptr_this.promote();
249 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
250 LOG(ERROR) << "Callback invoked on an invalid object";
251 return;
252 }
253 NanClusterEventInd hidl_struct;
254 // event types defined identically - hence can be cast
255 hidl_struct.eventType = (NanClusterEventType)msg.event_type;
256 hidl_struct.addr = msg.data.mac_addr.addr;
257
258 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
259 if (!callback->eventClusterEvent(hidl_struct).isOk()) {
260 LOG(ERROR) << "Failed to invoke the callback";
261 }
262 }
263 };
264
265 callback_handlers.on_event_disabled =
266 [weak_ptr_this](const legacy_hal::NanDisabledInd& 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 WifiNanStatus status;
273 hidl_struct_util::convertToWifiNanStatus(
274 msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status);
275
276 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
277 if (!callback->eventDisabled(status).isOk()) {
278 LOG(ERROR) << "Failed to invoke the callback";
279 }
280 }
281 };
282
283 callback_handlers.on_event_publish_terminated =
284 [weak_ptr_this](const legacy_hal::NanPublishTerminatedInd& msg) {
285 const auto shared_ptr_this = weak_ptr_this.promote();
286 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
287 LOG(ERROR) << "Callback invoked on an invalid object";
288 return;
289 }
290 WifiNanStatus status;
291 hidl_struct_util::convertToWifiNanStatus(
292 msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status);
293
294 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
295 if (!callback->eventPublishTerminated(msg.publish_id, status)
296 .isOk()) {
297 LOG(ERROR) << "Failed to invoke the callback";
298 }
299 }
300 };
301
302 callback_handlers.on_event_subscribe_terminated =
303 [weak_ptr_this](const legacy_hal::NanSubscribeTerminatedInd& msg) {
304 const auto shared_ptr_this = weak_ptr_this.promote();
305 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
306 LOG(ERROR) << "Callback invoked on an invalid object";
307 return;
308 }
309 WifiNanStatus status;
310 hidl_struct_util::convertToWifiNanStatus(
311 msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status);
312
313 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
314 if (!callback
315 ->eventSubscribeTerminated(msg.subscribe_id, status)
316 .isOk()) {
317 LOG(ERROR) << "Failed to invoke the callback";
318 }
319 }
320 };
321
322 callback_handlers.on_event_match =
323 [weak_ptr_this](const legacy_hal::NanMatchInd& 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 NanMatchInd hidl_struct;
330 if (!hidl_struct_util::convertLegacyNanMatchIndToHidl(
331 msg, &hidl_struct)) {
332 LOG(ERROR) << "Failed to convert nan capabilities response";
333 return;
334 }
335
336 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
337 if (!callback->eventMatch(hidl_struct).isOk()) {
338 LOG(ERROR) << "Failed to invoke the callback";
339 }
340 }
341 };
342
343 callback_handlers.on_event_match_expired =
344 [weak_ptr_this](const legacy_hal::NanMatchExpiredInd& msg) {
345 const auto shared_ptr_this = weak_ptr_this.promote();
346 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
347 LOG(ERROR) << "Callback invoked on an invalid object";
348 return;
349 }
350 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
351 if (!callback
352 ->eventMatchExpired(msg.publish_subscribe_id,
353 msg.requestor_instance_id)
354 .isOk()) {
355 LOG(ERROR) << "Failed to invoke the callback";
356 }
357 }
358 };
359
360 callback_handlers.on_event_followup =
361 [weak_ptr_this](const legacy_hal::NanFollowupInd& msg) {
362 const auto shared_ptr_this = weak_ptr_this.promote();
363 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
364 LOG(ERROR) << "Callback invoked on an invalid object";
365 return;
366 }
367 NanFollowupReceivedInd hidl_struct;
368 if (!hidl_struct_util::convertLegacyNanFollowupIndToHidl(
369 msg, &hidl_struct)) {
370 LOG(ERROR) << "Failed to convert nan capabilities response";
371 return;
372 }
373
374 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
375 if (!callback->eventFollowupReceived(hidl_struct).isOk()) {
376 LOG(ERROR) << "Failed to invoke the callback";
377 }
378 }
379 };
380
381 callback_handlers.on_event_transmit_follow_up =
382 [weak_ptr_this](const legacy_hal::NanTransmitFollowupInd& msg) {
383 const auto shared_ptr_this = weak_ptr_this.promote();
384 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
385 LOG(ERROR) << "Callback invoked on an invalid object";
386 return;
387 }
388 WifiNanStatus status;
389 hidl_struct_util::convertToWifiNanStatus(
390 msg.reason, msg.nan_reason, sizeof(msg.nan_reason), &status);
391
392 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
393 if (!callback->eventTransmitFollowup(msg.id, status).isOk()) {
394 LOG(ERROR) << "Failed to invoke the callback";
395 }
396 }
397 };
398
399 callback_handlers.on_event_data_path_request =
400 [weak_ptr_this](const legacy_hal::NanDataPathRequestInd& msg) {
401 const auto shared_ptr_this = weak_ptr_this.promote();
402 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
403 LOG(ERROR) << "Callback invoked on an invalid object";
404 return;
405 }
406 NanDataPathRequestInd hidl_struct;
407 if (!hidl_struct_util::convertLegacyNanDataPathRequestIndToHidl(
408 msg, &hidl_struct)) {
409 LOG(ERROR) << "Failed to convert nan capabilities response";
410 return;
411 }
412
413 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
414 if (!callback->eventDataPathRequest(hidl_struct).isOk()) {
415 LOG(ERROR) << "Failed to invoke the callback";
416 }
417 }
418 };
419
420 callback_handlers.on_event_data_path_confirm =
421 [weak_ptr_this](const legacy_hal::NanDataPathConfirmInd& msg) {
422 const auto shared_ptr_this = weak_ptr_this.promote();
423 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
424 LOG(ERROR) << "Callback invoked on an invalid object";
425 return;
426 }
427 V1_2::NanDataPathConfirmInd hidl_struct;
428 if (!hidl_struct_util::convertLegacyNanDataPathConfirmIndToHidl(
429 msg, &hidl_struct)) {
430 LOG(ERROR) << "Failed to convert nan capabilities response";
431 return;
432 }
433
434 for (const auto& callback :
435 shared_ptr_this->getEventCallbacks_1_2()) {
436 if (!callback->eventDataPathConfirm_1_2(hidl_struct).isOk()) {
437 LOG(ERROR) << "Failed to invoke the callback";
438 }
439 }
440 };
441
442 callback_handlers.on_event_data_path_end =
443 [weak_ptr_this](const legacy_hal::NanDataPathEndInd& msg) {
444 const auto shared_ptr_this = weak_ptr_this.promote();
445 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
446 LOG(ERROR) << "Callback invoked on an invalid object";
447 return;
448 }
449 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
450 for (int i = 0; i < msg.num_ndp_instances; ++i) {
451 if (!callback
452 ->eventDataPathTerminated(msg.ndp_instance_id[i])
453 .isOk()) {
454 LOG(ERROR) << "Failed to invoke the callback";
455 }
456 }
457 }
458 };
459
460 callback_handlers.on_event_beacon_sdf_payload =
461 [weak_ptr_this](const legacy_hal::NanBeaconSdfPayloadInd& /* msg */) {
462 LOG(ERROR) << "on_event_beacon_sdf_payload - should not be called";
463 };
464
465 callback_handlers.on_event_range_request =
466 [weak_ptr_this](const legacy_hal::NanRangeRequestInd& /* msg */) {
467 LOG(ERROR) << "on_event_range_request - should not be called";
468 };
469
470 callback_handlers.on_event_range_report =
471 [weak_ptr_this](const legacy_hal::NanRangeReportInd& /* msg */) {
472 LOG(ERROR) << "on_event_range_report - should not be called";
473 };
474
475 callback_handlers
476 .on_event_schedule_update = [weak_ptr_this](
477 const legacy_hal::
478 NanDataPathScheduleUpdateInd& msg) {
479 const auto shared_ptr_this = weak_ptr_this.promote();
480 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
481 LOG(ERROR) << "Callback invoked on an invalid object";
482 return;
483 }
484 V1_2::NanDataPathScheduleUpdateInd hidl_struct;
485 if (!hidl_struct_util::convertLegacyNanDataPathScheduleUpdateIndToHidl(
486 msg, &hidl_struct)) {
487 LOG(ERROR) << "Failed to convert nan capabilities response";
488 return;
489 }
490
491 for (const auto& callback : shared_ptr_this->getEventCallbacks_1_2()) {
492 if (!callback->eventDataPathScheduleUpdate(hidl_struct).isOk()) {
493 LOG(ERROR) << "Failed to invoke the callback";
494 }
495 }
496 };
497
498 legacy_hal::wifi_error legacy_status =
499 legacy_hal_.lock()->nanRegisterCallbackHandlers(ifname_,
500 callback_handlers);
501 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
502 LOG(ERROR) << "Failed to register nan callbacks. Invalidating object";
503 invalidate();
504 }
505
506 // Register for iface state toggle events.
507 iface_util::IfaceEventHandlers event_handlers = {};
508 event_handlers.on_state_toggle_off_on =
509 [weak_ptr_this](const std::string& /* iface_name */) {
510 const auto shared_ptr_this = weak_ptr_this.promote();
511 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
512 LOG(ERROR) << "Callback invoked on an invalid object";
513 return;
514 }
515 // Tell framework that NAN has been disabled.
516 WifiNanStatus status = {
517 NanStatusType::UNSUPPORTED_CONCURRENCY_NAN_DISABLED, ""};
518 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
519 if (!callback->eventDisabled(status).isOk()) {
520 LOG(ERROR) << "Failed to invoke the callback";
521 }
522 }
523 };
524 iface_util_.lock()->registerIfaceEventHandlers(ifname_, event_handlers);
525 }
526
invalidate()527 void WifiNanIface::invalidate() {
528 // send commands to HAL to actually disable and destroy interfaces
529 legacy_hal_.lock()->nanDisableRequest(ifname_, 0xFFFF);
530 legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, 0xFFFE, "aware_data0");
531 legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, 0xFFFD, "aware_data1");
532 iface_util_.lock()->unregisterIfaceEventHandlers(ifname_);
533 legacy_hal_.reset();
534 event_cb_handler_.invalidate();
535 event_cb_handler_1_2_.invalidate();
536 is_valid_ = false;
537 }
538
isValid()539 bool WifiNanIface::isValid() { return is_valid_; }
540
getName()541 std::string WifiNanIface::getName() { return ifname_; }
542
543 std::set<sp<V1_0::IWifiNanIfaceEventCallback>>
getEventCallbacks()544 WifiNanIface::getEventCallbacks() {
545 return event_cb_handler_.getCallbacks();
546 }
547
548 std::set<sp<V1_2::IWifiNanIfaceEventCallback>>
getEventCallbacks_1_2()549 WifiNanIface::getEventCallbacks_1_2() {
550 return event_cb_handler_1_2_.getCallbacks();
551 }
552
getName(getName_cb hidl_status_cb)553 Return<void> WifiNanIface::getName(getName_cb hidl_status_cb) {
554 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
555 &WifiNanIface::getNameInternal, hidl_status_cb);
556 }
557
getType(getType_cb hidl_status_cb)558 Return<void> WifiNanIface::getType(getType_cb hidl_status_cb) {
559 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
560 &WifiNanIface::getTypeInternal, hidl_status_cb);
561 }
562
registerEventCallback(const sp<V1_0::IWifiNanIfaceEventCallback> & callback,registerEventCallback_cb hidl_status_cb)563 Return<void> WifiNanIface::registerEventCallback(
564 const sp<V1_0::IWifiNanIfaceEventCallback>& callback,
565 registerEventCallback_cb hidl_status_cb) {
566 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
567 &WifiNanIface::registerEventCallbackInternal,
568 hidl_status_cb, callback);
569 }
570
getCapabilitiesRequest(uint16_t cmd_id,getCapabilitiesRequest_cb hidl_status_cb)571 Return<void> WifiNanIface::getCapabilitiesRequest(
572 uint16_t cmd_id, getCapabilitiesRequest_cb hidl_status_cb) {
573 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
574 &WifiNanIface::getCapabilitiesRequestInternal,
575 hidl_status_cb, cmd_id);
576 }
577
enableRequest(uint16_t cmd_id,const NanEnableRequest & msg,enableRequest_cb hidl_status_cb)578 Return<void> WifiNanIface::enableRequest(uint16_t cmd_id,
579 const NanEnableRequest& msg,
580 enableRequest_cb hidl_status_cb) {
581 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
582 &WifiNanIface::enableRequestInternal, hidl_status_cb,
583 cmd_id, msg);
584 }
585
configRequest(uint16_t cmd_id,const NanConfigRequest & msg,configRequest_cb hidl_status_cb)586 Return<void> WifiNanIface::configRequest(uint16_t cmd_id,
587 const NanConfigRequest& msg,
588 configRequest_cb hidl_status_cb) {
589 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
590 &WifiNanIface::configRequestInternal, hidl_status_cb,
591 cmd_id, msg);
592 }
593
disableRequest(uint16_t cmd_id,disableRequest_cb hidl_status_cb)594 Return<void> WifiNanIface::disableRequest(uint16_t cmd_id,
595 disableRequest_cb hidl_status_cb) {
596 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
597 &WifiNanIface::disableRequestInternal,
598 hidl_status_cb, cmd_id);
599 }
600
startPublishRequest(uint16_t cmd_id,const NanPublishRequest & msg,startPublishRequest_cb hidl_status_cb)601 Return<void> WifiNanIface::startPublishRequest(
602 uint16_t cmd_id, const NanPublishRequest& msg,
603 startPublishRequest_cb hidl_status_cb) {
604 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
605 &WifiNanIface::startPublishRequestInternal,
606 hidl_status_cb, cmd_id, msg);
607 }
608
stopPublishRequest(uint16_t cmd_id,uint8_t sessionId,stopPublishRequest_cb hidl_status_cb)609 Return<void> WifiNanIface::stopPublishRequest(
610 uint16_t cmd_id, uint8_t sessionId, stopPublishRequest_cb hidl_status_cb) {
611 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
612 &WifiNanIface::stopPublishRequestInternal,
613 hidl_status_cb, cmd_id, sessionId);
614 }
615
startSubscribeRequest(uint16_t cmd_id,const NanSubscribeRequest & msg,startSubscribeRequest_cb hidl_status_cb)616 Return<void> WifiNanIface::startSubscribeRequest(
617 uint16_t cmd_id, const NanSubscribeRequest& msg,
618 startSubscribeRequest_cb hidl_status_cb) {
619 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
620 &WifiNanIface::startSubscribeRequestInternal,
621 hidl_status_cb, cmd_id, msg);
622 }
623
stopSubscribeRequest(uint16_t cmd_id,uint8_t sessionId,stopSubscribeRequest_cb hidl_status_cb)624 Return<void> WifiNanIface::stopSubscribeRequest(
625 uint16_t cmd_id, uint8_t sessionId,
626 stopSubscribeRequest_cb hidl_status_cb) {
627 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
628 &WifiNanIface::stopSubscribeRequestInternal,
629 hidl_status_cb, cmd_id, sessionId);
630 }
631
transmitFollowupRequest(uint16_t cmd_id,const NanTransmitFollowupRequest & msg,transmitFollowupRequest_cb hidl_status_cb)632 Return<void> WifiNanIface::transmitFollowupRequest(
633 uint16_t cmd_id, const NanTransmitFollowupRequest& msg,
634 transmitFollowupRequest_cb hidl_status_cb) {
635 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
636 &WifiNanIface::transmitFollowupRequestInternal,
637 hidl_status_cb, cmd_id, msg);
638 }
639
createDataInterfaceRequest(uint16_t cmd_id,const hidl_string & iface_name,createDataInterfaceRequest_cb hidl_status_cb)640 Return<void> WifiNanIface::createDataInterfaceRequest(
641 uint16_t cmd_id, const hidl_string& iface_name,
642 createDataInterfaceRequest_cb hidl_status_cb) {
643 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
644 &WifiNanIface::createDataInterfaceRequestInternal,
645 hidl_status_cb, cmd_id, iface_name);
646 }
647
deleteDataInterfaceRequest(uint16_t cmd_id,const hidl_string & iface_name,deleteDataInterfaceRequest_cb hidl_status_cb)648 Return<void> WifiNanIface::deleteDataInterfaceRequest(
649 uint16_t cmd_id, const hidl_string& iface_name,
650 deleteDataInterfaceRequest_cb hidl_status_cb) {
651 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
652 &WifiNanIface::deleteDataInterfaceRequestInternal,
653 hidl_status_cb, cmd_id, iface_name);
654 }
655
initiateDataPathRequest(uint16_t cmd_id,const NanInitiateDataPathRequest & msg,initiateDataPathRequest_cb hidl_status_cb)656 Return<void> WifiNanIface::initiateDataPathRequest(
657 uint16_t cmd_id, const NanInitiateDataPathRequest& msg,
658 initiateDataPathRequest_cb hidl_status_cb) {
659 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
660 &WifiNanIface::initiateDataPathRequestInternal,
661 hidl_status_cb, cmd_id, msg);
662 }
663
respondToDataPathIndicationRequest(uint16_t cmd_id,const NanRespondToDataPathIndicationRequest & msg,respondToDataPathIndicationRequest_cb hidl_status_cb)664 Return<void> WifiNanIface::respondToDataPathIndicationRequest(
665 uint16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg,
666 respondToDataPathIndicationRequest_cb hidl_status_cb) {
667 return validateAndCall(
668 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
669 &WifiNanIface::respondToDataPathIndicationRequestInternal,
670 hidl_status_cb, cmd_id, msg);
671 }
672
terminateDataPathRequest(uint16_t cmd_id,uint32_t ndpInstanceId,terminateDataPathRequest_cb hidl_status_cb)673 Return<void> WifiNanIface::terminateDataPathRequest(
674 uint16_t cmd_id, uint32_t ndpInstanceId,
675 terminateDataPathRequest_cb hidl_status_cb) {
676 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
677 &WifiNanIface::terminateDataPathRequestInternal,
678 hidl_status_cb, cmd_id, ndpInstanceId);
679 }
680
registerEventCallback_1_2(const sp<V1_2::IWifiNanIfaceEventCallback> & callback,registerEventCallback_1_2_cb hidl_status_cb)681 Return<void> WifiNanIface::registerEventCallback_1_2(
682 const sp<V1_2::IWifiNanIfaceEventCallback>& callback,
683 registerEventCallback_1_2_cb hidl_status_cb) {
684 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
685 &WifiNanIface::registerEventCallback_1_2Internal,
686 hidl_status_cb, callback);
687 }
688
enableRequest_1_2(uint16_t cmd_id,const NanEnableRequest & msg1,const V1_2::NanConfigRequestSupplemental & msg2,enableRequest_1_2_cb hidl_status_cb)689 Return<void> WifiNanIface::enableRequest_1_2(
690 uint16_t cmd_id, const NanEnableRequest& msg1,
691 const V1_2::NanConfigRequestSupplemental& msg2,
692 enableRequest_1_2_cb hidl_status_cb) {
693 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
694 &WifiNanIface::enableRequest_1_2Internal,
695 hidl_status_cb, cmd_id, msg1, msg2);
696 }
697
configRequest_1_2(uint16_t cmd_id,const NanConfigRequest & msg1,const V1_2::NanConfigRequestSupplemental & msg2,configRequest_1_2_cb hidl_status_cb)698 Return<void> WifiNanIface::configRequest_1_2(
699 uint16_t cmd_id, const NanConfigRequest& msg1,
700 const V1_2::NanConfigRequestSupplemental& msg2,
701 configRequest_1_2_cb hidl_status_cb) {
702 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
703 &WifiNanIface::configRequest_1_2Internal,
704 hidl_status_cb, cmd_id, msg1, msg2);
705 }
706
getNameInternal()707 std::pair<WifiStatus, std::string> WifiNanIface::getNameInternal() {
708 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
709 }
710
getTypeInternal()711 std::pair<WifiStatus, IfaceType> WifiNanIface::getTypeInternal() {
712 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::NAN};
713 }
714
registerEventCallbackInternal(const sp<V1_0::IWifiNanIfaceEventCallback> & callback)715 WifiStatus WifiNanIface::registerEventCallbackInternal(
716 const sp<V1_0::IWifiNanIfaceEventCallback>& callback) {
717 if (!event_cb_handler_.addCallback(callback)) {
718 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
719 }
720 return createWifiStatus(WifiStatusCode::SUCCESS);
721 }
722
getCapabilitiesRequestInternal(uint16_t cmd_id)723 WifiStatus WifiNanIface::getCapabilitiesRequestInternal(uint16_t cmd_id) {
724 legacy_hal::wifi_error legacy_status =
725 legacy_hal_.lock()->nanGetCapabilities(ifname_, cmd_id);
726 return createWifiStatusFromLegacyError(legacy_status);
727 }
728
enableRequestInternal(uint16_t,const NanEnableRequest &)729 WifiStatus WifiNanIface::enableRequestInternal(
730 uint16_t /* cmd_id */, const NanEnableRequest& /* msg */) {
731 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
732 }
733
configRequestInternal(uint16_t,const NanConfigRequest &)734 WifiStatus WifiNanIface::configRequestInternal(
735 uint16_t /* cmd_id */, const NanConfigRequest& /* msg */) {
736 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
737 }
738
disableRequestInternal(uint16_t cmd_id)739 WifiStatus WifiNanIface::disableRequestInternal(uint16_t cmd_id) {
740 legacy_hal::wifi_error legacy_status =
741 legacy_hal_.lock()->nanDisableRequest(ifname_, cmd_id);
742 return createWifiStatusFromLegacyError(legacy_status);
743 }
744
startPublishRequestInternal(uint16_t cmd_id,const NanPublishRequest & msg)745 WifiStatus WifiNanIface::startPublishRequestInternal(
746 uint16_t cmd_id, const NanPublishRequest& msg) {
747 legacy_hal::NanPublishRequest legacy_msg;
748 if (!hidl_struct_util::convertHidlNanPublishRequestToLegacy(msg,
749 &legacy_msg)) {
750 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
751 }
752 legacy_hal::wifi_error legacy_status =
753 legacy_hal_.lock()->nanPublishRequest(ifname_, cmd_id, legacy_msg);
754 return createWifiStatusFromLegacyError(legacy_status);
755 }
756
stopPublishRequestInternal(uint16_t cmd_id,uint8_t sessionId)757 WifiStatus WifiNanIface::stopPublishRequestInternal(uint16_t cmd_id,
758 uint8_t sessionId) {
759 legacy_hal::NanPublishCancelRequest legacy_msg;
760 legacy_msg.publish_id = sessionId;
761 legacy_hal::wifi_error legacy_status =
762 legacy_hal_.lock()->nanPublishCancelRequest(ifname_, cmd_id,
763 legacy_msg);
764 return createWifiStatusFromLegacyError(legacy_status);
765 }
766
startSubscribeRequestInternal(uint16_t cmd_id,const NanSubscribeRequest & msg)767 WifiStatus WifiNanIface::startSubscribeRequestInternal(
768 uint16_t cmd_id, const NanSubscribeRequest& msg) {
769 legacy_hal::NanSubscribeRequest legacy_msg;
770 if (!hidl_struct_util::convertHidlNanSubscribeRequestToLegacy(
771 msg, &legacy_msg)) {
772 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
773 }
774 legacy_hal::wifi_error legacy_status =
775 legacy_hal_.lock()->nanSubscribeRequest(ifname_, cmd_id, legacy_msg);
776 return createWifiStatusFromLegacyError(legacy_status);
777 }
778
stopSubscribeRequestInternal(uint16_t cmd_id,uint8_t sessionId)779 WifiStatus WifiNanIface::stopSubscribeRequestInternal(uint16_t cmd_id,
780 uint8_t sessionId) {
781 legacy_hal::NanSubscribeCancelRequest legacy_msg;
782 legacy_msg.subscribe_id = sessionId;
783 legacy_hal::wifi_error legacy_status =
784 legacy_hal_.lock()->nanSubscribeCancelRequest(ifname_, cmd_id,
785 legacy_msg);
786 return createWifiStatusFromLegacyError(legacy_status);
787 }
788
transmitFollowupRequestInternal(uint16_t cmd_id,const NanTransmitFollowupRequest & msg)789 WifiStatus WifiNanIface::transmitFollowupRequestInternal(
790 uint16_t cmd_id, const NanTransmitFollowupRequest& msg) {
791 legacy_hal::NanTransmitFollowupRequest legacy_msg;
792 if (!hidl_struct_util::convertHidlNanTransmitFollowupRequestToLegacy(
793 msg, &legacy_msg)) {
794 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
795 }
796 legacy_hal::wifi_error legacy_status =
797 legacy_hal_.lock()->nanTransmitFollowupRequest(ifname_, cmd_id,
798 legacy_msg);
799 return createWifiStatusFromLegacyError(legacy_status);
800 }
801
createDataInterfaceRequestInternal(uint16_t cmd_id,const std::string & iface_name)802 WifiStatus WifiNanIface::createDataInterfaceRequestInternal(
803 uint16_t cmd_id, const std::string& iface_name) {
804 legacy_hal::wifi_error legacy_status =
805 legacy_hal_.lock()->nanDataInterfaceCreate(ifname_, cmd_id, iface_name);
806 return createWifiStatusFromLegacyError(legacy_status);
807 }
deleteDataInterfaceRequestInternal(uint16_t cmd_id,const std::string & iface_name)808 WifiStatus WifiNanIface::deleteDataInterfaceRequestInternal(
809 uint16_t cmd_id, const std::string& iface_name) {
810 legacy_hal::wifi_error legacy_status =
811 legacy_hal_.lock()->nanDataInterfaceDelete(ifname_, cmd_id, iface_name);
812 return createWifiStatusFromLegacyError(legacy_status);
813 }
initiateDataPathRequestInternal(uint16_t cmd_id,const NanInitiateDataPathRequest & msg)814 WifiStatus WifiNanIface::initiateDataPathRequestInternal(
815 uint16_t cmd_id, const NanInitiateDataPathRequest& msg) {
816 legacy_hal::NanDataPathInitiatorRequest legacy_msg;
817 if (!hidl_struct_util::convertHidlNanDataPathInitiatorRequestToLegacy(
818 msg, &legacy_msg)) {
819 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
820 }
821 legacy_hal::wifi_error legacy_status =
822 legacy_hal_.lock()->nanDataRequestInitiator(ifname_, cmd_id,
823 legacy_msg);
824 return createWifiStatusFromLegacyError(legacy_status);
825 }
respondToDataPathIndicationRequestInternal(uint16_t cmd_id,const NanRespondToDataPathIndicationRequest & msg)826 WifiStatus WifiNanIface::respondToDataPathIndicationRequestInternal(
827 uint16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg) {
828 legacy_hal::NanDataPathIndicationResponse legacy_msg;
829 if (!hidl_struct_util::convertHidlNanDataPathIndicationResponseToLegacy(
830 msg, &legacy_msg)) {
831 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
832 }
833 legacy_hal::wifi_error legacy_status =
834 legacy_hal_.lock()->nanDataIndicationResponse(ifname_, cmd_id,
835 legacy_msg);
836 return createWifiStatusFromLegacyError(legacy_status);
837 }
terminateDataPathRequestInternal(uint16_t cmd_id,uint32_t ndpInstanceId)838 WifiStatus WifiNanIface::terminateDataPathRequestInternal(
839 uint16_t cmd_id, uint32_t ndpInstanceId) {
840 legacy_hal::wifi_error legacy_status =
841 legacy_hal_.lock()->nanDataEnd(ifname_, cmd_id, ndpInstanceId);
842 return createWifiStatusFromLegacyError(legacy_status);
843 }
844
registerEventCallback_1_2Internal(const sp<V1_2::IWifiNanIfaceEventCallback> & callback)845 WifiStatus WifiNanIface::registerEventCallback_1_2Internal(
846 const sp<V1_2::IWifiNanIfaceEventCallback>& callback) {
847 sp<V1_0::IWifiNanIfaceEventCallback> callback_1_0 = callback;
848 if (!event_cb_handler_.addCallback(callback_1_0)) {
849 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
850 }
851 if (!event_cb_handler_1_2_.addCallback(callback)) {
852 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
853 }
854 return createWifiStatus(WifiStatusCode::SUCCESS);
855 }
856
enableRequest_1_2Internal(uint16_t cmd_id,const NanEnableRequest & msg1,const V1_2::NanConfigRequestSupplemental & msg2)857 WifiStatus WifiNanIface::enableRequest_1_2Internal(
858 uint16_t cmd_id, const NanEnableRequest& msg1,
859 const V1_2::NanConfigRequestSupplemental& msg2) {
860 legacy_hal::NanEnableRequest legacy_msg;
861 if (!hidl_struct_util::convertHidlNanEnableRequest_1_2ToLegacy(
862 msg1, msg2, &legacy_msg)) {
863 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
864 }
865 legacy_hal::wifi_error legacy_status =
866 legacy_hal_.lock()->nanEnableRequest(ifname_, cmd_id, legacy_msg);
867 return createWifiStatusFromLegacyError(legacy_status);
868 }
869
configRequest_1_2Internal(uint16_t cmd_id,const NanConfigRequest & msg1,const V1_2::NanConfigRequestSupplemental & msg2)870 WifiStatus WifiNanIface::configRequest_1_2Internal(
871 uint16_t cmd_id, const NanConfigRequest& msg1,
872 const V1_2::NanConfigRequestSupplemental& msg2) {
873 legacy_hal::NanConfigRequest legacy_msg;
874 if (!hidl_struct_util::convertHidlNanConfigRequest_1_2ToLegacy(
875 msg1, msg2, &legacy_msg)) {
876 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
877 }
878 legacy_hal::wifi_error legacy_status =
879 legacy_hal_.lock()->nanConfigRequest(ifname_, cmd_id, legacy_msg);
880 return createWifiStatusFromLegacyError(legacy_status);
881 }
882
883 } // namespace implementation
884 } // namespace V1_3
885 } // namespace wifi
886 } // namespace hardware
887 } // namespace android
888