1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This is the implementation file for the NFA P2P.
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_api.h"
266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "llcp_defs.h"
276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_dm_int.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_p2p_api.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_p2p_int.h"
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_sys.h"
316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_sys_int.h"
326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_api.h"
336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "string.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Global Variables
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Static Functions
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Constants
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_allocate_conn_cb
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Allocate data link connection control block
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
54512ee63c7cc8feb016863e507a5d33cd0f4242bfRuchi Kandoi** Returns          uint8_t
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint8_t nfa_p2p_allocate_conn_cb(uint8_t local_sap) {
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) {
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_p2p_cb.conn_cb[xx].flags == 0) {
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_IN_USE;
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.conn_cb[xx].local_sap = local_sap;
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (xx);
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_ERROR0("nfa_p2p_allocate_conn_cb (): No resource");
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return LLCP_MAX_DATA_LINK;
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_deallocate_conn_cb
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deallocate data link connection control block
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfa_p2p_deallocate_conn_cb(uint8_t xx) {
856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (xx < LLCP_MAX_DATA_LINK) {
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_cb.conn_cb[xx].flags = 0;
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    P2P_TRACE_ERROR1("nfa_p2p_deallocate_conn_cb (): Invalid index (%d)", xx);
896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_find_conn_cb
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find data link connection control block by local/remote SAP
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
99512ee63c7cc8feb016863e507a5d33cd0f4242bfRuchi Kandoi** Returns          uint8_t
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint8_t nfa_p2p_find_conn_cb(uint8_t local_sap, uint8_t remote_sap) {
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) {
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) &&
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (nfa_p2p_cb.conn_cb[xx].local_sap == local_sap) &&
1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (nfa_p2p_cb.conn_cb[xx].remote_sap == remote_sap)) {
1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (xx);
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (LLCP_MAX_DATA_LINK);
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_llcp_cback
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing SAP callback events from LLCP
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfa_p2p_llcp_cback(tLLCP_SAP_CBACK_DATA* p_data) {
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG2("nfa_p2p_llcp_cback (): event:0x%02X, local_sap:0x%02X",
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   p_data->hdr.event, p_data->hdr.local_sap);
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_data->hdr.event) {
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_SAP_EVT_DATA_IND:
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_proc_llcp_data_ind(p_data);
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_SAP_EVT_CONNECT_IND:
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_proc_llcp_connect_ind(p_data);
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_SAP_EVT_CONNECT_RESP:
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_proc_llcp_connect_resp(p_data);
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_SAP_EVT_DISCONNECT_IND:
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_proc_llcp_disconnect_ind(p_data);
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_SAP_EVT_DISCONNECT_RESP:
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_proc_llcp_disconnect_resp(p_data);
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_SAP_EVT_CONGEST:
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_proc_llcp_congestion(p_data);
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_SAP_EVT_LINK_STATUS:
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_proc_llcp_link_status(p_data);
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      P2P_TRACE_ERROR1("nfa_p2p_llcp_cback (): Unknown event:0x%02X",
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                       p_data->hdr.event);
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return;
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_sdp_cback
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process SDP callback event from LLCP
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_p2p_sdp_cback(uint8_t tid, uint8_t remote_sap) {
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap;
1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG2("nfa_p2p_sdp_cback (): tid:0x%02X, remote_sap:0x%02X", tid,
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   remote_sap);
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* search for callback function to process */
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) {
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((nfa_p2p_cb.sdp_cb[xx].local_sap != LLCP_INVALID_SAP) &&
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (nfa_p2p_cb.sdp_cb[xx].tid == tid)) {
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_sap = nfa_p2p_cb.sdp_cb[xx].local_sap;
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.sdp.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.sdp.remote_sap = remote_sap;
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_SDP_EVT, &evt_data);
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sdp_cb[xx].local_sap = LLCP_INVALID_SAP;
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_start_sdp
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initiate SDP
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_start_sdp(char* p_service_name, uint8_t local_sap) {
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG1("nfa_p2p_start_sdp (): SN:<%s>", p_service_name);
2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* search for empty slot */
2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) {
2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_p2p_cb.sdp_cb[xx].local_sap == LLCP_INVALID_SAP) {
2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (LLCP_DiscoverService(p_service_name, nfa_p2p_sdp_cback,
2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                               &(nfa_p2p_cb.sdp_cb[xx].tid)) ==
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          LLCP_STATUS_SUCCESS) {
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sdp_cb[xx].local_sap = local_sap;
2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return true;
2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* failure of SDP */
2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return false;
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return false;
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_proc_llcp_data_ind
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing incoming data event from LLCP
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_p2p_proc_llcp_data_ind(tLLCP_SAP_CBACK_DATA* p_data) {
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap, xx;
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_proc_llcp_data_ind ()");
2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = p_data->data_ind.local_sap;
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.data.handle = 0;
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if connectionless */
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_data->data_ind.link_type == NFA_P2P_LLINK_TYPE) {
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.data.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      xx = nfa_p2p_find_conn_cb(p_data->data_ind.local_sap,
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                p_data->data_ind.remote_sap);
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (xx != LLCP_MAX_DATA_LINK) {
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.data.handle =
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.data.remote_sap = p_data->data_ind.remote_sap;
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.data.link_type = p_data->data_ind.link_type;
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* notify upper layer that there are data at LLCP */
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DATA_EVT, &evt_data);
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_proc_llcp_connect_ind
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing connection request from peer
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_p2p_proc_llcp_connect_ind(tLLCP_SAP_CBACK_DATA* p_data) {
2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t server_sap, local_sap;
2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG1("nfa_p2p_proc_llcp_connect_ind () server_sap:0x%x",
2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   p_data->connect_ind.server_sap);
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  server_sap = p_data->connect_ind.server_sap;
2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = p_data->connect_ind.local_sap;
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[server_sap].p_cback) {
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    xx = nfa_p2p_allocate_conn_cb(server_sap);
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (xx != LLCP_MAX_DATA_LINK) {
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.conn_cb[xx].remote_sap = p_data->connect_ind.remote_sap;
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.conn_cb[xx].remote_miu = p_data->connect_ind.miu;
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* peer will not receive any data */
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_data->connect_ind.rw == 0)
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO;
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.conn_req.server_handle = (NFA_HANDLE_GROUP_P2P | server_sap);
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.conn_req.conn_handle =
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.conn_req.remote_sap = p_data->connect_ind.remote_sap;
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.conn_req.remote_miu = p_data->connect_ind.miu;
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.conn_req.remote_rw = p_data->connect_ind.rw;
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[server_sap].p_cback(NFA_P2P_CONN_REQ_EVT, &evt_data);
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    P2P_TRACE_ERROR0("nfa_p2p_proc_llcp_connect_ind (): Not registered");
3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_proc_llcp_connect_resp
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing connection response from peer
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_p2p_proc_llcp_connect_resp(tLLCP_SAP_CBACK_DATA* p_data) {
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap, xx;
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_proc_llcp_connect_resp ()");
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = p_data->connect_resp.local_sap;
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    xx = nfa_p2p_allocate_conn_cb(local_sap);
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (xx != LLCP_MAX_DATA_LINK) {
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.conn_cb[xx].remote_sap = p_data->connect_resp.remote_sap;
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.conn_cb[xx].remote_miu = p_data->connect_resp.miu;
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* peer will not receive any data */
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_data->connect_resp.rw == 0)
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO;
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.connected.client_handle = (NFA_HANDLE_GROUP_P2P | local_sap);
3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.connected.conn_handle =
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.connected.remote_sap = p_data->connect_resp.remote_sap;
3526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.connected.remote_miu = p_data->connect_resp.miu;
3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.connected.remote_rw = p_data->connect_resp.rw;
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONNECTED_EVT, &evt_data);
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_proc_llcp_disconnect_ind
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing disconnection request from peer
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_p2p_proc_llcp_disconnect_ind(tLLCP_SAP_CBACK_DATA* p_data) {
3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap, xx;
3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_proc_llcp_disconnect_ind ()");
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = p_data->disconnect_ind.local_sap;
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    xx = nfa_p2p_find_conn_cb(p_data->disconnect_ind.local_sap,
3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              p_data->disconnect_ind.remote_sap);
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (xx != LLCP_MAX_DATA_LINK) {
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.handle =
3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.reason = NFA_P2P_DISC_REASON_REMOTE_INITIATE;
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_deallocate_conn_cb(xx);
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /*
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** LLCP link has been deactivated before receiving CC or DM.
3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** Return NFA_P2P_DISC_EVT to indicate failure of creating
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** connection
3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      */
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      P2P_TRACE_ERROR0("nfa_p2p_proc_llcp_disconnect_ind (): Link deactivated");
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_proc_llcp_disconnect_resp
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing rejected connection from peer
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_p2p_proc_llcp_disconnect_resp(tLLCP_SAP_CBACK_DATA* p_data) {
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap, xx;
4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_proc_llcp_disconnect_resp ()");
4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = p_data->disconnect_resp.local_sap;
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_RESP_DISC) {
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.reason = NFA_P2P_DISC_REASON_LOCAL_INITITATE;
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if ((p_data->disconnect_resp.reason ==
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                LLCP_SAP_DM_REASON_APP_REJECTED) ||
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (p_data->disconnect_resp.reason ==
4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                LLCP_SAP_DM_REASON_PERM_REJECT_THIS) ||
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (p_data->disconnect_resp.reason ==
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                LLCP_SAP_DM_REASON_PERM_REJECT_ANY) ||
4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (p_data->disconnect_resp.reason ==
4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                LLCP_SAP_DM_REASON_TEMP_REJECT_THIS) ||
4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (p_data->disconnect_resp.reason ==
4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                LLCP_SAP_DM_REASON_TEMP_REJECT_ANY)) {
4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.reason = NFA_P2P_DISC_REASON_REMOTE_REJECT;
4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if (p_data->disconnect_resp.reason ==
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               LLCP_SAP_DM_REASON_NO_SERVICE) {
4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_SERVICE;
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if (p_data->disconnect_resp.reason ==
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               LLCP_SAP_DM_REASON_NO_ACTIVE_CONNECTION) {
4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_INFORMATION;
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (evt_data.disc.reason == NFA_P2P_DISC_REASON_LOCAL_INITITATE) {
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      xx = nfa_p2p_find_conn_cb(p_data->disconnect_resp.local_sap,
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                p_data->disconnect_resp.remote_sap);
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (xx != LLCP_MAX_DATA_LINK) {
4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.disc.handle =
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_deallocate_conn_cb(xx);
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        P2P_TRACE_ERROR0(
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            "nfa_p2p_proc_llcp_disconnect_resp (): No connection found");
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_proc_llcp_congest
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing LLCP congestion event
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_p2p_proc_llcp_congestion(tLLCP_SAP_CBACK_DATA* p_data) {
4826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap, remote_sap, xx;
4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = p_data->congest.local_sap;
4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  remote_sap = p_data->congest.remote_sap;
4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.congest.link_type = p_data->congest.link_type;
4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.congest.is_congested = p_data->congest.is_congested;
4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_data->congest.is_congested) {
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    P2P_TRACE_DEBUG2("nfa_p2p_proc_llcp_congestion () START SAP=(0x%x,0x%x)",
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                     local_sap, remote_sap);
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    P2P_TRACE_DEBUG2("nfa_p2p_proc_llcp_congestion () END SAP=(0x%x,0x%x)",
4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                     local_sap, remote_sap);
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (evt_data.congest.link_type == NFA_P2P_LLINK_TYPE) {
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((evt_data.congest.is_congested == false) &&
5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (nfa_p2p_cb.sap_cb[local_sap].flags &
5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           NFA_P2P_SAP_FLAG_LLINK_CONGESTED)) {
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].flags &= ~NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if ((evt_data.congest.is_congested == true) &&
5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 (!(nfa_p2p_cb.sap_cb[local_sap].flags &
5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    NFA_P2P_SAP_FLAG_LLINK_CONGESTED))) {
5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* this is overall congestion due to high usage of buffer pool */
5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      xx = nfa_p2p_find_conn_cb(local_sap, remote_sap);
5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (xx != LLCP_MAX_DATA_LINK) {
5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.congest.handle =
5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((evt_data.congest.is_congested == false) &&
5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED)) {
5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_p2p_cb.conn_cb[xx].flags &= ~NFA_P2P_CONN_FLAG_CONGESTED;
5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if ((evt_data.congest.is_congested == true) &&
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   (!(nfa_p2p_cb.conn_cb[xx].flags &
5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      NFA_P2P_CONN_FLAG_CONGESTED))) {
5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* this is overall congestion due to high usage of buffer pool */
5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
5356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        P2P_TRACE_ERROR0(
5366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            "nfa_p2p_proc_llcp_congestion (): No connection found");
5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_proc_llcp_link_status
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing LLCP link status
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          next state after processing this event
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_p2p_proc_llcp_link_status(tLLCP_SAP_CBACK_DATA* p_data) {
5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap, xx;
5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG1("nfa_p2p_proc_llcp_link_status () is_activated:%d",
5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   p_data->link_status.is_activated);
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = p_data->link_status.local_sap;
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_data->link_status.is_activated) {
5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* only for server */
5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
5656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu;
5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_ACTIVATED_EVT, &evt_data);
5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else /* if LLCP link is deactivated */
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) {
5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) &&
5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (nfa_p2p_cb.conn_cb[xx].local_sap == local_sap)) {
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          evt_data.disc.handle =
5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED;
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_p2p_deallocate_conn_cb(xx);
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* notify deactivation and clear flags */
5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_SERVER) {
5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.deactivated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DEACTIVATED_EVT,
5876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                             &evt_data);
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_SERVER;
5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if (nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_CLIENT) {
5916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.deactivated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DEACTIVATED_EVT,
5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                             &evt_data);
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_CLIENT;
5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else /* if this is not registered service */
5976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      {
5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].p_cback = NULL;
5996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
6016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_reg_server
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Allocate a service as server and register to LLCP
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          FALSE if need to keep buffer
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_reg_server(tNFA_P2P_MSG* p_msg) {
6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t server_sap;
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_reg_server ()");
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  server_sap = LLCP_RegisterServer(
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_msg->api_reg_server.server_sap, p_msg->api_reg_server.link_type,
6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_msg->api_reg_server.service_name, nfa_p2p_llcp_cback);
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (server_sap == LLCP_INVALID_SAP) {
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.reg_server.server_handle = NFA_HANDLE_INVALID;
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.reg_server.server_sap = NFA_P2P_INVALID_SAP;
6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    strncpy(evt_data.reg_server.service_name,
6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_msg->api_reg_server.service_name, LLCP_MAX_SN_LEN);
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    evt_data.reg_server.service_name[LLCP_MAX_SN_LEN] = 0;
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_msg->api_reg_server.p_cback(NFA_P2P_REG_SERVER_EVT, &evt_data);
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6334a179646f6d5567830a0383050aee7610a0222a6Ruchi Kandoi    return true;
6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if need to update WKS in LLCP Gen bytes */
6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (server_sap <= LLCP_UPPER_BOUND_WK_SAP) {
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_enable_listening(NFA_ID_P2P, true);
6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (!nfa_p2p_cb.is_p2p_listening) {
6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_enable_listening(NFA_ID_P2P, false);
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_cb.sap_cb[server_sap].p_cback = p_msg->api_reg_server.p_cback;
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_cb.sap_cb[server_sap].flags = NFA_P2P_SAP_FLAG_SERVER;
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.reg_server.server_handle = (NFA_HANDLE_GROUP_P2P | server_sap);
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.reg_server.server_sap = server_sap;
6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  strncpy(evt_data.reg_server.service_name, p_msg->api_reg_server.service_name,
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          LLCP_MAX_SN_LEN);
6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.reg_server.service_name[LLCP_MAX_SN_LEN] = 0;
6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* notify NFA_P2P_REG_SERVER_EVT to server */
6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_cb.sap_cb[server_sap].p_cback(NFA_P2P_REG_SERVER_EVT, &evt_data);
6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if LLCP is already activated */
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED) {
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | server_sap);
6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu;
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* notify NFA_P2P_ACTIVATED_EVT to server */
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_cb.sap_cb[server_sap].p_cback(NFA_P2P_ACTIVATED_EVT, &evt_data);
6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_reg_client
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Allocate a service as client and register to LLCP
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_reg_client(tNFA_P2P_MSG* p_msg) {
6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap;
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_reg_client ()");
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap =
6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_RegisterClient(p_msg->api_reg_client.link_type, nfa_p2p_llcp_cback);
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (local_sap == LLCP_INVALID_SAP) {
6886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.reg_client.client_handle = NFA_HANDLE_INVALID;
6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_msg->api_reg_client.p_cback(NFA_P2P_REG_CLIENT_EVT, &evt_data);
6906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_cb.sap_cb[local_sap].p_cback = p_msg->api_reg_client.p_cback;
6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_CLIENT;
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.reg_client.client_handle = (NFA_HANDLE_GROUP_P2P | local_sap);
6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_REG_CLIENT_EVT, &evt_data);
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if LLCP is already activated */
7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED) {
7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu;
7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* notify NFA_P2P_ACTIVATED_EVT to client */
7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_ACTIVATED_EVT, &evt_data);
7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_dereg
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
716552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Deallocate a service as server or client and deregister to
717552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  LLCP. LLCP will deallocate data link connection created by
718552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  this server
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_dereg(tNFA_P2P_MSG* p_msg) {
7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap, xx;
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_dereg ()");
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = (uint8_t)(p_msg->api_dereg.handle & NFA_HANDLE_MASK);
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) {
7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) &&
7336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (nfa_p2p_cb.conn_cb[xx].local_sap == local_sap)) {
7346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_deallocate_conn_cb(xx);
7356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_Deregister(local_sap);
7406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_cb.sap_cb[local_sap].p_cback = NULL;
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.is_p2p_listening) {
7436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* check if this is the last server on NFA P2P */
7446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (xx = 0; xx < NFA_P2P_NUM_SAP; xx++) {
7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((nfa_p2p_cb.sap_cb[xx].p_cback) &&
7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (nfa_p2p_cb.sap_cb[xx].flags & NFA_P2P_SAP_FLAG_SERVER)) {
7476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
7486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (xx >= NFA_P2P_NUM_SAP) {
7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if need to update WKS in LLCP Gen bytes */
7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (local_sap <= LLCP_UPPER_BOUND_WK_SAP)
7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_disable_listening(NFA_ID_P2P, true);
7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      else
7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_disable_listening(NFA_ID_P2P, false);
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
7586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if need to update WKS in LLCP Gen bytes */
7596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if (local_sap <= LLCP_UPPER_BOUND_WK_SAP) {
7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_enable_listening(NFA_ID_P2P, true);
7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
7626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_accept_connection
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Connection Confirm from local application
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_accept_connection(tNFA_P2P_MSG* p_msg) {
7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_CONNECTION_PARAMS params;
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_accept_connection ()");
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx = (uint8_t)(p_msg->api_accept.conn_handle & NFA_HANDLE_MASK);
7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  params.miu = p_msg->api_accept.miu;
7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  params.rw = p_msg->api_accept.rw;
7886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  params.sn[0] = 0;
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_ConnectCfm(nfa_p2p_cb.conn_cb[xx].local_sap,
7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  nfa_p2p_cb.conn_cb[xx].remote_sap, &params);
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_reject_connection
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reject connection by local application
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_reject_connection(tNFA_P2P_MSG* p_msg) {
8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_reject_connection ()");
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx = (uint8_t)(p_msg->api_reject.conn_handle & NFA_HANDLE_MASK);
8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_ConnectReject(nfa_p2p_cb.conn_cb[xx].local_sap,
8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                     nfa_p2p_cb.conn_cb[xx].remote_sap,
8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                     LLCP_SAP_DM_REASON_APP_REJECTED);
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* no need to deregister service on LLCP */
8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_deallocate_conn_cb(xx);
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_disconnect
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Disconnect data link connection by local application
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_disconnect(tNFA_P2P_MSG* p_msg) {
8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap, xx;
8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_disconnect ()");
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx = (uint8_t)(p_msg->api_disconnect.conn_handle & NFA_HANDLE_MASK);
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if this is for data link connection */
8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (xx & NFA_P2P_HANDLE_FLAG_CONN) {
8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_DisconnectReq(nfa_p2p_cb.conn_cb[xx].local_sap,
8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                nfa_p2p_cb.conn_cb[xx].remote_sap,
8496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                p_msg->api_disconnect.flush);
8506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (status == LLCP_STATUS_SUCCESS) {
8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* wait for disconnect response if successful */
8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /*
8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** while we are waiting for connect confirm,
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** we cannot sent DISC because we don't know DSAP yet
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      */
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_sap = nfa_p2p_cb.conn_cb[xx].local_sap;
8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.disc.handle =
8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.disc.reason = NFA_P2P_DISC_REASON_LOCAL_INITITATE;
8656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_deallocate_conn_cb(xx);
8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
8686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
8716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    P2P_TRACE_ERROR0("Handle is not for Data link connection");
8726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_create_data_link_connection
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Create data link connection
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_create_data_link_connection(tNFA_P2P_MSG* p_msg) {
8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap;
8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_CONNECTION_PARAMS conn_params;
8916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_create_data_link_connection ()");
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = (uint8_t)(p_msg->api_connect.client_handle & NFA_HANDLE_MASK);
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  conn_params.miu = p_msg->api_connect.miu;
8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  conn_params.rw = p_msg->api_connect.rw;
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* NFA_P2pConnectBySap () */
9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_msg->api_connect.dsap != LLCP_INVALID_SAP) {
9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    conn_params.sn[0] = 0;
9036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_ConnectReq(local_sap, p_msg->api_connect.dsap, &conn_params);
9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* NFA_P2pConnectByName () */
9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else {
9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    strncpy(conn_params.sn, p_msg->api_connect.service_name, LLCP_MAX_SN_LEN);
9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    conn_params.sn[LLCP_MAX_SN_LEN] = 0;
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_ConnectReq(local_sap, LLCP_SAP_SDP, &conn_params);
9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status != LLCP_STATUS_SUCCESS) {
9146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
9156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_INFORMATION;
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
9186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_send_ui
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send UI PDU
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_send_ui(tNFA_P2P_MSG* p_msg) {
9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap;
9356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
9366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_send_ui ()");
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = (uint8_t)(p_msg->api_send_ui.handle & NFA_HANDLE_MASK);
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* decrease number of tx UI PDU which is not processed by NFA for congestion
9436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * control */
9446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.sap_cb[local_sap].num_pending_ui_pdu)
9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_cb.sap_cb[local_sap].num_pending_ui_pdu--;
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.total_pending_ui_pdu) nfa_p2p_cb.total_pending_ui_pdu--;
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status =
9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_SendUI(local_sap, p_msg->api_send_ui.dsap, p_msg->api_send_ui.p_msg);
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == LLCP_STATUS_CONGESTED) {
9536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (!(nfa_p2p_cb.sap_cb[local_sap].flags &
9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_P2P_SAP_FLAG_LLINK_CONGESTED)) {
9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[local_sap].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* notify that this logical link is congested */
9586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.congest.link_type = NFA_P2P_LLINK_TYPE;
9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
9606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.congest.is_congested = true;
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_send_data
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send I PDU
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_send_data(tNFA_P2P_MSG* p_msg) {
9806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
9826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_send_data ()");
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx = (uint8_t)(p_msg->api_send_data.conn_handle & NFA_HANDLE_MASK);
9876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* decrease number of tx I PDU which is not processed by NFA for congestion
9906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * control */
9916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu)
9926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu--;
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_p2p_cb.total_pending_i_pdu) nfa_p2p_cb.total_pending_i_pdu--;
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = LLCP_SendData(nfa_p2p_cb.conn_cb[xx].local_sap,
9976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                         nfa_p2p_cb.conn_cb[xx].remote_sap,
9986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                         p_msg->api_send_data.p_msg);
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == LLCP_STATUS_CONGESTED) {
10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (!(nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED)) {
10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* notify that this data link is congested */
10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.congest.link_type = NFA_P2P_DLINK_TYPE;
10066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.congest.handle =
10076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx);
10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.congest.is_congested = true;
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_p2p_cb.sap_cb[nfa_p2p_cb.conn_cb[xx].local_sap].p_cback(
10116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_P2P_CONGEST_EVT, &evt_data);
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_set_local_busy
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set or reset local busy
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_set_local_busy(tNFA_P2P_MSG* p_msg) {
10296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_set_local_busy ()");
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx = (uint8_t)(p_msg->api_local_busy.conn_handle & NFA_HANDLE_MASK);
10346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_SetLocalBusyStatus(nfa_p2p_cb.conn_cb[xx].local_sap,
10376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          nfa_p2p_cb.conn_cb[xx].remote_sap,
10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          p_msg->api_local_busy.is_busy);
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_get_link_info
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get WKS of remote and link MIU
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_get_link_info(tNFA_P2P_MSG* p_msg) {
10546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
10556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap;
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_get_link_info ()");
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.link_info.handle = p_msg->api_link_info.handle;
10606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.link_info.wks = LLCP_GetRemoteWKS();
10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.link_info.local_link_miu = nfa_p2p_cb.local_link_miu;
10626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.link_info.remote_link_miu = nfa_p2p_cb.remote_link_miu;
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = (uint8_t)(p_msg->api_link_info.handle & NFA_HANDLE_MASK);
10656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_LINK_INFO_EVT, &evt_data);
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_get_remote_sap
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get remote SAP
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_get_remote_sap(tNFA_P2P_MSG* p_msg) {
10816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_P2P_EVT_DATA evt_data;
10826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t local_sap;
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_get_remote_sap ()");
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  local_sap = (uint8_t)(p_msg->api_remote_sap.handle & NFA_HANDLE_MASK);
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!nfa_p2p_start_sdp(p_msg->api_remote_sap.service_name, local_sap)) {
10896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.sdp.handle = p_msg->api_remote_sap.handle;
10906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.sdp.remote_sap = 0x00;
10916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_SDP_EVT, &evt_data);
10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_p2p_set_llcp_cfg
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set LLCP configuration
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE to deallocate buffer
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_set_llcp_cfg(tNFA_P2P_MSG* p_msg) {
11086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_SetConfig(p_msg->api_set_llcp_cfg.link_miu, p_msg->api_set_llcp_cfg.opt,
11096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_msg->api_set_llcp_cfg.wt,
11106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_msg->api_set_llcp_cfg.link_timeout,
11116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_msg->api_set_llcp_cfg.inact_timeout_init,
11126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_msg->api_set_llcp_cfg.inact_timeout_target,
11136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_msg->api_set_llcp_cfg.symm_delay,
11146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_msg->api_set_llcp_cfg.data_link_timeout,
11156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_msg->api_set_llcp_cfg.delay_first_pdu_timeout);
11166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
11195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
11205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
11215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
11225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfa_p2p_restart_rf_discovery
11235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
11245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Restart RF discovery by deactivating to IDLE
11255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
11265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
11275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          TRUE to deallocate buffer
11285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
11295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
11306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_p2p_restart_rf_discovery(tNFA_P2P_MSG* p_msg) {
11316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  P2P_TRACE_DEBUG0("nfa_p2p_restart_rf_discovery ()");
11325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
11345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
11365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
1137