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
195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the LLCP Link Management
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_int.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_defs.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT16 llcp_link_rwt[15] =  /* RWT = (302us)*2**WT; 302us = 256*16/fc; fc = 13.56MHz */
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project       1, /* WT=0,     302us */
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project       1, /* WT=1,     604us */
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project       2, /* WT=2,    1208us */
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project       3, /* WT=3,     2.4ms */
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project       5, /* WT=4,     4.8ms */
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project      10, /* WT=5,     9.7ms */
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project      20, /* WT=6,    19.3ms */
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project      39, /* WT=7,    38.7ms */
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project      78, /* WT=8,    77.3ms */
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     155, /* WT=9,   154.6ms */
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     310, /* WT=10,  309.2ms */
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     619, /* WT=11,  618.5ms */
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    1237, /* WT=12, 1237.0ms */
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    2474, /* WT=13, 2474.0ms */
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    4948, /* WT=14, 4948.0ms */
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN llcp_link_parse_gen_bytes (UINT8 gen_bytes_len, UINT8 *p_gen_bytes);
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN llcp_link_version_agreement (void);
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_send_SYMM (void);
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_update_status (BOOLEAN is_activated);
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_check_congestion (void);
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_check_uncongested (void);
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_proc_ui_pdu (UINT8 local_sap, UINT8 remote_sap, UINT16 ui_pdu_length, UINT8 *p_ui_pdu, BT_HDR *p_msg);
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_proc_agf_pdu (BT_HDR *p_msg);
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_proc_rx_pdu (UINT8 dsap, UINT8 ptype, UINT8 ssap, BT_HDR *p_msg);
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_proc_rx_data (BT_HDR *p_msg);
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *llcp_link_get_next_pdu (BOOLEAN length_only, UINT16 *p_next_pdu_length);
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *llcp_link_build_next_pdu (BT_HDR *p_agf);
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void    llcp_link_send_to_lower (BT_HDR *p_msg);
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern tLLCP_TEST_PARAMS llcp_test_params;
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* debug functions type */
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *llcp_pdu_type (UINT8 ptype);
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_start_inactivity_timer
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function start LLCP link inactivity timer.
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_start_inactivity_timer (void)
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (llcp_cb.lcb.inact_timer.in_use == FALSE)
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(llcp_cb.lcb.inact_timeout > 0)  )
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG1 ("Start inactivity_timer: %d ms", llcp_cb.lcb.inact_timeout);
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_start_quick_timer (&llcp_cb.lcb.inact_timer, NFC_TTYPE_LLCP_LINK_INACT,
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               ((UINT32) llcp_cb.lcb.inact_timeout) * QUICK_TIMER_TICKS_PER_SEC / 1000);
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_stop_inactivity_timer
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function stop LLCP link inactivity timer.
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_stop_inactivity_timer (void)
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.inact_timer.in_use)
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG0 ("Stop inactivity_timer");
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_stop_quick_timer (&llcp_cb.lcb.inact_timer);
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_start_link_timer
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function starts LLCP link timer (LTO or delay response).
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_start_link_timer (void)
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT)
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* wait for application layer sending data */
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_LINK_MANAGER,
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               (((UINT32) llcp_cb.lcb.symm_delay) * QUICK_TIMER_TICKS_PER_SEC) / 1000);
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* wait for data to receive from remote */
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_LINK_MANAGER,
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               ((UINT32) llcp_cb.lcb.peer_lto) * QUICK_TIMER_TICKS_PER_SEC / 1000);
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_stop_link_timer
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function stop LLCP link timer (LTO or delay response).
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_stop_link_timer (void)
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_stop_quick_timer (&llcp_cb.lcb.timer);
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_activate
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Activate LLCP link
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tLLCP_STATUS
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS llcp_link_activate (tLLCP_ACTIVATE_CONFIG *p_config)
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG0 ("llcp_link_activate ()");
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* At this point, MAC link activation procedure has been successfully completed */
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* The Length Reduction values LRi and LRt MUST be 11b. (254bytes) */
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_config->max_payload_size != LLCP_NCI_MAX_PAYL_SIZE)
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_WARNING2 ("llcp_link_activate (): max payload size (%d) must be %d bytes",
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             p_config->max_payload_size, LLCP_NCI_MAX_PAYL_SIZE);
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Processing the parametes that have been received with the MAC link activation */
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_link_parse_gen_bytes (p_config->gen_bytes_len,
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   p_config->p_gen_bytes ) == FALSE)
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("llcp_link_activate (): Failed to parse general bytes");
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_ACTIVATION_FAILED_EVT, LLCP_LINK_BAD_GEN_BYTES);
1867c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1877c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (p_config->is_initiator == FALSE)
1887c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
1897c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* repond to any incoming PDU with invalid LLCP PDU */
1907c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            llcp_cb.lcb.link_state = LLCP_LINK_STATE_ACTIVATION_FAILED;
1917c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            NFC_SetStaticRfCback (llcp_link_connection_cback);
1927c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** For the Target device, the scaled value of RWT MUST be less than or equal to the
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** scaled value of the LLC Link Timeout (LTO).
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_config->is_initiator) && (llcp_link_rwt[p_config->waiting_time] > llcp_cb.lcb.peer_lto))
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_WARNING3 ("llcp_link_activate (): WT (%d, %dms) must be less than or equal to LTO (%dms)",
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             p_config->waiting_time,
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             llcp_link_rwt[p_config->waiting_time],
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             llcp_cb.lcb.peer_lto);
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* extend LTO as much as internally required processing time and propagation delays */
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.peer_lto += LLCP_INTERNAL_TX_DELAY + LLCP_INTERNAL_RX_DELAY;
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* LLCP version number agreement */
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_link_version_agreement () == FALSE)
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("llcp_link_activate (): Failed to agree version");
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_ACTIVATION_FAILED_EVT, LLCP_LINK_VERSION_FAILED);
2167c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
2177c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (p_config->is_initiator == FALSE)
2187c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
2197c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* repond to any incoming PDU with invalid LLCP PDU */
2207c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            llcp_cb.lcb.link_state = LLCP_LINK_STATE_ACTIVATION_FAILED;
2217c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            NFC_SetStaticRfCback (llcp_link_connection_cback);
2227c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
226dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen    llcp_cb.lcb.received_first_packet = FALSE;
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.is_initiator = p_config->is_initiator;
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* reset internal flags */
2305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    llcp_cb.lcb.flags = 0x00;
2315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* set tx MIU to MIN (MIU of local LLCP, MIU of peer LLCP) */
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.local_link_miu >= llcp_cb.lcb.peer_miu)
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.effective_miu = llcp_cb.lcb.peer_miu;
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.effective_miu = llcp_cb.lcb.local_link_miu;
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** When entering the normal operation phase, LLCP shall initialize the symmetry
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** procedure.
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.is_initiator)
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG0 ("llcp_link_activate (): Connected as Initiator");
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.inact_timeout = llcp_cb.lcb.inact_timeout_init;
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.symm_state    = LLCP_LINK_SYMM_LOCAL_XMIT_NEXT;
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.lcb.delay_first_pdu_timeout > 0)
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* give a chance to upper layer to send PDU if need */
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_DELAY_FIRST_PDU,
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   (((UINT32) llcp_cb.lcb.delay_first_pdu_timeout) * QUICK_TIMER_TICKS_PER_SEC) / 1000);
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_send_SYMM ();
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG0 ("llcp_link_activate (): Connected as Target");
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.inact_timeout = llcp_cb.lcb.inact_timeout_target;
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.symm_state    = LLCP_LINK_SYMM_REMOTE_XMIT_NEXT;
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* wait for data to receive from remote */
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_start_link_timer ();
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Set state to LLCP_LINK_STATE_ACTIVATED and notify activation before set data callback
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** because LLCP PDU could be in NCI queue.
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.link_state = LLCP_LINK_STATE_ACTIVATED;
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* LLCP Link Activation completed */
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_ACTIVATION_COMPLETE_EVT, LLCP_LINK_SUCCESS);
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Update link status to service layer */
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_link_update_status (TRUE);
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_SetStaticRfCback (llcp_link_connection_cback);
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (LLCP_STATUS_SUCCESS);
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_deactivate_cleanup
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Clean up for link deactivation
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_deactivate_cleanup  (UINT8 reason)
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* report SDP failure for any pending request */
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_sdp_proc_deactivation ();
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Update link status to service layer */
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_link_update_status (FALSE);
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* We had sent out DISC */
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.link_state = LLCP_LINK_STATE_DEACTIVATED;
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_link_stop_link_timer ();
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* stop inactivity timer */
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_link_stop_inactivity_timer ();
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Let upper layer deactivate local link */
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_DEACTIVATED_EVT, reason);
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_process_link_timeout
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process timeout events for LTO, SYMM and deactivating
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_link_process_link_timeout (void)
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((llcp_cb.lcb.symm_delay > 0) && (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT))
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* upper layer doesn't have anything to send */
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_DEBUG0 ("llcp_link_process_link_timeout (): LEVT_TIMEOUT in state of LLCP_LINK_SYMM_LOCAL_XMIT_NEXT");
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_send_SYMM ();
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* wait for data to receive from remote */
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_start_link_timer ();
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* start inactivity timer */
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (llcp_cb.num_data_link_connection == 0)
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_link_start_inactivity_timer ();
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR0 ("llcp_link_process_link_timeout (): LEVT_TIMEOUT in state of LLCP_LINK_SYMM_REMOTE_XMIT_NEXT");
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_deactivate (LLCP_LINK_TIMEOUT);
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING)
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_deactivate_cleanup (llcp_cb.lcb.link_deact_reason);
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_SetStaticRfCback (NULL);
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
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         llcp_link_deactivate
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deactivate LLCP link
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_link_deactivate (UINT8 reason)
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8        local_sap, idx;
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG1 ("llcp_link_deactivate () reason = 0x%x", reason);
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Release any held buffers in signaling PDU queue */
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (llcp_cb.lcb.sig_xmit_q.p_first)
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (GKI_dequeue (&llcp_cb.lcb.sig_xmit_q));
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Release any held buffers in UI PDU queue */
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (local_sap = LLCP_SAP_SDP + 1; local_sap < LLCP_NUM_SAPS; local_sap++)
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_app_cb = llcp_util_get_app_cb (local_sap);
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (p_app_cb)
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(p_app_cb->p_app_cback)  )
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (p_app_cb->ui_xmit_q.p_first)
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_freebuf (GKI_dequeue (&p_app_cb->ui_xmit_q));
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_app_cb->is_ui_tx_congested = FALSE;
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (p_app_cb->ui_rx_q.p_first)
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_freebuf (GKI_dequeue (&p_app_cb->ui_rx_q));
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.total_tx_ui_pdu = 0;
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.total_rx_ui_pdu = 0;
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Notify all of data link */
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++)
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.dlcb[idx].state != LLCP_DLC_STATE_IDLE)
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dlcb = &(llcp_cb.dlcb[idx]);
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_LINK_ERROR, NULL);
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.total_tx_i_pdu = 0;
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.total_rx_i_pdu = 0;
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.overall_tx_congested = FALSE;
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.overall_rx_congested = FALSE;
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (reason == LLCP_LINK_FRAME_ERROR)
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(reason == LLCP_LINK_LOCAL_INITIATED)  )
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* get rid of the data pending in NFC tx queue, so DISC PDU can be sent ASAP */
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_FlushData (NFC_RF_CONN_ID);
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_util_send_disc (LLCP_SAP_LM, LLCP_SAP_LM);
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Wait until DISC is sent to peer */
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG0 ("llcp_link_deactivate (): Wait until DISC is sent to peer");
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.link_state = LLCP_LINK_STATE_DEACTIVATING;
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.lcb.sig_xmit_q.count == 0)
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if DISC is sent to NFCC, wait for short period for NFCC to send it to peer */
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_LINK_MANAGER,
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   ((UINT32) 50) * QUICK_TIMER_TICKS_PER_SEC / 1000);
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.link_deact_reason = reason;
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (  (reason == LLCP_LINK_REMOTE_INITIATED)
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             &&(!llcp_cb.lcb.is_initiator)  )
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if received DISC to deactivate LLCP link as target role, send SYMM PDU */
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_send_SYMM ();
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else /*  for link timeout and interface error */
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
4495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* if got RF link loss receiving no LLC PDU from peer */
450a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (  (reason == LLCP_LINK_RF_LINK_LOSS_ERR)
451a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            &&(!(llcp_cb.lcb.flags & LLCP_LINK_FLAGS_RX_ANY_LLC_PDU)))
452a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
453a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            reason = LLCP_LINK_RF_LINK_LOSS_NO_RX_LLC;
454a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
455a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_FlushData (NFC_RF_CONN_ID);
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_deactivate_cleanup (reason);
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_parse_gen_bytes
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check LLCP magic number and get parameters in general bytes
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN llcp_link_parse_gen_bytes (UINT8 gen_bytes_len, UINT8 *p_gen_bytes)
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 *p = p_gen_bytes + LLCP_MAGIC_NUMBER_LEN;
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 length = gen_bytes_len - LLCP_MAGIC_NUMBER_LEN;
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (gen_bytes_len >= LLCP_MAGIC_NUMBER_LEN)
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(*(p_gen_bytes) == LLCP_MAGIC_NUMBER_BYTE0)
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(*(p_gen_bytes + 1) == LLCP_MAGIC_NUMBER_BYTE1)
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(*(p_gen_bytes + 2) == LLCP_MAGIC_NUMBER_BYTE2)  )
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* in case peer didn't include these */
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.peer_miu = LLCP_DEFAULT_MIU;
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.peer_lto = LLCP_DEFAULT_LTO_IN_MS;
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (llcp_util_parse_link_params (length, p));
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else /* if this is not LLCP */
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (FALSE);
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (TRUE);
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_version_agreement
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      LLCP version number agreement
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN llcp_link_version_agreement (void)
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 peer_major_version, peer_minor_version;
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    peer_major_version = LLCP_GET_MAJOR_VERSION (llcp_cb.lcb.peer_version);
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    peer_minor_version = LLCP_GET_MINOR_VERSION (llcp_cb.lcb.peer_version);
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (peer_major_version < LLCP_MIN_MAJOR_VERSION)
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1("llcp_link_version_agreement(): unsupported peer version number. Peer Major Version:%d", peer_major_version);
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (peer_major_version == LLCP_VERSION_MAJOR)
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.lcb.agreed_major_version = LLCP_VERSION_MAJOR;
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (peer_minor_version >= LLCP_VERSION_MINOR)
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.lcb.agreed_minor_version = LLCP_VERSION_MINOR;
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.lcb.agreed_minor_version = peer_minor_version;
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (peer_major_version < LLCP_VERSION_MAJOR)
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* so far we can support backward compatibility */
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.lcb.agreed_major_version = peer_major_version;
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.lcb.agreed_minor_version = peer_minor_version;
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* let peer (higher major version) decide it */
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.lcb.agreed_major_version = LLCP_VERSION_MAJOR;
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.lcb.agreed_minor_version = LLCP_VERSION_MINOR;
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG6 ("local version:%d.%d, remote version:%d.%d, agreed version:%d.%d",
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            LLCP_VERSION_MAJOR, LLCP_VERSION_MINOR,
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            peer_major_version, peer_minor_version,
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            llcp_cb.lcb.agreed_major_version, llcp_cb.lcb.agreed_minor_version);
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (TRUE);
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_update_status
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Notify all of service layer client link status change
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_update_status (BOOLEAN is_activated)
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_SAP_CBACK_DATA data;
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 sap;
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    data.link_status.event        = LLCP_SAP_EVT_LINK_STATUS;
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    data.link_status.is_activated = is_activated;
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    data.link_status.is_initiator = llcp_cb.lcb.is_initiator;
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* notify all SAP so they can create connection while link is activated */
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (sap = LLCP_SAP_SDP + 1; sap < LLCP_NUM_SAPS; sap++)
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_app_cb = llcp_util_get_app_cb (sap);
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (p_app_cb)
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(p_app_cb->p_app_cback)  )
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data.link_status.local_sap = sap;
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_app_cb->p_app_cback (&data);
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_check_congestion
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check overall congestion status
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Notify to all of upper layer if congested
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_check_congestion (void)
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_SAP_CBACK_DATA data;
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 sap, idx;
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.overall_tx_congested)
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* already congested so no need to check again */
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu >= llcp_cb.max_num_tx_buff)
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* overall buffer usage is high */
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.overall_tx_congested = TRUE;
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_WARNING2 ("overall tx congestion start: total_tx_ui_pdu=%d, total_tx_i_pdu=%d",
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              llcp_cb.total_tx_ui_pdu, llcp_cb.total_tx_i_pdu);
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        data.congest.event        = LLCP_SAP_EVT_CONGEST;
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        data.congest.is_congested = TRUE;
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* notify logical data link congestion status */
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        data.congest.remote_sap = LLCP_INVALID_SAP;
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        data.congest.link_type  = LLCP_LINK_TYPE_LOGICAL_DATA_LINK;
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (sap = LLCP_SAP_SDP + 1; sap < LLCP_NUM_SAPS; sap++)
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_app_cb = llcp_util_get_app_cb (sap);
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (p_app_cb)
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(p_app_cb->p_app_cback)
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK)  )
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* if already congested then no need to notify again */
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (!p_app_cb->is_ui_tx_congested)
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_app_cb->is_ui_tx_congested = TRUE;
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    LLCP_TRACE_WARNING2 ("Logical link (SAP=0x%X) congestion start: count=%d",
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                          sap, p_app_cb->ui_xmit_q.count);
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    data.congest.local_sap = sap;
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_app_cb->p_app_cback (&data);
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* notify data link connection congestion status */
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        data.congest.link_type  = LLCP_LINK_TYPE_DATA_LINK_CONNECTION;
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++ )
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (llcp_cb.dlcb[idx].state == LLCP_DLC_STATE_CONNECTED)
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(llcp_cb.dlcb[idx].remote_busy == FALSE)
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(llcp_cb.dlcb[idx].is_tx_congested == FALSE)  )
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.dlcb[idx].is_tx_congested = TRUE;
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                LLCP_TRACE_WARNING3 ("Data link (SSAP:DSAP=0x%X:0x%X) congestion start: count=%d",
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      llcp_cb.dlcb[idx].local_sap, llcp_cb.dlcb[idx].remote_sap,
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      llcp_cb.dlcb[idx].i_xmit_q.count);
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                data.congest.local_sap  = llcp_cb.dlcb[idx].local_sap;
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                data.congest.remote_sap = llcp_cb.dlcb[idx].remote_sap;
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                (*llcp_cb.dlcb[idx].p_app_cb->p_app_cback) (&data);
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
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         llcp_link_check_uncongested
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check overall congestion status, logical data link and
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  data link connection congestion status
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Notify to each upper layer if uncongested
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_check_uncongested (void)
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_SAP_CBACK_DATA data;
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 xx, sap, idx;
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.overall_tx_congested)
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu <= llcp_cb.max_num_tx_buff / 2)
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* overall congestion is cleared */
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.overall_tx_congested = FALSE;
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_WARNING2 ("overall tx congestion end: total_tx_ui_pdu=%d, total_tx_i_pdu=%d",
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  llcp_cb.total_tx_ui_pdu, llcp_cb.total_tx_i_pdu);
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* wait until more data packets are sent out */
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    data.congest.event        = LLCP_SAP_EVT_CONGEST;
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    data.congest.is_congested = FALSE;
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if total number of UI PDU is below threshold */
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.total_tx_ui_pdu < llcp_cb.max_num_ll_tx_buff)
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* check and notify logical data link congestion status */
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        data.congest.remote_sap = LLCP_INVALID_SAP;
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        data.congest.link_type  = LLCP_LINK_TYPE_LOGICAL_DATA_LINK;
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /*
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** start point of uncongested status notification is in round robin
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** so each logical data link has equal chance of transmitting.
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        */
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        sap = llcp_cb.ll_tx_uncongest_ntf_start_sap;
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (xx = LLCP_SAP_SDP + 1; xx < LLCP_NUM_SAPS; xx++)
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* no logical data link on LM and SDP */
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (sap > LLCP_SAP_SDP)
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_app_cb = llcp_util_get_app_cb (sap);
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (p_app_cb)
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(p_app_cb->p_app_cback)
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK)
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(p_app_cb->is_ui_tx_congested)
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(p_app_cb->ui_xmit_q.count <= llcp_cb.ll_tx_congest_end)  )
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* if it was congested but now tx queue count is below threshold */
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_app_cb->is_ui_tx_congested = FALSE;
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    LLCP_TRACE_DEBUG2 ("Logical link (SAP=0x%X) congestion end: count=%d",
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                        sap, p_app_cb->ui_xmit_q.count);
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    data.congest.local_sap = sap;
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_app_cb->p_app_cback (&data);
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            sap = (sap + 1) % LLCP_NUM_SAPS;
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* move start point for next logical data link */
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (xx = 0; xx < LLCP_NUM_SAPS; xx++)
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            sap = (llcp_cb.ll_tx_uncongest_ntf_start_sap + 1) % LLCP_NUM_SAPS;
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (sap > LLCP_SAP_SDP)
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_app_cb = llcp_util_get_app_cb (sap);
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (p_app_cb)
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(p_app_cb->p_app_cback)
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK)  )
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    llcp_cb.ll_tx_uncongest_ntf_start_sap = sap;
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* notify data link connection congestion status */
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    data.congest.link_type  = LLCP_LINK_TYPE_DATA_LINK_CONNECTION;
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** start point of uncongested status notification is in round robin
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** so each data link connection has equal chance of transmitting.
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    idx = llcp_cb.dl_tx_uncongest_ntf_start_idx;
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++ )
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if it was congested but now tx queue is below threshold (receiving window) */
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (llcp_cb.dlcb[idx].state == LLCP_DLC_STATE_CONNECTED)
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(llcp_cb.dlcb[idx].is_tx_congested)
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(llcp_cb.dlcb[idx].i_xmit_q.count <= llcp_cb.dlcb[idx].remote_rw / 2)  )
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.dlcb[idx].is_tx_congested = FALSE;
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (llcp_cb.dlcb[idx].remote_busy == FALSE)
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                LLCP_TRACE_DEBUG3 ("Data link (SSAP:DSAP=0x%X:0x%X) congestion end: count=%d",
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    llcp_cb.dlcb[idx].local_sap, llcp_cb.dlcb[idx].remote_sap,
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    llcp_cb.dlcb[idx].i_xmit_q.count);
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                data.congest.local_sap  = llcp_cb.dlcb[idx].local_sap;
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                data.congest.remote_sap = llcp_cb.dlcb[idx].remote_sap;
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                (*llcp_cb.dlcb[idx].p_app_cb->p_app_cback) (&data);
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        idx = (idx + 1) % LLCP_MAX_DATA_LINK;
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* move start point for next data link connection */
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++ )
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        idx = (llcp_cb.dl_tx_uncongest_ntf_start_idx + 1) % LLCP_MAX_DATA_LINK;
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.dlcb[idx].state == LLCP_DLC_STATE_CONNECTED)
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.dl_tx_uncongest_ntf_start_idx = idx;
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_send_SYMM
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send SYMM PDU
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_send_SYMM (void)
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR *p_msg;
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  *p;
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_msg = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_msg)
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->len    = LLCP_PDU_SYMM_SIZE;
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = (UINT8 *) (p_msg + 1) + p_msg->offset;
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, LLCP_GET_PDU_HEADER (LLCP_SAP_LM, LLCP_PDU_SYMM_TYPE, LLCP_SAP_LM ));
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_send_to_lower (p_msg);
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
8407c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Function         llcp_link_send_invalid_pdu
8417c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
8427c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Description      Send invalid LLC PDU in LLCP_LINK_STATE_ACTIVATION_FAILED
8437c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
8447c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Returns          void
8457c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
8467c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu*******************************************************************************/
8477c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chustatic void llcp_link_send_invalid_pdu (void)
8487c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu{
8497c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    BT_HDR *p_msg;
8507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    UINT8  *p;
8517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
8527c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    p_msg = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);
8537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
8547c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    if (p_msg)
8557c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
8567c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        /* send one byte of 0x00 as invalid LLC PDU */
8577c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        p_msg->len    = 1;
8587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
8597c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
8607c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        p = (UINT8 *) (p_msg + 1) + p_msg->offset;
8617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        *p = 0x00;
8627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
8637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        NFC_SendData (NFC_RF_CONN_ID, p_msg);
8647c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
8657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu}
8667c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
8677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu/*******************************************************************************
8687c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_check_send_data
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send PDU to peer
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_link_check_send_data (void)
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR *p_pdu;
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* don't re-enter while processing to prevent out of sequence */
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.is_sending_data)
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.is_sending_data = TRUE;
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** check overall congestion due to high usage of buffer pool
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** if congested then notify all of upper layers not to send any more data
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_link_check_congestion ();
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT)
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG0 ("llcp_link_check_send_data () in state of LLCP_LINK_SYMM_LOCAL_XMIT_NEXT");
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_pdu = llcp_link_build_next_pdu (NULL);
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /*
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** For data link connection,
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** V(RA) was updated and N(R) was set to V(RA), if I PDU was added in this transmission.
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** If there was no I PDU to carry V(RA) and V(RA) is not V(R) and it's not congested,
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** then RR PDU will be sent.
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** If there was no I PDU to carry V(RA) and V(RA) is not V(R) and it's congested,
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** then RNR PDU will be sent.
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** If local busy state has been changed then RR or RNR PDU may be sent.
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        */
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_dlc_check_to_send_rr_rnr ();
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* add RR/RNR PDU to be sent if any */
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_pdu = llcp_link_build_next_pdu (p_pdu);
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_pdu != NULL)
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_send_to_lower (p_pdu);
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* stop inactivity timer */
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_stop_inactivity_timer ();
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* check congestion status after sending out some data */
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_check_uncongested ();
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* There is no data to send, so send SYMM */
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (llcp_cb.lcb.symm_delay > 0)
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* wait for application layer sending data */
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    llcp_link_start_link_timer ();
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    llcp_cb.lcb.is_sending_data = FALSE;
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return;
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    llcp_link_send_SYMM ();
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* start inactivity timer */
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (llcp_cb.num_data_link_connection == 0)
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        llcp_link_start_inactivity_timer ();
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.lcb.is_sending_data = FALSE;
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return;
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING)
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* wait for short period for NFCC to send DISC */
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_LINK_MANAGER,
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   ((UINT32) 50) * QUICK_TIMER_TICKS_PER_SEC / 1000);
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* wait for data to receive from remote */
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_start_link_timer ();
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.is_sending_data = FALSE;
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_proc_ui_pdu
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process UI PDU from peer device
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_ui_pdu (UINT8  local_sap,
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT8  remote_sap,
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT16 ui_pdu_length,
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT8  *p_ui_pdu,
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   BT_HDR *p_msg)
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN      appended;
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR       *p_last_buf;
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16       available_bytes;
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8        *p_dst;
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_SAP_CBACK_DATA data;
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb = llcp_util_get_app_cb (local_sap);
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /*if UI PDU sent to SAP with data link connection*/
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap)))
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_util_send_frmr (p_dlcb, LLCP_FRMR_W_ERROR_FLAG, LLCP_PDU_UI_TYPE, 0);
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_FRAME_ERROR, NULL);
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_msg)
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_msg);
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if application is registered and expecting UI PDU on logical data link */
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_app_cb)
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_app_cb->p_app_cback)
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK)  )
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG2 ("llcp_link_proc_ui_pdu () Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if this is not from AGF PDU */
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_msg)
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ui_pdu_length = p_msg->len; /* including LLCP header */
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_ui_pdu      = (UINT8*) (p_msg + 1) + p_msg->offset;
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        appended = FALSE;
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* get last buffer in rx queue */
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_last_buf = (BT_HDR *) GKI_getlast (&p_app_cb->ui_rx_q);
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_last_buf)
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* get max length to append at the end of buffer */
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            available_bytes = GKI_get_buf_size (p_last_buf) - BT_HDR_SIZE - p_last_buf->offset - p_last_buf->len;
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if new UI PDU with length can be attached at the end of buffer */
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (available_bytes >= LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length)
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_dst = (UINT8*) (p_last_buf + 1) + p_last_buf->offset + p_last_buf->len;
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* add length of UI PDU */
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT16_TO_BE_STREAM (p_dst, ui_pdu_length);
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* copy UI PDU with LLCP header */
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                memcpy (p_dst, p_ui_pdu, ui_pdu_length);
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_last_buf->len += LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_msg)
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    GKI_freebuf (p_msg);
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                appended = TRUE;
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if it is not available to append */
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!appended)
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if it's not from AGF PDU */
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_msg)
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* add length of PDU in front of UI PDU (reuse room for NCI header) */
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_ui_pdu -= LLCP_PDU_AGF_LEN_SIZE;
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT16_TO_BE_STREAM (p_ui_pdu, ui_pdu_length);
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_msg->offset -= LLCP_PDU_AGF_LEN_SIZE;
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_msg->len    += LLCP_PDU_AGF_LEN_SIZE;
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_msg->layer_specific = 0;
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_msg = (BT_HDR *) GKI_getpoolbuf (LLCP_POOL_ID);
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_msg)
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_dst = (UINT8*) (p_msg + 1);
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* add length of PDU in front of UI PDU */
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    UINT16_TO_BE_STREAM (p_dst, ui_pdu_length);
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    memcpy (p_dst, p_ui_pdu, ui_pdu_length);
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_msg->offset = 0;
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_msg->len    = LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_msg->layer_specific = 0;
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    LLCP_TRACE_ERROR0 ("llcp_link_proc_ui_pdu (): out of buffer");
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* insert UI PDU in rx queue */
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_msg)
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_enqueue (&p_app_cb->ui_rx_q, p_msg);
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.total_rx_ui_pdu++;
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_app_cb->ui_rx_q.count > llcp_cb.ll_rx_congest_start)
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_WARNING2 ("llcp_link_proc_ui_pdu (): SAP:0x%x, rx link is congested (%d), discard oldest UI PDU",
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 local_sap, p_app_cb->ui_rx_q.count);
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (GKI_dequeue (&p_app_cb->ui_rx_q));
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.total_rx_ui_pdu--;
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_app_cb->ui_rx_q.count == 1) && (appended == FALSE))
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data.data_ind.event         = LLCP_SAP_EVT_DATA_IND;
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data.data_ind.local_sap     = local_sap;
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data.data_ind.remote_sap    = remote_sap;
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data.data_ind.link_type     = LLCP_LINK_TYPE_LOGICAL_DATA_LINK;
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*p_app_cb->p_app_cback) (&data);
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("llcp_link_proc_ui_pdu (): Unregistered SAP:0x%x", local_sap);
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_msg)
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_msg);
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_proc_agf_pdu
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process AGF PDU from peer device
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_agf_pdu (BT_HDR *p_agf)
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 agf_length;
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 *p, *p_info, *p_pdu_length;
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 pdu_hdr, pdu_length;
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  dsap, ptype, ssap;
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_agf->len    -= LLCP_PDU_HEADER_SIZE;
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_agf->offset += LLCP_PDU_HEADER_SIZE;
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** check integrity of AGF PDU and get number of PDUs in AGF PDU
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    agf_length = p_agf->len;
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_agf + 1) + p_agf->offset;
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (agf_length > 0)
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (agf_length > LLCP_PDU_AGF_LEN_SIZE)
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (pdu_length, p);
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            agf_length -= LLCP_PDU_AGF_LEN_SIZE;
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pdu_length <= agf_length)
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p += pdu_length;
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            agf_length -= pdu_length;
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (agf_length != 0)
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("llcp_link_proc_agf_pdu (): Received invalid AGF PDU");
1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_agf);
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Process PDUs in AGF
1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    agf_length = p_agf->len;
1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_agf + 1) + p_agf->offset;
1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (agf_length > 0)
1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* get length of PDU */
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_pdu_length = p;
1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT16 (pdu_length, p);
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        agf_length -= LLCP_PDU_AGF_LEN_SIZE;
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* get DSAP/PTYPE/SSAP */
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_info = p;
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT16 (pdu_hdr, p_info );
1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dsap  = LLCP_GET_DSAP (pdu_hdr);
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ptype = (UINT8) (LLCP_GET_PTYPE (pdu_hdr));
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ssap  = LLCP_GET_SSAP (pdu_hdr);
1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG4 ("llcp_link_proc_agf_pdu (): Rx DSAP:0x%x, PTYPE:%s (0x%x), SSAP:0x%x in AGF",
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                           dsap, llcp_pdu_type (ptype), ptype, ssap);
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (ptype == LLCP_PDU_DISC_TYPE)
1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(dsap == LLCP_SAP_LM)
1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(ssap == LLCP_SAP_LM)  )
1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_agf);
1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_deactivate (LLCP_LINK_REMOTE_INITIATED);
1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (ptype == LLCP_PDU_SYMM_TYPE)
1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR0 ("llcp_link_proc_agf_pdu (): SYMM PDU exchange shall not be in AGF");
1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (ptype == LLCP_PDU_PAX_TYPE)
1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR0 ("llcp_link_proc_agf_pdu (): PAX PDU exchange shall not be used");
1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (ptype == LLCP_PDU_SNL_TYPE)
1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_sdp_proc_snl ((UINT16) (pdu_length - LLCP_PDU_HEADER_SIZE), p_info);
1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if ((ptype == LLCP_PDU_UI_TYPE) && (pdu_length > LLCP_PDU_HEADER_SIZE))
1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_proc_ui_pdu (dsap, ssap, pdu_length, p, NULL);
1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (ptype == LLCP_PDU_I_TYPE)
1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_dlc_proc_i_pdu (dsap, ssap, pdu_length, p, NULL);
1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else /* let data link connection handle PDU */
1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_dlc_proc_rx_pdu (dsap, ptype, ssap, (UINT16) (pdu_length - LLCP_PDU_HEADER_SIZE), p_info);
1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += pdu_length;
1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        agf_length -= pdu_length;
1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_freebuf (p_agf);
1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_proc_rx_pdu
1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process received PDU from peer device
1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_rx_pdu (UINT8 dsap, UINT8 ptype, UINT8 ssap, BT_HDR *p_msg)
1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN free_buffer = TRUE;
1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   *p_data;
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (ptype)
1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_PAX_TYPE:
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("llcp_link_proc_rx_pdu (); PAX PDU exchange shall not be used");
1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_DISC_TYPE:
1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((dsap == LLCP_SAP_LM) && (ssap == LLCP_SAP_LM))
1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_deactivate (LLCP_LINK_REMOTE_INITIATED);
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_data = (UINT8 *) (p_msg + 1) + p_msg->offset + LLCP_PDU_HEADER_SIZE;
1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_dlc_proc_rx_pdu (dsap, ptype, ssap, (UINT16) (p_msg->len - LLCP_PDU_HEADER_SIZE), p_data);
1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_SNL_TYPE:
1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_data = (UINT8 *) (p_msg + 1) + p_msg->offset + LLCP_PDU_HEADER_SIZE;
1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_sdp_proc_snl ((UINT16) (p_msg->len - LLCP_PDU_HEADER_SIZE), p_data);
1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_AGF_TYPE:
1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_proc_agf_pdu (p_msg);
1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        free_buffer = FALSE;
1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_UI_TYPE:
1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_proc_ui_pdu (dsap, ssap, 0, NULL, p_msg);
1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        free_buffer = FALSE;
1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_I_TYPE:
1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_dlc_proc_i_pdu (dsap, ssap, 0, NULL, p_msg);
1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        free_buffer = FALSE;
1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_data = (UINT8 *) (p_msg + 1) + p_msg->offset + LLCP_PDU_HEADER_SIZE;
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_dlc_proc_rx_pdu (dsap, ptype, ssap, (UINT16) (p_msg->len - LLCP_PDU_HEADER_SIZE), p_data);
1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (free_buffer)
1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_msg);
1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_proc_rx_data
1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process received data from NFCC and maintain symmetry state
1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_rx_data (BT_HDR *p_msg)
1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  *p;
1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16  pdu_hdr, info_length = 0;
1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   dsap, ptype, ssap;
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN free_buffer = TRUE;
1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN frame_error = FALSE;
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_REMOTE_XMIT_NEXT)
1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_stop_link_timer ();
1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1326dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen        if (llcp_cb.lcb.received_first_packet == FALSE)
1327dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen        {
1328dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen            llcp_cb.lcb.received_first_packet = TRUE;
1329dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen            (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_FIRST_PACKET_RECEIVED_EVT, LLCP_LINK_SUCCESS);
1330dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen        }
1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING)
1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(llcp_cb.lcb.sig_xmit_q.count == 0)  )
1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* this indicates that DISC PDU had been sent out to peer */
1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* initiator may wait for SYMM PDU */
1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_process_link_timeout ();
1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_msg->len < LLCP_PDU_HEADER_SIZE)
1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                LLCP_TRACE_ERROR1 ("Received too small PDU: got %d bytes", p_msg->len);
1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                frame_error = TRUE;
1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p = (UINT8 *) (p_msg + 1) + p_msg->offset;
1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT16 (pdu_hdr, p );
1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                dsap  = LLCP_GET_DSAP (pdu_hdr);
1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ptype = (UINT8) (LLCP_GET_PTYPE (pdu_hdr));
1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ssap  = LLCP_GET_SSAP (pdu_hdr);
1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* get length of information per PDU type */
1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (ptype == LLCP_PDU_I_TYPE)
1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ||(ptype == LLCP_PDU_RR_TYPE)
1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ||(ptype == LLCP_PDU_RNR_TYPE)  )
1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (p_msg->len >= LLCP_PDU_HEADER_SIZE + LLCP_SEQUENCE_SIZE)
1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        info_length = p_msg->len - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE;
1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else
1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        LLCP_TRACE_ERROR0 ("Received I/RR/RNR PDU without sequence");
1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        frame_error = TRUE;
1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    info_length = p_msg->len - LLCP_PDU_HEADER_SIZE;
1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* check if length of information is bigger than link MIU */
1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((!frame_error) && (info_length > llcp_cb.lcb.local_link_miu))
1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    LLCP_TRACE_ERROR2 ("Received exceeding MIU (%d): got %d bytes SDU",
1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       llcp_cb.lcb.local_link_miu, info_length);
1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    frame_error = TRUE;
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    LLCP_TRACE_DEBUG4 ("llcp_link_proc_rx_data (): DSAP:0x%x, PTYPE:%s (0x%x), SSAP:0x%x",
1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       dsap, llcp_pdu_type (ptype), ptype, ssap);
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (ptype == LLCP_PDU_SYMM_TYPE)
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (info_length > 0)
1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            LLCP_TRACE_ERROR1 ("Received extra data (%d bytes) in SYMM PDU", info_length);
1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            frame_error = TRUE;
1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else
1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        /* received other than SYMM */
1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        llcp_link_stop_inactivity_timer ();
1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        llcp_link_proc_rx_pdu (dsap, ptype, ssap, p_msg);
1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        free_buffer = FALSE;
1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_LOCAL_XMIT_NEXT;
1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* check if any pending packet */
1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_check_send_data ();
1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("Received PDU in state of SYMM_MUST_XMIT_NEXT");
1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (free_buffer)
1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_msg);
1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_get_next_pdu
1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get next PDU from link manager or data links w/wo dequeue
1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer of a PDU to send if length_only is FALSE
1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NULL otherwise
1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *llcp_link_get_next_pdu (BOOLEAN length_only, UINT16 *p_next_pdu_length)
1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR *p_msg;
1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int     count, xx;
1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* processing signalling PDU first */
1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.sig_xmit_q.p_first)
1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (length_only)
1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_msg = (BT_HDR*) llcp_cb.lcb.sig_xmit_q.p_first;
1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *p_next_pdu_length = p_msg->len;
1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return NULL;
1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_msg = (BT_HDR*) GKI_dequeue (&llcp_cb.lcb.sig_xmit_q);
1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return p_msg;
1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* transmitting logical data link and data link connection equaly */
1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (xx = 0; xx < 2; xx++)
1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!llcp_cb.lcb.ll_served)
1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Get one from logical link connection */
1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                for (count = 0; count < LLCP_NUM_SAPS; count++)
1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* round robin schedule without priority  */
1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_app_cb = llcp_util_get_app_cb (llcp_cb.lcb.ll_idx);
1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (  (p_app_cb)
1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        &&(p_app_cb->p_app_cback)
1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        &&(p_app_cb->ui_xmit_q.count)  )
1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (length_only)
1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            /* don't alternate next data link to return the same length of PDU */
1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_msg = (BT_HDR *) p_app_cb->ui_xmit_q.p_first;
1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            *p_next_pdu_length = p_msg->len;
1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            return NULL;
1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        else
1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            /* check data link connection first in next time */
1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            llcp_cb.lcb.ll_served = !llcp_cb.lcb.ll_served;
1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_msg = (BT_HDR*) GKI_dequeue (&p_app_cb->ui_xmit_q);
1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            llcp_cb.total_tx_ui_pdu--;
1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            /* this logical link has been served, so start from next logical link next time */
1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            llcp_cb.lcb.ll_idx = (llcp_cb.lcb.ll_idx + 1) % LLCP_NUM_SAPS;
1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            return p_msg;
1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else
1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        /* check next logical link connection */
1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        llcp_cb.lcb.ll_idx = (llcp_cb.lcb.ll_idx + 1) % LLCP_NUM_SAPS;
1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* no data, so check data link connection if not checked yet */
1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.lcb.ll_served = !llcp_cb.lcb.ll_served;
1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Get one from data link connection */
1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                for (count = 0; count < LLCP_MAX_DATA_LINK; count++)
1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* round robin schedule without priority  */
1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (llcp_cb.dlcb[llcp_cb.lcb.dl_idx].state != LLCP_DLC_STATE_IDLE)
1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (length_only)
1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            *p_next_pdu_length = llcp_dlc_get_next_pdu_length (&llcp_cb.dlcb[llcp_cb.lcb.dl_idx]);
1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            if (*p_next_pdu_length > 0 )
1514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            {
1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                /* don't change data link connection to return the same length of PDU */
1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                return NULL;
1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            }
1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            else
1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            {
1520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                /* no data, so check next data link connection */
1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                llcp_cb.lcb.dl_idx = (llcp_cb.lcb.dl_idx + 1) % LLCP_MAX_DATA_LINK;
1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            }
1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        else
1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_msg = llcp_dlc_get_next_pdu (&llcp_cb.dlcb[llcp_cb.lcb.dl_idx]);
1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            /* this data link has been served, so start from next data link next time */
1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            llcp_cb.lcb.dl_idx = (llcp_cb.lcb.dl_idx + 1) % LLCP_MAX_DATA_LINK;
1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            if (p_msg)
1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            {
1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                /* serve logical data link next time */
1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                llcp_cb.lcb.ll_served = !llcp_cb.lcb.ll_served;
1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                return p_msg;
1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            }
1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else
1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        /* check next data link connection */
1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        llcp_cb.lcb.dl_idx = (llcp_cb.lcb.dl_idx + 1) % LLCP_MAX_DATA_LINK;
1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* if all of data link connection doesn't have data to send */
1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (count >= LLCP_MAX_DATA_LINK)
1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    llcp_cb.lcb.ll_served = !llcp_cb.lcb.ll_served;
1550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* nothing to send */
1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_next_pdu_length = 0;
1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NULL;
1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_build_next_pdu
1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Build a PDU from Link Manager and Data Link
1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Perform aggregation procedure if necessary
1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          BT_HDR* if sent any PDU
1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *llcp_link_build_next_pdu (BT_HDR *p_pdu)
1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR *p_agf = NULL, *p_msg = NULL, *p_next_pdu;
1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  *p, ptype;
1574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16  next_pdu_length, pdu_hdr;
1575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG0 ("llcp_link_build_next_pdu ()");
1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* add any pending SNL PDU into sig_xmit_q for transmitting */
1579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_sdp_check_send_snl ();
1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_pdu)
1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* get PDU type */
1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = (UINT8 *) (p_pdu + 1) + p_pdu->offset;
1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT16 (pdu_hdr, p);
1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ptype = (UINT8) (LLCP_GET_PTYPE (pdu_hdr));
1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ptype == LLCP_PDU_AGF_TYPE)
1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* add more PDU into this AGF PDU */
1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_agf = p_pdu;
1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_msg = p_pdu;
1597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Get a PDU from link manager or data links */
1602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg = llcp_link_get_next_pdu (FALSE, &next_pdu_length);
1603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!p_msg)
1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return NULL;
1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Get length of next PDU from link manager or data links without dequeue */
1611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_link_get_next_pdu (TRUE, &next_pdu_length);
1612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (next_pdu_length > 0)
1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if it's first visit */
1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!p_agf)
1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if next PDU fits into MIU, allocate AGF PDU and copy the first PDU */
1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (2 + p_msg->len + 2 + next_pdu_length <= llcp_cb.lcb.effective_miu)
1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_agf = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);
1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_agf)
1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_agf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p = (UINT8 *) (p_agf + 1) + p_agf->offset;
1626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    UINT16_TO_BE_STREAM (p, LLCP_GET_PDU_HEADER (LLCP_SAP_LM, LLCP_PDU_AGF_TYPE, LLCP_SAP_LM ));
1628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    UINT16_TO_BE_STREAM (p, p_msg->len);
1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    memcpy(p, (UINT8 *) (p_msg + 1) + p_msg->offset, p_msg->len);
1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_agf->len      = LLCP_PDU_HEADER_SIZE + 2 + p_msg->len;
1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    GKI_freebuf (p_msg);
1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_msg = p_agf;
1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    LLCP_TRACE_ERROR0 ("llcp_link_build_next_pdu (): Out of buffer");
1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return p_msg;
1640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if next PDU fits into MIU, copy the next PDU into AGF */
1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_agf->len - LLCP_PDU_HEADER_SIZE + 2 + next_pdu_length <= llcp_cb.lcb.effective_miu)
1650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Get a next PDU from link manager or data links */
1652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_next_pdu = llcp_link_get_next_pdu (FALSE, &next_pdu_length);
1653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p = (UINT8 *) (p_agf + 1) + p_agf->offset + p_agf->len;
1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT16_TO_BE_STREAM (p, p_next_pdu->len);
1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p, (UINT8 *) (p_next_pdu + 1) + p_next_pdu->offset, p_next_pdu->len);
1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_agf->len += 2 + p_next_pdu->len;
1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_next_pdu);
1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Get next PDU length from link manager or data links without dequeue */
1664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_get_next_pdu (TRUE, &next_pdu_length);
1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_agf)
1673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return p_agf;
1674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return p_msg;
1676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_send_to_lower
1681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send PDU to lower layer
1683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_send_to_lower (BT_HDR *p_pdu)
1688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
1690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DispLLCP (p_pdu, FALSE);
1691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_REMOTE_XMIT_NEXT;
1694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_SendData (NFC_RF_CONN_ID, p_pdu);
1696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_link_connection_cback
1701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      processing incoming data
1703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_link_connection_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
1708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event == NFC_DATA_CEVT)
1710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
1712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        DispLLCP ((BT_HDR *)p_data->data.p_data, TRUE);
1713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATED)
1715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* respoding SYMM while LLCP is deactivated but RF link is not deactivated yet */
1717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_send_SYMM ();
1718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf ((BT_HDR *) p_data->data.p_data);
1719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
17207c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        else if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATION_FAILED)
17217c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
17227c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* respoding with invalid LLC PDU until initiator deactivates RF link after LLCP activation was failed,
17237c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            ** so that initiator knows LLCP link activation was failed.
17247c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            */
17257c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            llcp_link_send_invalid_pdu ();
17267c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            GKI_freebuf ((BT_HDR *) p_data->data.p_data);
17277c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
1728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
17305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            llcp_cb.lcb.flags |= LLCP_LINK_FLAGS_RX_ANY_LLC_PDU;
1731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_proc_rx_data ((BT_HDR *) p_data->data.p_data);
1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (event == NFC_ERROR_CEVT)
1735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* RF interface specific status code */
1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_deactivate (*(UINT8*) p_data);
1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (event == NFC_DEACTIVATE_CEVT)
1740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING)
1742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(!llcp_cb.lcb.is_initiator)  )
1743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* peer initiates NFC link deactivation before timeout */
1745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_stop_link_timer ();
1746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_process_link_timeout ();
1747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
17487c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        else if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATION_FAILED)
17497c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
17507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* do not notify to upper layer because activation failure was already notified */
17517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            NFC_FlushData (NFC_RF_CONN_ID);
17527c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            llcp_cb.lcb.link_state = LLCP_LINK_STATE_DEACTIVATED;
17537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
1754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_DEACTIVATED)
1755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_link_deactivate (LLCP_LINK_RF_LINK_LOSS_ERR);
1757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
17587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_SetStaticRfCback (NULL);
1760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
17617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    else if (event == NFC_DATA_START_CEVT)
17627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
17637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_REMOTE_XMIT_NEXT)
17647c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
17657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* LLCP shall stop LTO timer when receiving the first bit of LLC PDU */
17667c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            llcp_link_stop_link_timer ();
17677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
17687c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
1769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* LLCP ignores the following events
1771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_CONN_CREATE_CEVT
1773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_CONN_CLOSE_CEVT
1774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
1775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_pdu_type
1781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
1783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          string of PDU type
1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *llcp_pdu_type (UINT8 ptype)
1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch(ptype)
1790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_SYMM_TYPE:
1792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "SYMM";
1793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_PAX_TYPE:
1794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "PAX";
1795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_AGF_TYPE:
1796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "AGF";
1797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_UI_TYPE:
1798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "UI";
1799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_CONNECT_TYPE:
1800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "CONNECT";
1801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_DISC_TYPE:
1802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DISC";
1803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_CC_TYPE:
1804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "CC";
1805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_DM_TYPE:
1806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DM";
1807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_FRMR_TYPE:
1808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "FRMR";
1809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_SNL_TYPE:
1810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "SNL";
1811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_I_TYPE:
1812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "I";
1813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_RR_TYPE:
1814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "RR";
1815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case LLCP_PDU_RNR_TYPE:
1816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "RNR";
1817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "RESERVED";
1820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1825