blob: 41651964940421b6a0f72ee98262a64180005a08 [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
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800403 legacy_hal::wifi_error legacy_status =
404 legacy_hal_.lock()->nanRegisterCallbackHandlers(callback_handlers);
405 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
406 LOG(ERROR) << "Failed to register nan callbacks. Invalidating object";
407 invalidate();
408 }
409}
Roshan Pius3e2d6712016-10-06 13:16:23 -0700410
411void WifiNanIface::invalidate() {
412 legacy_hal_.reset();
Roshan Piusd37341f2017-01-31 13:13:28 -0800413 event_cb_handler_.invalidate();
Roshan Pius3e2d6712016-10-06 13:16:23 -0700414 is_valid_ = false;
415}
416
Roshan Pius907d4a22016-10-27 12:48:12 -0700417bool WifiNanIface::isValid() {
418 return is_valid_;
419}
420
Roshan Piusd37341f2017-01-31 13:13:28 -0800421std::set<sp<IWifiNanIfaceEventCallback>> WifiNanIface::getEventCallbacks() {
422 return event_cb_handler_.getCallbacks();
423}
424
Roshan Pius734fea02016-10-11 08:30:28 -0700425Return<void> WifiNanIface::getName(getName_cb hidl_status_cb) {
Roshan Pius907d4a22016-10-27 12:48:12 -0700426 return validateAndCall(this,
427 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
428 &WifiNanIface::getNameInternal,
429 hidl_status_cb);
Roshan Pius3e2d6712016-10-06 13:16:23 -0700430}
431
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800432Return<void> WifiNanIface::getType(getType_cb hidl_status_cb) {
433 return validateAndCall(this,
434 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
435 &WifiNanIface::getTypeInternal,
436 hidl_status_cb);
437}
438
Roshan Pius0c92d442016-10-27 17:38:53 -0700439Return<void> WifiNanIface::registerEventCallback(
440 const sp<IWifiNanIfaceEventCallback>& callback,
441 registerEventCallback_cb hidl_status_cb) {
442 return validateAndCall(this,
443 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
444 &WifiNanIface::registerEventCallbackInternal,
445 hidl_status_cb,
446 callback);
447}
448
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800449Return<void> WifiNanIface::getCapabilitiesRequest(uint16_t cmd_id,
450 getCapabilitiesRequest_cb hidl_status_cb) {
451 return validateAndCall(this,
452 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
453 &WifiNanIface::getCapabilitiesRequestInternal,
454 hidl_status_cb,
455 cmd_id);
456}
457
458Return<void> WifiNanIface::enableRequest(uint16_t cmd_id,
Roshan Pius0c92d442016-10-27 17:38:53 -0700459 const NanEnableRequest& msg,
460 enableRequest_cb hidl_status_cb) {
461 return validateAndCall(this,
462 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
463 &WifiNanIface::enableRequestInternal,
464 hidl_status_cb,
465 cmd_id,
466 msg);
467}
468
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800469Return<void> WifiNanIface::configRequest(uint16_t cmd_id,
Roshan Pius0c92d442016-10-27 17:38:53 -0700470 const NanConfigRequest& msg,
471 configRequest_cb hidl_status_cb) {
472 return validateAndCall(this,
473 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
474 &WifiNanIface::configRequestInternal,
475 hidl_status_cb,
476 cmd_id,
477 msg);
478}
479
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800480Return<void> WifiNanIface::disableRequest(uint16_t cmd_id,
481 disableRequest_cb hidl_status_cb) {
482 return validateAndCall(this,
483 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
484 &WifiNanIface::disableRequestInternal,
485 hidl_status_cb,
486 cmd_id);
487}
488
489Return<void> WifiNanIface::startPublishRequest(uint16_t cmd_id,
490 const NanPublishRequest& msg,
491 startPublishRequest_cb hidl_status_cb) {
492 return validateAndCall(this,
493 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
494 &WifiNanIface::startPublishRequestInternal,
495 hidl_status_cb,
496 cmd_id,
497 msg);
498}
499
500Return<void> WifiNanIface::stopPublishRequest(
501 uint16_t cmd_id,
Etan Cohen073bb992017-02-09 10:05:59 -0800502 uint8_t sessionId,
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800503 stopPublishRequest_cb hidl_status_cb) {
504 return validateAndCall(this,
505 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
506 &WifiNanIface::stopPublishRequestInternal,
507 hidl_status_cb,
508 cmd_id,
509 sessionId);
510}
511
512Return<void> WifiNanIface::startSubscribeRequest(
513 uint16_t cmd_id,
514 const NanSubscribeRequest& msg,
515 startSubscribeRequest_cb hidl_status_cb) {
516 return validateAndCall(this,
517 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
518 &WifiNanIface::startSubscribeRequestInternal,
519 hidl_status_cb,
520 cmd_id,
521 msg);
522}
523
524Return<void> WifiNanIface::stopSubscribeRequest(
525 uint16_t cmd_id,
Etan Cohen073bb992017-02-09 10:05:59 -0800526 uint8_t sessionId,
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800527 stopSubscribeRequest_cb hidl_status_cb) {
528 return validateAndCall(this,
529 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
530 &WifiNanIface::stopSubscribeRequestInternal,
531 hidl_status_cb,
532 cmd_id,
533 sessionId);
534}
535
536Return<void> WifiNanIface::transmitFollowupRequest(
537 uint16_t cmd_id,
538 const NanTransmitFollowupRequest& msg,
539 transmitFollowupRequest_cb hidl_status_cb) {
540 return validateAndCall(this,
541 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
542 &WifiNanIface::transmitFollowupRequestInternal,
543 hidl_status_cb,
544 cmd_id,
545 msg);
546}
547
548Return<void> WifiNanIface::createDataInterfaceRequest(
549 uint16_t cmd_id,
550 const hidl_string& iface_name,
551 createDataInterfaceRequest_cb hidl_status_cb) {
552 return validateAndCall(this,
553 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
554 &WifiNanIface::createDataInterfaceRequestInternal,
555 hidl_status_cb,
556 cmd_id,
557 iface_name);
558}
559
560Return<void> WifiNanIface::deleteDataInterfaceRequest(
561 uint16_t cmd_id,
562 const hidl_string& iface_name,
563 deleteDataInterfaceRequest_cb hidl_status_cb) {
564 return validateAndCall(this,
565 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
566 &WifiNanIface::deleteDataInterfaceRequestInternal,
567 hidl_status_cb,
568 cmd_id,
569 iface_name);
570}
571
572Return<void> WifiNanIface::initiateDataPathRequest(
573 uint16_t cmd_id,
574 const NanInitiateDataPathRequest& msg,
575 initiateDataPathRequest_cb hidl_status_cb) {
576 return validateAndCall(this,
577 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
578 &WifiNanIface::initiateDataPathRequestInternal,
579 hidl_status_cb,
580 cmd_id,
581 msg);
582}
583
584Return<void> WifiNanIface::respondToDataPathIndicationRequest(
585 uint16_t cmd_id,
586 const NanRespondToDataPathIndicationRequest& msg,
587 respondToDataPathIndicationRequest_cb hidl_status_cb) {
588 return validateAndCall(this,
589 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
590 &WifiNanIface::respondToDataPathIndicationRequestInternal,
591 hidl_status_cb,
592 cmd_id,
593 msg);
594}
595
596Return<void> WifiNanIface::terminateDataPathRequest(uint16_t cmd_id, uint32_t ndpInstanceId,
597 terminateDataPathRequest_cb hidl_status_cb) {
598 return validateAndCall(this,
599 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
600 &WifiNanIface::terminateDataPathRequestInternal,
601 hidl_status_cb,
602 cmd_id,
603 ndpInstanceId);
604}
605
Roshan Pius907d4a22016-10-27 12:48:12 -0700606std::pair<WifiStatus, std::string> WifiNanIface::getNameInternal() {
607 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
608}
609
610std::pair<WifiStatus, IfaceType> WifiNanIface::getTypeInternal() {
611 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::NAN};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700612}
613
Roshan Pius0c92d442016-10-27 17:38:53 -0700614WifiStatus WifiNanIface::registerEventCallbackInternal(
615 const sp<IWifiNanIfaceEventCallback>& callback) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800616 if (!event_cb_handler_.addCallback(callback)) {
617 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
618 }
Roshan Pius0c92d442016-10-27 17:38:53 -0700619 return createWifiStatus(WifiStatusCode::SUCCESS);
620}
621
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800622WifiStatus WifiNanIface::getCapabilitiesRequestInternal(uint16_t cmd_id) {
623 legacy_hal::wifi_error legacy_status =
624 legacy_hal_.lock()->nanGetCapabilities(cmd_id);
625 return createWifiStatusFromLegacyError(legacy_status);
626}
627
628WifiStatus WifiNanIface::enableRequestInternal(uint16_t cmd_id,
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800629 const NanEnableRequest& msg) {
630 legacy_hal::NanEnableRequest legacy_msg;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800631 if (!hidl_struct_util::convertHidlNanEnableRequestToLegacy(msg, &legacy_msg)) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800632 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
633 }
634 legacy_hal::wifi_error legacy_status =
635 legacy_hal_.lock()->nanEnableRequest(cmd_id, legacy_msg);
636 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700637}
638
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800639WifiStatus WifiNanIface::configRequestInternal(
640 uint16_t cmd_id, const NanConfigRequest& msg) {
641 legacy_hal::NanConfigRequest legacy_msg;
642 if (!hidl_struct_util::convertHidlNanConfigRequestToLegacy(msg,
643 &legacy_msg)) {
644 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
645 }
646 legacy_hal::wifi_error legacy_status =
647 legacy_hal_.lock()->nanConfigRequest(cmd_id, legacy_msg);
648 return createWifiStatusFromLegacyError(legacy_status);
649}
650
651WifiStatus WifiNanIface::disableRequestInternal(uint16_t cmd_id) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800652 legacy_hal::wifi_error legacy_status =
653 legacy_hal_.lock()->nanDisableRequest(cmd_id);
654 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700655}
656
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800657WifiStatus WifiNanIface::startPublishRequestInternal(uint16_t cmd_id,
658 const NanPublishRequest& msg) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800659 legacy_hal::NanPublishRequest legacy_msg;
660 if (!hidl_struct_util::convertHidlNanPublishRequestToLegacy(msg,
661 &legacy_msg)) {
662 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
663 }
664 legacy_hal::wifi_error legacy_status =
665 legacy_hal_.lock()->nanPublishRequest(cmd_id, legacy_msg);
666 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700667}
668
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800669WifiStatus WifiNanIface::stopPublishRequestInternal(
Etan Cohen073bb992017-02-09 10:05:59 -0800670 uint16_t cmd_id, uint8_t sessionId) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800671 legacy_hal::NanPublishCancelRequest legacy_msg;
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800672 legacy_msg.publish_id = sessionId;
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800673 legacy_hal::wifi_error legacy_status =
674 legacy_hal_.lock()->nanPublishCancelRequest(cmd_id, legacy_msg);
675 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700676}
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800677
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800678WifiStatus WifiNanIface::startSubscribeRequestInternal(
679 uint16_t cmd_id, const NanSubscribeRequest& msg) {
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800680 legacy_hal::NanSubscribeRequest legacy_msg;
681 if (!hidl_struct_util::convertHidlNanSubscribeRequestToLegacy(msg,
682 &legacy_msg)) {
683 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
684 }
685 legacy_hal::wifi_error legacy_status =
686 legacy_hal_.lock()->nanSubscribeRequest(cmd_id, legacy_msg);
687 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700688}
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800689
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800690WifiStatus WifiNanIface::stopSubscribeRequestInternal(
Etan Cohen073bb992017-02-09 10:05:59 -0800691 uint16_t cmd_id, uint8_t sessionId) {
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800692 legacy_hal::NanSubscribeCancelRequest legacy_msg;
693 legacy_msg.subscribe_id = sessionId;
694 legacy_hal::wifi_error legacy_status =
695 legacy_hal_.lock()->nanSubscribeCancelRequest(cmd_id, legacy_msg);
696 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700697}
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800698
Roshan Pius0c92d442016-10-27 17:38:53 -0700699WifiStatus WifiNanIface::transmitFollowupRequestInternal(
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800700 uint16_t cmd_id, const NanTransmitFollowupRequest& msg) {
701 legacy_hal::NanTransmitFollowupRequest legacy_msg;
702 if (!hidl_struct_util::convertHidlNanTransmitFollowupRequestToLegacy(msg, &legacy_msg)) {
703 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
704 }
705 legacy_hal::wifi_error legacy_status =
706 legacy_hal_.lock()->nanTransmitFollowupRequest(cmd_id, legacy_msg);
707 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700708}
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800709
710WifiStatus WifiNanIface::createDataInterfaceRequestInternal(
711 uint16_t cmd_id, const std::string& iface_name) {
712 legacy_hal::wifi_error legacy_status =
713 legacy_hal_.lock()->nanDataInterfaceCreate(cmd_id, iface_name);
714 return createWifiStatusFromLegacyError(legacy_status);
715}
716WifiStatus WifiNanIface::deleteDataInterfaceRequestInternal(
717 uint16_t cmd_id, const std::string& iface_name) {
718 legacy_hal::wifi_error legacy_status =
719 legacy_hal_.lock()->nanDataInterfaceDelete(cmd_id, iface_name);
720 return createWifiStatusFromLegacyError(legacy_status);
721}
722WifiStatus WifiNanIface::initiateDataPathRequestInternal(
723 uint16_t cmd_id, const NanInitiateDataPathRequest& msg) {
724 legacy_hal::NanDataPathInitiatorRequest legacy_msg;
725 if (!hidl_struct_util::convertHidlNanDataPathInitiatorRequestToLegacy(msg, &legacy_msg)) {
726 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
727 }
728 legacy_hal::wifi_error legacy_status =
729 legacy_hal_.lock()->nanDataRequestInitiator(cmd_id, legacy_msg);
730 return createWifiStatusFromLegacyError(legacy_status);
731}
732WifiStatus WifiNanIface::respondToDataPathIndicationRequestInternal(
733 uint16_t cmd_id, const NanRespondToDataPathIndicationRequest& msg) {
734 legacy_hal::NanDataPathIndicationResponse legacy_msg;
735 if (!hidl_struct_util::convertHidlNanDataPathIndicationResponseToLegacy(msg, &legacy_msg)) {
736 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
737 }
738 legacy_hal::wifi_error legacy_status =
739 legacy_hal_.lock()->nanDataIndicationResponse(cmd_id, legacy_msg);
740 return createWifiStatusFromLegacyError(legacy_status);
741}
742WifiStatus WifiNanIface::terminateDataPathRequestInternal(
743 uint16_t cmd_id, uint32_t ndpInstanceId) {
744 legacy_hal::NanDataPathEndRequest* legacy_msg = (legacy_hal::NanDataPathEndRequest*)malloc(
745 sizeof(legacy_hal::NanDataPathEndRequest) + sizeof(uint32_t));
746 legacy_msg->num_ndp_instances = 1;
747 legacy_msg->ndp_instance_id[0] = ndpInstanceId;
748
749 legacy_hal::wifi_error legacy_status =
750 legacy_hal_.lock()->nanDataEnd(cmd_id, *legacy_msg);
751 free(legacy_msg);
752 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius0c92d442016-10-27 17:38:53 -0700753}
Etan Cohenf01bcaa2016-12-25 09:42:21 -0800754
Roshan Pius3e2d6712016-10-06 13:16:23 -0700755} // namespace implementation
756} // namespace V1_0
757} // namespace wifi
758} // namespace hardware
759} // namespace android