blob: eb965e7ed3300142fc8b60b9a1774c5cb9fe92c5 [file] [log] [blame]
nxpandroidc7611652015-09-23 16:42:05 +05301/******************************************************************************
2 *
3 * Copyright (C) 2010-2014 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
nxpandroidc7611652015-09-23 16:42:05 +053018
19/******************************************************************************
20 *
21 * This is the main implementation file for the NFA P2P.
22 *
23 ******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +053024#include <string>
25
26#include <android-base/stringprintf.h>
27#include <base/logging.h>
28
nxpandroidc7611652015-09-23 16:42:05 +053029#include "llcp_api.h"
nxf24591c1cbeab2018-02-21 17:32:26 +053030#include "nfa_dm_int.h"
nxpandroidc7611652015-09-23 16:42:05 +053031#include "nfa_p2p_int.h"
32
nxf24591c1cbeab2018-02-21 17:32:26 +053033using android::base::StringPrintf;
34
35extern bool nfc_debug_enabled;
36
nxpandroidc7611652015-09-23 16:42:05 +053037/*****************************************************************************
38** Global Variables
39*****************************************************************************/
40
41/* system manager control block definition */
nxpandroidc7611652015-09-23 16:42:05 +053042tNFA_P2P_CB nfa_p2p_cb;
nxpandroidc7611652015-09-23 16:42:05 +053043
44/*****************************************************************************
45** Static Functions
46*****************************************************************************/
47
48/* event handler function type */
nxpandroid8f6d0532017-07-12 18:25:30 +053049static bool nfa_p2p_evt_hdlr(NFC_HDR* p_msg);
nxpandroidc7611652015-09-23 16:42:05 +053050
51/* disable function type */
nxpandroid8f6d0532017-07-12 18:25:30 +053052static void nfa_p2p_sys_disable(void);
53static void nfa_p2p_update_active_listen(void);
nxpandroidc7611652015-09-23 16:42:05 +053054
55/* debug functions type */
nxf24591c1cbeab2018-02-21 17:32:26 +053056static std::string nfa_p2p_llcp_state_code(tNFA_P2P_LLCP_STATE state_code);
57static std::string nfa_p2p_evt_code(uint16_t evt_code);
nxpandroidc7611652015-09-23 16:42:05 +053058
59/*****************************************************************************
60** Constants
61*****************************************************************************/
62/* timeout to restore active listen mode if no RF activation on passive mode */
nxpandroid8f6d0532017-07-12 18:25:30 +053063#define NFA_P2P_RESTORE_ACTIVE_LISTEN_TIMEOUT 5000
nxpandroidc7611652015-09-23 16:42:05 +053064
nxpandroid8f6d0532017-07-12 18:25:30 +053065static const tNFA_SYS_REG nfa_p2p_sys_reg = {NULL, nfa_p2p_evt_hdlr,
66 nfa_p2p_sys_disable, NULL};
nxpandroidc7611652015-09-23 16:42:05 +053067
nxpandroid8f6d0532017-07-12 18:25:30 +053068#define NFA_P2P_NUM_ACTIONS (NFA_P2P_LAST_EVT & 0x00ff)
nxpandroidc7611652015-09-23 16:42:05 +053069
70/* type for action functions */
nxpandroid8f6d0532017-07-12 18:25:30 +053071typedef bool (*tNFA_P2P_ACTION)(tNFA_P2P_MSG* p_data);
nxpandroidc7611652015-09-23 16:42:05 +053072
73/* action function list */
nxpandroid8f6d0532017-07-12 18:25:30 +053074const tNFA_P2P_ACTION nfa_p2p_action[] = {
75 nfa_p2p_reg_server, /* NFA_P2P_API_REG_SERVER_EVT */
76 nfa_p2p_reg_client, /* NFA_P2P_API_REG_CLIENT_EVT */
77 nfa_p2p_dereg, /* NFA_P2P_API_DEREG_EVT */
78 nfa_p2p_accept_connection, /* NFA_P2P_API_ACCEPT_CONN_EVT */
79 nfa_p2p_reject_connection, /* NFA_P2P_API_REJECT_CONN_EVT */
80 nfa_p2p_disconnect, /* NFA_P2P_API_DISCONNECT_EVT */
81 nfa_p2p_create_data_link_connection, /* NFA_P2P_API_CONNECT_EVT */
82 nfa_p2p_send_ui, /* NFA_P2P_API_SEND_UI_EVT */
83 nfa_p2p_send_data, /* NFA_P2P_API_SEND_DATA_EVT */
84 nfa_p2p_set_local_busy, /* NFA_P2P_API_SET_LOCAL_BUSY_EVT */
85 nfa_p2p_get_link_info, /* NFA_P2P_API_GET_LINK_INFO_EVT */
86 nfa_p2p_get_remote_sap, /* NFA_P2P_API_GET_REMOTE_SAP_EVT */
87 nfa_p2p_set_llcp_cfg, /* NFA_P2P_API_SET_LLCP_CFG_EVT */
88 nfa_p2p_restart_rf_discovery /* NFA_P2P_INT_RESTART_RF_DISC_EVT */
nxpandroidc7611652015-09-23 16:42:05 +053089};
90
91/*******************************************************************************
92**
93** Function nfa_p2p_discovery_cback
94**
95** Description Processing event from discovery callback for listening
96**
97**
98** Returns None
99**
100*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530101void nfa_p2p_discovery_cback(tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data) {
102 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530103
nxf24591c1cbeab2018-02-21 17:32:26 +0530104 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event);
nxpandroidc7611652015-09-23 16:42:05 +0530105
nxpandroid8f6d0532017-07-12 18:25:30 +0530106 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +0530107 case NFA_DM_RF_DISC_START_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530108 if (p_data->status == NFC_STATUS_OK) {
109 nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_LISTENING;
110 nfa_p2p_cb.rf_disc_state = NFA_DM_RFST_DISCOVERY;
111 }
112 break;
nxpandroidc7611652015-09-23 16:42:05 +0530113
114 case NFA_DM_RF_DISC_ACTIVATED_EVT:
115
nxpandroid8f6d0532017-07-12 18:25:30 +0530116 nfa_p2p_cb.rf_disc_state = NFA_DM_RFST_LISTEN_ACTIVE;
nxpandroidc7611652015-09-23 16:42:05 +0530117
nxpandroid8f6d0532017-07-12 18:25:30 +0530118 /* notify NFC link activation */
119 memcpy(&(evt_data.activated.activate_ntf), &(p_data->activate),
120 sizeof(tNFC_ACTIVATE_DEVT));
121 nfa_dm_conn_cback_event_notify(NFA_ACTIVATED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530122
nxpandroid8f6d0532017-07-12 18:25:30 +0530123 if ((p_data->activate.protocol == NFC_PROTOCOL_NFC_DEP) &&
nxf24591c1cbeab2018-02-21 17:32:26 +0530124 (p_data->activate.intf_param.type == NFC_INTERFACE_NFC_DEP)) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530125 nfa_p2p_activate_llcp(p_data);
nxpandroidc7611652015-09-23 16:42:05 +0530126
nxpandroid8f6d0532017-07-12 18:25:30 +0530127 /* stop timer not to deactivate LLCP link on passive mode */
128 nfa_sys_stop_timer(&nfa_p2p_cb.active_listen_restore_timer);
129 }
130 break;
nxpandroidc7611652015-09-23 16:42:05 +0530131
132 case NFA_DM_RF_DISC_DEACTIVATED_EVT:
133
nxpandroid8f6d0532017-07-12 18:25:30 +0530134 if ((nfa_p2p_cb.rf_disc_state != NFA_DM_RFST_LISTEN_ACTIVE) &&
135 (nfa_p2p_cb.rf_disc_state != NFA_DM_RFST_LISTEN_SLEEP)) {
136 /* this is not for P2P listen
137 ** DM broadcasts deactivaiton event in listen sleep state.
138 */
nxpandroidc7611652015-09-23 16:42:05 +0530139 break;
nxpandroid8f6d0532017-07-12 18:25:30 +0530140 }
141
142 /* notify deactivation */
143 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) ||
144 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
145 nfa_p2p_cb.rf_disc_state = NFA_DM_RFST_LISTEN_SLEEP;
146 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_SLEEP;
147 } else {
148 nfa_p2p_cb.rf_disc_state = NFA_DM_RFST_DISCOVERY;
149 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
150 }
151 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data);
152 break;
nxpandroidc7611652015-09-23 16:42:05 +0530153
154 default:
nxf24591c1cbeab2018-02-21 17:32:26 +0530155 LOG(ERROR) << StringPrintf("Unexpected event");
nxpandroid8f6d0532017-07-12 18:25:30 +0530156 break;
157 }
nxpandroidc7611652015-09-23 16:42:05 +0530158}
159
160/*******************************************************************************
161**
162** Function nfa_p2p_update_active_listen_timeout_cback
163**
164** Description Timeout while waiting for passive mode activation
165**
166** Returns void
167**
168*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +0530169static void nfa_p2p_update_active_listen_timeout_cback(__attribute__((unused))
170 TIMER_LIST_ENT* p_tle) {
171 LOG(ERROR) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530172
nxpandroid8f6d0532017-07-12 18:25:30 +0530173 /* restore active listen mode */
174 nfa_p2p_update_active_listen();
nxpandroidc7611652015-09-23 16:42:05 +0530175}
176
177/*******************************************************************************
178**
179** Function nfa_p2p_update_active_listen
180**
181** Description Remove active listen mode temporarily or restore it
182**
183**
184** Returns None
185**
186*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530187static void nfa_p2p_update_active_listen(void) {
188 tNFA_DM_DISC_TECH_PROTO_MASK p2p_listen_mask = 0;
189 NFC_HDR* p_msg;
nxpandroidc7611652015-09-23 16:42:05 +0530190
nxf24591c1cbeab2018-02-21 17:32:26 +0530191 DLOG_IF(INFO, nfc_debug_enabled)
192 << StringPrintf("listen_tech_mask_to_restore:0x%x",
193 nfa_p2p_cb.listen_tech_mask_to_restore);
nxpandroidc7611652015-09-23 16:42:05 +0530194
nxpandroid8f6d0532017-07-12 18:25:30 +0530195 /* if active listen mode was removed temporarily */
196 if (nfa_p2p_cb.listen_tech_mask_to_restore) {
197 /* restore listen technologies */
198 nfa_p2p_cb.listen_tech_mask = nfa_p2p_cb.listen_tech_mask_to_restore;
199 nfa_p2p_cb.listen_tech_mask_to_restore = 0;
200 nfa_sys_stop_timer(&nfa_p2p_cb.active_listen_restore_timer);
201 } else {
202 /* start timer in case of no passive activation */
203 nfa_p2p_cb.active_listen_restore_timer.p_cback =
204 (TIMER_CBACK*)nfa_p2p_update_active_listen_timeout_cback;
205 nfa_sys_start_timer(&nfa_p2p_cb.active_listen_restore_timer, 0,
206 NFA_P2P_RESTORE_ACTIVE_LISTEN_TIMEOUT);
nxpandroidc7611652015-09-23 16:42:05 +0530207
nxpandroid8f6d0532017-07-12 18:25:30 +0530208 /* save listen techonologies */
209 nfa_p2p_cb.listen_tech_mask_to_restore = nfa_p2p_cb.listen_tech_mask;
nxpandroidc7611652015-09-23 16:42:05 +0530210
nxpandroid8f6d0532017-07-12 18:25:30 +0530211 /* remove active listen mode */
nxf24591c1cbeab2018-02-21 17:32:26 +0530212 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
213 nfa_p2p_cb.listen_tech_mask &= ~(NFA_TECHNOLOGY_MASK_ACTIVE);
214 } else {
215 nfa_p2p_cb.listen_tech_mask &=
216 ~(NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE);
217 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530218 }
nxpandroidc7611652015-09-23 16:42:05 +0530219
nxpandroid8f6d0532017-07-12 18:25:30 +0530220 if (nfa_p2p_cb.dm_disc_handle != NFA_HANDLE_INVALID) {
221 nfa_dm_delete_rf_discover(nfa_p2p_cb.dm_disc_handle);
222 nfa_p2p_cb.dm_disc_handle = NFA_HANDLE_INVALID;
223 }
nxpandroidc7611652015-09-23 16:42:05 +0530224
nxpandroid8f6d0532017-07-12 18:25:30 +0530225 /* collect listen technologies with NFC-DEP protocol */
226 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_A)
227 p2p_listen_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP;
nxpandroidc7611652015-09-23 16:42:05 +0530228
nxpandroid8f6d0532017-07-12 18:25:30 +0530229 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_F)
230 p2p_listen_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP;
nxf24591c1cbeab2018-02-21 17:32:26 +0530231 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
232 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_ACTIVE)
233 p2p_listen_mask |= NFA_DM_DISC_MASK_LACM_NFC_DEP;
234 } else {
235 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE)
236 p2p_listen_mask |= NFA_DM_DISC_MASK_LAA_NFC_DEP;
237 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE)
238 p2p_listen_mask |= NFA_DM_DISC_MASK_LFA_NFC_DEP;
239 }
nxpandroidc7611652015-09-23 16:42:05 +0530240
nxf24591c1cbeab2018-02-21 17:32:26 +0530241 /* For P2P mode(Default DTA mode) open Raw channel to bypass LLCP layer. For
242 * LLCP DTA mode activate LLCP Bypassing LLCP is handled in
243 * nfa_dm_poll_disc_cback */
nxpandroidc7611652015-09-23 16:42:05 +0530244
nxf24591c1cbeab2018-02-21 17:32:26 +0530245 if (appl_dta_mode_flag == 1 &&
nxpandroid8f6d0532017-07-12 18:25:30 +0530246 ((nfa_dm_cb.eDtaMode & 0x0F) == NFA_DTA_DEFAULT_MODE)) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530247 // Configure listen technologies and protocols and register callback to DTA
248
249 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
250 "%s: DTA mode:Registering nfa_dm_poll_disc_cback to avoid LLCP in P2P",
251 __func__);
nxpandroid8f6d0532017-07-12 18:25:30 +0530252 nfa_p2p_cb.dm_disc_handle =
253 nfa_dm_add_rf_discover(p2p_listen_mask, NFA_DM_DISC_HOST_ID_DH,
254 nfa_dm_poll_disc_cback_dta_wrapper);
nxf24591c1cbeab2018-02-21 17:32:26 +0530255 } else {
nxpandroid8f6d0532017-07-12 18:25:30 +0530256 /* Configure listen technologies and protocols and register callback to NFA
257 * DM discovery */
258 nfa_p2p_cb.dm_disc_handle = nfa_dm_add_rf_discover(
259 p2p_listen_mask, NFA_DM_DISC_HOST_ID_DH, nfa_p2p_discovery_cback);
260 }
nxpandroidc7611652015-09-23 16:42:05 +0530261
nxpandroid8f6d0532017-07-12 18:25:30 +0530262 /* restart RF discovery to update RF technologies */
263 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
264 if (p_msg != NULL) {
265 p_msg->event = NFA_P2P_INT_RESTART_RF_DISC_EVT;
266 nfa_sys_sendmsg(p_msg);
267 }
nxpandroidc7611652015-09-23 16:42:05 +0530268}
269
270/*******************************************************************************
271**
272** Function nfa_p2p_llcp_link_cback
273**
274** Description Processing event from LLCP link management callback
275**
276**
277** Returns None
278**
279*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530280void nfa_p2p_llcp_link_cback(uint8_t event, uint8_t reason) {
281 tNFA_LLCP_ACTIVATED llcp_activated;
282 tNFA_LLCP_DEACTIVATED llcp_deactivated;
nxpandroidc7611652015-09-23 16:42:05 +0530283
nxf24591c1cbeab2018-02-21 17:32:26 +0530284 DLOG_IF(INFO, nfc_debug_enabled)
285 << StringPrintf("event:0x%x, reason:0x%x", event, reason);
nxpandroidc7611652015-09-23 16:42:05 +0530286
nxpandroid8f6d0532017-07-12 18:25:30 +0530287 if (event == LLCP_LINK_ACTIVATION_COMPLETE_EVT) {
288 LLCP_GetLinkMIU(&nfa_p2p_cb.local_link_miu, &nfa_p2p_cb.remote_link_miu);
289 nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_ACTIVATED;
nxpandroidc7611652015-09-23 16:42:05 +0530290
nxpandroid8f6d0532017-07-12 18:25:30 +0530291 if (nfa_p2p_cb.is_initiator) {
292 /* notify NFA DM to send Activate Event to applicaiton with status */
293 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL);
nxpandroidc7611652015-09-23 16:42:05 +0530294 }
nxpandroidc7611652015-09-23 16:42:05 +0530295
nxpandroid8f6d0532017-07-12 18:25:30 +0530296 llcp_activated.is_initiator = nfa_p2p_cb.is_initiator;
297 llcp_activated.local_link_miu = nfa_p2p_cb.local_link_miu;
298 llcp_activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
299 llcp_activated.remote_lsc = LLCP_GetRemoteLSC();
300 llcp_activated.remote_wks = LLCP_GetRemoteWKS();
301 llcp_activated.remote_version = LLCP_GetRemoteVersion();
nxpandroidc7611652015-09-23 16:42:05 +0530302
nxf24591c1cbeab2018-02-21 17:32:26 +0530303 tNFA_CONN_EVT_DATA nfa_conn_evt_data;
304 nfa_conn_evt_data.llcp_activated = llcp_activated;
305 nfa_dm_act_conn_cback_notify(NFA_LLCP_ACTIVATED_EVT, &nfa_conn_evt_data);
nxpandroid8f6d0532017-07-12 18:25:30 +0530306
307 } else if (event == LLCP_LINK_ACTIVATION_FAILED_EVT) {
308 nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_IDLE;
309
310 if (nfa_p2p_cb.is_initiator) {
311 /* notify NFA DM to send Activate Event to applicaiton with status */
312 nfa_dm_notify_activation_status(NFA_STATUS_FAILED, NULL);
nxpandroidc7611652015-09-23 16:42:05 +0530313 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530314
315 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
316 } else if (event == LLCP_LINK_FIRST_PACKET_RECEIVED_EVT) {
317 nfa_dm_act_conn_cback_notify(NFA_LLCP_FIRST_PACKET_RECEIVED_EVT, NULL);
318 } else /* LLCP_LINK_DEACTIVATED_EVT */
319 {
320 nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_IDLE;
321
322 /* if got RF link loss without any rx LLC PDU */
323 if (reason == LLCP_LINK_RF_LINK_LOSS_NO_RX_LLC) {
324 /* if it was active listen mode */
325 if ((nfa_p2p_cb.is_active_mode) && (!nfa_p2p_cb.is_initiator)) {
326 /* if it didn't retry without active listen mode and passive mode is
327 * available */
328 if ((nfa_p2p_cb.listen_tech_mask_to_restore == 0x00) &&
329 (nfa_p2p_cb.listen_tech_mask &
330 (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_F))) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530331 DLOG_IF(INFO, nfc_debug_enabled)
332 << StringPrintf("Retry without active listen mode");
nxpandroid8f6d0532017-07-12 18:25:30 +0530333
334 /* retry without active listen mode */
335 nfa_p2p_update_active_listen();
336 }
337 } else if (nfa_p2p_cb.listen_tech_mask_to_restore) {
338 nfa_sys_start_timer(&nfa_p2p_cb.active_listen_restore_timer, 0,
339 NFA_P2P_RESTORE_ACTIVE_LISTEN_TIMEOUT);
340 }
341
342 reason = LLCP_LINK_RF_LINK_LOSS_ERR;
343 } else {
344 if (nfa_p2p_cb.listen_tech_mask_to_restore) {
345 /* restore active listen mode */
346 nfa_p2p_update_active_listen();
347 }
nxpandroidc7611652015-09-23 16:42:05 +0530348 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530349
350 llcp_deactivated.reason = reason;
nxf24591c1cbeab2018-02-21 17:32:26 +0530351 tNFA_CONN_EVT_DATA nfa_conn_evt_data;
352 nfa_conn_evt_data.llcp_deactivated = llcp_deactivated;
353 nfa_dm_act_conn_cback_notify(NFA_LLCP_DEACTIVATED_EVT, &nfa_conn_evt_data);
nxpandroid8f6d0532017-07-12 18:25:30 +0530354
355 if (reason != LLCP_LINK_RF_LINK_LOSS_ERR) /* if NFC link is still up */
nxpandroidc7611652015-09-23 16:42:05 +0530356 {
nxpandroid8f6d0532017-07-12 18:25:30 +0530357 if (nfa_p2p_cb.is_initiator) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530358 /*For LLCP DTA test, Deactivate to Sleep is needed to send DSL_REQ*/
nxf24591c1cbeab2018-02-21 17:32:26 +0530359 if (appl_dta_mode_flag == 1 &&
nxpandroid8f6d0532017-07-12 18:25:30 +0530360 ((nfa_dm_cb.eDtaMode & 0x0F) == NFA_DTA_LLCP_MODE)) {
361 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_SLEEP);
362 } else {
nxpandroid8f6d0532017-07-12 18:25:30 +0530363 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
nxpandroidc7611652015-09-23 16:42:05 +0530364 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530365 } else if ((nfa_p2p_cb.is_active_mode) && (reason == LLCP_LINK_TIMEOUT)) {
366 /*
367 ** target needs to trun off RF in case of receiving invalid
368 ** frame from initiator
369 */
nxf24591c1cbeab2018-02-21 17:32:26 +0530370 DLOG_IF(INFO, nfc_debug_enabled)
371 << StringPrintf("Got LLCP_LINK_TIMEOUT in active mode on target");
nxpandroid8f6d0532017-07-12 18:25:30 +0530372 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
373 }
nxpandroidc7611652015-09-23 16:42:05 +0530374 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530375 }
nxpandroidc7611652015-09-23 16:42:05 +0530376}
377
378/*******************************************************************************
379**
380** Function nfa_p2p_activate_llcp
381**
382** Description Activate LLCP link
383**
384**
385** Returns None
386**
387*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530388void nfa_p2p_activate_llcp(tNFC_DISCOVER* p_data) {
389 tLLCP_ACTIVATE_CONFIG config;
nxpandroidc7611652015-09-23 16:42:05 +0530390
nxf24591c1cbeab2018-02-21 17:32:26 +0530391 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530392
nxpandroid8f6d0532017-07-12 18:25:30 +0530393 if ((p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) ||
nxf24591c1cbeab2018-02-21 17:32:26 +0530394 (p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_F)) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530395 config.is_initiator = true;
396 } else {
397 config.is_initiator = false;
398 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530399 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
400 if (p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_ACTIVE) {
401 config.is_initiator = true;
402 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530403 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530404 if ((p_data->activate.rf_tech_param.mode ==
405 NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) ||
406 (p_data->activate.rf_tech_param.mode ==
407 NFC_DISCOVERY_TYPE_POLL_F_ACTIVE)) {
408 config.is_initiator = true;
409 }
410 }
411 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
412 if ((p_data->activate.rf_tech_param.mode ==
413 NFC_DISCOVERY_TYPE_POLL_ACTIVE) ||
414 (p_data->activate.rf_tech_param.mode ==
415 NFC_DISCOVERY_TYPE_LISTEN_ACTIVE)) {
416 nfa_p2p_cb.is_active_mode = true;
417 } else {
418 nfa_p2p_cb.is_active_mode = false;
419 }
420 } else {
421 if ((p_data->activate.rf_tech_param.mode ==
422 NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) ||
423 (p_data->activate.rf_tech_param.mode ==
424 NFC_DISCOVERY_TYPE_POLL_F_ACTIVE) ||
425 (p_data->activate.rf_tech_param.mode ==
426 NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) ||
427 (p_data->activate.rf_tech_param.mode ==
428 NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE)) {
429 nfa_p2p_cb.is_active_mode = true;
430 } else {
431 nfa_p2p_cb.is_active_mode = false;
432 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530433 }
nxpandroidc7611652015-09-23 16:42:05 +0530434
nxpandroid8f6d0532017-07-12 18:25:30 +0530435 nfa_p2p_cb.is_initiator = config.is_initiator;
nxpandroidc7611652015-09-23 16:42:05 +0530436
nxpandroid8f6d0532017-07-12 18:25:30 +0530437 config.max_payload_size =
438 p_data->activate.intf_param.intf_param.pa_nfc.max_payload_size;
439 config.waiting_time =
440 p_data->activate.intf_param.intf_param.pa_nfc.waiting_time;
441 config.p_gen_bytes = p_data->activate.intf_param.intf_param.pa_nfc.gen_bytes;
442 config.gen_bytes_len =
443 p_data->activate.intf_param.intf_param.pa_nfc.gen_bytes_len;
nxpandroidc7611652015-09-23 16:42:05 +0530444
nxpandroid8f6d0532017-07-12 18:25:30 +0530445 LLCP_ActivateLink(config, nfa_p2p_llcp_link_cback);
nxpandroidc7611652015-09-23 16:42:05 +0530446}
447
448/*******************************************************************************
449**
450** Function nfa_p2p_deactivate_llcp
451**
452** Description Deactivate LLCP link
453**
454**
455** Returns None
456**
457*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530458void nfa_p2p_deactivate_llcp(void) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530459 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530460
nxpandroid8f6d0532017-07-12 18:25:30 +0530461 LLCP_DeactivateLink();
nxpandroidc7611652015-09-23 16:42:05 +0530462}
463
464/*******************************************************************************
465**
466** Function nfa_p2p_init
467**
468** Description Initialize NFA P2P
469**
470**
471** Returns None
472**
473*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530474void nfa_p2p_init(void) {
475 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +0530476
nxf24591c1cbeab2018-02-21 17:32:26 +0530477 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530478
nxpandroid8f6d0532017-07-12 18:25:30 +0530479 /* initialize control block */
480 memset(&nfa_p2p_cb, 0, sizeof(tNFA_P2P_CB));
481 nfa_p2p_cb.dm_disc_handle = NFA_HANDLE_INVALID;
nxpandroidc7611652015-09-23 16:42:05 +0530482
nxpandroid8f6d0532017-07-12 18:25:30 +0530483 for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) {
484 nfa_p2p_cb.sdp_cb[xx].local_sap = LLCP_INVALID_SAP;
485 }
nxpandroidc7611652015-09-23 16:42:05 +0530486
nxpandroid8f6d0532017-07-12 18:25:30 +0530487 /* register message handler on NFA SYS */
488 nfa_sys_register(NFA_ID_P2P, &nfa_p2p_sys_reg);
nxpandroidc7611652015-09-23 16:42:05 +0530489}
490
nxpandroidc7611652015-09-23 16:42:05 +0530491/*******************************************************************************
492**
493** Function nfa_p2p_sys_disable
494**
495** Description Deregister NFA P2P from NFA SYS/DM
496**
497**
498** Returns None
499**
500*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530501static void nfa_p2p_sys_disable(void) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530502 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530503
nxpandroid8f6d0532017-07-12 18:25:30 +0530504 nfa_sys_stop_timer(&nfa_p2p_cb.active_listen_restore_timer);
nxpandroidc7611652015-09-23 16:42:05 +0530505
nxpandroid8f6d0532017-07-12 18:25:30 +0530506 /* deregister message handler on NFA SYS */
507 nfa_sys_deregister(NFA_ID_P2P);
nxpandroidc7611652015-09-23 16:42:05 +0530508}
509
510/*******************************************************************************
511**
512** Function nfa_p2p_set_config
513**
514** Description Set General bytes and WT parameters for LLCP
515**
516**
517** Returns void
518**
519*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530520void nfa_p2p_set_config(tNFA_DM_DISC_TECH_PROTO_MASK disc_mask) {
521 uint8_t wt, gen_bytes_len = LLCP_MAX_GEN_BYTES;
522 uint8_t params[LLCP_MAX_GEN_BYTES + 5], *p, length;
nxpandroidc7611652015-09-23 16:42:05 +0530523
nxf24591c1cbeab2018-02-21 17:32:26 +0530524 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530525
nxpandroid8f6d0532017-07-12 18:25:30 +0530526 LLCP_GetDiscoveryConfig(&wt, params + 2, &gen_bytes_len);
527 if (nfa_dm_is_p2p_paused()) {
528 gen_bytes_len = 0;
529 }
nxpandroidc7611652015-09-23 16:42:05 +0530530
nxf24591c1cbeab2018-02-21 17:32:26 +0530531 if ((disc_mask &
532 (NFA_DM_DISC_MASK_PA_NFC_DEP | NFA_DM_DISC_MASK_PF_NFC_DEP)) ||
533 ((NFC_GetNCIVersion() == NCI_VERSION_2_0) &&
534 (disc_mask & NFA_DM_DISC_MASK_PACM_NFC_DEP)) ||
535 ((NFC_GetNCIVersion() != NCI_VERSION_2_0) &&
536 (disc_mask &
537 (NFA_DM_DISC_MASK_PAA_NFC_DEP | NFA_DM_DISC_MASK_PFA_NFC_DEP)))) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530538 p = params;
nxpandroidc7611652015-09-23 16:42:05 +0530539
nxpandroid8f6d0532017-07-12 18:25:30 +0530540 UINT8_TO_BE_STREAM(p, NFC_PMID_ATR_REQ_GEN_BYTES);
541 UINT8_TO_BE_STREAM(p, gen_bytes_len);
nxpandroidc7611652015-09-23 16:42:05 +0530542
nxpandroid8f6d0532017-07-12 18:25:30 +0530543 p += gen_bytes_len;
544 length = gen_bytes_len + 2;
nxpandroidc7611652015-09-23 16:42:05 +0530545
nxpandroid8f6d0532017-07-12 18:25:30 +0530546 nfa_dm_check_set_config(length, params, false);
547 }
nxpandroidc7611652015-09-23 16:42:05 +0530548
nxf24591c1cbeab2018-02-21 17:32:26 +0530549 if ((disc_mask &
550 (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LF_NFC_DEP)) ||
551 ((NFC_GetNCIVersion() == NCI_VERSION_2_0) &&
552 (disc_mask & NFA_DM_DISC_MASK_LACM_NFC_DEP)) ||
553 ((NFC_GetNCIVersion() != NCI_VERSION_2_0) &&
554 (disc_mask &
555 (NFA_DM_DISC_MASK_LFA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP)))) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530556 p = params;
nxpandroidc7611652015-09-23 16:42:05 +0530557
nxpandroid8f6d0532017-07-12 18:25:30 +0530558 UINT8_TO_BE_STREAM(p, NFC_PMID_ATR_RES_GEN_BYTES);
559 UINT8_TO_BE_STREAM(p, gen_bytes_len);
nxpandroidc7611652015-09-23 16:42:05 +0530560
nxpandroid8f6d0532017-07-12 18:25:30 +0530561 p += gen_bytes_len;
562 length = gen_bytes_len + 2;
nxpandroidc7611652015-09-23 16:42:05 +0530563
nxpandroid8f6d0532017-07-12 18:25:30 +0530564 UINT8_TO_BE_STREAM(p, NFC_PMID_WT);
565 UINT8_TO_BE_STREAM(p, NCI_PARAM_LEN_WT);
566 UINT8_TO_BE_STREAM(p, wt);
nxpandroidc7611652015-09-23 16:42:05 +0530567
nxpandroid8f6d0532017-07-12 18:25:30 +0530568 length += 3;
nxpandroidc7611652015-09-23 16:42:05 +0530569
nxpandroid8f6d0532017-07-12 18:25:30 +0530570 nfa_dm_check_set_config(length, params, false);
571 }
nxpandroidc7611652015-09-23 16:42:05 +0530572}
573
574/*******************************************************************************
575**
576** Function nfa_p2p_enable_listening
577**
578** Description Configure listen technologies and protocols for LLCP
579** If LLCP WKS is changed then LLCP Gen bytes will be updated.
580**
581** Returns void
582**
583*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530584void nfa_p2p_enable_listening(tNFA_SYS_ID sys_id, bool update_wks) {
585 tNFA_DM_DISC_TECH_PROTO_MASK p2p_listen_mask = 0;
nxpandroidc7611652015-09-23 16:42:05 +0530586
nxf24591c1cbeab2018-02-21 17:32:26 +0530587 DLOG_IF(INFO, nfc_debug_enabled)
588 << StringPrintf("sys_id = %d, update_wks = %d", sys_id, update_wks);
nxpandroidc7611652015-09-23 16:42:05 +0530589
nxpandroid8f6d0532017-07-12 18:25:30 +0530590 if (sys_id == NFA_ID_P2P)
591 nfa_p2p_cb.is_p2p_listening = true;
592 else if (sys_id == NFA_ID_SNEP)
593 nfa_p2p_cb.is_snep_listening = true;
nxpandroidc7611652015-09-23 16:42:05 +0530594
nxpandroid8f6d0532017-07-12 18:25:30 +0530595 if (nfa_p2p_cb.dm_disc_handle != NFA_HANDLE_INVALID) {
596 /* if need to update WKS in LLCP Gen bytes */
597 if (update_wks) {
598 /* update LLCP Gen Bytes */
599 nfa_p2p_set_config(NFA_DM_DISC_MASK_PA_NFC_DEP |
600 NFA_DM_DISC_MASK_LA_NFC_DEP);
nxpandroidc7611652015-09-23 16:42:05 +0530601 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530602 return;
603 }
nxpandroidc7611652015-09-23 16:42:05 +0530604
nxpandroid8f6d0532017-07-12 18:25:30 +0530605 /* collect listen technologies with NFC-DEP protocol */
606 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_A)
607 p2p_listen_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP;
nxpandroidc7611652015-09-23 16:42:05 +0530608
nxpandroid8f6d0532017-07-12 18:25:30 +0530609 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_F)
610 p2p_listen_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP;
nxpandroidc7611652015-09-23 16:42:05 +0530611
nxf24591c1cbeab2018-02-21 17:32:26 +0530612 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
613 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_ACTIVE)
614 p2p_listen_mask |= NFA_DM_DISC_MASK_LACM_NFC_DEP;
615 } else {
616 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE)
617 p2p_listen_mask |= NFA_DM_DISC_MASK_LAA_NFC_DEP;
nxpandroidc7611652015-09-23 16:42:05 +0530618
nxf24591c1cbeab2018-02-21 17:32:26 +0530619 if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE)
620 p2p_listen_mask |= NFA_DM_DISC_MASK_LFA_NFC_DEP;
621 }
nxpandroidc7611652015-09-23 16:42:05 +0530622
nxpandroid8f6d0532017-07-12 18:25:30 +0530623 if (p2p_listen_mask) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530624 /* For P2P mode(Default DTA mode) open Raw channel to bypass LLCP layer.
625 * For LLCP DTA mode activate LLCP Bypassing LLCP is handled in
626 * nfa_dm_poll_disc_cback */
627 if (appl_dta_mode_flag == 1 &&
nxpandroid8f6d0532017-07-12 18:25:30 +0530628 ((nfa_dm_cb.eDtaMode & 0x0F) == NFA_DTA_DEFAULT_MODE)) {
629 /* Configure listen technologies and protocols and register callback to
630 * NFA DM discovery */
nxf24591c1cbeab2018-02-21 17:32:26 +0530631 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
632 "%s: DTA mode:Registering nfa_dm_poll_disc_cback to avoid LLCP in "
633 "P2P",
634 __func__);
nxpandroid8f6d0532017-07-12 18:25:30 +0530635 nfa_p2p_cb.dm_disc_handle =
636 nfa_dm_add_rf_discover(p2p_listen_mask, NFA_DM_DISC_HOST_ID_DH,
637 nfa_dm_poll_disc_cback_dta_wrapper);
nxf24591c1cbeab2018-02-21 17:32:26 +0530638 } else {
nxpandroid8f6d0532017-07-12 18:25:30 +0530639 /* Configure listen technologies and protocols and register callback to
640 * NFA DM discovery */
641 nfa_p2p_cb.dm_disc_handle = nfa_dm_add_rf_discover(
642 p2p_listen_mask, NFA_DM_DISC_HOST_ID_DH, nfa_p2p_discovery_cback);
nxpandroidc7611652015-09-23 16:42:05 +0530643 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530644 }
nxpandroidc7611652015-09-23 16:42:05 +0530645}
646
647/*******************************************************************************
648**
649** Function nfa_p2p_disable_listening
650**
651** Description Remove listen technologies and protocols for LLCP and
nxpandroid8f6d0532017-07-12 18:25:30 +0530652** deregister callback from NFA DM discovery if all of
653** P2P/CHO/SNEP doesn't listen LLCP any more.
nxpandroidc7611652015-09-23 16:42:05 +0530654** If LLCP WKS is changed then ATR_RES will be updated.
655**
656** Returns void
657**
658*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530659void nfa_p2p_disable_listening(tNFA_SYS_ID sys_id, bool update_wks) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530660 DLOG_IF(INFO, nfc_debug_enabled)
661 << StringPrintf("sys_id = %d, update_wks = %d", sys_id, update_wks);
nxpandroidc7611652015-09-23 16:42:05 +0530662
nxpandroid8f6d0532017-07-12 18:25:30 +0530663 if (sys_id == NFA_ID_P2P)
664 nfa_p2p_cb.is_p2p_listening = false;
665 else if (sys_id == NFA_ID_SNEP)
666 nfa_p2p_cb.is_snep_listening = false;
nxpandroidc7611652015-09-23 16:42:05 +0530667
nxpandroid8f6d0532017-07-12 18:25:30 +0530668 if (nfa_p2p_cb.dm_disc_handle != NFA_HANDLE_INVALID) {
669 if ((nfa_p2p_cb.is_p2p_listening == false) &&
670 (nfa_p2p_cb.is_snep_listening == false)) {
671 nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_IDLE;
672 nfa_p2p_cb.rf_disc_state = NFA_DM_RFST_IDLE;
nxpandroidc7611652015-09-23 16:42:05 +0530673
nxpandroid8f6d0532017-07-12 18:25:30 +0530674 nfa_dm_delete_rf_discover(nfa_p2p_cb.dm_disc_handle);
675 nfa_p2p_cb.dm_disc_handle = NFA_HANDLE_INVALID;
676 } else if (update_wks) {
677 /* update LLCP Gen Bytes */
678 nfa_p2p_set_config(NFA_DM_DISC_MASK_PA_NFC_DEP |
679 NFA_DM_DISC_MASK_LA_NFC_DEP);
nxpandroidc7611652015-09-23 16:42:05 +0530680 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530681 }
nxpandroidc7611652015-09-23 16:42:05 +0530682}
683
684/*******************************************************************************
685**
686** Function nfa_p2p_update_listen_tech
687**
688** Description Update P2P listen technologies. If there is change then
689** restart or stop P2P listen.
690**
691** Returns void
692**
693*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530694void nfa_p2p_update_listen_tech(tNFA_TECHNOLOGY_MASK tech_mask) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530695 DLOG_IF(INFO, nfc_debug_enabled)
696 << StringPrintf("tech_mask = 0x%x", tech_mask);
nxpandroidc7611652015-09-23 16:42:05 +0530697
nxpandroid8f6d0532017-07-12 18:25:30 +0530698 if (nfa_p2p_cb.listen_tech_mask_to_restore) {
699 nfa_p2p_cb.listen_tech_mask_to_restore = 0;
700 nfa_sys_stop_timer(&nfa_p2p_cb.active_listen_restore_timer);
701 }
702
703 if (nfa_p2p_cb.listen_tech_mask != tech_mask) {
704 nfa_p2p_cb.listen_tech_mask = tech_mask;
705
706 if (nfa_p2p_cb.dm_disc_handle != NFA_HANDLE_INVALID) {
707 nfa_p2p_cb.rf_disc_state = NFA_DM_RFST_IDLE;
708
709 nfa_dm_delete_rf_discover(nfa_p2p_cb.dm_disc_handle);
710 nfa_p2p_cb.dm_disc_handle = NFA_HANDLE_INVALID;
nxpandroidc7611652015-09-23 16:42:05 +0530711 }
712
nxpandroid8f6d0532017-07-12 18:25:30 +0530713 /* restart discovery without updating sub-module status */
nxf24591c1cbeab2018-02-21 17:32:26 +0530714 if (nfa_p2p_cb.is_p2p_listening || appl_dta_mode_flag)
nxpandroid8f6d0532017-07-12 18:25:30 +0530715 nfa_p2p_enable_listening(NFA_ID_P2P, false);
716 else if (nfa_p2p_cb.is_snep_listening)
717 nfa_p2p_enable_listening(NFA_ID_SNEP, false);
718 }
nxpandroidc7611652015-09-23 16:42:05 +0530719}
720
721/*******************************************************************************
722**
723** Function nfa_p2p_evt_hdlr
724**
725** Description Processing event for NFA P2P
726**
727**
nxf24591c1cbeab2018-02-21 17:32:26 +0530728** Returns TRUE if p_msg needs to be deallocated
nxpandroidc7611652015-09-23 16:42:05 +0530729**
730*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530731static bool nfa_p2p_evt_hdlr(NFC_HDR* p_hdr) {
732 bool delete_msg = true;
733 uint16_t event;
nxpandroidc7611652015-09-23 16:42:05 +0530734
nxf24591c1cbeab2018-02-21 17:32:26 +0530735 DLOG_IF(INFO, nfc_debug_enabled)
736 << StringPrintf("LLCP State [%s], Event [%s]",
737 nfa_p2p_llcp_state_code(nfa_p2p_cb.llcp_state).c_str(),
738 nfa_p2p_evt_code(p_hdr->event).c_str());
nxpandroidc7611652015-09-23 16:42:05 +0530739
nxf24591c1cbeab2018-02-21 17:32:26 +0530740 event = p_hdr->event & 0x00ff;
nxpandroidc7611652015-09-23 16:42:05 +0530741
nxpandroid8f6d0532017-07-12 18:25:30 +0530742 /* execute action functions */
743 if (event < NFA_P2P_NUM_ACTIONS) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530744 tNFA_P2P_MSG* p_msg = (tNFA_P2P_MSG*)p_hdr;
nxpandroid8f6d0532017-07-12 18:25:30 +0530745 delete_msg = (*nfa_p2p_action[event])(p_msg);
746 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530747 LOG(ERROR) << StringPrintf("Unhandled event");
nxpandroid8f6d0532017-07-12 18:25:30 +0530748 }
nxpandroidc7611652015-09-23 16:42:05 +0530749
nxpandroid8f6d0532017-07-12 18:25:30 +0530750 return delete_msg;
nxpandroidc7611652015-09-23 16:42:05 +0530751}
752
nxpandroidc7611652015-09-23 16:42:05 +0530753/*******************************************************************************
754**
755** Function nfa_p2p_llcp_state_code
756**
757** Description
758**
759** Returns string of state
760**
761*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +0530762static std::string nfa_p2p_llcp_state_code(tNFA_P2P_LLCP_STATE state_code) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530763 switch (state_code) {
nxpandroidc7611652015-09-23 16:42:05 +0530764 case NFA_P2P_LLCP_STATE_IDLE:
nxpandroid8f6d0532017-07-12 18:25:30 +0530765 return "Link IDLE";
nxpandroidc7611652015-09-23 16:42:05 +0530766 case NFA_P2P_LLCP_STATE_LISTENING:
nxpandroid8f6d0532017-07-12 18:25:30 +0530767 return "Link LISTENING";
nxpandroidc7611652015-09-23 16:42:05 +0530768 case NFA_P2P_LLCP_STATE_ACTIVATED:
nxpandroid8f6d0532017-07-12 18:25:30 +0530769 return "Link ACTIVATED";
nxpandroidc7611652015-09-23 16:42:05 +0530770 default:
nxpandroid8f6d0532017-07-12 18:25:30 +0530771 return "Unknown state";
772 }
nxpandroidc7611652015-09-23 16:42:05 +0530773}
774
775/*******************************************************************************
776**
777** Function nfa_p2p_evt_code
778**
779** Description
780**
781** Returns string of event
782**
783*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +0530784static std::string nfa_p2p_evt_code(uint16_t evt_code) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530785 switch (evt_code) {
nxpandroidc7611652015-09-23 16:42:05 +0530786 case NFA_P2P_API_REG_SERVER_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530787 return "API_REG_SERVER";
nxpandroidc7611652015-09-23 16:42:05 +0530788 case NFA_P2P_API_REG_CLIENT_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530789 return "API_REG_CLIENT";
nxpandroidc7611652015-09-23 16:42:05 +0530790 case NFA_P2P_API_DEREG_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530791 return "API_DEREG";
nxpandroidc7611652015-09-23 16:42:05 +0530792 case NFA_P2P_API_ACCEPT_CONN_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530793 return "API_ACCEPT_CONN";
nxpandroidc7611652015-09-23 16:42:05 +0530794 case NFA_P2P_API_REJECT_CONN_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530795 return "API_REJECT_CONN";
nxpandroidc7611652015-09-23 16:42:05 +0530796 case NFA_P2P_API_DISCONNECT_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530797 return "API_DISCONNECT";
nxpandroidc7611652015-09-23 16:42:05 +0530798 case NFA_P2P_API_CONNECT_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530799 return "API_CONNECT";
nxpandroidc7611652015-09-23 16:42:05 +0530800 case NFA_P2P_API_SEND_UI_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530801 return "API_SEND_UI";
nxpandroidc7611652015-09-23 16:42:05 +0530802 case NFA_P2P_API_SEND_DATA_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530803 return "API_SEND_DATA";
nxpandroidc7611652015-09-23 16:42:05 +0530804 case NFA_P2P_API_SET_LOCAL_BUSY_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530805 return "API_SET_LOCAL_BUSY";
nxpandroidc7611652015-09-23 16:42:05 +0530806 case NFA_P2P_API_GET_LINK_INFO_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530807 return "API_GET_LINK_INFO";
nxpandroidc7611652015-09-23 16:42:05 +0530808 case NFA_P2P_API_GET_REMOTE_SAP_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530809 return "API_GET_REMOTE_SAP";
nxpandroidc7611652015-09-23 16:42:05 +0530810 case NFA_P2P_API_SET_LLCP_CFG_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530811 return "API_SET_LLCP_CFG_EVT";
nxpandroidc7611652015-09-23 16:42:05 +0530812 case NFA_P2P_INT_RESTART_RF_DISC_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530813 return "RESTART_RF_DISC_EVT";
nxpandroidc7611652015-09-23 16:42:05 +0530814 default:
nxpandroid8f6d0532017-07-12 18:25:30 +0530815 return "Unknown event";
816 }
nxpandroidc7611652015-09-23 16:42:05 +0530817}