Home | History | Annotate | Download | only in p2p
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2010-2012 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  *  NFA interface to LLCP
     22  *
     23  ******************************************************************************/
     24 #include <string.h>
     25 #include "nfc_api.h"
     26 #include "nfa_sys.h"
     27 #include "nfa_sys_int.h"
     28 #include "llcp_defs.h"
     29 #include "llcp_api.h"
     30 #include "nfa_p2p_api.h"
     31 #include "nfa_p2p_int.h"
     32 
     33 /*****************************************************************************
     34 **  Constants
     35 *****************************************************************************/
     36 
     37 /*******************************************************************************
     38 **
     39 ** Function         NFA_P2pRegisterServer
     40 **
     41 ** Description      This function is called to listen to a SAP as server on LLCP.
     42 **
     43 **                  NFA_P2P_REG_SERVER_EVT will be returned with status and handle.
     44 **
     45 **                  If server_sap is set to NFA_P2P_ANY_SAP, then NFA will allocate
     46 **                  a SAP between LLCP_LOWER_BOUND_SDP_SAP and LLCP_UPPER_BOUND_SDP_SAP
     47 **                  Otherwise, server_sap must be between (LLCP_SDP_SAP + 1) and
     48 **                  LLCP_UPPER_BOUND_SDP_SAP
     49 **
     50 **                  link_type : NFA_P2P_LLINK_TYPE and/or NFA_P2P_DLINK_TYPE
     51 **
     52 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
     53 **                  should happen before calling this function
     54 **
     55 ** Returns          NFA_STATUS_OK if successfully initiated
     56 **                  NFA_STATUS_FAILED otherwise
     57 **
     58 *******************************************************************************/
     59 tNFA_STATUS NFA_P2pRegisterServer (UINT8              server_sap,
     60                                    tNFA_P2P_LINK_TYPE link_type,
     61                                    char               *p_service_name,
     62                                    tNFA_P2P_CBACK     *p_cback)
     63 {
     64     tNFA_P2P_API_REG_SERVER *p_msg;
     65 
     66     P2P_TRACE_API3 ("NFA_P2pRegisterServer (): server_sap:0x%02x, link_type:0x%x, SN:<%s>",
     67                      server_sap, link_type, p_service_name);
     68 
     69     if (  (server_sap != NFA_P2P_ANY_SAP)
     70         &&((server_sap <= LLCP_SAP_SDP) ||(server_sap > LLCP_UPPER_BOUND_SDP_SAP))  )
     71     {
     72         P2P_TRACE_ERROR2 ("NFA_P2pRegisterServer (): server_sap must be between %d and %d",
     73                           LLCP_SAP_SDP + 1, LLCP_UPPER_BOUND_SDP_SAP);
     74         return (NFA_STATUS_FAILED);
     75     }
     76     else if (  ((link_type & NFA_P2P_LLINK_TYPE) == 0x00)
     77              &&((link_type & NFA_P2P_DLINK_TYPE) == 0x00)  )
     78     {
     79         P2P_TRACE_ERROR1 ("NFA_P2pRegisterServer(): link type (0x%x) must be specified", link_type);
     80         return (NFA_STATUS_FAILED);
     81     }
     82 
     83     if ((p_msg = (tNFA_P2P_API_REG_SERVER *) GKI_getbuf (sizeof (tNFA_P2P_API_REG_SERVER))) != NULL)
     84     {
     85         p_msg->hdr.event = NFA_P2P_API_REG_SERVER_EVT;
     86 
     87         p_msg->server_sap = server_sap;
     88         p_msg->link_type  = link_type;
     89 
     90         BCM_STRNCPY_S (p_msg->service_name, sizeof (p_msg->service_name), p_service_name, LLCP_MAX_SN_LEN);
     91         p_msg->service_name[LLCP_MAX_SN_LEN] = 0;
     92 
     93         p_msg->p_cback = p_cback;
     94 
     95         nfa_sys_sendmsg (p_msg);
     96 
     97         return (NFA_STATUS_OK);
     98     }
     99 
    100     return (NFA_STATUS_FAILED);
    101 }
    102 
    103 /*******************************************************************************
    104 **
    105 ** Function         NFA_P2pRegisterClient
    106 **
    107 ** Description      This function is called to register a client service on LLCP.
    108 **
    109 **                  NFA_P2P_REG_CLIENT_EVT will be returned with status and handle.
    110 **
    111 **                  link_type : NFA_P2P_LLINK_TYPE and/or NFA_P2P_DLINK_TYPE
    112 **
    113 ** Returns          NFA_STATUS_OK if successfully initiated
    114 **                  NFA_STATUS_FAILED otherwise
    115 **
    116 *******************************************************************************/
    117 tNFA_STATUS NFA_P2pRegisterClient (tNFA_P2P_LINK_TYPE link_type,
    118                                    tNFA_P2P_CBACK     *p_cback)
    119 {
    120     tNFA_P2P_API_REG_CLIENT *p_msg;
    121 
    122     P2P_TRACE_API1 ("NFA_P2pRegisterClient (): link_type:0x%x", link_type);
    123 
    124     if (  ((link_type & NFA_P2P_LLINK_TYPE) == 0x00)
    125         &&((link_type & NFA_P2P_DLINK_TYPE) == 0x00)  )
    126     {
    127         P2P_TRACE_ERROR1 ("NFA_P2pRegisterClient (): link type (0x%x) must be specified", link_type);
    128         return (NFA_STATUS_FAILED);
    129     }
    130 
    131     if ((p_msg = (tNFA_P2P_API_REG_CLIENT *) GKI_getbuf (sizeof (tNFA_P2P_API_REG_CLIENT))) != NULL)
    132     {
    133         p_msg->hdr.event = NFA_P2P_API_REG_CLIENT_EVT;
    134 
    135         p_msg->p_cback   = p_cback;
    136         p_msg->link_type = link_type;
    137 
    138         nfa_sys_sendmsg (p_msg);
    139 
    140         return (NFA_STATUS_OK);
    141     }
    142 
    143     return (NFA_STATUS_FAILED);
    144 }
    145 
    146 /*******************************************************************************
    147 **
    148 ** Function         NFA_P2pDeregister
    149 **
    150 ** Description      This function is called to stop listening to a SAP as server
    151 **                  or stop client service on LLCP.
    152 **
    153 ** Note:            If this function is called to de-register a server and RF discovery
    154 **                  is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    155 **                  should happen before calling this function
    156 **
    157 ** Returns          NFA_STATUS_OK if successfully initiated
    158 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    159 **                  NFA_STATUS_FAILED otherwise
    160 **
    161 *******************************************************************************/
    162 tNFA_STATUS NFA_P2pDeregister (tNFA_HANDLE handle)
    163 {
    164     tNFA_P2P_API_DEREG *p_msg;
    165     tNFA_HANDLE         xx;
    166 
    167     P2P_TRACE_API1 ("NFA_P2pDeregister (): handle:0x%02X", handle);
    168 
    169     xx = handle & NFA_HANDLE_MASK;
    170 
    171     if (  (xx >= NFA_P2P_NUM_SAP)
    172         ||(nfa_p2p_cb.sap_cb[xx].p_cback == NULL)  )
    173     {
    174         P2P_TRACE_ERROR0 ("NFA_P2pDeregister (): Handle is invalid or not registered");
    175         return (NFA_STATUS_BAD_HANDLE);
    176     }
    177 
    178     if ((p_msg = (tNFA_P2P_API_DEREG *) GKI_getbuf (sizeof (tNFA_P2P_API_DEREG))) != NULL)
    179     {
    180         p_msg->hdr.event = NFA_P2P_API_DEREG_EVT;
    181 
    182         p_msg->handle    = handle;
    183 
    184         nfa_sys_sendmsg (p_msg);
    185 
    186         return (NFA_STATUS_OK);
    187     }
    188 
    189     return (NFA_STATUS_FAILED);
    190 }
    191 
    192 /*******************************************************************************
    193 **
    194 ** Function         NFA_P2pAcceptConn
    195 **
    196 ** Description      This function is called to accept a request of data link
    197 **                  connection to a listening SAP on LLCP after receiving
    198 **                  NFA_P2P_CONN_REQ_EVT.
    199 **
    200 ** Returns          NFA_STATUS_OK if successfully initiated
    201 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    202 **                  NFA_STATUS_FAILED otherwise
    203 **
    204 *******************************************************************************/
    205 tNFA_STATUS NFA_P2pAcceptConn (tNFA_HANDLE handle,
    206                                UINT16      miu,
    207                                UINT8       rw)
    208 {
    209     tNFA_P2P_API_ACCEPT_CONN *p_msg;
    210     tNFA_HANDLE               xx;
    211 
    212     P2P_TRACE_API3 ("NFA_P2pAcceptConn (): handle:0x%02X, MIU:%d, RW:%d", handle, miu, rw);
    213 
    214     xx = handle & NFA_HANDLE_MASK;
    215 
    216     if (!(xx & NFA_P2P_HANDLE_FLAG_CONN))
    217     {
    218         P2P_TRACE_ERROR0 ("NFA_P2pAcceptConn (): Connection Handle is not valid");
    219         return (NFA_STATUS_BAD_HANDLE);
    220     }
    221     else
    222     {
    223         xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
    224     }
    225 
    226     if (  (xx >= LLCP_MAX_DATA_LINK)
    227         ||(nfa_p2p_cb.conn_cb[xx].flags == 0)  )
    228     {
    229         P2P_TRACE_ERROR0 ("NFA_P2pAcceptConn (): Connection Handle is not valid");
    230         return (NFA_STATUS_BAD_HANDLE);
    231     }
    232 
    233     if ((miu < LLCP_DEFAULT_MIU) || (nfa_p2p_cb.local_link_miu < miu))
    234     {
    235         P2P_TRACE_ERROR3 ("NFA_P2pAcceptConn (): MIU(%d) must be between %d and %d",
    236                             miu, LLCP_DEFAULT_MIU, nfa_p2p_cb.local_link_miu);
    237     }
    238     else if ((p_msg = (tNFA_P2P_API_ACCEPT_CONN *) GKI_getbuf (sizeof (tNFA_P2P_API_ACCEPT_CONN))) != NULL)
    239     {
    240         p_msg->hdr.event = NFA_P2P_API_ACCEPT_CONN_EVT;
    241 
    242         p_msg->conn_handle  = handle;
    243         p_msg->miu          = miu;
    244         p_msg->rw           = rw;
    245 
    246         nfa_sys_sendmsg (p_msg);
    247 
    248         return (NFA_STATUS_OK);
    249     }
    250 
    251     return (NFA_STATUS_FAILED);
    252 }
    253 
    254 /*******************************************************************************
    255 **
    256 ** Function         NFA_P2pRejectConn
    257 **
    258 ** Description      This function is called to reject a request of data link
    259 **                  connection to a listening SAP on LLCP after receiving
    260 **                  NFA_P2P_CONN_REQ_EVT.
    261 **
    262 ** Returns          NFA_STATUS_OK if successfully initiated
    263 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    264 **                  NFA_STATUS_FAILED otherwise
    265 **
    266 *******************************************************************************/
    267 tNFA_STATUS NFA_P2pRejectConn (tNFA_HANDLE handle)
    268 {
    269     tNFA_P2P_API_REJECT_CONN *p_msg;
    270     tNFA_HANDLE               xx;
    271 
    272     P2P_TRACE_API1 ("NFA_P2pRejectConn (): handle:0x%02X", handle);
    273 
    274     xx = handle & NFA_HANDLE_MASK;
    275 
    276     if (!(xx & NFA_P2P_HANDLE_FLAG_CONN))
    277     {
    278         P2P_TRACE_ERROR0 ("NFA_P2pRejectConn (): Connection Handle is not valid");
    279         return (NFA_STATUS_BAD_HANDLE);
    280     }
    281     else
    282     {
    283         xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
    284     }
    285 
    286     if (  (xx >= LLCP_MAX_DATA_LINK)
    287         ||(nfa_p2p_cb.conn_cb[xx].flags == 0)  )
    288     {
    289         P2P_TRACE_ERROR0 ("NFA_P2pRejectConn (): Connection Handle is not valid");
    290         return (NFA_STATUS_BAD_HANDLE);
    291     }
    292 
    293     if ((p_msg = (tNFA_P2P_API_REJECT_CONN *) GKI_getbuf (sizeof (tNFA_P2P_API_REJECT_CONN))) != NULL)
    294     {
    295         p_msg->hdr.event = NFA_P2P_API_REJECT_CONN_EVT;
    296 
    297         p_msg->conn_handle  = handle;
    298 
    299         nfa_sys_sendmsg (p_msg);
    300 
    301         return (NFA_STATUS_OK);
    302     }
    303 
    304     return (NFA_STATUS_FAILED);
    305 }
    306 
    307 /*******************************************************************************
    308 **
    309 ** Function         NFA_P2pDisconnect
    310 **
    311 ** Description      This function is called to disconnect an existing or
    312 **                  connecting data link connection.
    313 **
    314 **                  discard any pending data on data link connection if flush is set to TRUE
    315 **
    316 **                  NFA_P2P_DISC_EVT will be returned after data link connection is disconnected
    317 **
    318 ** Returns          NFA_STATUS_OK if successfully initiated
    319 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    320 **                  NFA_STATUS_FAILED otherwise
    321 **
    322 *******************************************************************************/
    323 tNFA_STATUS NFA_P2pDisconnect (tNFA_HANDLE handle, BOOLEAN flush)
    324 {
    325     tNFA_P2P_API_DISCONNECT *p_msg;
    326     tNFA_HANDLE              xx;
    327 
    328     P2P_TRACE_API2 ("NFA_P2pDisconnect (): handle:0x%02X, flush=%d", handle, flush);
    329 
    330     xx = handle & NFA_HANDLE_MASK;
    331 
    332     if (xx & NFA_P2P_HANDLE_FLAG_CONN)
    333     {
    334         xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
    335 
    336         if (  (xx >= LLCP_MAX_DATA_LINK)
    337             ||(nfa_p2p_cb.conn_cb[xx].flags == 0)  )
    338         {
    339             P2P_TRACE_ERROR0 ("NFA_P2pDisconnect (): Connection Handle is not valid");
    340             return (NFA_STATUS_BAD_HANDLE);
    341         }
    342     }
    343     else
    344     {
    345         P2P_TRACE_ERROR0 ("NFA_P2pDisconnect (): Handle is not valid");
    346         return (NFA_STATUS_BAD_HANDLE);
    347     }
    348 
    349     if ((p_msg = (tNFA_P2P_API_DISCONNECT *) GKI_getbuf (sizeof (tNFA_P2P_API_DISCONNECT))) != NULL)
    350     {
    351         p_msg->hdr.event = NFA_P2P_API_DISCONNECT_EVT;
    352 
    353         p_msg->conn_handle  = handle;
    354         p_msg->flush        = flush;
    355 
    356         nfa_sys_sendmsg (p_msg);
    357 
    358         return (NFA_STATUS_OK);
    359     }
    360 
    361     return (NFA_STATUS_FAILED);
    362 }
    363 
    364 /*******************************************************************************
    365 **
    366 ** Function         NFA_P2pConnectByName
    367 **
    368 ** Description      This function is called to create a connection-oriented transport
    369 **                  by a service name.
    370 **                  NFA_P2P_CONNECTED_EVT if success
    371 **                  NFA_P2P_DISC_EVT if failed
    372 **
    373 ** Returns          NFA_STATUS_OK if successfully initiated
    374 **                  NFA_STATUS_BAD_HANDLE if client is not registered
    375 **                  NFA_STATUS_FAILED otherwise
    376 **
    377 *******************************************************************************/
    378 tNFA_STATUS NFA_P2pConnectByName (tNFA_HANDLE client_handle,
    379                                   char        *p_service_name,
    380                                   UINT16      miu,
    381                                   UINT8       rw)
    382 {
    383     tNFA_P2P_API_CONNECT *p_msg;
    384     tNFA_HANDLE           xx;
    385 
    386     P2P_TRACE_API4 ("NFA_P2pConnectByName (): client_handle:0x%x, SN:<%s>, MIU:%d, RW:%d",
    387                     client_handle, p_service_name, miu, rw);
    388 
    389     xx = client_handle & NFA_HANDLE_MASK;
    390 
    391     if (  (xx >= NFA_P2P_NUM_SAP)
    392         ||(nfa_p2p_cb.sap_cb[xx].p_cback == NULL)  )
    393     {
    394         P2P_TRACE_ERROR0 ("NFA_P2pConnectByName (): Client Handle is not valid");
    395         return (NFA_STATUS_BAD_HANDLE);
    396     }
    397 
    398     if (  (miu < LLCP_DEFAULT_MIU)
    399         ||(nfa_p2p_cb.llcp_state != NFA_P2P_LLCP_STATE_ACTIVATED)
    400         ||(nfa_p2p_cb.local_link_miu < miu)  )
    401     {
    402         P2P_TRACE_ERROR3 ("NFA_P2pConnectByName (): MIU(%d) must be between %d and %d or LLCP link is not activated",
    403                             miu, LLCP_DEFAULT_MIU, nfa_p2p_cb.local_link_miu);
    404     }
    405     else if ((p_msg = (tNFA_P2P_API_CONNECT *) GKI_getbuf (sizeof (tNFA_P2P_API_CONNECT))) != NULL)
    406     {
    407         p_msg->hdr.event = NFA_P2P_API_CONNECT_EVT;
    408 
    409         BCM_STRNCPY_S (p_msg->service_name, sizeof (p_msg->service_name), p_service_name, LLCP_MAX_SN_LEN);
    410         p_msg->service_name[LLCP_MAX_SN_LEN] = 0;
    411 
    412         p_msg->dsap    = LLCP_INVALID_SAP;
    413         p_msg->miu     = miu;
    414         p_msg->rw      = rw;
    415         p_msg->client_handle = client_handle;
    416 
    417         nfa_sys_sendmsg (p_msg);
    418 
    419         return (NFA_STATUS_OK);
    420     }
    421 
    422     return (NFA_STATUS_FAILED);
    423 }
    424 
    425 /*******************************************************************************
    426 **
    427 ** Function         NFA_P2pConnectBySap
    428 **
    429 ** Description      This function is called to create a connection-oriented transport
    430 **                  by a SAP.
    431 **                  NFA_P2P_CONNECTED_EVT if success
    432 **                  NFA_P2P_DISC_EVT if failed
    433 **
    434 ** Returns          NFA_STATUS_OK if successfully initiated
    435 **                  NFA_STATUS_BAD_HANDLE if client is not registered
    436 **                  NFA_STATUS_FAILED otherwise
    437 **
    438 *******************************************************************************/
    439 tNFA_STATUS NFA_P2pConnectBySap (tNFA_HANDLE client_handle,
    440                                  UINT8       dsap,
    441                                  UINT16      miu,
    442                                  UINT8       rw)
    443 {
    444     tNFA_P2P_API_CONNECT *p_msg;
    445     tNFA_HANDLE           xx;
    446 
    447     P2P_TRACE_API4 ("NFA_P2pConnectBySap (): client_handle:0x%x, DSAP:0x%02X, MIU:%d, RW:%d",
    448                     client_handle, dsap, miu, rw);
    449 
    450     xx = client_handle & NFA_HANDLE_MASK;
    451 
    452     if (  (xx >= NFA_P2P_NUM_SAP)
    453         ||(nfa_p2p_cb.sap_cb[xx].p_cback == NULL)  )
    454     {
    455         P2P_TRACE_ERROR0 ("NFA_P2pConnectBySap (): Client Handle is not valid");
    456         return (NFA_STATUS_BAD_HANDLE);
    457     }
    458 
    459     if (  (miu < LLCP_DEFAULT_MIU)
    460         ||(nfa_p2p_cb.llcp_state != NFA_P2P_LLCP_STATE_ACTIVATED)
    461         ||(nfa_p2p_cb.local_link_miu < miu)  )
    462     {
    463         P2P_TRACE_ERROR3 ("NFA_P2pConnectBySap (): MIU(%d) must be between %d and %d, or LLCP link is not activated",
    464                             miu, LLCP_DEFAULT_MIU, nfa_p2p_cb.local_link_miu);
    465     }
    466     else if ((p_msg = (tNFA_P2P_API_CONNECT *) GKI_getbuf (sizeof (tNFA_P2P_API_CONNECT))) != NULL)
    467     {
    468         p_msg->hdr.event = NFA_P2P_API_CONNECT_EVT;
    469 
    470         p_msg->service_name[LLCP_MAX_SN_LEN] = 0;
    471 
    472         p_msg->dsap    = dsap;
    473         p_msg->miu     = miu;
    474         p_msg->rw      = rw;
    475         p_msg->client_handle = client_handle;
    476 
    477         nfa_sys_sendmsg (p_msg);
    478 
    479         return (NFA_STATUS_OK);
    480     }
    481 
    482     return (NFA_STATUS_FAILED);
    483 }
    484 
    485 /*******************************************************************************
    486 **
    487 ** Function         NFA_P2pSendUI
    488 **
    489 ** Description      This function is called to send data on connectionless
    490 **                  transport.
    491 **
    492 ** Returns          NFA_STATUS_OK if successfully initiated
    493 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    494 **                  NFA_STATUS_BAD_LENGTH if data length is more than remote link MIU
    495 **                  NFA_STATUS_CONGESTED  if congested
    496 **                  NFA_STATUS_FAILED otherwise
    497 **
    498 *******************************************************************************/
    499 tNFA_STATUS NFA_P2pSendUI (tNFA_HANDLE handle,
    500                            UINT8       dsap,
    501                            UINT16      length,
    502                            UINT8      *p_data)
    503 {
    504     tNFA_P2P_API_SEND_UI *p_msg;
    505     tNFA_STATUS           ret_status = NFA_STATUS_FAILED;
    506     tNFA_HANDLE           xx;
    507 
    508     P2P_TRACE_API3 ("NFA_P2pSendUI (): handle:0x%X, DSAP:0x%02X, length:%d", handle, dsap, length);
    509 
    510     GKI_sched_lock ();
    511 
    512     xx = handle & NFA_HANDLE_MASK;
    513 
    514     if (  (xx >= NFA_P2P_NUM_SAP)
    515         ||(nfa_p2p_cb.sap_cb[xx].p_cback == NULL))
    516     {
    517         P2P_TRACE_ERROR1 ("NFA_P2pSendUI (): Handle (0x%X) is not valid", handle);
    518         ret_status = NFA_STATUS_BAD_HANDLE;
    519     }
    520     else if (length > nfa_p2p_cb.remote_link_miu)
    521     {
    522         P2P_TRACE_ERROR3 ("NFA_P2pSendUI (): handle:0x%X, length(%d) must be less than remote link MIU(%d)",
    523                            handle, length, nfa_p2p_cb.remote_link_miu);
    524         ret_status = NFA_STATUS_BAD_LENGTH;
    525     }
    526     else if (nfa_p2p_cb.sap_cb[xx].flags & NFA_P2P_SAP_FLAG_LLINK_CONGESTED)
    527     {
    528         P2P_TRACE_WARNING1 ("NFA_P2pSendUI (): handle:0x%X, logical data link is already congested",
    529                              handle);
    530         ret_status = NFA_STATUS_CONGESTED;
    531     }
    532     else if (LLCP_IsLogicalLinkCongested ((UINT8)xx,
    533                                           nfa_p2p_cb.sap_cb[xx].num_pending_ui_pdu,
    534                                           nfa_p2p_cb.total_pending_ui_pdu,
    535                                           nfa_p2p_cb.total_pending_i_pdu))
    536     {
    537         nfa_p2p_cb.sap_cb[xx].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
    538 
    539         P2P_TRACE_WARNING1 ("NFA_P2pSendUI(): handle:0x%X, logical data link is congested",
    540                              handle);
    541         ret_status = NFA_STATUS_CONGESTED;
    542     }
    543     else if ((p_msg = (tNFA_P2P_API_SEND_UI *) GKI_getbuf (sizeof(tNFA_P2P_API_SEND_UI))) != NULL)
    544     {
    545         p_msg->hdr.event = NFA_P2P_API_SEND_UI_EVT;
    546 
    547         p_msg->handle  = handle;
    548         p_msg->dsap    = dsap;
    549 
    550         if ((p_msg->p_msg = (BT_HDR *) GKI_getpoolbuf (LLCP_POOL_ID)) != NULL)
    551         {
    552             p_msg->p_msg->len    = length;
    553             p_msg->p_msg->offset = LLCP_MIN_OFFSET;
    554             memcpy (((UINT8*) (p_msg->p_msg + 1) + p_msg->p_msg->offset), p_data, length);
    555 
    556             /* increase number of tx UI PDU which is not processed by NFA for congestion control */
    557             nfa_p2p_cb.sap_cb[xx].num_pending_ui_pdu++;
    558             nfa_p2p_cb.total_pending_ui_pdu++;
    559             nfa_sys_sendmsg (p_msg);
    560 
    561             ret_status = NFA_STATUS_OK;
    562         }
    563         else
    564         {
    565             GKI_freebuf (p_msg);
    566 
    567             nfa_p2p_cb.sap_cb[xx].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
    568             ret_status = NFA_STATUS_CONGESTED;
    569         }
    570     }
    571 
    572     GKI_sched_unlock ();
    573 
    574     return (ret_status);
    575 }
    576 
    577 /*******************************************************************************
    578 **
    579 ** Function         NFA_P2pReadUI
    580 **
    581 ** Description      This function is called to read data on connectionless
    582 **                  transport when receiving NFA_P2P_DATA_EVT with NFA_P2P_LLINK_TYPE.
    583 **
    584 **                  - Remote SAP who sent UI PDU is returned.
    585 **                  - Information of UI PDU up to max_data_len is copied into p_data.
    586 **                  - If more information of UI PDU or more UI PDU in queue then more
    587 **                    is returned to TRUE.
    588 **                  - Information of next UI PDU is not concatenated.
    589 **
    590 ** Returns          NFA_STATUS_OK if successfully initiated
    591 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    592 **
    593 *******************************************************************************/
    594 tNFA_STATUS NFA_P2pReadUI (tNFA_HANDLE handle,
    595                            UINT32      max_data_len,
    596                            UINT8       *p_remote_sap,
    597                            UINT32      *p_data_len,
    598                            UINT8       *p_data,
    599                            BOOLEAN     *p_more)
    600 {
    601     tNFA_STATUS ret_status;
    602     tNFA_HANDLE xx;
    603 
    604     P2P_TRACE_API1 ("NFA_P2pReadUI (): handle:0x%X", handle);
    605 
    606     GKI_sched_lock ();
    607 
    608     xx = handle & NFA_HANDLE_MASK;
    609 
    610     if (  (xx >= NFA_P2P_NUM_SAP)
    611         ||(nfa_p2p_cb.sap_cb[xx].p_cback == NULL)  )
    612     {
    613         P2P_TRACE_ERROR1 ("NFA_P2pReadUI (): Handle (0x%X) is not valid", handle);
    614         ret_status = NFA_STATUS_BAD_HANDLE;
    615     }
    616     else
    617     {
    618         *p_more = LLCP_ReadLogicalLinkData ((UINT8)xx,
    619                                             max_data_len,
    620                                             p_remote_sap,
    621                                             p_data_len,
    622                                             p_data);
    623         ret_status = NFA_STATUS_OK;
    624     }
    625 
    626     GKI_sched_unlock ();
    627 
    628     return (ret_status);
    629 }
    630 
    631 /*******************************************************************************
    632 **
    633 ** Function         NFA_P2pFlushUI
    634 **
    635 ** Description      This function is called to flush data on connectionless
    636 **                  transport.
    637 **
    638 ** Returns          NFA_STATUS_OK if successfully initiated
    639 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    640 **
    641 *******************************************************************************/
    642 tNFA_STATUS NFA_P2pFlushUI (tNFA_HANDLE handle,
    643                             UINT32      *p_length)
    644 {
    645     tNFA_STATUS ret_status;
    646     tNFA_HANDLE xx;
    647 
    648     P2P_TRACE_API1 ("NFA_P2pReadUI (): handle:0x%X", handle);
    649 
    650     GKI_sched_lock ();
    651 
    652     xx = handle & NFA_HANDLE_MASK;
    653 
    654     if (  (xx >= NFA_P2P_NUM_SAP)
    655         ||(nfa_p2p_cb.sap_cb[xx].p_cback == NULL)  )
    656     {
    657         P2P_TRACE_ERROR1 ("NFA_P2pFlushUI (): Handle (0x%X) is not valid", handle);
    658         ret_status = NFA_STATUS_BAD_HANDLE;
    659         *p_length  = 0;
    660     }
    661     else
    662     {
    663         *p_length  = LLCP_FlushLogicalLinkRxData ((UINT8)xx);
    664         ret_status = NFA_STATUS_OK;
    665     }
    666 
    667     GKI_sched_unlock ();
    668 
    669     return (ret_status);
    670 }
    671 
    672 /*******************************************************************************
    673 **
    674 ** Function         NFA_P2pSendData
    675 **
    676 ** Description      This function is called to send data on connection-oriented
    677 **                  transport.
    678 **
    679 ** Returns          NFA_STATUS_OK if successfully initiated
    680 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    681 **                  NFA_STATUS_BAD_LENGTH if data length is more than remote MIU
    682 **                  NFA_STATUS_CONGESTED  if congested
    683 **                  NFA_STATUS_FAILED otherwise
    684 **
    685 *******************************************************************************/
    686 tNFA_STATUS NFA_P2pSendData (tNFA_HANDLE handle,
    687                              UINT16      length,
    688                              UINT8      *p_data)
    689 {
    690     tNFA_P2P_API_SEND_DATA *p_msg;
    691     tNFA_STATUS            ret_status = NFA_STATUS_FAILED;
    692     tNFA_HANDLE            xx;
    693 
    694     P2P_TRACE_API2 ("NFA_P2pSendData (): handle:0x%X, length:%d", handle, length);
    695 
    696     GKI_sched_lock ();
    697 
    698     xx = handle & NFA_HANDLE_MASK;
    699     xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
    700 
    701     if (  (!(handle & NFA_P2P_HANDLE_FLAG_CONN))
    702         ||(xx >= LLCP_MAX_DATA_LINK)
    703         ||(nfa_p2p_cb.conn_cb[xx].flags == 0)  )
    704     {
    705         P2P_TRACE_ERROR1 ("NFA_P2pSendData (): Handle(0x%X) is not valid", handle);
    706         ret_status = NFA_STATUS_BAD_HANDLE;
    707     }
    708     else if (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO)
    709     {
    710         P2P_TRACE_ERROR1 ("NFA_P2pSendData (): handle:0x%X, Remote set RW to 0 (flow off)", handle);
    711         ret_status = NFA_STATUS_FAILED;
    712     }
    713     else if (nfa_p2p_cb.conn_cb[xx].remote_miu < length)
    714     {
    715         P2P_TRACE_ERROR2 ("NFA_P2pSendData (): handle:0x%X, Data more than remote MIU(%d)",
    716                            handle, nfa_p2p_cb.conn_cb[xx].remote_miu);
    717         ret_status = NFA_STATUS_BAD_LENGTH;
    718     }
    719     else if (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED)
    720     {
    721         P2P_TRACE_WARNING1 ("NFA_P2pSendData (): handle:0x%X, data link connection is already congested",
    722                             handle);
    723         ret_status = NFA_STATUS_CONGESTED;
    724     }
    725     else if (LLCP_IsDataLinkCongested (nfa_p2p_cb.conn_cb[xx].local_sap,
    726                                        nfa_p2p_cb.conn_cb[xx].remote_sap,
    727                                        nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu,
    728                                        nfa_p2p_cb.total_pending_ui_pdu,
    729                                        nfa_p2p_cb.total_pending_i_pdu))
    730     {
    731         nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
    732 
    733         P2P_TRACE_WARNING1 ("NFA_P2pSendData (): handle:0x%X, data link connection is congested",
    734                             handle);
    735         ret_status = NFA_STATUS_CONGESTED;
    736     }
    737     else if ((p_msg = (tNFA_P2P_API_SEND_DATA *) GKI_getbuf (sizeof(tNFA_P2P_API_SEND_DATA))) != NULL)
    738     {
    739         p_msg->hdr.event = NFA_P2P_API_SEND_DATA_EVT;
    740 
    741         p_msg->conn_handle  = handle;
    742 
    743         if ((p_msg->p_msg = (BT_HDR *) GKI_getpoolbuf (LLCP_POOL_ID)) != NULL)
    744         {
    745             p_msg->p_msg->len    = length;
    746             p_msg->p_msg->offset = LLCP_MIN_OFFSET;
    747             memcpy (((UINT8*) (p_msg->p_msg + 1) + p_msg->p_msg->offset), p_data, length);
    748 
    749             /* increase number of tx I PDU which is not processed by NFA for congestion control */
    750             nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu++;
    751             nfa_p2p_cb.total_pending_i_pdu++;
    752             nfa_sys_sendmsg (p_msg);
    753 
    754             ret_status = NFA_STATUS_OK;
    755         }
    756         else
    757         {
    758             GKI_freebuf (p_msg);
    759             nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
    760             ret_status = NFA_STATUS_CONGESTED;
    761         }
    762     }
    763 
    764     GKI_sched_unlock ();
    765 
    766     return (ret_status);
    767 }
    768 
    769 /*******************************************************************************
    770 **
    771 ** Function         NFA_P2pReadData
    772 **
    773 ** Description      This function is called to read data on connection-oriented
    774 **                  transport when receiving NFA_P2P_DATA_EVT with NFA_P2P_DLINK_TYPE.
    775 **
    776 **                  - Information of I PDU is copied into p_data up to max_data_len.
    777 **                  - If more information of I PDU or more I PDU in queue, then more
    778 **                    is returned to TRUE.
    779 **                  - Information of next I PDU is not concatenated.
    780 **
    781 ** Returns          NFA_STATUS_OK if successfully initiated
    782 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    783 **
    784 *******************************************************************************/
    785 tNFA_STATUS NFA_P2pReadData (tNFA_HANDLE handle,
    786                              UINT32      max_data_len,
    787                              UINT32      *p_data_len,
    788                              UINT8       *p_data,
    789                              BOOLEAN     *p_more)
    790 {
    791     tNFA_STATUS ret_status;
    792     tNFA_HANDLE xx;
    793 
    794     P2P_TRACE_API1 ("NFA_P2pReadData (): handle:0x%X", handle);
    795 
    796     GKI_sched_lock ();
    797 
    798     xx = handle & NFA_HANDLE_MASK;
    799     xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
    800 
    801     if (  (!(handle & NFA_P2P_HANDLE_FLAG_CONN))
    802         ||(xx >= LLCP_MAX_DATA_LINK)
    803         ||(nfa_p2p_cb.conn_cb[xx].flags == 0)  )
    804     {
    805         P2P_TRACE_ERROR1 ("NFA_P2pReadData (): Handle(0x%X) is not valid", handle);
    806         ret_status = NFA_STATUS_BAD_HANDLE;
    807     }
    808     else
    809     {
    810         *p_more = LLCP_ReadDataLinkData (nfa_p2p_cb.conn_cb[xx].local_sap,
    811                                          nfa_p2p_cb.conn_cb[xx].remote_sap,
    812                                          max_data_len,
    813                                          p_data_len,
    814                                          p_data);
    815         ret_status = NFA_STATUS_OK;
    816     }
    817 
    818     GKI_sched_unlock ();
    819 
    820     return (ret_status);
    821 }
    822 
    823 /*******************************************************************************
    824 **
    825 ** Function         NFA_P2pFlushData
    826 **
    827 ** Description      This function is called to flush data on connection-oriented
    828 **                  transport.
    829 **
    830 ** Returns          NFA_STATUS_OK if successfully initiated
    831 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    832 **
    833 *******************************************************************************/
    834 tNFA_STATUS NFA_P2pFlushData (tNFA_HANDLE handle,
    835                               UINT32      *p_length)
    836 {
    837     tNFA_STATUS ret_status;
    838     tNFA_HANDLE xx;
    839 
    840     P2P_TRACE_API1 ("NFA_P2pFlushData (): handle:0x%X", handle);
    841 
    842     GKI_sched_lock ();
    843 
    844     xx = handle & NFA_HANDLE_MASK;
    845     xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
    846 
    847     if (  (!(handle & NFA_P2P_HANDLE_FLAG_CONN))
    848         ||(xx >= LLCP_MAX_DATA_LINK)
    849         ||(nfa_p2p_cb.conn_cb[xx].flags == 0)  )
    850     {
    851         P2P_TRACE_ERROR1 ("NFA_P2pFlushData (): Handle(0x%X) is not valid", handle);
    852         ret_status = NFA_STATUS_BAD_HANDLE;
    853     }
    854     else
    855     {
    856         *p_length = LLCP_FlushDataLinkRxData (nfa_p2p_cb.conn_cb[xx].local_sap,
    857                                               nfa_p2p_cb.conn_cb[xx].remote_sap);
    858         ret_status = NFA_STATUS_OK;
    859     }
    860 
    861     GKI_sched_unlock ();
    862 
    863     return (ret_status);
    864 }
    865 
    866 /*******************************************************************************
    867 **
    868 ** Function         NFA_P2pSetLocalBusy
    869 **
    870 ** Description      This function is called to stop or resume incoming data on
    871 **                  connection-oriented transport.
    872 **
    873 ** Returns          NFA_STATUS_OK if successfully initiated
    874 **                  NFA_STATUS_BAD_HANDLE if handle is not valid
    875 **                  NFA_STATUS_FAILED otherwise
    876 **
    877 *******************************************************************************/
    878 tNFA_STATUS NFA_P2pSetLocalBusy (tNFA_HANDLE conn_handle,
    879                                  BOOLEAN     is_busy)
    880 {
    881     tNFA_P2P_API_SET_LOCAL_BUSY *p_msg;
    882     tNFA_HANDLE                  xx;
    883 
    884     P2P_TRACE_API2 ("NFA_P2pSetLocalBusy (): conn_handle:0x%02X, is_busy:%d", conn_handle, is_busy);
    885 
    886     xx = conn_handle & NFA_HANDLE_MASK;
    887 
    888     if (!(xx & NFA_P2P_HANDLE_FLAG_CONN))
    889     {
    890         P2P_TRACE_ERROR0 ("NFA_P2pSetLocalBusy (): Connection Handle is not valid");
    891         return (NFA_STATUS_BAD_HANDLE);
    892     }
    893     else
    894     {
    895         xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
    896     }
    897 
    898     if (  (xx >= LLCP_MAX_DATA_LINK)
    899         ||(nfa_p2p_cb.conn_cb[xx].flags == 0)  )
    900     {
    901         P2P_TRACE_ERROR0 ("NFA_P2pSetLocalBusy (): Connection Handle is not valid");
    902         return (NFA_STATUS_BAD_HANDLE);
    903     }
    904 
    905     if ((p_msg = (tNFA_P2P_API_SET_LOCAL_BUSY *) GKI_getbuf (sizeof (tNFA_P2P_API_SET_LOCAL_BUSY))) != NULL)
    906     {
    907         p_msg->hdr.event = NFA_P2P_API_SET_LOCAL_BUSY_EVT;
    908 
    909         p_msg->conn_handle = conn_handle;
    910         p_msg->is_busy     = is_busy;
    911 
    912         nfa_sys_sendmsg (p_msg);
    913 
    914         return (NFA_STATUS_OK);
    915     }
    916 
    917     return (NFA_STATUS_FAILED);
    918 }
    919 
    920 /*******************************************************************************
    921 **
    922 ** Function         NFA_P2pGetLinkInfo
    923 **
    924 ** Description      This function is called to get local/remote link MIU and
    925 **                  Well-Known Service list encoded as a 16-bit field of connected LLCP.
    926 **                  NFA_P2P_LINK_INFO_EVT will be returned.
    927 **
    928 ** Returns          NFA_STATUS_OK if successfully initiated
    929 **                  NFA_STATUS_BAD_HANDLE if server or client is not registered
    930 **                  NFA_STATUS_FAILED otherwise
    931 **
    932 *******************************************************************************/
    933 tNFA_STATUS NFA_P2pGetLinkInfo (tNFA_HANDLE handle)
    934 {
    935     tNFA_P2P_API_GET_LINK_INFO *p_msg;
    936     tNFA_HANDLE                 xx;
    937 
    938     P2P_TRACE_API1 ("NFA_P2pGetLinkInfo (): handle:0x%x", handle);
    939 
    940     if (nfa_p2p_cb.llcp_state != NFA_P2P_LLCP_STATE_ACTIVATED)
    941     {
    942         P2P_TRACE_ERROR0 ("NFA_P2pGetLinkInfo (): LLCP link is not activated");
    943         return (NFA_STATUS_FAILED);
    944     }
    945 
    946     xx = handle & NFA_HANDLE_MASK;
    947 
    948     if (  (xx >= NFA_P2P_NUM_SAP)
    949         ||(nfa_p2p_cb.sap_cb[xx].p_cback == NULL)  )
    950     {
    951         P2P_TRACE_ERROR0 ("NFA_P2pGetLinkInfo (): Handle is invalid or not registered");
    952         return (NFA_STATUS_BAD_HANDLE);
    953     }
    954 
    955     if ((p_msg = (tNFA_P2P_API_GET_LINK_INFO *) GKI_getbuf (sizeof (tNFA_P2P_API_GET_LINK_INFO))) != NULL)
    956     {
    957         p_msg->hdr.event = NFA_P2P_API_GET_LINK_INFO_EVT;
    958 
    959         p_msg->handle = handle;
    960 
    961         nfa_sys_sendmsg (p_msg);
    962 
    963         return (NFA_STATUS_OK);
    964     }
    965 
    966     return (NFA_STATUS_FAILED);
    967 }
    968 
    969 /*******************************************************************************
    970 **
    971 ** Function         NFA_P2pGetRemoteSap
    972 **
    973 ** Description      This function is called to get SAP associated by service name
    974 **                  on connected remote LLCP.
    975 **                  NFA_P2P_SDP_EVT will be returned.
    976 **
    977 ** Returns          NFA_STATUS_OK if successfully initiated
    978 **                  NFA_STATUS_BAD_HANDLE if server or client is not registered
    979 **                  NFA_STATUS_FAILED otherwise
    980 **
    981 *******************************************************************************/
    982 tNFA_STATUS NFA_P2pGetRemoteSap (tNFA_HANDLE handle,
    983                                  char        *p_service_name)
    984 {
    985     tNFA_P2P_API_GET_REMOTE_SAP *p_msg;
    986     tNFA_HANDLE                  xx;
    987 
    988     P2P_TRACE_API2 ("NFA_P2pGetRemoteSap(): handle:0x%x, SN:<%s>", handle, p_service_name);
    989 
    990     if (nfa_p2p_cb.llcp_state != NFA_P2P_LLCP_STATE_ACTIVATED)
    991     {
    992         P2P_TRACE_ERROR0 ("NFA_P2pGetRemoteSap(): LLCP link is not activated");
    993         return (NFA_STATUS_FAILED);
    994     }
    995 
    996     xx = handle & NFA_HANDLE_MASK;
    997 
    998     if (  (xx >= NFA_P2P_NUM_SAP)
    999         ||(nfa_p2p_cb.sap_cb[xx].p_cback == NULL)  )
   1000     {
   1001         P2P_TRACE_ERROR0 ("NFA_P2pGetRemoteSap (): Handle is invalid or not registered");
   1002         return (NFA_STATUS_BAD_HANDLE);
   1003     }
   1004 
   1005     if ((p_msg = (tNFA_P2P_API_GET_REMOTE_SAP *) GKI_getbuf (sizeof (tNFA_P2P_API_GET_REMOTE_SAP))) != NULL)
   1006     {
   1007         p_msg->hdr.event = NFA_P2P_API_GET_REMOTE_SAP_EVT;
   1008 
   1009         p_msg->handle = handle;
   1010 
   1011         BCM_STRNCPY_S (p_msg->service_name, sizeof (p_msg->service_name), p_service_name, LLCP_MAX_SN_LEN);
   1012         p_msg->service_name[LLCP_MAX_SN_LEN] = 0;
   1013 
   1014         nfa_sys_sendmsg (p_msg);
   1015 
   1016         return (NFA_STATUS_OK);
   1017     }
   1018 
   1019     return (NFA_STATUS_FAILED);
   1020 }
   1021 
   1022 /*******************************************************************************
   1023 **
   1024 ** Function         NFA_P2pSetLLCPConfig
   1025 **
   1026 ** Description      This function is called to change LLCP config parameters.
   1027 **                  Application must call while LLCP is not activated.
   1028 **
   1029 **                  Parameters descriptions (default value)
   1030 **                  - Local Link MIU (LLCP_MIU)
   1031 **                  - Option parameter (LLCP_OPT_VALUE)
   1032 **                  - Response Waiting Time Index (LLCP_WAITING_TIME)
   1033 **                  - Local Link Timeout (LLCP_LTO_VALUE)
   1034 **                  - Inactivity Timeout as initiator role (LLCP_INIT_INACTIVITY_TIMEOUT)
   1035 **                  - Inactivity Timeout as target role (LLCP_TARGET_INACTIVITY_TIMEOUT)
   1036 **                  - Delay SYMM response (LLCP_DELAY_RESP_TIME)
   1037 **                  - Data link connection timeout (LLCP_DATA_LINK_CONNECTION_TOUT)
   1038 **                  - Delay timeout to send first PDU as initiator (LLCP_DELAY_TIME_TO_SEND_FIRST_PDU)
   1039 **
   1040 ** Returns          NFA_STATUS_OK if successfully initiated
   1041 **                  NFA_STATUS_FAILED otherwise
   1042 **
   1043 *******************************************************************************/
   1044 tNFA_STATUS NFA_P2pSetLLCPConfig (UINT16 link_miu,
   1045                                   UINT8  opt,
   1046                                   UINT8  wt,
   1047                                   UINT16 link_timeout,
   1048                                   UINT16 inact_timeout_init,
   1049                                   UINT16 inact_timeout_target,
   1050                                   UINT16 symm_delay,
   1051                                   UINT16 data_link_timeout,
   1052                                   UINT16 delay_first_pdu_timeout)
   1053 {
   1054     tNFA_P2P_API_SET_LLCP_CFG *p_msg;
   1055 
   1056     P2P_TRACE_API4 ("NFA_P2pSetLLCPConfig ():link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
   1057                      link_miu, opt, wt, link_timeout);
   1058     P2P_TRACE_API4 ("                       inact_timeout(init:%d, target:%d), symm_delay:%d, data_link_timeout:%d",
   1059                      inact_timeout_init, inact_timeout_target, symm_delay, data_link_timeout);
   1060     P2P_TRACE_API1 ("                       delay_first_pdu_timeout:%d", delay_first_pdu_timeout);
   1061 
   1062     if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED)
   1063     {
   1064         P2P_TRACE_ERROR0 ("NFA_P2pSetLLCPConfig (): LLCP link is activated");
   1065         return (NFA_STATUS_FAILED);
   1066     }
   1067 
   1068     if ((p_msg = (tNFA_P2P_API_SET_LLCP_CFG *) GKI_getbuf (sizeof (tNFA_P2P_API_SET_LLCP_CFG))) != NULL)
   1069     {
   1070         p_msg->hdr.event = NFA_P2P_API_SET_LLCP_CFG_EVT;
   1071 
   1072         p_msg->link_miu             = link_miu;
   1073         p_msg->opt                  = opt;
   1074         p_msg->wt                   = wt;
   1075         p_msg->link_timeout         = link_timeout;
   1076         p_msg->inact_timeout_init   = inact_timeout_init;
   1077         p_msg->inact_timeout_target = inact_timeout_target;
   1078         p_msg->symm_delay           = symm_delay;
   1079         p_msg->data_link_timeout    = data_link_timeout;
   1080         p_msg->delay_first_pdu_timeout = delay_first_pdu_timeout;
   1081 
   1082         nfa_sys_sendmsg (p_msg);
   1083 
   1084         return (NFA_STATUS_OK);
   1085     }
   1086 
   1087     return (NFA_STATUS_FAILED);
   1088 }
   1089 
   1090 /*******************************************************************************
   1091 **
   1092 ** Function         NFA_P2pGetLLCPConfig
   1093 **
   1094 ** Description      This function is called to read LLCP config parameters.
   1095 **
   1096 **                  Parameters descriptions
   1097 **                  - Local Link MIU
   1098 **                  - Option parameter
   1099 **                  - Response Waiting Time Index
   1100 **                  - Local Link Timeout
   1101 **                  - Inactivity Timeout as initiator role
   1102 **                  - Inactivity Timeout as target role
   1103 **                  - Delay SYMM response
   1104 **                  - Data link connection timeout
   1105 **                  - Delay timeout to send first PDU as initiator
   1106 **
   1107 ** Returns          None
   1108 **
   1109 *******************************************************************************/
   1110 void NFA_P2pGetLLCPConfig (UINT16 *p_link_miu,
   1111                            UINT8  *p_opt,
   1112                            UINT8  *p_wt,
   1113                            UINT16 *p_link_timeout,
   1114                            UINT16 *p_inact_timeout_init,
   1115                            UINT16 *p_inact_timeout_target,
   1116                            UINT16 *p_symm_delay,
   1117                            UINT16 *p_data_link_timeout,
   1118                            UINT16 *p_delay_first_pdu_timeout)
   1119 {
   1120     LLCP_GetConfig (p_link_miu,
   1121                     p_opt,
   1122                     p_wt,
   1123                     p_link_timeout,
   1124                     p_inact_timeout_init,
   1125                     p_inact_timeout_target,
   1126                     p_symm_delay,
   1127                     p_data_link_timeout,
   1128                     p_delay_first_pdu_timeout);
   1129 
   1130     P2P_TRACE_API4 ("NFA_P2pGetLLCPConfig () link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
   1131                      *p_link_miu, *p_opt, *p_wt, *p_link_timeout);
   1132     P2P_TRACE_API4 ("                       inact_timeout(init:%d, target:%d), symm_delay:%d, data_link_timeout:%d",
   1133                      *p_inact_timeout_init, *p_inact_timeout_target, *p_symm_delay, *p_data_link_timeout);
   1134     P2P_TRACE_API1 ("                       delay_first_pdu_timeout:%d", *p_delay_first_pdu_timeout);
   1135 
   1136 }
   1137 
   1138 /*******************************************************************************
   1139 **
   1140 ** Function         NFA_P2pSetTraceLevel
   1141 **
   1142 ** Description      This function sets the trace level for P2P.  If called with
   1143 **                  a value of 0xFF, it simply returns the current trace level.
   1144 **
   1145 ** Returns          The new or current trace level
   1146 **
   1147 *******************************************************************************/
   1148 UINT8 NFA_P2pSetTraceLevel (UINT8 new_level)
   1149 {
   1150     if (new_level != 0xFF)
   1151         nfa_p2p_cb.trace_level = new_level;
   1152 
   1153     return (nfa_p2p_cb.trace_level);
   1154 }
   1155 
   1156