blob: 0d8c8e4a93031aa6f5fc49372977887b2ccd9206 [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 ******************************************************************************/
18
nxpandroidc7611652015-09-23 16:42:05 +053019/******************************************************************************
20 *
21 * This is the implementation file for the NFA P2P.
22 *
23 ******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +053024#include <android-base/stringprintf.h>
25#include <base/logging.h>
nxpandroidc7611652015-09-23 16:42:05 +053026
nxpandroidc7611652015-09-23 16:42:05 +053027#include "llcp_api.h"
nxf24591c1cbeab2018-02-21 17:32:26 +053028#include "nfa_dm_int.h"
nxpandroidc7611652015-09-23 16:42:05 +053029#include "nfa_p2p_api.h"
30#include "nfa_p2p_int.h"
31
nxf24591c1cbeab2018-02-21 17:32:26 +053032using android::base::StringPrintf;
33
34extern bool nfc_debug_enabled;
35
nxpandroidc7611652015-09-23 16:42:05 +053036/*****************************************************************************
37** Global Variables
38*****************************************************************************/
39
40/*****************************************************************************
41** Static Functions
42*****************************************************************************/
43
44/*****************************************************************************
45** Constants
46*****************************************************************************/
47
48/*******************************************************************************
49**
50** Function nfa_p2p_allocate_conn_cb
51**
52** Description Allocate data link connection control block
53**
54**
nxpandroid8f6d0532017-07-12 18:25:30 +053055** Returns uint8_t
nxpandroidc7611652015-09-23 16:42:05 +053056**
57*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +053058static uint8_t nfa_p2p_allocate_conn_cb(uint8_t local_sap) {
59 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +053060
nxpandroid8f6d0532017-07-12 18:25:30 +053061 for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) {
62 if (nfa_p2p_cb.conn_cb[xx].flags == 0) {
63 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_IN_USE;
64 nfa_p2p_cb.conn_cb[xx].local_sap = local_sap;
nxpandroidc7611652015-09-23 16:42:05 +053065
nxpandroid8f6d0532017-07-12 18:25:30 +053066 return (xx);
nxpandroidc7611652015-09-23 16:42:05 +053067 }
nxpandroid8f6d0532017-07-12 18:25:30 +053068 }
nxpandroidc7611652015-09-23 16:42:05 +053069
nxf24591c1cbeab2018-02-21 17:32:26 +053070 LOG(ERROR) << StringPrintf("No resource");
nxpandroidc7611652015-09-23 16:42:05 +053071
nxpandroid8f6d0532017-07-12 18:25:30 +053072 return LLCP_MAX_DATA_LINK;
nxpandroidc7611652015-09-23 16:42:05 +053073}
74
75/*******************************************************************************
76**
77** Function nfa_p2p_deallocate_conn_cb
78**
79** Description Deallocate data link connection control block
80**
81**
82** Returns void
83**
84*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +053085static void nfa_p2p_deallocate_conn_cb(uint8_t xx) {
86 if (xx < LLCP_MAX_DATA_LINK) {
87 nfa_p2p_cb.conn_cb[xx].flags = 0;
88 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +053089 LOG(ERROR) << StringPrintf("Invalid index (%d)", xx);
nxpandroid8f6d0532017-07-12 18:25:30 +053090 }
nxpandroidc7611652015-09-23 16:42:05 +053091}
92
93/*******************************************************************************
94**
95** Function nfa_p2p_find_conn_cb
96**
97** Description Find data link connection control block by local/remote SAP
98**
99**
nxpandroid8f6d0532017-07-12 18:25:30 +0530100** Returns uint8_t
nxpandroidc7611652015-09-23 16:42:05 +0530101**
102*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530103static uint8_t nfa_p2p_find_conn_cb(uint8_t local_sap, uint8_t remote_sap) {
104 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +0530105
nxpandroid8f6d0532017-07-12 18:25:30 +0530106 for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) {
107 if ((nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) &&
108 (nfa_p2p_cb.conn_cb[xx].local_sap == local_sap) &&
109 (nfa_p2p_cb.conn_cb[xx].remote_sap == remote_sap)) {
110 return (xx);
nxpandroidc7611652015-09-23 16:42:05 +0530111 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530112 }
nxpandroidc7611652015-09-23 16:42:05 +0530113
nxpandroid8f6d0532017-07-12 18:25:30 +0530114 return (LLCP_MAX_DATA_LINK);
nxpandroidc7611652015-09-23 16:42:05 +0530115}
116
117/*******************************************************************************
118**
119** Function nfa_p2p_llcp_cback
120**
121** Description Processing SAP callback events from LLCP
122**
123**
124** Returns None
125**
126*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530127static void nfa_p2p_llcp_cback(tLLCP_SAP_CBACK_DATA* p_data) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530128 DLOG_IF(INFO, nfc_debug_enabled)
129 << StringPrintf("event:0x%02X, local_sap:0x%02X", p_data->hdr.event,
130 p_data->hdr.local_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530131
nxpandroid8f6d0532017-07-12 18:25:30 +0530132 switch (p_data->hdr.event) {
nxpandroidc7611652015-09-23 16:42:05 +0530133 case LLCP_SAP_EVT_DATA_IND:
nxpandroid8f6d0532017-07-12 18:25:30 +0530134 nfa_p2p_proc_llcp_data_ind(p_data);
135 break;
nxpandroidc7611652015-09-23 16:42:05 +0530136
137 case LLCP_SAP_EVT_CONNECT_IND:
nxpandroid8f6d0532017-07-12 18:25:30 +0530138 nfa_p2p_proc_llcp_connect_ind(p_data);
139 break;
nxpandroidc7611652015-09-23 16:42:05 +0530140
141 case LLCP_SAP_EVT_CONNECT_RESP:
nxpandroid8f6d0532017-07-12 18:25:30 +0530142 nfa_p2p_proc_llcp_connect_resp(p_data);
143 break;
nxpandroidc7611652015-09-23 16:42:05 +0530144
145 case LLCP_SAP_EVT_DISCONNECT_IND:
nxpandroid8f6d0532017-07-12 18:25:30 +0530146 nfa_p2p_proc_llcp_disconnect_ind(p_data);
147 break;
nxpandroidc7611652015-09-23 16:42:05 +0530148
149 case LLCP_SAP_EVT_DISCONNECT_RESP:
nxpandroid8f6d0532017-07-12 18:25:30 +0530150 nfa_p2p_proc_llcp_disconnect_resp(p_data);
151 break;
nxpandroidc7611652015-09-23 16:42:05 +0530152
153 case LLCP_SAP_EVT_CONGEST:
nxpandroid8f6d0532017-07-12 18:25:30 +0530154 nfa_p2p_proc_llcp_congestion(p_data);
155 break;
nxpandroidc7611652015-09-23 16:42:05 +0530156
157 case LLCP_SAP_EVT_LINK_STATUS:
nxpandroid8f6d0532017-07-12 18:25:30 +0530158 nfa_p2p_proc_llcp_link_status(p_data);
159 break;
nxpandroidc7611652015-09-23 16:42:05 +0530160
161 default:
nxf24591c1cbeab2018-02-21 17:32:26 +0530162 LOG(ERROR) << StringPrintf("Unknown event:0x%02X", p_data->hdr.event);
nxpandroid8f6d0532017-07-12 18:25:30 +0530163 return;
164 }
nxpandroidc7611652015-09-23 16:42:05 +0530165}
166
167/*******************************************************************************
168**
169** Function nfa_p2p_sdp_cback
170**
171** Description Process SDP callback event from LLCP
172**
173**
174** Returns None
175**
176*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530177void nfa_p2p_sdp_cback(uint8_t tid, uint8_t remote_sap) {
178 uint8_t local_sap;
179 uint8_t xx;
180 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530181
nxf24591c1cbeab2018-02-21 17:32:26 +0530182 DLOG_IF(INFO, nfc_debug_enabled)
183 << StringPrintf("tid:0x%02X, remote_sap:0x%02X", tid, remote_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530184
nxpandroid8f6d0532017-07-12 18:25:30 +0530185 /* search for callback function to process */
186 for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) {
187 if ((nfa_p2p_cb.sdp_cb[xx].local_sap != LLCP_INVALID_SAP) &&
188 (nfa_p2p_cb.sdp_cb[xx].tid == tid)) {
189 local_sap = nfa_p2p_cb.sdp_cb[xx].local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530190
nxpandroid8f6d0532017-07-12 18:25:30 +0530191 evt_data.sdp.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
192 evt_data.sdp.remote_sap = remote_sap;
193 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_SDP_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530194
nxpandroid8f6d0532017-07-12 18:25:30 +0530195 nfa_p2p_cb.sdp_cb[xx].local_sap = LLCP_INVALID_SAP;
196 break;
nxpandroidc7611652015-09-23 16:42:05 +0530197 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530198 }
nxpandroidc7611652015-09-23 16:42:05 +0530199}
200
201/*******************************************************************************
202**
203** Function nfa_p2p_start_sdp
204**
205** Description Initiate SDP
206**
207**
nxf24591c1cbeab2018-02-21 17:32:26 +0530208** Returns TRUE if success
nxpandroidc7611652015-09-23 16:42:05 +0530209**
210*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530211bool nfa_p2p_start_sdp(char* p_service_name, uint8_t local_sap) {
212 int xx;
nxpandroidc7611652015-09-23 16:42:05 +0530213
nxf24591c1cbeab2018-02-21 17:32:26 +0530214 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("SN:<%s>", p_service_name);
nxpandroidc7611652015-09-23 16:42:05 +0530215
nxpandroid8f6d0532017-07-12 18:25:30 +0530216 /* search for empty slot */
217 for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) {
218 if (nfa_p2p_cb.sdp_cb[xx].local_sap == LLCP_INVALID_SAP) {
219 if (LLCP_DiscoverService(p_service_name, nfa_p2p_sdp_cback,
220 &(nfa_p2p_cb.sdp_cb[xx].tid)) ==
221 LLCP_STATUS_SUCCESS) {
222 nfa_p2p_cb.sdp_cb[xx].local_sap = local_sap;
223 return true;
224 } else {
225 /* failure of SDP */
226 return false;
227 }
nxpandroidc7611652015-09-23 16:42:05 +0530228 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530229 }
230 return false;
nxpandroidc7611652015-09-23 16:42:05 +0530231}
232
233/*******************************************************************************
234**
235** Function nfa_p2p_proc_llcp_data_ind
236**
237** Description Processing incoming data event from LLCP
238**
239**
240** Returns None
241**
242*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530243void nfa_p2p_proc_llcp_data_ind(tLLCP_SAP_CBACK_DATA* p_data) {
244 uint8_t local_sap, xx;
245 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530246
nxf24591c1cbeab2018-02-21 17:32:26 +0530247 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530248
nxpandroid8f6d0532017-07-12 18:25:30 +0530249 local_sap = p_data->data_ind.local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530250
nxpandroid8f6d0532017-07-12 18:25:30 +0530251 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
252 evt_data.data.handle = 0;
253 /* if connectionless */
254 if (p_data->data_ind.link_type == NFA_P2P_LLINK_TYPE) {
255 evt_data.data.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
256 } else {
257 xx = nfa_p2p_find_conn_cb(p_data->data_ind.local_sap,
258 p_data->data_ind.remote_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530259
nxpandroid8f6d0532017-07-12 18:25:30 +0530260 if (xx != LLCP_MAX_DATA_LINK) {
261 evt_data.data.handle =
262 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
263 }
nxpandroidc7611652015-09-23 16:42:05 +0530264 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530265
266 evt_data.data.remote_sap = p_data->data_ind.remote_sap;
267 evt_data.data.link_type = p_data->data_ind.link_type;
268
269 /* notify upper layer that there are data at LLCP */
270 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DATA_EVT, &evt_data);
271 }
nxpandroidc7611652015-09-23 16:42:05 +0530272}
273
274/*******************************************************************************
275**
276** Function nfa_p2p_proc_llcp_connect_ind
277**
278** Description Processing connection request from peer
279**
280**
281** Returns None
282**
283*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530284void nfa_p2p_proc_llcp_connect_ind(tLLCP_SAP_CBACK_DATA* p_data) {
285 uint8_t server_sap, local_sap;
286 tNFA_P2P_EVT_DATA evt_data;
287 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +0530288
nxf24591c1cbeab2018-02-21 17:32:26 +0530289 DLOG_IF(INFO, nfc_debug_enabled)
290 << StringPrintf("server_sap:0x%x", p_data->connect_ind.server_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530291
nxpandroid8f6d0532017-07-12 18:25:30 +0530292 server_sap = p_data->connect_ind.server_sap;
293 local_sap = p_data->connect_ind.local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530294
nxpandroid8f6d0532017-07-12 18:25:30 +0530295 if (nfa_p2p_cb.sap_cb[server_sap].p_cback) {
296 xx = nfa_p2p_allocate_conn_cb(server_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530297
nxpandroid8f6d0532017-07-12 18:25:30 +0530298 if (xx != LLCP_MAX_DATA_LINK) {
299 nfa_p2p_cb.conn_cb[xx].remote_sap = p_data->connect_ind.remote_sap;
300 nfa_p2p_cb.conn_cb[xx].remote_miu = p_data->connect_ind.miu;
nxpandroidc7611652015-09-23 16:42:05 +0530301
nxpandroid8f6d0532017-07-12 18:25:30 +0530302 /* peer will not receive any data */
303 if (p_data->connect_ind.rw == 0)
304 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO;
nxpandroidc7611652015-09-23 16:42:05 +0530305
nxpandroid8f6d0532017-07-12 18:25:30 +0530306 evt_data.conn_req.server_handle = (NFA_HANDLE_GROUP_P2P | server_sap);
307 evt_data.conn_req.conn_handle =
308 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
309 evt_data.conn_req.remote_sap = p_data->connect_ind.remote_sap;
310 evt_data.conn_req.remote_miu = p_data->connect_ind.miu;
311 evt_data.conn_req.remote_rw = p_data->connect_ind.rw;
nxpandroidc7611652015-09-23 16:42:05 +0530312
nxpandroid8f6d0532017-07-12 18:25:30 +0530313 nfa_p2p_cb.sap_cb[server_sap].p_cback(NFA_P2P_CONN_REQ_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530314 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530315 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530316 LOG(ERROR) << StringPrintf("Not registered");
nxpandroid8f6d0532017-07-12 18:25:30 +0530317 }
nxpandroidc7611652015-09-23 16:42:05 +0530318}
319
320/*******************************************************************************
321**
322** Function nfa_p2p_proc_llcp_connect_resp
323**
324** Description Processing connection response from peer
325**
326**
327** Returns None
328**
329*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530330void nfa_p2p_proc_llcp_connect_resp(tLLCP_SAP_CBACK_DATA* p_data) {
331 uint8_t local_sap, xx;
332 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530333
nxf24591c1cbeab2018-02-21 17:32:26 +0530334 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530335
nxpandroid8f6d0532017-07-12 18:25:30 +0530336 local_sap = p_data->connect_resp.local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530337
nxpandroid8f6d0532017-07-12 18:25:30 +0530338 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
339 xx = nfa_p2p_allocate_conn_cb(local_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530340
nxpandroid8f6d0532017-07-12 18:25:30 +0530341 if (xx != LLCP_MAX_DATA_LINK) {
342 nfa_p2p_cb.conn_cb[xx].remote_sap = p_data->connect_resp.remote_sap;
343 nfa_p2p_cb.conn_cb[xx].remote_miu = p_data->connect_resp.miu;
nxpandroidc7611652015-09-23 16:42:05 +0530344
nxpandroid8f6d0532017-07-12 18:25:30 +0530345 /* peer will not receive any data */
346 if (p_data->connect_resp.rw == 0)
347 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO;
nxpandroidc7611652015-09-23 16:42:05 +0530348
nxpandroid8f6d0532017-07-12 18:25:30 +0530349 evt_data.connected.client_handle = (NFA_HANDLE_GROUP_P2P | local_sap);
350 evt_data.connected.conn_handle =
351 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
352 evt_data.connected.remote_sap = p_data->connect_resp.remote_sap;
353 evt_data.connected.remote_miu = p_data->connect_resp.miu;
354 evt_data.connected.remote_rw = p_data->connect_resp.rw;
nxpandroidc7611652015-09-23 16:42:05 +0530355
nxpandroid8f6d0532017-07-12 18:25:30 +0530356 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONNECTED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530357 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530358 }
nxpandroidc7611652015-09-23 16:42:05 +0530359}
360
361/*******************************************************************************
362**
363** Function nfa_p2p_proc_llcp_disconnect_ind
364**
365** Description Processing disconnection request from peer
366**
367**
368** Returns None
369**
370*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530371void nfa_p2p_proc_llcp_disconnect_ind(tLLCP_SAP_CBACK_DATA* p_data) {
372 uint8_t local_sap, xx;
373 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530374
nxf24591c1cbeab2018-02-21 17:32:26 +0530375 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530376
nxpandroid8f6d0532017-07-12 18:25:30 +0530377 local_sap = p_data->disconnect_ind.local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530378
nxpandroid8f6d0532017-07-12 18:25:30 +0530379 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
380 xx = nfa_p2p_find_conn_cb(p_data->disconnect_ind.local_sap,
381 p_data->disconnect_ind.remote_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530382
nxpandroid8f6d0532017-07-12 18:25:30 +0530383 if (xx != LLCP_MAX_DATA_LINK) {
384 evt_data.disc.handle =
385 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
386 evt_data.disc.reason = NFA_P2P_DISC_REASON_REMOTE_INITIATE;
nxpandroidc7611652015-09-23 16:42:05 +0530387
nxpandroid8f6d0532017-07-12 18:25:30 +0530388 nfa_p2p_deallocate_conn_cb(xx);
nxpandroidc7611652015-09-23 16:42:05 +0530389
nxpandroid8f6d0532017-07-12 18:25:30 +0530390 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
391 } else {
392 /*
393 ** LLCP link has been deactivated before receiving CC or DM.
394 ** Return NFA_P2P_DISC_EVT to indicate failure of creating
395 ** connection
396 */
nxpandroidc7611652015-09-23 16:42:05 +0530397
nxpandroid8f6d0532017-07-12 18:25:30 +0530398 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
399 evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
nxpandroidc7611652015-09-23 16:42:05 +0530400
nxpandroid8f6d0532017-07-12 18:25:30 +0530401 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530402
nxf24591c1cbeab2018-02-21 17:32:26 +0530403 LOG(ERROR) << StringPrintf("Link deactivated");
nxpandroidc7611652015-09-23 16:42:05 +0530404 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530405 }
nxpandroidc7611652015-09-23 16:42:05 +0530406}
407
408/*******************************************************************************
409**
410** Function nfa_p2p_proc_llcp_disconnect_resp
411**
412** Description Processing rejected connection from peer
413**
414**
415** Returns None
416**
417*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530418void nfa_p2p_proc_llcp_disconnect_resp(tLLCP_SAP_CBACK_DATA* p_data) {
419 uint8_t local_sap, xx;
420 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530421
nxf24591c1cbeab2018-02-21 17:32:26 +0530422 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530423
nxpandroid8f6d0532017-07-12 18:25:30 +0530424 local_sap = p_data->disconnect_resp.local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530425
nxpandroid8f6d0532017-07-12 18:25:30 +0530426 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
427 if (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_RESP_DISC) {
428 evt_data.disc.reason = NFA_P2P_DISC_REASON_LOCAL_INITITATE;
429 } else if ((p_data->disconnect_resp.reason ==
430 LLCP_SAP_DM_REASON_APP_REJECTED) ||
431 (p_data->disconnect_resp.reason ==
432 LLCP_SAP_DM_REASON_PERM_REJECT_THIS) ||
433 (p_data->disconnect_resp.reason ==
434 LLCP_SAP_DM_REASON_PERM_REJECT_ANY) ||
435 (p_data->disconnect_resp.reason ==
436 LLCP_SAP_DM_REASON_TEMP_REJECT_THIS) ||
437 (p_data->disconnect_resp.reason ==
438 LLCP_SAP_DM_REASON_TEMP_REJECT_ANY)) {
439 evt_data.disc.reason = NFA_P2P_DISC_REASON_REMOTE_REJECT;
440 } else if (p_data->disconnect_resp.reason ==
441 LLCP_SAP_DM_REASON_NO_SERVICE) {
442 evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_SERVICE;
443 } else if (p_data->disconnect_resp.reason ==
444 LLCP_SAP_DM_REASON_NO_ACTIVE_CONNECTION) {
445 evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
446 } else {
447 evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_INFORMATION;
nxpandroidc7611652015-09-23 16:42:05 +0530448 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530449
450 if (evt_data.disc.reason == NFA_P2P_DISC_REASON_LOCAL_INITITATE) {
451 xx = nfa_p2p_find_conn_cb(p_data->disconnect_resp.local_sap,
452 p_data->disconnect_resp.remote_sap);
453
454 if (xx != LLCP_MAX_DATA_LINK) {
455 evt_data.disc.handle =
456 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
457
458 nfa_p2p_deallocate_conn_cb(xx);
459
460 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
461 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530462 LOG(ERROR) << StringPrintf("No connection found");
nxpandroid8f6d0532017-07-12 18:25:30 +0530463 }
464 } else {
465 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
466 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
467 }
468 }
nxpandroidc7611652015-09-23 16:42:05 +0530469}
470
471/*******************************************************************************
472**
473** Function nfa_p2p_proc_llcp_congest
474**
475** Description Processing LLCP congestion event
476**
477**
478** Returns None
479**
480*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530481void nfa_p2p_proc_llcp_congestion(tLLCP_SAP_CBACK_DATA* p_data) {
482 uint8_t local_sap, remote_sap, xx;
483 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530484
nxpandroid8f6d0532017-07-12 18:25:30 +0530485 local_sap = p_data->congest.local_sap;
486 remote_sap = p_data->congest.remote_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530487
nxpandroid8f6d0532017-07-12 18:25:30 +0530488 evt_data.congest.link_type = p_data->congest.link_type;
489 evt_data.congest.is_congested = p_data->congest.is_congested;
nxpandroidc7611652015-09-23 16:42:05 +0530490
nxpandroid8f6d0532017-07-12 18:25:30 +0530491 if (p_data->congest.is_congested) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530492 DLOG_IF(INFO, nfc_debug_enabled)
493 << StringPrintf("START SAP=(0x%x,0x%x)", local_sap, remote_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530494
nxpandroid8f6d0532017-07-12 18:25:30 +0530495 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530496 DLOG_IF(INFO, nfc_debug_enabled)
497 << StringPrintf("END SAP=(0x%x,0x%x)", local_sap, remote_sap);
nxpandroid8f6d0532017-07-12 18:25:30 +0530498 }
nxpandroidc7611652015-09-23 16:42:05 +0530499
nxpandroid8f6d0532017-07-12 18:25:30 +0530500 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
501 if (evt_data.congest.link_type == NFA_P2P_LLINK_TYPE) {
502 evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
nxpandroidc7611652015-09-23 16:42:05 +0530503
nxpandroid8f6d0532017-07-12 18:25:30 +0530504 if ((evt_data.congest.is_congested == false) &&
505 (nfa_p2p_cb.sap_cb[local_sap].flags &
506 NFA_P2P_SAP_FLAG_LLINK_CONGESTED)) {
507 nfa_p2p_cb.sap_cb[local_sap].flags &= ~NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
508 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
509 } else if ((evt_data.congest.is_congested == true) &&
510 (!(nfa_p2p_cb.sap_cb[local_sap].flags &
511 NFA_P2P_SAP_FLAG_LLINK_CONGESTED))) {
512 /* this is overall congestion due to high usage of buffer pool */
513 nfa_p2p_cb.sap_cb[local_sap].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
514 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
515 }
516 } else {
517 xx = nfa_p2p_find_conn_cb(local_sap, remote_sap);
518
519 if (xx != LLCP_MAX_DATA_LINK) {
520 evt_data.congest.handle =
521 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
522
523 if ((evt_data.congest.is_congested == false) &&
524 (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED)) {
525 nfa_p2p_cb.conn_cb[xx].flags &= ~NFA_P2P_CONN_FLAG_CONGESTED;
526 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
527 } else if ((evt_data.congest.is_congested == true) &&
528 (!(nfa_p2p_cb.conn_cb[xx].flags &
529 NFA_P2P_CONN_FLAG_CONGESTED))) {
530 /* this is overall congestion due to high usage of buffer pool */
531 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
532 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530533 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530534 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530535 LOG(ERROR) << StringPrintf("No connection found");
nxpandroid8f6d0532017-07-12 18:25:30 +0530536 }
nxpandroidc7611652015-09-23 16:42:05 +0530537 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530538 }
nxpandroidc7611652015-09-23 16:42:05 +0530539}
540
541/*******************************************************************************
542**
543** Function nfa_p2p_proc_llcp_link_status
544**
545** Description Processing LLCP link status
546**
547**
548** Returns next state after processing this event
549**
550*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530551void nfa_p2p_proc_llcp_link_status(tLLCP_SAP_CBACK_DATA* p_data) {
552 uint8_t local_sap, xx;
553 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530554
nxf24591c1cbeab2018-02-21 17:32:26 +0530555 DLOG_IF(INFO, nfc_debug_enabled)
556 << StringPrintf("is_activated:%d", p_data->link_status.is_activated);
nxpandroidc7611652015-09-23 16:42:05 +0530557
nxpandroid8f6d0532017-07-12 18:25:30 +0530558 local_sap = p_data->link_status.local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530559
nxpandroid8f6d0532017-07-12 18:25:30 +0530560 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
561 if (p_data->link_status.is_activated) {
562 /* only for server */
563 evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
564 evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu;
565 evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
566
567 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_ACTIVATED_EVT, &evt_data);
568 } else /* if LLCP link is deactivated */
nxpandroidc7611652015-09-23 16:42:05 +0530569 {
nxpandroid8f6d0532017-07-12 18:25:30 +0530570 for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) {
571 if ((nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) &&
572 (nfa_p2p_cb.conn_cb[xx].local_sap == local_sap)) {
573 evt_data.disc.handle =
574 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
575 evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
nxpandroidc7611652015-09-23 16:42:05 +0530576
nxpandroid8f6d0532017-07-12 18:25:30 +0530577 nfa_p2p_deallocate_conn_cb(xx);
578 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530579 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530580 }
nxpandroidc7611652015-09-23 16:42:05 +0530581
nxpandroid8f6d0532017-07-12 18:25:30 +0530582 /* notify deactivation and clear flags */
583 if (nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_SERVER) {
584 evt_data.deactivated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
585 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DEACTIVATED_EVT,
586 &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530587
nxpandroid8f6d0532017-07-12 18:25:30 +0530588 nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_SERVER;
589 } else if (nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_CLIENT) {
590 evt_data.deactivated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
591 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DEACTIVATED_EVT,
592 &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530593
nxpandroid8f6d0532017-07-12 18:25:30 +0530594 nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_CLIENT;
595 } else /* if this is not registered service */
596 {
597 nfa_p2p_cb.sap_cb[local_sap].p_cback = NULL;
598 }
nxpandroidc7611652015-09-23 16:42:05 +0530599 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530600 }
nxpandroidc7611652015-09-23 16:42:05 +0530601}
602
603/*******************************************************************************
604**
605** Function nfa_p2p_reg_server
606**
607** Description Allocate a service as server and register to LLCP
608**
609**
nxf24591c1cbeab2018-02-21 17:32:26 +0530610** Returns FALSE if need to keep buffer
nxpandroidc7611652015-09-23 16:42:05 +0530611**
612*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530613bool nfa_p2p_reg_server(tNFA_P2P_MSG* p_msg) {
614 tNFA_P2P_EVT_DATA evt_data;
615 uint8_t server_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530616
nxf24591c1cbeab2018-02-21 17:32:26 +0530617 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530618
nxpandroid8f6d0532017-07-12 18:25:30 +0530619 server_sap = LLCP_RegisterServer(
620 p_msg->api_reg_server.server_sap, p_msg->api_reg_server.link_type,
621 p_msg->api_reg_server.service_name, nfa_p2p_llcp_cback);
nxpandroidc7611652015-09-23 16:42:05 +0530622
nxpandroid8f6d0532017-07-12 18:25:30 +0530623 if (server_sap == LLCP_INVALID_SAP) {
624 evt_data.reg_server.server_handle = NFA_HANDLE_INVALID;
625 evt_data.reg_server.server_sap = NFA_P2P_INVALID_SAP;
626 strncpy(evt_data.reg_server.service_name,
627 p_msg->api_reg_server.service_name, LLCP_MAX_SN_LEN);
nxpandroidc7611652015-09-23 16:42:05 +0530628 evt_data.reg_server.service_name[LLCP_MAX_SN_LEN] = 0;
629
nxpandroid8f6d0532017-07-12 18:25:30 +0530630 p_msg->api_reg_server.p_cback(NFA_P2P_REG_SERVER_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530631
nxpandroid8f6d0532017-07-12 18:25:30 +0530632 return true;
633 }
nxpandroidc7611652015-09-23 16:42:05 +0530634
nxpandroid8f6d0532017-07-12 18:25:30 +0530635 /* if need to update WKS in LLCP Gen bytes */
636 if (server_sap <= LLCP_UPPER_BOUND_WK_SAP) {
637 nfa_p2p_enable_listening(NFA_ID_P2P, true);
638 } else if (!nfa_p2p_cb.is_p2p_listening) {
639 nfa_p2p_enable_listening(NFA_ID_P2P, false);
640 }
nxpandroidc7611652015-09-23 16:42:05 +0530641
nxpandroid8f6d0532017-07-12 18:25:30 +0530642 nfa_p2p_cb.sap_cb[server_sap].p_cback = p_msg->api_reg_server.p_cback;
643 nfa_p2p_cb.sap_cb[server_sap].flags = NFA_P2P_SAP_FLAG_SERVER;
644
645 evt_data.reg_server.server_handle = (NFA_HANDLE_GROUP_P2P | server_sap);
646 evt_data.reg_server.server_sap = server_sap;
647 strncpy(evt_data.reg_server.service_name, p_msg->api_reg_server.service_name,
648 LLCP_MAX_SN_LEN);
649 evt_data.reg_server.service_name[LLCP_MAX_SN_LEN] = 0;
650
651 /* notify NFA_P2P_REG_SERVER_EVT to server */
652 nfa_p2p_cb.sap_cb[server_sap].p_cback(NFA_P2P_REG_SERVER_EVT, &evt_data);
653
654 /* if LLCP is already activated */
655 if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED) {
656 evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | server_sap);
657 evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu;
658 evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
659
660 /* notify NFA_P2P_ACTIVATED_EVT to server */
661 nfa_p2p_cb.sap_cb[server_sap].p_cback(NFA_P2P_ACTIVATED_EVT, &evt_data);
662 }
663
664 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530665}
666
667/*******************************************************************************
668**
669** Function nfa_p2p_reg_client
670**
671** Description Allocate a service as client and register to LLCP
672**
673**
nxf24591c1cbeab2018-02-21 17:32:26 +0530674** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +0530675**
676*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530677bool nfa_p2p_reg_client(tNFA_P2P_MSG* p_msg) {
678 tNFA_P2P_EVT_DATA evt_data;
679 uint8_t local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530680
nxf24591c1cbeab2018-02-21 17:32:26 +0530681 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530682
nxpandroid8f6d0532017-07-12 18:25:30 +0530683 local_sap =
684 LLCP_RegisterClient(p_msg->api_reg_client.link_type, nfa_p2p_llcp_cback);
nxpandroidc7611652015-09-23 16:42:05 +0530685
nxpandroid8f6d0532017-07-12 18:25:30 +0530686 if (local_sap == LLCP_INVALID_SAP) {
687 evt_data.reg_client.client_handle = NFA_HANDLE_INVALID;
688 p_msg->api_reg_client.p_cback(NFA_P2P_REG_CLIENT_EVT, &evt_data);
689 return true;
690 }
nxpandroidc7611652015-09-23 16:42:05 +0530691
nxpandroid8f6d0532017-07-12 18:25:30 +0530692 nfa_p2p_cb.sap_cb[local_sap].p_cback = p_msg->api_reg_client.p_cback;
693 nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_CLIENT;
nxpandroidc7611652015-09-23 16:42:05 +0530694
nxpandroid8f6d0532017-07-12 18:25:30 +0530695 evt_data.reg_client.client_handle = (NFA_HANDLE_GROUP_P2P | local_sap);
696 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_REG_CLIENT_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530697
nxpandroid8f6d0532017-07-12 18:25:30 +0530698 /* if LLCP is already activated */
699 if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED) {
700 evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
701 evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu;
702 evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
nxpandroidc7611652015-09-23 16:42:05 +0530703
nxpandroid8f6d0532017-07-12 18:25:30 +0530704 /* notify NFA_P2P_ACTIVATED_EVT to client */
705 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_ACTIVATED_EVT, &evt_data);
706 }
nxpandroidc7611652015-09-23 16:42:05 +0530707
nxpandroid8f6d0532017-07-12 18:25:30 +0530708 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530709}
710
711/*******************************************************************************
712**
713** Function nfa_p2p_dereg
714**
nxpandroid8f6d0532017-07-12 18:25:30 +0530715** Description Deallocate a service as server or client and deregister to
716** LLCP. LLCP will deallocate data link connection created by
717** this server
nxpandroidc7611652015-09-23 16:42:05 +0530718**
nxf24591c1cbeab2018-02-21 17:32:26 +0530719** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +0530720**
721*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530722bool nfa_p2p_dereg(tNFA_P2P_MSG* p_msg) {
723 uint8_t local_sap, xx;
nxpandroidc7611652015-09-23 16:42:05 +0530724
nxf24591c1cbeab2018-02-21 17:32:26 +0530725 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530726
nxpandroid8f6d0532017-07-12 18:25:30 +0530727 local_sap = (uint8_t)(p_msg->api_dereg.handle & NFA_HANDLE_MASK);
nxpandroidc7611652015-09-23 16:42:05 +0530728
nxpandroid8f6d0532017-07-12 18:25:30 +0530729 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
730 for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) {
731 if ((nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) &&
732 (nfa_p2p_cb.conn_cb[xx].local_sap == local_sap)) {
733 nfa_p2p_deallocate_conn_cb(xx);
734 }
735 }
736 }
737
738 LLCP_Deregister(local_sap);
739 nfa_p2p_cb.sap_cb[local_sap].p_cback = NULL;
740
741 if (nfa_p2p_cb.is_p2p_listening) {
742 /* check if this is the last server on NFA P2P */
743 for (xx = 0; xx < NFA_P2P_NUM_SAP; xx++) {
744 if ((nfa_p2p_cb.sap_cb[xx].p_cback) &&
745 (nfa_p2p_cb.sap_cb[xx].flags & NFA_P2P_SAP_FLAG_SERVER)) {
746 break;
747 }
nxpandroidc7611652015-09-23 16:42:05 +0530748 }
749
nxpandroid8f6d0532017-07-12 18:25:30 +0530750 if (xx >= NFA_P2P_NUM_SAP) {
751 /* if need to update WKS in LLCP Gen bytes */
752 if (local_sap <= LLCP_UPPER_BOUND_WK_SAP)
753 nfa_p2p_disable_listening(NFA_ID_P2P, true);
754 else
755 nfa_p2p_disable_listening(NFA_ID_P2P, false);
nxpandroidc7611652015-09-23 16:42:05 +0530756 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530757 /* if need to update WKS in LLCP Gen bytes */
758 else if (local_sap <= LLCP_UPPER_BOUND_WK_SAP) {
759 nfa_p2p_enable_listening(NFA_ID_P2P, true);
760 }
761 }
nxpandroidc7611652015-09-23 16:42:05 +0530762
nxpandroid8f6d0532017-07-12 18:25:30 +0530763 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530764}
765
766/*******************************************************************************
767**
768** Function nfa_p2p_accept_connection
769**
770** Description Connection Confirm from local application
771**
772**
nxf24591c1cbeab2018-02-21 17:32:26 +0530773** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +0530774**
775*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530776bool nfa_p2p_accept_connection(tNFA_P2P_MSG* p_msg) {
777 uint8_t xx;
778 tLLCP_CONNECTION_PARAMS params;
nxpandroidc7611652015-09-23 16:42:05 +0530779
nxf24591c1cbeab2018-02-21 17:32:26 +0530780 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530781
nxpandroid8f6d0532017-07-12 18:25:30 +0530782 xx = (uint8_t)(p_msg->api_accept.conn_handle & NFA_HANDLE_MASK);
783 xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
nxpandroidc7611652015-09-23 16:42:05 +0530784
nxpandroid8f6d0532017-07-12 18:25:30 +0530785 params.miu = p_msg->api_accept.miu;
786 params.rw = p_msg->api_accept.rw;
787 params.sn[0] = 0;
nxpandroidc7611652015-09-23 16:42:05 +0530788
nxpandroid8f6d0532017-07-12 18:25:30 +0530789 LLCP_ConnectCfm(nfa_p2p_cb.conn_cb[xx].local_sap,
790 nfa_p2p_cb.conn_cb[xx].remote_sap, &params);
nxpandroidc7611652015-09-23 16:42:05 +0530791
nxpandroid8f6d0532017-07-12 18:25:30 +0530792 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530793}
794
795/*******************************************************************************
796**
797** Function nfa_p2p_reject_connection
798**
799** Description Reject connection by local application
800**
801**
nxf24591c1cbeab2018-02-21 17:32:26 +0530802** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +0530803**
804*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530805bool nfa_p2p_reject_connection(tNFA_P2P_MSG* p_msg) {
806 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +0530807
nxf24591c1cbeab2018-02-21 17:32:26 +0530808 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530809
nxpandroid8f6d0532017-07-12 18:25:30 +0530810 xx = (uint8_t)(p_msg->api_reject.conn_handle & NFA_HANDLE_MASK);
811 xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
nxpandroidc7611652015-09-23 16:42:05 +0530812
nxpandroid8f6d0532017-07-12 18:25:30 +0530813 LLCP_ConnectReject(nfa_p2p_cb.conn_cb[xx].local_sap,
814 nfa_p2p_cb.conn_cb[xx].remote_sap,
815 LLCP_SAP_DM_REASON_APP_REJECTED);
nxpandroidc7611652015-09-23 16:42:05 +0530816
nxpandroid8f6d0532017-07-12 18:25:30 +0530817 /* no need to deregister service on LLCP */
818 nfa_p2p_deallocate_conn_cb(xx);
nxpandroidc7611652015-09-23 16:42:05 +0530819
nxpandroid8f6d0532017-07-12 18:25:30 +0530820 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530821}
822
823/*******************************************************************************
824**
825** Function nfa_p2p_disconnect
826**
827** Description Disconnect data link connection by local application
828**
829**
nxf24591c1cbeab2018-02-21 17:32:26 +0530830** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +0530831**
832*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530833bool nfa_p2p_disconnect(tNFA_P2P_MSG* p_msg) {
834 uint8_t local_sap, xx;
835 tLLCP_STATUS status;
836 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530837
nxf24591c1cbeab2018-02-21 17:32:26 +0530838 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530839
nxpandroid8f6d0532017-07-12 18:25:30 +0530840 xx = (uint8_t)(p_msg->api_disconnect.conn_handle & NFA_HANDLE_MASK);
nxpandroidc7611652015-09-23 16:42:05 +0530841
nxpandroid8f6d0532017-07-12 18:25:30 +0530842 /* if this is for data link connection */
843 if (xx & NFA_P2P_HANDLE_FLAG_CONN) {
844 xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
nxpandroidc7611652015-09-23 16:42:05 +0530845
nxpandroid8f6d0532017-07-12 18:25:30 +0530846 status = LLCP_DisconnectReq(nfa_p2p_cb.conn_cb[xx].local_sap,
847 nfa_p2p_cb.conn_cb[xx].remote_sap,
848 p_msg->api_disconnect.flush);
nxpandroidc7611652015-09-23 16:42:05 +0530849
nxpandroid8f6d0532017-07-12 18:25:30 +0530850 if (status == LLCP_STATUS_SUCCESS) {
851 /* wait for disconnect response if successful */
852 return true;
853 } else {
854 /*
855 ** while we are waiting for connect confirm,
856 ** we cannot sent DISC because we don't know DSAP yet
857 */
858 local_sap = nfa_p2p_cb.conn_cb[xx].local_sap;
nxpandroidc7611652015-09-23 16:42:05 +0530859
nxpandroid8f6d0532017-07-12 18:25:30 +0530860 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
861 evt_data.disc.handle =
862 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
863 evt_data.disc.reason = NFA_P2P_DISC_REASON_LOCAL_INITITATE;
nxpandroidc7611652015-09-23 16:42:05 +0530864
nxpandroid8f6d0532017-07-12 18:25:30 +0530865 nfa_p2p_deallocate_conn_cb(xx);
866 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
867 }
nxpandroidc7611652015-09-23 16:42:05 +0530868 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530869 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530870 LOG(ERROR) << StringPrintf("Handle is not for Data link connection");
nxpandroid8f6d0532017-07-12 18:25:30 +0530871 }
nxpandroidc7611652015-09-23 16:42:05 +0530872
nxpandroid8f6d0532017-07-12 18:25:30 +0530873 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530874}
875
876/*******************************************************************************
877**
878** Function nfa_p2p_create_data_link_connection
879**
880** Description Create data link connection
881**
882**
nxf24591c1cbeab2018-02-21 17:32:26 +0530883** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +0530884**
885*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530886bool nfa_p2p_create_data_link_connection(tNFA_P2P_MSG* p_msg) {
887 uint8_t local_sap;
888 tNFA_P2P_EVT_DATA evt_data;
889 tLLCP_CONNECTION_PARAMS conn_params;
890 tLLCP_STATUS status;
nxpandroidc7611652015-09-23 16:42:05 +0530891
nxf24591c1cbeab2018-02-21 17:32:26 +0530892 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530893
nxpandroid8f6d0532017-07-12 18:25:30 +0530894 local_sap = (uint8_t)(p_msg->api_connect.client_handle & NFA_HANDLE_MASK);
nxpandroidc7611652015-09-23 16:42:05 +0530895
nxpandroid8f6d0532017-07-12 18:25:30 +0530896 conn_params.miu = p_msg->api_connect.miu;
897 conn_params.rw = p_msg->api_connect.rw;
nxpandroidc7611652015-09-23 16:42:05 +0530898
nxpandroid8f6d0532017-07-12 18:25:30 +0530899 /* NFA_P2pConnectBySap () */
900 if (p_msg->api_connect.dsap != LLCP_INVALID_SAP) {
901 conn_params.sn[0] = 0;
902 status = LLCP_ConnectReq(local_sap, p_msg->api_connect.dsap, &conn_params);
903 }
904 /* NFA_P2pConnectByName () */
905 else {
906 strncpy(conn_params.sn, p_msg->api_connect.service_name, LLCP_MAX_SN_LEN);
907 conn_params.sn[LLCP_MAX_SN_LEN] = 0;
nxpandroidc7611652015-09-23 16:42:05 +0530908
nxpandroid8f6d0532017-07-12 18:25:30 +0530909 status = LLCP_ConnectReq(local_sap, LLCP_SAP_SDP, &conn_params);
910 }
nxpandroidc7611652015-09-23 16:42:05 +0530911
nxpandroid8f6d0532017-07-12 18:25:30 +0530912 if (status != LLCP_STATUS_SUCCESS) {
913 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
914 evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_INFORMATION;
nxpandroidc7611652015-09-23 16:42:05 +0530915
nxpandroid8f6d0532017-07-12 18:25:30 +0530916 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
917 }
nxpandroidc7611652015-09-23 16:42:05 +0530918
nxpandroid8f6d0532017-07-12 18:25:30 +0530919 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530920}
921
922/*******************************************************************************
923**
924** Function nfa_p2p_send_ui
925**
926** Description Send UI PDU
927**
928**
nxf24591c1cbeab2018-02-21 17:32:26 +0530929** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +0530930**
931*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530932bool nfa_p2p_send_ui(tNFA_P2P_MSG* p_msg) {
933 uint8_t local_sap;
934 tLLCP_STATUS status;
935 tNFA_P2P_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530936
nxf24591c1cbeab2018-02-21 17:32:26 +0530937 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530938
nxpandroid8f6d0532017-07-12 18:25:30 +0530939 local_sap = (uint8_t)(p_msg->api_send_ui.handle & NFA_HANDLE_MASK);
nxpandroidc7611652015-09-23 16:42:05 +0530940
nxpandroid8f6d0532017-07-12 18:25:30 +0530941 /* decrease number of tx UI PDU which is not processed by NFA for congestion
942 * control */
943 if (nfa_p2p_cb.sap_cb[local_sap].num_pending_ui_pdu)
944 nfa_p2p_cb.sap_cb[local_sap].num_pending_ui_pdu--;
nxpandroidc7611652015-09-23 16:42:05 +0530945
nxpandroid8f6d0532017-07-12 18:25:30 +0530946 if (nfa_p2p_cb.total_pending_ui_pdu) nfa_p2p_cb.total_pending_ui_pdu--;
nxpandroidc7611652015-09-23 16:42:05 +0530947
nxpandroid8f6d0532017-07-12 18:25:30 +0530948 status =
949 LLCP_SendUI(local_sap, p_msg->api_send_ui.dsap, p_msg->api_send_ui.p_msg);
nxpandroidc7611652015-09-23 16:42:05 +0530950
nxpandroid8f6d0532017-07-12 18:25:30 +0530951 if (status == LLCP_STATUS_CONGESTED) {
952 if (!(nfa_p2p_cb.sap_cb[local_sap].flags &
953 NFA_P2P_SAP_FLAG_LLINK_CONGESTED)) {
954 nfa_p2p_cb.sap_cb[local_sap].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
nxpandroidc7611652015-09-23 16:42:05 +0530955
nxpandroid8f6d0532017-07-12 18:25:30 +0530956 /* notify that this logical link is congested */
957 evt_data.congest.link_type = NFA_P2P_LLINK_TYPE;
958 evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
959 evt_data.congest.is_congested = true;
nxpandroidc7611652015-09-23 16:42:05 +0530960
nxpandroid8f6d0532017-07-12 18:25:30 +0530961 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530962 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530963 }
nxpandroidc7611652015-09-23 16:42:05 +0530964
nxpandroid8f6d0532017-07-12 18:25:30 +0530965 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530966}
967
968/*******************************************************************************
969**
970** Function nfa_p2p_send_data
971**
972** Description Send I PDU
973**
974**
nxf24591c1cbeab2018-02-21 17:32:26 +0530975** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +0530976**
977*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530978bool nfa_p2p_send_data(tNFA_P2P_MSG* p_msg) {
979 tNFA_P2P_EVT_DATA evt_data;
980 tLLCP_STATUS status;
981 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +0530982
nxf24591c1cbeab2018-02-21 17:32:26 +0530983 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530984
nxpandroid8f6d0532017-07-12 18:25:30 +0530985 xx = (uint8_t)(p_msg->api_send_data.conn_handle & NFA_HANDLE_MASK);
986 xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
nxpandroidc7611652015-09-23 16:42:05 +0530987
nxpandroid8f6d0532017-07-12 18:25:30 +0530988 /* decrease number of tx I PDU which is not processed by NFA for congestion
989 * control */
990 if (nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu)
991 nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu--;
nxpandroidc7611652015-09-23 16:42:05 +0530992
nxpandroid8f6d0532017-07-12 18:25:30 +0530993 if (nfa_p2p_cb.total_pending_i_pdu) nfa_p2p_cb.total_pending_i_pdu--;
nxpandroidc7611652015-09-23 16:42:05 +0530994
nxpandroid8f6d0532017-07-12 18:25:30 +0530995 status = LLCP_SendData(nfa_p2p_cb.conn_cb[xx].local_sap,
996 nfa_p2p_cb.conn_cb[xx].remote_sap,
997 p_msg->api_send_data.p_msg);
nxpandroidc7611652015-09-23 16:42:05 +0530998
nxpandroid8f6d0532017-07-12 18:25:30 +0530999 if (status == LLCP_STATUS_CONGESTED) {
1000 if (!(nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED)) {
1001 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
nxpandroidc7611652015-09-23 16:42:05 +05301002
nxpandroid8f6d0532017-07-12 18:25:30 +05301003 /* notify that this data link is congested */
1004 evt_data.congest.link_type = NFA_P2P_DLINK_TYPE;
1005 evt_data.congest.handle =
1006 (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
1007 evt_data.congest.is_congested = true;
nxpandroidc7611652015-09-23 16:42:05 +05301008
nxpandroid8f6d0532017-07-12 18:25:30 +05301009 nfa_p2p_cb.sap_cb[nfa_p2p_cb.conn_cb[xx].local_sap].p_cback(
1010 NFA_P2P_CONGEST_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301011 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301012 }
nxpandroidc7611652015-09-23 16:42:05 +05301013
nxpandroid8f6d0532017-07-12 18:25:30 +05301014 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301015}
1016
1017/*******************************************************************************
1018**
1019** Function nfa_p2p_set_local_busy
1020**
1021** Description Set or reset local busy
1022**
1023**
nxf24591c1cbeab2018-02-21 17:32:26 +05301024** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +05301025**
1026*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301027bool nfa_p2p_set_local_busy(tNFA_P2P_MSG* p_msg) {
1028 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +05301029
nxf24591c1cbeab2018-02-21 17:32:26 +05301030 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301031
nxpandroid8f6d0532017-07-12 18:25:30 +05301032 xx = (uint8_t)(p_msg->api_local_busy.conn_handle & NFA_HANDLE_MASK);
1033 xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
nxpandroidc7611652015-09-23 16:42:05 +05301034
nxpandroid8f6d0532017-07-12 18:25:30 +05301035 LLCP_SetLocalBusyStatus(nfa_p2p_cb.conn_cb[xx].local_sap,
1036 nfa_p2p_cb.conn_cb[xx].remote_sap,
1037 p_msg->api_local_busy.is_busy);
nxpandroidc7611652015-09-23 16:42:05 +05301038
nxpandroid8f6d0532017-07-12 18:25:30 +05301039 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301040}
1041
1042/*******************************************************************************
1043**
1044** Function nfa_p2p_get_link_info
1045**
1046** Description Get WKS of remote and link MIU
1047**
1048**
nxf24591c1cbeab2018-02-21 17:32:26 +05301049** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +05301050**
1051*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301052bool nfa_p2p_get_link_info(tNFA_P2P_MSG* p_msg) {
1053 tNFA_P2P_EVT_DATA evt_data;
1054 uint8_t local_sap;
nxpandroidc7611652015-09-23 16:42:05 +05301055
nxf24591c1cbeab2018-02-21 17:32:26 +05301056 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301057
nxpandroid8f6d0532017-07-12 18:25:30 +05301058 evt_data.link_info.handle = p_msg->api_link_info.handle;
1059 evt_data.link_info.wks = LLCP_GetRemoteWKS();
1060 evt_data.link_info.local_link_miu = nfa_p2p_cb.local_link_miu;
1061 evt_data.link_info.remote_link_miu = nfa_p2p_cb.remote_link_miu;
nxpandroidc7611652015-09-23 16:42:05 +05301062
nxpandroid8f6d0532017-07-12 18:25:30 +05301063 local_sap = (uint8_t)(p_msg->api_link_info.handle & NFA_HANDLE_MASK);
1064 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_LINK_INFO_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301065
nxpandroid8f6d0532017-07-12 18:25:30 +05301066 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301067}
1068
1069/*******************************************************************************
1070**
1071** Function nfa_p2p_get_remote_sap
1072**
1073** Description Get remote SAP
1074**
1075**
nxf24591c1cbeab2018-02-21 17:32:26 +05301076** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +05301077**
1078*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301079bool nfa_p2p_get_remote_sap(tNFA_P2P_MSG* p_msg) {
1080 tNFA_P2P_EVT_DATA evt_data;
1081 uint8_t local_sap;
nxpandroidc7611652015-09-23 16:42:05 +05301082
nxf24591c1cbeab2018-02-21 17:32:26 +05301083 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301084
nxpandroid8f6d0532017-07-12 18:25:30 +05301085 local_sap = (uint8_t)(p_msg->api_remote_sap.handle & NFA_HANDLE_MASK);
nxpandroidc7611652015-09-23 16:42:05 +05301086
nxpandroid8f6d0532017-07-12 18:25:30 +05301087 if (!nfa_p2p_start_sdp(p_msg->api_remote_sap.service_name, local_sap)) {
1088 evt_data.sdp.handle = p_msg->api_remote_sap.handle;
1089 evt_data.sdp.remote_sap = 0x00;
1090 nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_SDP_EVT, &evt_data);
1091 }
nxpandroidc7611652015-09-23 16:42:05 +05301092
nxpandroid8f6d0532017-07-12 18:25:30 +05301093 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301094}
1095
1096/*******************************************************************************
1097**
1098** Function nfa_p2p_set_llcp_cfg
1099**
1100** Description Set LLCP configuration
1101**
1102**
nxf24591c1cbeab2018-02-21 17:32:26 +05301103** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +05301104**
1105*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301106bool nfa_p2p_set_llcp_cfg(tNFA_P2P_MSG* p_msg) {
1107 LLCP_SetConfig(p_msg->api_set_llcp_cfg.link_miu, p_msg->api_set_llcp_cfg.opt,
1108 p_msg->api_set_llcp_cfg.wt,
1109 p_msg->api_set_llcp_cfg.link_timeout,
1110 p_msg->api_set_llcp_cfg.inact_timeout_init,
1111 p_msg->api_set_llcp_cfg.inact_timeout_target,
1112 p_msg->api_set_llcp_cfg.symm_delay,
1113 p_msg->api_set_llcp_cfg.data_link_timeout,
1114 p_msg->api_set_llcp_cfg.delay_first_pdu_timeout);
nxpandroidc7611652015-09-23 16:42:05 +05301115
nxpandroid8f6d0532017-07-12 18:25:30 +05301116 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301117}
1118
1119/*******************************************************************************
1120**
1121** Function nfa_p2p_restart_rf_discovery
1122**
1123** Description Restart RF discovery by deactivating to IDLE
1124**
1125**
nxf24591c1cbeab2018-02-21 17:32:26 +05301126** Returns TRUE to deallocate buffer
nxpandroidc7611652015-09-23 16:42:05 +05301127**
1128*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301129bool nfa_p2p_restart_rf_discovery(__attribute__((unused)) tNFA_P2P_MSG* p_msg) {
1130 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301131
nxpandroid8f6d0532017-07-12 18:25:30 +05301132 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
nxpandroidc7611652015-09-23 16:42:05 +05301133
nxpandroid8f6d0532017-07-12 18:25:30 +05301134 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301135}