nfa_p2p_act.c revision 552f2b745deddd35d9b75da9c9c09bd2f3f573a8
1/******************************************************************************
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
19
20/******************************************************************************
21 *
22 *  This is the implementation file for the NFA P2P.
23 *
24 ******************************************************************************/
25
26#include "string.h"
27#include "nfc_api.h"
28#include "nfa_sys.h"
29#include "nfa_sys_int.h"
30#include "nfa_dm_int.h"
31#include "llcp_defs.h"
32#include "llcp_api.h"
33#include "nfa_p2p_api.h"
34#include "nfa_p2p_int.h"
35
36/*****************************************************************************
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**
55** Returns          uint8_t
56**
57*******************************************************************************/
58static uint8_t nfa_p2p_allocate_conn_cb (uint8_t local_sap)
59{
60    uint8_t xx;
61
62    for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++)
63    {
64        if (nfa_p2p_cb.conn_cb[xx].flags == 0)
65        {
66            nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_IN_USE;
67            nfa_p2p_cb.conn_cb[xx].local_sap = local_sap;
68
69            return (xx);
70        }
71    }
72
73    P2P_TRACE_ERROR0 ("nfa_p2p_allocate_conn_cb (): No resource");
74
75    return LLCP_MAX_DATA_LINK;
76}
77
78/*******************************************************************************
79**
80** Function         nfa_p2p_deallocate_conn_cb
81**
82** Description      Deallocate data link connection control block
83**
84**
85** Returns          void
86**
87*******************************************************************************/
88static void nfa_p2p_deallocate_conn_cb (uint8_t xx)
89{
90    if (xx < LLCP_MAX_DATA_LINK)
91    {
92        nfa_p2p_cb.conn_cb[xx].flags = 0;
93    }
94    else
95    {
96        P2P_TRACE_ERROR1 ("nfa_p2p_deallocate_conn_cb (): Invalid index (%d)", xx);
97    }
98}
99
100/*******************************************************************************
101**
102** Function         nfa_p2p_find_conn_cb
103**
104** Description      Find data link connection control block by local/remote SAP
105**
106**
107** Returns          uint8_t
108**
109*******************************************************************************/
110static uint8_t nfa_p2p_find_conn_cb (uint8_t local_sap, uint8_t remote_sap)
111{
112    uint8_t xx;
113
114    for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++)
115    {
116        if (  (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE)
117            &&(nfa_p2p_cb.conn_cb[xx].local_sap == local_sap)
118            &&(nfa_p2p_cb.conn_cb[xx].remote_sap == remote_sap)  )
119        {
120            return (xx);
121        }
122    }
123
124    return (LLCP_MAX_DATA_LINK);
125}
126
127/*******************************************************************************
128**
129** Function         nfa_p2p_llcp_cback
130**
131** Description      Processing SAP callback events from LLCP
132**
133**
134** Returns          None
135**
136*******************************************************************************/
137static void nfa_p2p_llcp_cback (tLLCP_SAP_CBACK_DATA *p_data)
138{
139    P2P_TRACE_DEBUG2 ("nfa_p2p_llcp_cback (): event:0x%02X, local_sap:0x%02X", p_data->hdr.event, p_data->hdr.local_sap);
140
141    switch (p_data->hdr.event)
142    {
143    case LLCP_SAP_EVT_DATA_IND:
144         nfa_p2p_proc_llcp_data_ind (p_data);
145        break;
146
147    case LLCP_SAP_EVT_CONNECT_IND:
148        nfa_p2p_proc_llcp_connect_ind (p_data);
149        break;
150
151    case LLCP_SAP_EVT_CONNECT_RESP:
152        nfa_p2p_proc_llcp_connect_resp (p_data);
153        break;
154
155    case LLCP_SAP_EVT_DISCONNECT_IND:
156        nfa_p2p_proc_llcp_disconnect_ind (p_data);
157        break;
158
159    case LLCP_SAP_EVT_DISCONNECT_RESP:
160        nfa_p2p_proc_llcp_disconnect_resp (p_data);
161        break;
162
163    case LLCP_SAP_EVT_CONGEST:
164        nfa_p2p_proc_llcp_congestion (p_data);
165        break;
166
167    case LLCP_SAP_EVT_LINK_STATUS:
168        nfa_p2p_proc_llcp_link_status (p_data);
169        break;
170
171    default:
172        P2P_TRACE_ERROR1 ("nfa_p2p_llcp_cback (): Unknown event:0x%02X", p_data->hdr.event);
173        return;
174    }
175}
176
177/*******************************************************************************
178**
179** Function         nfa_p2p_sdp_cback
180**
181** Description      Process SDP callback event from LLCP
182**
183**
184** Returns          None
185**
186*******************************************************************************/
187void nfa_p2p_sdp_cback (uint8_t tid, uint8_t remote_sap)
188{
189    uint8_t           local_sap;
190    uint8_t           xx;
191    tNFA_P2P_EVT_DATA evt_data;
192
193    P2P_TRACE_DEBUG2 ("nfa_p2p_sdp_cback (): tid:0x%02X, remote_sap:0x%02X", tid, remote_sap);
194
195    /* search for callback function to process */
196    for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++)
197    {
198        if (  (nfa_p2p_cb.sdp_cb[xx].local_sap != LLCP_INVALID_SAP)
199            &&(nfa_p2p_cb.sdp_cb[xx].tid == tid)  )
200        {
201            local_sap = nfa_p2p_cb.sdp_cb[xx].local_sap;
202
203            evt_data.sdp.handle     = (NFA_HANDLE_GROUP_P2P | local_sap);
204            evt_data.sdp.remote_sap = remote_sap;
205            nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_SDP_EVT, &evt_data);
206
207            nfa_p2p_cb.sdp_cb[xx].local_sap = LLCP_INVALID_SAP;
208            break;
209        }
210    }
211}
212
213/*******************************************************************************
214**
215** Function         nfa_p2p_start_sdp
216**
217** Description      Initiate SDP
218**
219**
220** Returns          TRUE if success
221**
222*******************************************************************************/
223bool    nfa_p2p_start_sdp (char *p_service_name, uint8_t local_sap)
224{
225    int xx;
226
227    P2P_TRACE_DEBUG1 ("nfa_p2p_start_sdp (): SN:<%s>", p_service_name);
228
229    /* search for empty slot */
230    for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++)
231    {
232        if (nfa_p2p_cb.sdp_cb[xx].local_sap == LLCP_INVALID_SAP)
233        {
234            if (LLCP_DiscoverService (p_service_name,
235                                      nfa_p2p_sdp_cback,
236                                      &(nfa_p2p_cb.sdp_cb[xx].tid)) == LLCP_STATUS_SUCCESS)
237            {
238                nfa_p2p_cb.sdp_cb[xx].local_sap    = local_sap;
239                return true;
240            }
241            else
242            {
243                /* failure of SDP */
244                return false;
245            }
246        }
247    }
248    return false;
249}
250
251/*******************************************************************************
252**
253** Function         nfa_p2p_proc_llcp_data_ind
254**
255** Description      Processing incoming data event from LLCP
256**
257**
258** Returns          None
259**
260*******************************************************************************/
261void nfa_p2p_proc_llcp_data_ind (tLLCP_SAP_CBACK_DATA  *p_data)
262{
263    uint8_t           local_sap, xx;
264    tNFA_P2P_EVT_DATA evt_data;
265
266    P2P_TRACE_DEBUG0 ("nfa_p2p_proc_llcp_data_ind ()");
267
268    local_sap = p_data->data_ind.local_sap;
269
270    if (nfa_p2p_cb.sap_cb[local_sap].p_cback)
271    {
272        evt_data.data.handle    = 0;
273        /* if connectionless */
274        if (p_data->data_ind.link_type == NFA_P2P_LLINK_TYPE)
275        {
276            evt_data.data.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
277        }
278        else
279        {
280            xx = nfa_p2p_find_conn_cb (p_data->data_ind.local_sap,
281                                       p_data->data_ind.remote_sap);
282
283            if (xx != LLCP_MAX_DATA_LINK)
284            {
285                evt_data.data.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
286            }
287        }
288
289        evt_data.data.remote_sap = p_data->data_ind.remote_sap;
290        evt_data.data.link_type  = p_data->data_ind.link_type;
291
292        /* notify upper layer that there are data at LLCP */
293        nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DATA_EVT, &evt_data);
294    }
295}
296
297/*******************************************************************************
298**
299** Function         nfa_p2p_proc_llcp_connect_ind
300**
301** Description      Processing connection request from peer
302**
303**
304** Returns          None
305**
306*******************************************************************************/
307void nfa_p2p_proc_llcp_connect_ind (tLLCP_SAP_CBACK_DATA  *p_data)
308{
309    uint8_t           server_sap, local_sap;
310    tNFA_P2P_EVT_DATA evt_data;
311    uint8_t           xx;
312
313    P2P_TRACE_DEBUG1 ("nfa_p2p_proc_llcp_connect_ind () server_sap:0x%x",
314                       p_data->connect_ind.server_sap);
315
316    server_sap = p_data->connect_ind.server_sap;
317    local_sap  = p_data->connect_ind.local_sap;
318
319    if (nfa_p2p_cb.sap_cb[server_sap].p_cback)
320    {
321        xx = nfa_p2p_allocate_conn_cb (server_sap);
322
323        if (xx != LLCP_MAX_DATA_LINK)
324        {
325            nfa_p2p_cb.conn_cb[xx].remote_sap = p_data->connect_ind.remote_sap;
326            nfa_p2p_cb.conn_cb[xx].remote_miu = p_data->connect_ind.miu;
327
328            /* peer will not receive any data */
329            if (p_data->connect_ind.rw == 0)
330                nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO;
331
332            evt_data.conn_req.server_handle = (NFA_HANDLE_GROUP_P2P | server_sap);
333            evt_data.conn_req.conn_handle   = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
334            evt_data.conn_req.remote_sap    = p_data->connect_ind.remote_sap;
335            evt_data.conn_req.remote_miu    = p_data->connect_ind.miu;
336            evt_data.conn_req.remote_rw     = p_data->connect_ind.rw;
337
338            nfa_p2p_cb.sap_cb[server_sap].p_cback (NFA_P2P_CONN_REQ_EVT, &evt_data);
339        }
340    }
341    else
342    {
343        P2P_TRACE_ERROR0 ("nfa_p2p_proc_llcp_connect_ind (): Not registered");
344    }
345}
346
347/*******************************************************************************
348**
349** Function         nfa_p2p_proc_llcp_connect_resp
350**
351** Description      Processing connection response from peer
352**
353**
354** Returns          None
355**
356*******************************************************************************/
357void nfa_p2p_proc_llcp_connect_resp (tLLCP_SAP_CBACK_DATA  *p_data)
358{
359    uint8_t           local_sap, xx;
360    tNFA_P2P_EVT_DATA evt_data;
361
362    P2P_TRACE_DEBUG0 ("nfa_p2p_proc_llcp_connect_resp ()");
363
364    local_sap  = p_data->connect_resp.local_sap;
365
366    if (nfa_p2p_cb.sap_cb[local_sap].p_cback)
367    {
368        xx = nfa_p2p_allocate_conn_cb (local_sap);
369
370        if (xx != LLCP_MAX_DATA_LINK)
371        {
372            nfa_p2p_cb.conn_cb[xx].remote_sap = p_data->connect_resp.remote_sap;
373            nfa_p2p_cb.conn_cb[xx].remote_miu = p_data->connect_resp.miu;
374
375            /* peer will not receive any data */
376            if (p_data->connect_resp.rw == 0)
377                nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO;
378
379            evt_data.connected.client_handle = (NFA_HANDLE_GROUP_P2P | local_sap);
380            evt_data.connected.conn_handle   = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
381            evt_data.connected.remote_sap    = p_data->connect_resp.remote_sap;
382            evt_data.connected.remote_miu    = p_data->connect_resp.miu;
383            evt_data.connected.remote_rw     = p_data->connect_resp.rw;
384
385            nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONNECTED_EVT, &evt_data);
386        }
387    }
388}
389
390/*******************************************************************************
391**
392** Function         nfa_p2p_proc_llcp_disconnect_ind
393**
394** Description      Processing disconnection request from peer
395**
396**
397** Returns          None
398**
399*******************************************************************************/
400void nfa_p2p_proc_llcp_disconnect_ind (tLLCP_SAP_CBACK_DATA  *p_data)
401{
402    uint8_t           local_sap, xx;
403    tNFA_P2P_EVT_DATA evt_data;
404
405    P2P_TRACE_DEBUG0 ("nfa_p2p_proc_llcp_disconnect_ind ()");
406
407    local_sap  = p_data->disconnect_ind.local_sap;
408
409    if (nfa_p2p_cb.sap_cb[local_sap].p_cback)
410    {
411        xx = nfa_p2p_find_conn_cb (p_data->disconnect_ind.local_sap,
412                                   p_data->disconnect_ind.remote_sap);
413
414        if (xx != LLCP_MAX_DATA_LINK)
415        {
416            evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
417            evt_data.disc.reason = NFA_P2P_DISC_REASON_REMOTE_INITIATE;
418
419            nfa_p2p_deallocate_conn_cb (xx);
420
421            nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data);
422        }
423        else
424        {
425            /*
426            ** LLCP link has been deactivated before receiving CC or DM.
427            ** Return NFA_P2P_DISC_EVT to indicate failure of creating
428            ** connection
429            */
430
431            evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
432            evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
433
434            nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data);
435
436            P2P_TRACE_ERROR0 ("nfa_p2p_proc_llcp_disconnect_ind (): Link deactivated");
437        }
438    }
439}
440
441/*******************************************************************************
442**
443** Function         nfa_p2p_proc_llcp_disconnect_resp
444**
445** Description      Processing rejected connection from peer
446**
447**
448** Returns          None
449**
450*******************************************************************************/
451void nfa_p2p_proc_llcp_disconnect_resp (tLLCP_SAP_CBACK_DATA  *p_data)
452{
453    uint8_t           local_sap, xx;
454    tNFA_P2P_EVT_DATA evt_data;
455
456    P2P_TRACE_DEBUG0 ("nfa_p2p_proc_llcp_disconnect_resp ()");
457
458    local_sap  = p_data->disconnect_resp.local_sap;
459
460    if (nfa_p2p_cb.sap_cb[local_sap].p_cback)
461    {
462        if (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_RESP_DISC)
463        {
464            evt_data.disc.reason = NFA_P2P_DISC_REASON_LOCAL_INITITATE;
465        }
466        else if (  (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_APP_REJECTED)
467                 ||(p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_PERM_REJECT_THIS)
468                 ||(p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_PERM_REJECT_ANY)
469                 ||(p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_TEMP_REJECT_THIS)
470                 ||(p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_TEMP_REJECT_ANY)  )
471        {
472            evt_data.disc.reason = NFA_P2P_DISC_REASON_REMOTE_REJECT;
473        }
474        else if (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_NO_SERVICE)
475        {
476            evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_SERVICE;
477        }
478        else if (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_NO_ACTIVE_CONNECTION)
479        {
480            evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
481        }
482        else
483        {
484            evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_INFORMATION;
485        }
486
487        if (evt_data.disc.reason == NFA_P2P_DISC_REASON_LOCAL_INITITATE)
488        {
489            xx = nfa_p2p_find_conn_cb (p_data->disconnect_resp.local_sap,
490                                       p_data->disconnect_resp.remote_sap);
491
492            if (xx != LLCP_MAX_DATA_LINK)
493            {
494                evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
495
496                nfa_p2p_deallocate_conn_cb (xx);
497
498                nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data);
499            }
500            else
501            {
502                P2P_TRACE_ERROR0 ("nfa_p2p_proc_llcp_disconnect_resp (): No connection found");
503            }
504        }
505        else
506        {
507            evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
508            nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data);
509        }
510    }
511}
512
513/*******************************************************************************
514**
515** Function         nfa_p2p_proc_llcp_congest
516**
517** Description      Processing LLCP congestion event
518**
519**
520** Returns          None
521**
522*******************************************************************************/
523void nfa_p2p_proc_llcp_congestion (tLLCP_SAP_CBACK_DATA  *p_data)
524{
525    uint8_t           local_sap, remote_sap, xx;
526    tNFA_P2P_EVT_DATA evt_data;
527
528    local_sap  = p_data->congest.local_sap;
529    remote_sap = p_data->congest.remote_sap;
530
531    evt_data.congest.link_type    = p_data->congest.link_type;
532    evt_data.congest.is_congested = p_data->congest.is_congested;
533
534    if (p_data->congest.is_congested)
535    {
536        P2P_TRACE_DEBUG2 ("nfa_p2p_proc_llcp_congestion () START SAP=(0x%x,0x%x)",
537                          local_sap, remote_sap);
538
539    }
540    else
541    {
542        P2P_TRACE_DEBUG2 ("nfa_p2p_proc_llcp_congestion () END SAP=(0x%x,0x%x)",
543                          local_sap, remote_sap);
544    }
545
546    if (nfa_p2p_cb.sap_cb[local_sap].p_cback)
547    {
548        if (evt_data.congest.link_type == NFA_P2P_LLINK_TYPE)
549        {
550            evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
551
552            if (  (evt_data.congest.is_congested == false)
553                &&(nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_LLINK_CONGESTED)  )
554            {
555                nfa_p2p_cb.sap_cb[local_sap].flags &= ~NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
556                nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data);
557            }
558            else if (  (evt_data.congest.is_congested == true)
559                     &&(!(nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_LLINK_CONGESTED))  )
560            {
561                /* this is overall congestion due to high usage of buffer pool */
562                nfa_p2p_cb.sap_cb[local_sap].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
563                nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data);
564            }
565        }
566        else
567        {
568            xx = nfa_p2p_find_conn_cb (local_sap, remote_sap);
569
570            if (xx != LLCP_MAX_DATA_LINK)
571            {
572                evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
573
574                if (  (evt_data.congest.is_congested == false)
575                    &&(nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED)  )
576                {
577                    nfa_p2p_cb.conn_cb[xx].flags &= ~NFA_P2P_CONN_FLAG_CONGESTED;
578                    nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data);
579                }
580                else if (  (evt_data.congest.is_congested == true)
581                         &&(!(nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED))  )
582                {
583                    /* this is overall congestion due to high usage of buffer pool */
584                    nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
585                    nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data);
586                }
587            }
588            else
589            {
590                P2P_TRACE_ERROR0 ("nfa_p2p_proc_llcp_congestion (): No connection found");
591            }
592        }
593    }
594}
595
596/*******************************************************************************
597**
598** Function         nfa_p2p_proc_llcp_link_status
599**
600** Description      Processing LLCP link status
601**
602**
603** Returns          next state after processing this event
604**
605*******************************************************************************/
606void nfa_p2p_proc_llcp_link_status (tLLCP_SAP_CBACK_DATA  *p_data)
607{
608    uint8_t           local_sap, xx;
609    tNFA_P2P_EVT_DATA evt_data;
610
611    P2P_TRACE_DEBUG1 ("nfa_p2p_proc_llcp_link_status () is_activated:%d",
612                       p_data->link_status.is_activated);
613
614    local_sap  = p_data->link_status.local_sap;
615
616    if (nfa_p2p_cb.sap_cb[local_sap].p_cback)
617    {
618        if (p_data->link_status.is_activated)
619        {
620            /* only for server */
621            evt_data.activated.handle           = (NFA_HANDLE_GROUP_P2P | local_sap);
622            evt_data.activated.local_link_miu   = nfa_p2p_cb.local_link_miu;
623            evt_data.activated.remote_link_miu  = nfa_p2p_cb.remote_link_miu;
624
625            nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_ACTIVATED_EVT, &evt_data);
626        }
627        else /* if LLCP link is deactivated */
628        {
629            for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++)
630            {
631                if (  (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE)
632                    &&(nfa_p2p_cb.conn_cb[xx].local_sap == local_sap))
633                {
634                    evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
635                    evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
636
637                    nfa_p2p_deallocate_conn_cb (xx);
638                    nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data);
639                }
640            }
641
642            /* notify deactivation and clear flags */
643            if (nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_SERVER)
644            {
645                evt_data.deactivated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
646                nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DEACTIVATED_EVT, &evt_data);
647
648                nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_SERVER;
649            }
650            else if (nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_CLIENT)
651            {
652                evt_data.deactivated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
653                nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DEACTIVATED_EVT, &evt_data);
654
655                nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_CLIENT;
656            }
657            else /* if this is not registered service */
658            {
659                nfa_p2p_cb.sap_cb[local_sap].p_cback = NULL;
660            }
661        }
662    }
663}
664
665/*******************************************************************************
666**
667** Function         nfa_p2p_reg_server
668**
669** Description      Allocate a service as server and register to LLCP
670**
671**
672** Returns          FALSE if need to keep buffer
673**
674*******************************************************************************/
675bool    nfa_p2p_reg_server (tNFA_P2P_MSG *p_msg)
676{
677    tNFA_P2P_EVT_DATA  evt_data;
678    uint8_t            server_sap;
679
680    P2P_TRACE_DEBUG0 ("nfa_p2p_reg_server ()");
681
682    server_sap = LLCP_RegisterServer (p_msg->api_reg_server.server_sap,
683                                      p_msg->api_reg_server.link_type,
684                                      p_msg->api_reg_server.service_name,
685                                      nfa_p2p_llcp_cback);
686
687    if (server_sap == LLCP_INVALID_SAP)
688    {
689        evt_data.reg_server.server_handle = NFA_HANDLE_INVALID;
690        evt_data.reg_server.server_sap    = NFA_P2P_INVALID_SAP;
691        strncpy (evt_data.reg_server.service_name, p_msg->api_reg_server.service_name,
692                       LLCP_MAX_SN_LEN);
693        evt_data.reg_server.service_name[LLCP_MAX_SN_LEN] = 0;
694
695        p_msg->api_reg_server.p_cback (NFA_P2P_REG_SERVER_EVT, &evt_data);
696
697        return true;
698    }
699
700    /* if need to update WKS in LLCP Gen bytes */
701    if (server_sap <= LLCP_UPPER_BOUND_WK_SAP)
702    {
703        nfa_p2p_enable_listening (NFA_ID_P2P, true);
704    }
705    else if (!nfa_p2p_cb.is_p2p_listening)
706    {
707        nfa_p2p_enable_listening (NFA_ID_P2P, false);
708    }
709
710    nfa_p2p_cb.sap_cb[server_sap].p_cback    = p_msg->api_reg_server.p_cback;
711    nfa_p2p_cb.sap_cb[server_sap].flags      = NFA_P2P_SAP_FLAG_SERVER;
712
713    evt_data.reg_server.server_handle = (NFA_HANDLE_GROUP_P2P | server_sap);
714    evt_data.reg_server.server_sap    = server_sap;
715    strncpy (evt_data.reg_server.service_name, p_msg->api_reg_server.service_name,
716                   LLCP_MAX_SN_LEN);
717    evt_data.reg_server.service_name[LLCP_MAX_SN_LEN] = 0;
718
719    /* notify NFA_P2P_REG_SERVER_EVT to server */
720    nfa_p2p_cb.sap_cb[server_sap].p_cback (NFA_P2P_REG_SERVER_EVT, &evt_data);
721
722    /* if LLCP is already activated */
723    if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED)
724    {
725        evt_data.activated.handle          = (NFA_HANDLE_GROUP_P2P | server_sap);
726        evt_data.activated.local_link_miu  = nfa_p2p_cb.local_link_miu;
727        evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
728
729        /* notify NFA_P2P_ACTIVATED_EVT to server */
730        nfa_p2p_cb.sap_cb[server_sap].p_cback (NFA_P2P_ACTIVATED_EVT, &evt_data);
731    }
732
733    return true;
734}
735
736/*******************************************************************************
737**
738** Function         nfa_p2p_reg_client
739**
740** Description      Allocate a service as client and register to LLCP
741**
742**
743** Returns          TRUE to deallocate buffer
744**
745*******************************************************************************/
746bool    nfa_p2p_reg_client (tNFA_P2P_MSG *p_msg)
747{
748    tNFA_P2P_EVT_DATA  evt_data;
749    uint8_t            local_sap;
750
751    P2P_TRACE_DEBUG0 ("nfa_p2p_reg_client ()");
752
753    local_sap = LLCP_RegisterClient (p_msg->api_reg_client.link_type,
754                                     nfa_p2p_llcp_cback);
755
756    if (local_sap == LLCP_INVALID_SAP)
757    {
758        evt_data.reg_client.client_handle = NFA_HANDLE_INVALID;
759        p_msg->api_reg_client.p_cback (NFA_P2P_REG_CLIENT_EVT, &evt_data);
760        return true;
761    }
762
763    nfa_p2p_cb.sap_cb[local_sap].p_cback = p_msg->api_reg_client.p_cback;
764    nfa_p2p_cb.sap_cb[local_sap].flags   = NFA_P2P_SAP_FLAG_CLIENT;
765
766    evt_data.reg_client.client_handle = (NFA_HANDLE_GROUP_P2P | local_sap);
767    nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_REG_CLIENT_EVT, &evt_data);
768
769    /* if LLCP is already activated */
770    if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED)
771    {
772        evt_data.activated.handle           = (NFA_HANDLE_GROUP_P2P | local_sap);
773        evt_data.activated.local_link_miu   = nfa_p2p_cb.local_link_miu;
774        evt_data.activated.remote_link_miu  = nfa_p2p_cb.remote_link_miu;
775
776        /* notify NFA_P2P_ACTIVATED_EVT to client */
777        nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_ACTIVATED_EVT, &evt_data);
778    }
779
780    return true;
781}
782
783/*******************************************************************************
784**
785** Function         nfa_p2p_dereg
786**
787** Description      Deallocate a service as server or client and deregister to
788**                  LLCP. LLCP will deallocate data link connection created by
789**                  this server
790**
791** Returns          TRUE to deallocate buffer
792**
793*******************************************************************************/
794bool    nfa_p2p_dereg (tNFA_P2P_MSG *p_msg)
795{
796    uint8_t local_sap, xx;
797
798    P2P_TRACE_DEBUG0 ("nfa_p2p_dereg ()");
799
800    local_sap = (uint8_t) (p_msg->api_dereg.handle & NFA_HANDLE_MASK);
801
802    if (nfa_p2p_cb.sap_cb[local_sap].p_cback)
803    {
804        for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++)
805        {
806            if (  (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE)
807                &&(nfa_p2p_cb.conn_cb[xx].local_sap == local_sap)  )
808            {
809                nfa_p2p_deallocate_conn_cb (xx);
810            }
811        }
812    }
813
814    LLCP_Deregister (local_sap);
815    nfa_p2p_cb.sap_cb[local_sap].p_cback = NULL;
816
817    if (nfa_p2p_cb.is_p2p_listening)
818    {
819        /* check if this is the last server on NFA P2P */
820        for (xx = 0; xx < NFA_P2P_NUM_SAP; xx++)
821        {
822            if (  (nfa_p2p_cb.sap_cb[xx].p_cback)
823                &&(nfa_p2p_cb.sap_cb[xx].flags & NFA_P2P_SAP_FLAG_SERVER)  )
824            {
825                break;
826            }
827        }
828
829        if (xx >= NFA_P2P_NUM_SAP)
830        {
831            /* if need to update WKS in LLCP Gen bytes */
832            if (local_sap <= LLCP_UPPER_BOUND_WK_SAP)
833                nfa_p2p_disable_listening (NFA_ID_P2P, true);
834            else
835                nfa_p2p_disable_listening (NFA_ID_P2P, false);
836        }
837        /* if need to update WKS in LLCP Gen bytes */
838        else if (local_sap <= LLCP_UPPER_BOUND_WK_SAP)
839        {
840            nfa_p2p_enable_listening (NFA_ID_P2P, true);
841        }
842    }
843
844    return true;
845}
846
847/*******************************************************************************
848**
849** Function         nfa_p2p_accept_connection
850**
851** Description      Connection Confirm from local application
852**
853**
854** Returns          TRUE to deallocate buffer
855**
856*******************************************************************************/
857bool    nfa_p2p_accept_connection (tNFA_P2P_MSG *p_msg)
858{
859    uint8_t                 xx;
860    tLLCP_CONNECTION_PARAMS params;
861
862    P2P_TRACE_DEBUG0 ("nfa_p2p_accept_connection ()");
863
864    xx  = (uint8_t) (p_msg->api_accept.conn_handle & NFA_HANDLE_MASK);
865    xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
866
867    params.miu   = p_msg->api_accept.miu;
868    params.rw    = p_msg->api_accept.rw;
869    params.sn[0] = 0;
870
871    LLCP_ConnectCfm (nfa_p2p_cb.conn_cb[xx].local_sap, nfa_p2p_cb.conn_cb[xx].remote_sap, &params);
872
873    return true;
874}
875
876/*******************************************************************************
877**
878** Function         nfa_p2p_reject_connection
879**
880** Description      Reject connection by local application
881**
882**
883** Returns          TRUE to deallocate buffer
884**
885*******************************************************************************/
886bool    nfa_p2p_reject_connection (tNFA_P2P_MSG *p_msg)
887{
888    uint8_t xx;
889
890    P2P_TRACE_DEBUG0 ("nfa_p2p_reject_connection ()");
891
892    xx  = (uint8_t) (p_msg->api_reject.conn_handle & NFA_HANDLE_MASK);
893    xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
894
895    LLCP_ConnectReject (nfa_p2p_cb.conn_cb[xx].local_sap, nfa_p2p_cb.conn_cb[xx].remote_sap,
896                        LLCP_SAP_DM_REASON_APP_REJECTED);
897
898    /* no need to deregister service on LLCP */
899    nfa_p2p_deallocate_conn_cb (xx);
900
901    return true;
902}
903
904/*******************************************************************************
905**
906** Function         nfa_p2p_disconnect
907**
908** Description      Disconnect data link connection by local application
909**
910**
911** Returns          TRUE to deallocate buffer
912**
913*******************************************************************************/
914bool    nfa_p2p_disconnect (tNFA_P2P_MSG *p_msg)
915{
916    uint8_t           local_sap, xx;
917    tLLCP_STATUS      status;
918    tNFA_P2P_EVT_DATA evt_data;
919
920    P2P_TRACE_DEBUG0 ("nfa_p2p_disconnect ()");
921
922    xx = (uint8_t) (p_msg->api_disconnect.conn_handle & NFA_HANDLE_MASK);
923
924    /* if this is for data link connection */
925    if (xx & NFA_P2P_HANDLE_FLAG_CONN)
926    {
927        xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
928
929        status = LLCP_DisconnectReq (nfa_p2p_cb.conn_cb[xx].local_sap, nfa_p2p_cb.conn_cb[xx].remote_sap,
930                                     p_msg->api_disconnect.flush);
931
932        if (status == LLCP_STATUS_SUCCESS)
933        {
934            /* wait for disconnect response if successful */
935            return true;
936        }
937        else
938        {
939            /*
940            ** while we are waiting for connect confirm,
941            ** we cannot sent DISC because we don't know DSAP yet
942            */
943            local_sap = nfa_p2p_cb.conn_cb[xx].local_sap;
944
945            if (nfa_p2p_cb.sap_cb[local_sap].p_cback)
946            {
947                evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
948                evt_data.disc.reason = NFA_P2P_DISC_REASON_LOCAL_INITITATE;
949
950                nfa_p2p_deallocate_conn_cb (xx);
951                nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data);
952            }
953        }
954    }
955    else
956    {
957        P2P_TRACE_ERROR0 ("Handle is not for Data link connection");
958    }
959
960    return true;
961}
962
963/*******************************************************************************
964**
965** Function         nfa_p2p_create_data_link_connection
966**
967** Description      Create data link connection
968**
969**
970** Returns          TRUE to deallocate buffer
971**
972*******************************************************************************/
973bool    nfa_p2p_create_data_link_connection (tNFA_P2P_MSG *p_msg)
974{
975    uint8_t                 local_sap;
976    tNFA_P2P_EVT_DATA       evt_data;
977    tLLCP_CONNECTION_PARAMS conn_params;
978    tLLCP_STATUS            status;
979
980    P2P_TRACE_DEBUG0 ("nfa_p2p_create_data_link_connection ()");
981
982    local_sap = (uint8_t) (p_msg->api_connect.client_handle & NFA_HANDLE_MASK);
983
984    conn_params.miu = p_msg->api_connect.miu;
985    conn_params.rw  = p_msg->api_connect.rw;
986
987    /* NFA_P2pConnectBySap () */
988    if (p_msg->api_connect.dsap != LLCP_INVALID_SAP)
989    {
990        conn_params.sn[0] = 0;
991        status = LLCP_ConnectReq (local_sap, p_msg->api_connect.dsap, &conn_params);
992    }
993    /* NFA_P2pConnectByName () */
994    else
995    {
996        strncpy (conn_params.sn, p_msg->api_connect.service_name, LLCP_MAX_SN_LEN);
997        conn_params.sn[LLCP_MAX_SN_LEN] = 0;
998
999        status = LLCP_ConnectReq (local_sap, LLCP_SAP_SDP, &conn_params);
1000    }
1001
1002    if (status != LLCP_STATUS_SUCCESS)
1003    {
1004        evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
1005        evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_INFORMATION;
1006
1007        nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data);
1008    }
1009
1010    return true;
1011}
1012
1013/*******************************************************************************
1014**
1015** Function         nfa_p2p_send_ui
1016**
1017** Description      Send UI PDU
1018**
1019**
1020** Returns          TRUE to deallocate buffer
1021**
1022*******************************************************************************/
1023bool    nfa_p2p_send_ui (tNFA_P2P_MSG *p_msg)
1024{
1025    uint8_t           local_sap;
1026    tLLCP_STATUS      status;
1027    tNFA_P2P_EVT_DATA evt_data;
1028
1029    P2P_TRACE_DEBUG0 ("nfa_p2p_send_ui ()");
1030
1031    local_sap = (uint8_t) (p_msg->api_send_ui.handle & NFA_HANDLE_MASK);
1032
1033    /* decrease number of tx UI PDU which is not processed by NFA for congestion control */
1034    if (nfa_p2p_cb.sap_cb[local_sap].num_pending_ui_pdu)
1035        nfa_p2p_cb.sap_cb[local_sap].num_pending_ui_pdu--;
1036
1037    if (nfa_p2p_cb.total_pending_ui_pdu)
1038        nfa_p2p_cb.total_pending_ui_pdu--;
1039
1040    status = LLCP_SendUI (local_sap,
1041                          p_msg->api_send_ui.dsap,
1042                          p_msg->api_send_ui.p_msg);
1043
1044    if (status == LLCP_STATUS_CONGESTED)
1045    {
1046        if (!(nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_LLINK_CONGESTED))
1047        {
1048            nfa_p2p_cb.sap_cb[local_sap].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
1049
1050            /* notify that this logical link is congested */
1051            evt_data.congest.link_type    = NFA_P2P_LLINK_TYPE;
1052            evt_data.congest.handle       = (NFA_HANDLE_GROUP_P2P | local_sap);
1053            evt_data.congest.is_congested = true;
1054
1055            nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data);
1056        }
1057    }
1058
1059    return true;
1060}
1061
1062/*******************************************************************************
1063**
1064** Function         nfa_p2p_send_data
1065**
1066** Description      Send I PDU
1067**
1068**
1069** Returns          TRUE to deallocate buffer
1070**
1071*******************************************************************************/
1072bool    nfa_p2p_send_data (tNFA_P2P_MSG *p_msg)
1073{
1074    tNFA_P2P_EVT_DATA evt_data;
1075    tLLCP_STATUS      status;
1076    uint8_t           xx;
1077
1078    P2P_TRACE_DEBUG0 ("nfa_p2p_send_data ()");
1079
1080    xx = (uint8_t) (p_msg->api_send_data.conn_handle & NFA_HANDLE_MASK);
1081    xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
1082
1083    /* decrease number of tx I PDU which is not processed by NFA for congestion control */
1084    if (nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu)
1085        nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu--;
1086
1087    if (nfa_p2p_cb.total_pending_i_pdu)
1088        nfa_p2p_cb.total_pending_i_pdu--;
1089
1090    status = LLCP_SendData (nfa_p2p_cb.conn_cb[xx].local_sap,
1091                            nfa_p2p_cb.conn_cb[xx].remote_sap,
1092                            p_msg->api_send_data.p_msg);
1093
1094    if (status == LLCP_STATUS_CONGESTED)
1095    {
1096        if (!(nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED))
1097        {
1098            nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
1099
1100            /* notify that this data link is congested */
1101            evt_data.congest.link_type    = NFA_P2P_DLINK_TYPE;
1102            evt_data.congest.handle       = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
1103            evt_data.congest.is_congested = true;
1104
1105            nfa_p2p_cb.sap_cb[nfa_p2p_cb.conn_cb[xx].local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data);
1106        }
1107    }
1108
1109    return true;
1110}
1111
1112/*******************************************************************************
1113**
1114** Function         nfa_p2p_set_local_busy
1115**
1116** Description      Set or reset local busy
1117**
1118**
1119** Returns          TRUE to deallocate buffer
1120**
1121*******************************************************************************/
1122bool    nfa_p2p_set_local_busy (tNFA_P2P_MSG *p_msg)
1123{
1124    uint8_t xx;
1125
1126    P2P_TRACE_DEBUG0 ("nfa_p2p_set_local_busy ()");
1127
1128    xx = (uint8_t) (p_msg->api_local_busy.conn_handle & NFA_HANDLE_MASK);
1129    xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
1130
1131    LLCP_SetLocalBusyStatus (nfa_p2p_cb.conn_cb[xx].local_sap,
1132                             nfa_p2p_cb.conn_cb[xx].remote_sap,
1133                             p_msg->api_local_busy.is_busy);
1134
1135    return true;
1136}
1137
1138/*******************************************************************************
1139**
1140** Function         nfa_p2p_get_link_info
1141**
1142** Description      Get WKS of remote and link MIU
1143**
1144**
1145** Returns          TRUE to deallocate buffer
1146**
1147*******************************************************************************/
1148bool    nfa_p2p_get_link_info (tNFA_P2P_MSG *p_msg)
1149{
1150    tNFA_P2P_EVT_DATA evt_data;
1151    uint8_t           local_sap;
1152
1153    P2P_TRACE_DEBUG0 ("nfa_p2p_get_link_info ()");
1154
1155    evt_data.link_info.handle          = p_msg->api_link_info.handle;
1156    evt_data.link_info.wks             = LLCP_GetRemoteWKS ();
1157    evt_data.link_info.local_link_miu  = nfa_p2p_cb.local_link_miu;
1158    evt_data.link_info.remote_link_miu = nfa_p2p_cb.remote_link_miu;
1159
1160    local_sap =  (uint8_t) (p_msg->api_link_info.handle & NFA_HANDLE_MASK);
1161    nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_LINK_INFO_EVT, &evt_data);
1162
1163    return true;
1164}
1165
1166/*******************************************************************************
1167**
1168** Function         nfa_p2p_get_remote_sap
1169**
1170** Description      Get remote SAP
1171**
1172**
1173** Returns          TRUE to deallocate buffer
1174**
1175*******************************************************************************/
1176bool    nfa_p2p_get_remote_sap (tNFA_P2P_MSG *p_msg)
1177{
1178    tNFA_P2P_EVT_DATA evt_data;
1179    uint8_t           local_sap;
1180
1181    P2P_TRACE_DEBUG0 ("nfa_p2p_get_remote_sap ()");
1182
1183    local_sap =  (uint8_t) (p_msg->api_remote_sap.handle & NFA_HANDLE_MASK);
1184
1185    if (!nfa_p2p_start_sdp (p_msg->api_remote_sap.service_name,
1186                            local_sap))
1187    {
1188        evt_data.sdp.handle     = p_msg->api_remote_sap.handle;
1189        evt_data.sdp.remote_sap = 0x00;
1190        nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_SDP_EVT, &evt_data);
1191    }
1192
1193    return true;
1194}
1195
1196/*******************************************************************************
1197**
1198** Function         nfa_p2p_set_llcp_cfg
1199**
1200** Description      Set LLCP configuration
1201**
1202**
1203** Returns          TRUE to deallocate buffer
1204**
1205*******************************************************************************/
1206bool    nfa_p2p_set_llcp_cfg (tNFA_P2P_MSG *p_msg)
1207{
1208    LLCP_SetConfig (p_msg->api_set_llcp_cfg.link_miu,
1209                    p_msg->api_set_llcp_cfg.opt,
1210                    p_msg->api_set_llcp_cfg.wt,
1211                    p_msg->api_set_llcp_cfg.link_timeout,
1212                    p_msg->api_set_llcp_cfg.inact_timeout_init,
1213                    p_msg->api_set_llcp_cfg.inact_timeout_target,
1214                    p_msg->api_set_llcp_cfg.symm_delay,
1215                    p_msg->api_set_llcp_cfg.data_link_timeout,
1216                    p_msg->api_set_llcp_cfg.delay_first_pdu_timeout);
1217
1218    return true;
1219}
1220
1221/*******************************************************************************
1222**
1223** Function         nfa_p2p_restart_rf_discovery
1224**
1225** Description      Restart RF discovery by deactivating to IDLE
1226**
1227**
1228** Returns          TRUE to deallocate buffer
1229**
1230*******************************************************************************/
1231bool    nfa_p2p_restart_rf_discovery (tNFA_P2P_MSG *p_msg)
1232{
1233    P2P_TRACE_DEBUG0 ("nfa_p2p_restart_rf_discovery ()");
1234
1235    nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1236
1237    return true;
1238}
1239