Home | History | Annotate | Download | only in l2cap
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  this file contains the functions relating to link management. A "link"
     22  *  is a connection between this device and another device. Only ACL links
     23  *  are managed.
     24  *
     25  ******************************************************************************/
     26 
     27 #include <stdlib.h>
     28 #include <string.h>
     29 #include <stdio.h>
     30 
     31 #include "gki.h"
     32 #include "bt_types.h"
     33 #include "bt_utils.h"
     34 #include "hcimsgs.h"
     35 #include "l2cdefs.h"
     36 #include "l2c_int.h"
     37 #include "l2c_api.h"
     38 #include "btu.h"
     39 #include "btm_api.h"
     40 #include "btm_int.h"
     41 
     42 static BOOLEAN l2c_link_send_to_lower (tL2C_LCB *p_lcb, BT_HDR *p_buf);
     43 
     44 #define L2C_LINK_SEND_ACL_DATA(x)  HCI_ACL_DATA_TO_LOWER((x))
     45 
     46 #if (BLE_INCLUDED == TRUE)
     47 #define L2C_LINK_SEND_BLE_ACL_DATA(x)  HCI_BLE_ACL_DATA_TO_LOWER((x))
     48 #endif
     49 
     50 /*******************************************************************************
     51 **
     52 ** Function         l2c_link_hci_conn_req
     53 **
     54 ** Description      This function is called when an HCI Connection Request
     55 **                  event is received.
     56 **
     57 ** Returns          TRUE, if accept conn
     58 **
     59 *******************************************************************************/
     60 BOOLEAN l2c_link_hci_conn_req (BD_ADDR bd_addr)
     61 {
     62     tL2C_LCB        *p_lcb;
     63     tL2C_LCB        *p_lcb_cur;
     64     int             xx;
     65     BOOLEAN         no_links;
     66 
     67     /* See if we have a link control block for the remote device */
     68     p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
     69 
     70     /* If we don't have one, create one and accept the connection. */
     71     if (!p_lcb)
     72     {
     73         p_lcb = l2cu_allocate_lcb (bd_addr, FALSE, BT_TRANSPORT_BR_EDR);
     74         if (!p_lcb)
     75         {
     76             btsnd_hcic_reject_conn (bd_addr, HCI_ERR_HOST_REJECT_RESOURCES);
     77             L2CAP_TRACE_ERROR ("L2CAP failed to allocate LCB");
     78             return FALSE;
     79         }
     80 
     81         no_links = TRUE;
     82 
     83         /* If we already have connection, accept as a master */
     84         for (xx = 0, p_lcb_cur = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb_cur++)
     85         {
     86             if (p_lcb_cur == p_lcb)
     87                 continue;
     88 
     89             if (p_lcb_cur->in_use)
     90             {
     91                 no_links = FALSE;
     92                 p_lcb->link_role = HCI_ROLE_MASTER;
     93                 break;
     94             }
     95         }
     96 
     97         if (no_links)
     98         {
     99             if (!btm_dev_support_switch (bd_addr))
    100                 p_lcb->link_role = HCI_ROLE_SLAVE;
    101             else
    102                 p_lcb->link_role = l2cu_get_conn_role(p_lcb);
    103         }
    104 
    105         /* Tell the other side we accept the connection */
    106         btsnd_hcic_accept_conn (bd_addr, p_lcb->link_role);
    107 
    108         p_lcb->link_state = LST_CONNECTING;
    109 
    110         /* Start a timer waiting for connect complete */
    111         btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_CONNECT_TOUT);
    112         return (TRUE);
    113     }
    114 
    115     /* We already had a link control block to the guy. Check what state it is in */
    116     if ((p_lcb->link_state == LST_CONNECTING) || (p_lcb->link_state == LST_CONNECT_HOLDING))
    117     {
    118         /* Connection collision. Accept the connection anyways. */
    119 
    120         if (!btm_dev_support_switch (bd_addr))
    121             p_lcb->link_role = HCI_ROLE_SLAVE;
    122         else
    123             p_lcb->link_role = l2cu_get_conn_role(p_lcb);
    124 
    125         btsnd_hcic_accept_conn (bd_addr, p_lcb->link_role);
    126 
    127         p_lcb->link_state = LST_CONNECTING;
    128         return (TRUE);
    129     }
    130     else if (p_lcb->link_state == LST_DISCONNECTING)
    131     {
    132         /* In disconnecting state, reject the connection. */
    133         btsnd_hcic_reject_conn (bd_addr, HCI_ERR_HOST_REJECT_DEVICE);
    134     }
    135     else
    136     {
    137         L2CAP_TRACE_ERROR("L2CAP got conn_req while connected (state:%d). Reject it",
    138                 p_lcb->link_state);
    139         /* Reject the connection with ACL Connection Already exist reason */
    140         btsnd_hcic_reject_conn (bd_addr, HCI_ERR_CONNECTION_EXISTS);
    141     }
    142     return (FALSE);
    143 }
    144 
    145 /*******************************************************************************
    146 **
    147 ** Function         l2c_link_hci_conn_comp
    148 **
    149 ** Description      This function is called when an HCI Connection Complete
    150 **                  event is received.
    151 **
    152 ** Returns          void
    153 **
    154 *******************************************************************************/
    155 BOOLEAN l2c_link_hci_conn_comp (UINT8 status, UINT16 handle, BD_ADDR p_bda)
    156 {
    157     tL2C_CONN_INFO       ci;
    158     tL2C_LCB            *p_lcb;
    159     tL2C_CCB            *p_ccb;
    160     tBTM_SEC_DEV_REC    *p_dev_info = NULL;
    161 
    162 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
    163     btm_acl_update_busy_level (BTM_BLI_PAGE_DONE_EVT);
    164 #endif
    165 
    166     /* Save the parameters */
    167     ci.status       = status;
    168     memcpy (ci.bd_addr, p_bda, BD_ADDR_LEN);
    169 
    170     /* See if we have a link control block for the remote device */
    171     p_lcb = l2cu_find_lcb_by_bd_addr (ci.bd_addr, BT_TRANSPORT_BR_EDR);
    172 
    173     /* If we don't have one, this is an error */
    174     if (!p_lcb)
    175     {
    176         L2CAP_TRACE_WARNING ("L2CAP got conn_comp for unknown BD_ADDR");
    177         return (FALSE);
    178     }
    179 
    180     if (p_lcb->link_state != LST_CONNECTING)
    181     {
    182         L2CAP_TRACE_ERROR ("L2CAP got conn_comp in bad state: %d  status: 0x%d", p_lcb->link_state, status);
    183 
    184         if (status != HCI_SUCCESS)
    185             l2c_link_hci_disc_comp (p_lcb->handle, status);
    186 
    187         return (FALSE);
    188     }
    189 
    190     /* Save the handle */
    191     p_lcb->handle = handle;
    192 
    193     if (ci.status == HCI_SUCCESS)
    194     {
    195         /* Connected OK. Change state to connected */
    196         p_lcb->link_state = LST_CONNECTED;
    197 
    198         /* Get the peer information if the l2cap flow-control/rtrans is supported */
    199         l2cu_send_peer_info_req (p_lcb, L2CAP_EXTENDED_FEATURES_INFO_TYPE);
    200 
    201         /* Tell BTM Acl management about the link */
    202         if ((p_dev_info = btm_find_dev (p_bda)) != NULL)
    203             btm_acl_created (ci.bd_addr, p_dev_info->dev_class,
    204                              p_dev_info->sec_bd_name, handle,
    205                              p_lcb->link_role, BT_TRANSPORT_BR_EDR);
    206         else
    207             btm_acl_created (ci.bd_addr, NULL, NULL, handle, p_lcb->link_role, BT_TRANSPORT_BR_EDR);
    208 
    209         BTM_SetLinkSuperTout (ci.bd_addr, btm_cb.btm_def_link_super_tout);
    210 
    211         /* If dedicated bonding do not process any further */
    212         if (p_lcb->is_bonding)
    213         {
    214             if (l2cu_start_post_bond_timer(handle))
    215                 return (TRUE);
    216         }
    217 
    218         /* Update the timeouts in the hold queue */
    219         l2c_process_held_packets(FALSE);
    220 
    221         btu_stop_timer (&p_lcb->timer_entry);
    222 
    223         /* For all channels, send the event through their FSMs */
    224         for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
    225         {
    226             l2c_csm_execute (p_ccb, L2CEVT_LP_CONNECT_CFM, &ci);
    227         }
    228 
    229         if (p_lcb->p_echo_rsp_cb)
    230         {
    231             l2cu_send_peer_echo_req (p_lcb, NULL, 0);
    232             btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_ECHO_RSP_TOUT);
    233         }
    234         else if (!p_lcb->ccb_queue.p_first_ccb)
    235         {
    236             btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_STARTUP_TOUT);
    237         }
    238     }
    239     /* Max number of acl connections.                          */
    240     /* If there's an lcb disconnecting set this one to holding */
    241     else if ((ci.status == HCI_ERR_MAX_NUM_OF_CONNECTIONS) && l2cu_lcb_disconnecting())
    242     {
    243         p_lcb->link_state = LST_CONNECT_HOLDING;
    244         p_lcb->handle = HCI_INVALID_HANDLE;
    245     }
    246     else
    247     {
    248         /* Just in case app decides to try again in the callback context */
    249         p_lcb->link_state = LST_DISCONNECTING;
    250 
    251         /* Connection failed. For all channels, send the event through */
    252         /* their FSMs. The CCBs should remove themselves from the LCB  */
    253         for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; )
    254         {
    255             tL2C_CCB *pn = p_ccb->p_next_ccb;
    256 
    257             l2c_csm_execute (p_ccb, L2CEVT_LP_CONNECT_CFM_NEG, &ci);
    258 
    259             p_ccb = pn;
    260         }
    261 
    262         p_lcb->disc_reason = status;
    263         /* Release the LCB */
    264         if (p_lcb->ccb_queue.p_first_ccb == NULL)
    265             l2cu_release_lcb (p_lcb);
    266         else                              /* there are any CCBs remaining */
    267         {
    268             if (ci.status == HCI_ERR_CONNECTION_EXISTS)
    269             {
    270                 /* we are in collision situation, wait for connecttion request from controller */
    271                 p_lcb->link_state = LST_CONNECTING;
    272             }
    273             else
    274             {
    275                 l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR);
    276             }
    277         }
    278     }
    279     return (TRUE);
    280 }
    281 
    282 
    283 /*******************************************************************************
    284 **
    285 ** Function         l2c_link_sec_comp
    286 **
    287 ** Description      This function is called when required security procedures
    288 **                  are completed.
    289 **
    290 ** Returns          void
    291 **
    292 *******************************************************************************/
    293 void l2c_link_sec_comp (BD_ADDR p_bda, tBT_TRANSPORT transport, void *p_ref_data, UINT8 status)
    294 {
    295     tL2C_CONN_INFO  ci;
    296     tL2C_LCB        *p_lcb;
    297     tL2C_CCB        *p_ccb;
    298     tL2C_CCB        *p_next_ccb;
    299     UINT8           event;
    300 
    301     UNUSED(transport);
    302 
    303     L2CAP_TRACE_DEBUG ("l2c_link_sec_comp: %d, 0x%x", status, p_ref_data);
    304 
    305     if (status == BTM_SUCCESS_NO_SECURITY)
    306         status = BTM_SUCCESS;
    307 
    308     /* Save the parameters */
    309     ci.status       = status;
    310     memcpy (ci.bd_addr, p_bda, BD_ADDR_LEN);
    311 
    312     p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR);
    313 
    314     /* If we don't have one, this is an error */
    315     if (!p_lcb)
    316     {
    317         L2CAP_TRACE_WARNING ("L2CAP got sec_comp for unknown BD_ADDR");
    318         return;
    319     }
    320 
    321     /* Match p_ccb with p_ref_data returned by sec manager */
    322     for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
    323     {
    324         p_next_ccb = p_ccb->p_next_ccb;
    325 
    326         if (p_ccb == p_ref_data)
    327         {
    328             switch(status)
    329             {
    330             case BTM_SUCCESS:
    331                 L2CAP_TRACE_DEBUG ("ccb timer ticks: %u", p_ccb->timer_entry.ticks);
    332                 event = L2CEVT_SEC_COMP;
    333                 break;
    334 
    335             case BTM_DELAY_CHECK:
    336                 /* start a timer - encryption change not received before L2CAP connect req */
    337                 btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_DELAY_CHECK_SM4);
    338                 return;
    339 
    340             default:
    341                 event = L2CEVT_SEC_COMP_NEG;
    342             }
    343             l2c_csm_execute (p_ccb, event, &ci);
    344             break;
    345         }
    346     }
    347 }
    348 
    349 
    350 /*******************************************************************************
    351 **
    352 ** Function         l2c_link_hci_disc_comp
    353 **
    354 ** Description      This function is called when an HCI Disconnect Complete
    355 **                  event is received.
    356 **
    357 ** Returns          TRUE if the link is known about, else FALSE
    358 **
    359 *******************************************************************************/
    360 BOOLEAN l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason)
    361 {
    362     tL2C_LCB    *p_lcb;
    363     tL2C_CCB    *p_ccb;
    364     BOOLEAN     status = TRUE;
    365     BOOLEAN     lcb_is_free = TRUE;
    366     tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
    367 
    368     /* See if we have a link control block for the connection */
    369     p_lcb = l2cu_find_lcb_by_handle (handle);
    370 
    371     /* If we don't have one, maybe an SCO link. Send to MM */
    372     if (!p_lcb)
    373     {
    374         status = FALSE;
    375     }
    376     else
    377     {
    378         /* There can be a case when we rejected PIN code authentication */
    379         /* otherwise save a new reason */
    380         if (btm_cb.acl_disc_reason != HCI_ERR_HOST_REJECT_SECURITY)
    381             btm_cb.acl_disc_reason = reason;
    382 
    383         p_lcb->disc_reason = btm_cb.acl_disc_reason;
    384 
    385         /* Just in case app decides to try again in the callback context */
    386         p_lcb->link_state = LST_DISCONNECTING;
    387 
    388         /* Link is disconnected. For all channels, send the event through */
    389         /* their FSMs. The CCBs should remove themselves from the LCB     */
    390         for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; )
    391         {
    392             tL2C_CCB *pn = p_ccb->p_next_ccb;
    393 
    394             /* Keep connect pending control block (if exists)
    395              * Possible Race condition when a reconnect occurs
    396              * on the channel during a disconnect of link. This
    397              * ccb will be automatically retried after link disconnect
    398              * arrives
    399              */
    400             if (p_ccb != p_lcb->p_pending_ccb)
    401             {
    402                 l2c_csm_execute (p_ccb, L2CEVT_LP_DISCONNECT_IND, &reason);
    403             }
    404             p_ccb = pn;
    405         }
    406 
    407 #if (BTM_SCO_INCLUDED == TRUE)
    408 #if (BLE_INCLUDED == TRUE)
    409         if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
    410 #endif
    411             /* Tell SCO management to drop any SCOs on this ACL */
    412             btm_sco_acl_removed (p_lcb->remote_bd_addr);
    413 #endif
    414 
    415         /* If waiting for disconnect and reconnect is pending start the reconnect now
    416            race condition where layer above issued connect request on link that was
    417            disconnecting
    418          */
    419         if (p_lcb->ccb_queue.p_first_ccb != NULL || p_lcb->p_pending_ccb)
    420         {
    421             L2CAP_TRACE_DEBUG("l2c_link_hci_disc_comp: Restarting pending ACL request");
    422 #if BLE_INCLUDED == TRUE
    423             /* for LE link, always drop and re-open to ensure to get LE remote feature */
    424             if (p_lcb->transport == BT_TRANSPORT_LE)
    425             {
    426                 l2cu_release_lcb (p_lcb);
    427                 p_lcb->in_use = TRUE;
    428                 transport = BT_TRANSPORT_LE;
    429             }
    430             else
    431 #endif
    432        {
    433           #if (L2CAP_NUM_FIXED_CHNLS > 0)
    434           /* If we are going to re-use the LCB without dropping it, release all fixed channels
    435           here */
    436           int xx;
    437           for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
    438           {
    439               if (p_lcb->p_fixed_ccbs[xx] && p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb)
    440               {
    441 #if BLE_INCLUDED == TRUE
    442                   (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE,
    443                        p_lcb->disc_reason, p_lcb->transport);
    444 #else
    445                   (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE,
    446                        p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
    447 #endif
    448                     l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
    449 
    450                     p_lcb->p_fixed_ccbs[xx] = NULL;
    451               }
    452           }
    453 #endif
    454         }
    455             if (l2cu_create_conn(p_lcb, transport))
    456                 lcb_is_free = FALSE; /* still using this lcb */
    457         }
    458 
    459         p_lcb->p_pending_ccb = NULL;
    460 
    461         /* Release the LCB */
    462         if (lcb_is_free)
    463             l2cu_release_lcb (p_lcb);
    464     }
    465 
    466     /* Now that we have a free acl connection, see if any lcbs are pending */
    467     if (lcb_is_free && ((p_lcb = l2cu_find_lcb_by_state(LST_CONNECT_HOLDING)) != NULL))
    468     {
    469         /* we found one-- create a connection */
    470         l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR);
    471     }
    472 
    473     return status;
    474 }
    475 
    476 
    477 /*******************************************************************************
    478 **
    479 ** Function         l2c_link_hci_qos_violation
    480 **
    481 ** Description      This function is called when an HCI QOS Violation
    482 **                  event is received.
    483 **
    484 ** Returns          TRUE if the link is known about, else FALSE
    485 **
    486 *******************************************************************************/
    487 BOOLEAN l2c_link_hci_qos_violation (UINT16 handle)
    488 {
    489     tL2C_LCB        *p_lcb;
    490     tL2C_CCB        *p_ccb;
    491 
    492     /* See if we have a link control block for the connection */
    493     p_lcb = l2cu_find_lcb_by_handle (handle);
    494 
    495     /* If we don't have one, maybe an SCO link. */
    496     if (!p_lcb)
    497         return (FALSE);
    498 
    499     /* For all channels, tell the upper layer about it */
    500     for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
    501     {
    502         if (p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb)
    503             l2c_csm_execute (p_ccb, L2CEVT_LP_QOS_VIOLATION_IND, NULL);
    504     }
    505 
    506     return (TRUE);
    507 }
    508 
    509 
    510 
    511 /*******************************************************************************
    512 **
    513 ** Function         l2c_link_timeout
    514 **
    515 ** Description      This function is called when a link timer expires
    516 **
    517 ** Returns          void
    518 **
    519 *******************************************************************************/
    520 void l2c_link_timeout (tL2C_LCB *p_lcb)
    521 {
    522     tL2C_CCB   *p_ccb;
    523     UINT16      timeout;
    524     tBTM_STATUS rc;
    525 
    526      L2CAP_TRACE_EVENT ("L2CAP - l2c_link_timeout() link state %d first CCB %p is_bonding:%d",
    527          p_lcb->link_state, p_lcb->ccb_queue.p_first_ccb, p_lcb->is_bonding);
    528 
    529     /* If link was connecting or disconnecting, clear all channels and drop the LCB */
    530     if ((p_lcb->link_state == LST_CONNECTING_WAIT_SWITCH) ||
    531         (p_lcb->link_state == LST_CONNECTING) ||
    532         (p_lcb->link_state == LST_CONNECT_HOLDING) ||
    533         (p_lcb->link_state == LST_DISCONNECTING))
    534     {
    535         p_lcb->p_pending_ccb = NULL;
    536 
    537         /* For all channels, send a disconnect indication event through */
    538         /* their FSMs. The CCBs should remove themselves from the LCB   */
    539         for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; )
    540         {
    541             tL2C_CCB *pn = p_ccb->p_next_ccb;
    542 
    543             l2c_csm_execute (p_ccb, L2CEVT_LP_DISCONNECT_IND, NULL);
    544 
    545             p_ccb = pn;
    546         }
    547 #if (BLE_INCLUDED == TRUE)
    548         if (p_lcb->link_state == LST_CONNECTING &&
    549             l2cb.is_ble_connecting == TRUE)
    550         {
    551             L2CA_CancelBleConnectReq(l2cb.ble_connecting_bda);
    552         }
    553 #endif
    554         /* Release the LCB */
    555         l2cu_release_lcb (p_lcb);
    556     }
    557 
    558     /* If link is connected, check for inactivity timeout */
    559     if (p_lcb->link_state == LST_CONNECTED)
    560     {
    561         /* Check for ping outstanding */
    562         if (p_lcb->p_echo_rsp_cb)
    563         {
    564             tL2CA_ECHO_RSP_CB *p_cb = p_lcb->p_echo_rsp_cb;
    565 
    566             /* Zero out the callback in case app immediately calls us again */
    567             p_lcb->p_echo_rsp_cb = NULL;
    568 
    569             (*p_cb) (L2CAP_PING_RESULT_NO_RESP);
    570 
    571              L2CAP_TRACE_WARNING ("L2CAP - ping timeout");
    572 
    573             /* For all channels, send a disconnect indication event through */
    574             /* their FSMs. The CCBs should remove themselves from the LCB   */
    575             for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; )
    576             {
    577                 tL2C_CCB *pn = p_ccb->p_next_ccb;
    578 
    579                 l2c_csm_execute (p_ccb, L2CEVT_LP_DISCONNECT_IND, NULL);
    580 
    581                 p_ccb = pn;
    582             }
    583         }
    584 
    585         /* If no channels in use, drop the link. */
    586         if (!p_lcb->ccb_queue.p_first_ccb)
    587         {
    588             rc = btm_sec_disconnect (p_lcb->handle, HCI_ERR_PEER_USER);
    589 
    590             if (rc == BTM_CMD_STORED)
    591             {
    592                 /* Security Manager will take care of disconnecting, state will be updated at that time */
    593                 timeout = 0xFFFF;
    594             }
    595             else if (rc == BTM_CMD_STARTED)
    596             {
    597                 p_lcb->link_state = LST_DISCONNECTING;
    598                 timeout = L2CAP_LINK_DISCONNECT_TOUT;
    599             }
    600             else if (rc == BTM_SUCCESS)
    601             {
    602                 l2cu_process_fixed_disc_cback(p_lcb);
    603                 /* BTM SEC will make sure that link is release (probably after pairing is done) */
    604                 p_lcb->link_state = LST_DISCONNECTING;
    605                 timeout = 0xFFFF;
    606             }
    607             else if (rc == BTM_BUSY)
    608             {
    609                 /* BTM is still executing security process. Let lcb stay as connected */
    610                 timeout = 0xFFFF;
    611             }
    612             else if ((p_lcb->is_bonding)
    613                   && (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)))
    614             {
    615                 l2cu_process_fixed_disc_cback(p_lcb);
    616                 p_lcb->link_state = LST_DISCONNECTING;
    617                 timeout = L2CAP_LINK_DISCONNECT_TOUT;
    618             }
    619             else
    620             {
    621                 /* probably no buffer to send disconnect */
    622                 timeout = BT_1SEC_TIMEOUT;
    623             }
    624 
    625             if (timeout != 0xFFFF)
    626             {
    627                 btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, timeout);
    628             }
    629         }
    630         else
    631         {
    632             /* Check in case we were flow controlled */
    633             l2c_link_check_send_pkts (p_lcb, NULL, NULL);
    634         }
    635     }
    636 }
    637 
    638 /*******************************************************************************
    639 **
    640 ** Function         l2c_info_timeout
    641 **
    642 ** Description      This function is called when an info request times out
    643 **
    644 ** Returns          void
    645 **
    646 *******************************************************************************/
    647 void l2c_info_timeout (tL2C_LCB *p_lcb)
    648 {
    649     tL2C_CCB   *p_ccb;
    650     tL2C_CONN_INFO  ci;
    651 
    652     /* If we timed out waiting for info response, just continue using basic if allowed */
    653     if (p_lcb->w4_info_rsp)
    654     {
    655         /* If waiting for security complete, restart the info response timer */
    656         for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
    657         {
    658             if ( (p_ccb->chnl_state == CST_ORIG_W4_SEC_COMP) || (p_ccb->chnl_state == CST_TERM_W4_SEC_COMP) )
    659             {
    660                 btu_start_timer (&p_lcb->info_timer_entry, BTU_TTYPE_L2CAP_INFO, L2CAP_WAIT_INFO_RSP_TOUT);
    661                 return;
    662             }
    663         }
    664 
    665         p_lcb->w4_info_rsp = FALSE;
    666 
    667         /* If link is in process of being brought up */
    668         if ((p_lcb->link_state != LST_DISCONNECTED) &&
    669             (p_lcb->link_state != LST_DISCONNECTING))
    670         {
    671             /* Notify active channels that peer info is finished */
    672             if (p_lcb->ccb_queue.p_first_ccb)
    673             {
    674                 ci.status = HCI_SUCCESS;
    675                 memcpy (ci.bd_addr, p_lcb->remote_bd_addr, sizeof(BD_ADDR));
    676 
    677                 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
    678                 {
    679                     l2c_csm_execute (p_ccb, L2CEVT_L2CAP_INFO_RSP, &ci);
    680                 }
    681             }
    682         }
    683     }
    684 }
    685 
    686 /*******************************************************************************
    687 **
    688 ** Function         l2c_link_adjust_allocation
    689 **
    690 ** Description      This function is called when a link is created or removed
    691 **                  to calculate the amount of packets each link may send to
    692 **                  the HCI without an ack coming back.
    693 **
    694 **                  Currently, this is a simple allocation, dividing the
    695 **                  number of Controller Packets by the number of links. In
    696 **                  the future, QOS configuration should be examined.
    697 **
    698 ** Returns          void
    699 **
    700 *******************************************************************************/
    701 void l2c_link_adjust_allocation (void)
    702 {
    703     UINT16      qq, yy, qq_remainder;
    704     tL2C_LCB    *p_lcb;
    705     UINT16      hi_quota, low_quota;
    706     UINT16      num_lowpri_links = 0;
    707     UINT16      num_hipri_links  = 0;
    708     UINT16      controller_xmit_quota = l2cb.num_lm_acl_bufs;
    709     UINT16      high_pri_link_quota = L2CAP_HIGH_PRI_MIN_XMIT_QUOTA_A;
    710 
    711     /* If no links active, reset buffer quotas and controller buffers */
    712     if (l2cb.num_links_active == 0)
    713     {
    714         l2cb.controller_xmit_window = l2cb.num_lm_acl_bufs;
    715         l2cb.round_robin_quota = l2cb.round_robin_unacked = 0;
    716         return;
    717     }
    718 
    719     /* First, count the links */
    720     for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++)
    721     {
    722         if (p_lcb->in_use)
    723         {
    724             if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
    725                 num_hipri_links++;
    726             else
    727                 num_lowpri_links++;
    728         }
    729     }
    730 
    731     /* now adjust high priority link quota */
    732     low_quota = num_lowpri_links ? 1 : 0;
    733     while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota )
    734         high_pri_link_quota--;
    735 
    736     /* Work out the xmit quota and buffer quota high and low priorities */
    737     hi_quota  = num_hipri_links * high_pri_link_quota;
    738     low_quota = (hi_quota < controller_xmit_quota) ? controller_xmit_quota - hi_quota : 1;
    739 
    740     /* Work out and save the HCI xmit quota for each low priority link */
    741 
    742     /* If each low priority link cannot have at least one buffer */
    743     if (num_lowpri_links > low_quota)
    744     {
    745         l2cb.round_robin_quota = low_quota;
    746         qq = qq_remainder = 1;
    747     }
    748     /* If each low priority link can have at least one buffer */
    749     else if (num_lowpri_links > 0)
    750     {
    751         l2cb.round_robin_quota = 0;
    752         l2cb.round_robin_unacked = 0;
    753         qq = low_quota / num_lowpri_links;
    754         qq_remainder = low_quota % num_lowpri_links;
    755     }
    756     /* If no low priority link */
    757     else
    758     {
    759         l2cb.round_robin_quota = 0;
    760         l2cb.round_robin_unacked = 0;
    761         qq = qq_remainder = 1;
    762     }
    763 
    764     L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation  num_hipri: %u  num_lowpri: %u  low_quota: %u  round_robin_quota: %u  qq: %u",
    765                         num_hipri_links, num_lowpri_links, low_quota,
    766                         l2cb.round_robin_quota, qq);
    767 
    768     /* Now, assign the quotas to each link */
    769     for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++)
    770     {
    771         if (p_lcb->in_use)
    772         {
    773             if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
    774             {
    775                 p_lcb->link_xmit_quota   = high_pri_link_quota;
    776             }
    777             else
    778             {
    779                 /* Safety check in case we switched to round-robin with something outstanding */
    780                 /* if sent_not_acked is added into round_robin_unacked then don't add it again */
    781                 /* l2cap keeps updating sent_not_acked for exiting from round robin */
    782                 if (( p_lcb->link_xmit_quota > 0 )&&( qq == 0 ))
    783                     l2cb.round_robin_unacked += p_lcb->sent_not_acked;
    784 
    785                 p_lcb->link_xmit_quota   = qq;
    786                 if (qq_remainder > 0)
    787                 {
    788                     p_lcb->link_xmit_quota++;
    789                     qq_remainder--;
    790                 }
    791             }
    792 
    793 #if L2CAP_HOST_FLOW_CTRL
    794             p_lcb->link_ack_thresh = L2CAP_HOST_FC_ACL_BUFS / l2cb.num_links_active;
    795 #endif
    796             L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation LCB %d   Priority: %d  XmitQuota: %d",
    797                                 yy, p_lcb->acl_priority, p_lcb->link_xmit_quota);
    798 
    799             L2CAP_TRACE_EVENT ("        SentNotAcked: %d  RRUnacked: %d",
    800                                 p_lcb->sent_not_acked, l2cb.round_robin_unacked);
    801 
    802             /* There is a special case where we have readjusted the link quotas and  */
    803             /* this link may have sent anything but some other link sent packets so  */
    804             /* so we may need a timer to kick off this link's transmissions.         */
    805             if ( (p_lcb->link_state == LST_CONNECTED)
    806               && (p_lcb->link_xmit_data_q.count)
    807               && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) )
    808                 btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_FLOW_CONTROL_TOUT);
    809         }
    810     }
    811 
    812 }
    813 
    814 /*******************************************************************************
    815 **
    816 ** Function         l2c_link_adjust_chnl_allocation
    817 **
    818 ** Description      This function is called to calculate the amount of packets each
    819 **                  non-F&EC channel may have outstanding.
    820 **
    821 **                  Currently, this is a simple allocation, dividing the number
    822 **                  of packets allocated to the link by the number of channels. In
    823 **                  the future, QOS configuration should be examined.
    824 **
    825 ** Returns          void
    826 **
    827 *******************************************************************************/
    828 void l2c_link_adjust_chnl_allocation (void)
    829 {
    830     tL2C_CCB    *p_ccb;
    831     UINT8       xx;
    832 
    833     UINT16      weighted_chnls[GKI_NUM_TOTAL_BUF_POOLS];
    834     UINT16      quota_per_weighted_chnls[GKI_NUM_TOTAL_BUF_POOLS];
    835     UINT16      reserved_buff[GKI_NUM_TOTAL_BUF_POOLS];
    836 
    837     L2CAP_TRACE_DEBUG ("l2c_link_adjust_chnl_allocation");
    838 
    839     /* initialize variables */
    840     for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++ )
    841     {
    842         weighted_chnls[xx] = 0;
    843         reserved_buff[xx] = 0;
    844     }
    845 
    846     /* add up all of tx and rx data rate requirement */
    847     /* channel required higher data rate will get more buffer quota */
    848     for (xx = 0; xx < MAX_L2CAP_CHANNELS; xx++)
    849     {
    850         p_ccb = l2cb.ccb_pool + xx;
    851 
    852         if (!p_ccb->in_use)
    853             continue;
    854 
    855         if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
    856         {
    857             weighted_chnls[p_ccb->ertm_info.user_tx_pool_id] += p_ccb->tx_data_rate;
    858             weighted_chnls[p_ccb->ertm_info.user_rx_pool_id] += p_ccb->rx_data_rate;
    859 
    860             if (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID)
    861             {
    862                 /* reserve buffers only for wait_for_ack_q to maximize throughput */
    863                 /* retrans_q will work based on buffer status */
    864                 reserved_buff[HCI_ACL_POOL_ID] += p_ccb->peer_cfg.fcr.tx_win_sz;
    865             }
    866 
    867             if (p_ccb->ertm_info.fcr_rx_pool_id == HCI_ACL_POOL_ID)
    868             {
    869                 /* reserve buffers for srej_rcv_hold_q */
    870                 reserved_buff[HCI_ACL_POOL_ID] += p_ccb->peer_cfg.fcr.tx_win_sz;
    871             }
    872         }
    873         else
    874         {
    875             /* low data rate is 1, medium is 2, high is 3 and no traffic is 0 */
    876             weighted_chnls[HCI_ACL_POOL_ID] += p_ccb->tx_data_rate + p_ccb->rx_data_rate;
    877         }
    878     }
    879 
    880 
    881     /* get unit quota per pool */
    882     for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++ )
    883     {
    884         if ( weighted_chnls[xx] > 0 )
    885         {
    886             if (GKI_poolcount(xx) > reserved_buff[xx])
    887                 quota_per_weighted_chnls[xx] = ((GKI_poolcount(xx) - reserved_buff[xx])/weighted_chnls[xx]) + 1;
    888             else
    889                 quota_per_weighted_chnls[xx] = 1;
    890 
    891             L2CAP_TRACE_DEBUG ("POOL ID:%d, GKI_poolcount = %d, reserved_buff = %d, weighted_chnls = %d, quota_per_weighted_chnls = %d",
    892                                  xx, GKI_poolcount(xx), reserved_buff[xx], weighted_chnls[xx], quota_per_weighted_chnls[xx] );
    893         }
    894         else
    895             quota_per_weighted_chnls[xx] = 0;
    896     }
    897 
    898 
    899     /* assign buffer quota to each channel based on its data rate requirement */
    900     for (xx = 0; xx < MAX_L2CAP_CHANNELS; xx++)
    901     {
    902         p_ccb = l2cb.ccb_pool + xx;
    903 
    904         if (!p_ccb->in_use)
    905             continue;
    906 
    907         if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
    908         {
    909             p_ccb->buff_quota = quota_per_weighted_chnls[p_ccb->ertm_info.user_tx_pool_id] * p_ccb->tx_data_rate;
    910 
    911             L2CAP_TRACE_EVENT ("CID:0x%04x FCR Mode:%u UserTxPool:%u Priority:%u TxDataRate:%u Quota:%u",
    912                                 p_ccb->local_cid, p_ccb->peer_cfg.fcr.mode, p_ccb->ertm_info.user_tx_pool_id,
    913                                 p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota);
    914 
    915         }
    916         else
    917         {
    918             p_ccb->buff_quota = quota_per_weighted_chnls[HCI_ACL_POOL_ID] * p_ccb->tx_data_rate;
    919 
    920             L2CAP_TRACE_EVENT ("CID:0x%04x Priority:%u TxDataRate:%u Quota:%u",
    921                                 p_ccb->local_cid,
    922                                 p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota);
    923         }
    924 
    925         /* quota may be change so check congestion */
    926         l2cu_check_channel_congestion (p_ccb);
    927     }
    928 }
    929 
    930 /*******************************************************************************
    931 **
    932 ** Function         l2c_link_processs_num_bufs
    933 **
    934 ** Description      This function is called when a "controller buffer size"
    935 **                  event is first received from the controller. It updates
    936 **                  the L2CAP values.
    937 **
    938 ** Returns          void
    939 **
    940 *******************************************************************************/
    941 void l2c_link_processs_num_bufs (UINT16 num_lm_acl_bufs)
    942 {
    943     l2cb.num_lm_acl_bufs = l2cb.controller_xmit_window = num_lm_acl_bufs;
    944 
    945 }
    946 
    947 /*******************************************************************************
    948 **
    949 ** Function         l2c_link_pkts_rcvd
    950 **
    951 ** Description      This function is called from the HCI transport when it is time
    952 **                  tto send a "Host ready for packets" command. This is only when
    953 **                  host to controller flow control is used. If fills in the arrays
    954 **                  of numbers of packets and handles.
    955 **
    956 ** Returns          count of number of entries filled in
    957 **
    958 *******************************************************************************/
    959 UINT8 l2c_link_pkts_rcvd (UINT16 *num_pkts, UINT16 *handles)
    960 {
    961     UINT8       num_found = 0;
    962 
    963 #if (L2CAP_HOST_FLOW_CTRL == TRUE)
    964 
    965     int         xx;
    966     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
    967 
    968     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
    969     {
    970         if ((p_lcb->in_use) && (p_lcb->link_pkts_unacked))
    971         {
    972             num_pkts[num_found] = p_lcb->link_pkts_unacked;
    973             handles[num_found]  = p_lcb->handle;
    974             p_lcb->link_pkts_unacked = 0;
    975             num_found++;
    976         }
    977     }
    978 #else
    979     UNUSED(num_pkts);
    980     UNUSED(handles);
    981 #endif
    982 
    983     return (num_found);
    984 }
    985 
    986 /*******************************************************************************
    987 **
    988 ** Function         l2c_link_role_changed
    989 **
    990 ** Description      This function is called whan a link's master/slave role change
    991 **                  event is received. It simply updates the link control block.
    992 **
    993 ** Returns          void
    994 **
    995 *******************************************************************************/
    996 void l2c_link_role_changed (BD_ADDR bd_addr, UINT8 new_role, UINT8 hci_status)
    997 {
    998     tL2C_LCB *p_lcb;
    999     int      xx;
   1000 
   1001     /* Make sure not called from HCI Command Status (bd_addr and new_role are invalid) */
   1002     if (bd_addr)
   1003     {
   1004         /* If here came form hci role change event */
   1005         p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
   1006         if (p_lcb)
   1007         {
   1008             p_lcb->link_role = new_role;
   1009 
   1010             /* Reset high priority link if needed */
   1011             if (hci_status == HCI_SUCCESS)
   1012                 l2cu_set_acl_priority(bd_addr, p_lcb->acl_priority, TRUE);
   1013         }
   1014     }
   1015 
   1016     /* Check if any LCB was waiting for switch to be completed */
   1017     for (xx = 0, p_lcb = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
   1018     {
   1019         if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTING_WAIT_SWITCH))
   1020         {
   1021             l2cu_create_conn_after_switch (p_lcb);
   1022         }
   1023     }
   1024 }
   1025 
   1026 /*******************************************************************************
   1027 **
   1028 ** Function         l2c_pin_code_request
   1029 **
   1030 ** Description      This function is called whan a pin-code request is received
   1031 **                  on a connection. If there are no channels active yet on the
   1032 **                  link, it extends the link first connection timer.  Make sure
   1033 **                  that inactivity timer is not extended if PIN code happens
   1034 **                  to be after last ccb released.
   1035 **
   1036 ** Returns          void
   1037 **
   1038 *******************************************************************************/
   1039 void l2c_pin_code_request (BD_ADDR bd_addr)
   1040 {
   1041     tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
   1042 
   1043     if ( (p_lcb) && (!p_lcb->ccb_queue.p_first_ccb) )
   1044     {
   1045         btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_CONNECT_TOUT_EXT);
   1046     }
   1047 }
   1048 
   1049 #if ((BTM_PWR_MGR_INCLUDED == TRUE) && L2CAP_WAKE_PARKED_LINK == TRUE)
   1050 /*******************************************************************************
   1051 **
   1052 ** Function         l2c_link_check_power_mode
   1053 **
   1054 ** Description      This function is called to check power mode.
   1055 **
   1056 ** Returns          TRUE if link is going to be active from park
   1057 **                  FALSE if nothing to send or not in park mode
   1058 **
   1059 *******************************************************************************/
   1060 BOOLEAN l2c_link_check_power_mode (tL2C_LCB *p_lcb)
   1061 {
   1062     tBTM_PM_MODE     mode;
   1063     tL2C_CCB    *p_ccb;
   1064     BOOLEAN need_to_active = FALSE;
   1065 
   1066     /*
   1067      * We only switch park to active only if we have unsent packets
   1068      */
   1069     if ( p_lcb->link_xmit_data_q.count == 0 )
   1070     {
   1071         for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
   1072         {
   1073             if (p_ccb->xmit_hold_q.count != 0)
   1074             {
   1075                 need_to_active = TRUE;
   1076                 break;
   1077             }
   1078         }
   1079     }
   1080     else
   1081         need_to_active = TRUE;
   1082 
   1083     /* if we have packets to send */
   1084     if ( need_to_active )
   1085     {
   1086         /* check power mode */
   1087         if (BTM_ReadPowerMode(p_lcb->remote_bd_addr, &mode) == BTM_SUCCESS)
   1088         {
   1089             if ( mode == BTM_PM_STS_PENDING )
   1090             {
   1091                 L2CAP_TRACE_DEBUG ("LCB(0x%x) is in PM pending state", p_lcb->handle);
   1092 
   1093                 return TRUE;
   1094             }
   1095         }
   1096     }
   1097     return FALSE;
   1098 }
   1099 #endif /* ((BTM_PWR_MGR_INCLUDED == TRUE) && L2CAP_WAKE_PARKED_LINK == TRUE) */
   1100 
   1101 /*******************************************************************************
   1102 **
   1103 ** Function         l2c_link_check_send_pkts
   1104 **
   1105 ** Description      This function is called to check if it can send packets
   1106 **                  to the Host Controller. It may be passed the address of
   1107 **                  a packet to send.
   1108 **
   1109 ** Returns          void
   1110 **
   1111 *******************************************************************************/
   1112 void l2c_link_check_send_pkts (tL2C_LCB *p_lcb, tL2C_CCB *p_ccb, BT_HDR *p_buf)
   1113 {
   1114     int         xx;
   1115     BOOLEAN     single_write = FALSE;
   1116 
   1117     /* Save the channel ID for faster counting */
   1118     if (p_buf)
   1119     {
   1120         if (p_ccb != NULL)
   1121         {
   1122             p_buf->event = p_ccb->local_cid;
   1123             single_write = TRUE;
   1124         }
   1125         else
   1126             p_buf->event = 0;
   1127 
   1128         p_buf->layer_specific = 0;
   1129         GKI_enqueue (&p_lcb->link_xmit_data_q, p_buf);
   1130 
   1131         if (p_lcb->link_xmit_quota == 0)
   1132         {
   1133 #if BLE_INCLUDED == TRUE
   1134             if (p_lcb->transport == BT_TRANSPORT_LE)
   1135                 l2cb.ble_check_round_robin = TRUE;
   1136             else
   1137 #endif
   1138                 l2cb.check_round_robin = TRUE;
   1139         }
   1140     }
   1141 
   1142     /* If this is called from uncongested callback context break recursive calling.
   1143     ** This LCB will be served when receiving number of completed packet event.
   1144     */
   1145     if (l2cb.is_cong_cback_context)
   1146         return;
   1147 
   1148     /* If we are in a scenario where there are not enough buffers for each link to
   1149     ** have at least 1, then do a round-robin for all the LCBs
   1150     */
   1151     if ( (p_lcb == NULL) || (p_lcb->link_xmit_quota == 0) )
   1152     {
   1153         if (p_lcb == NULL)
   1154             p_lcb = l2cb.lcb_pool;
   1155         else if (!single_write)
   1156             p_lcb++;
   1157 
   1158         /* Loop through, starting at the next */
   1159         for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
   1160         {
   1161             /* If controller window is full, nothing to do */
   1162             if ( (l2cb.controller_xmit_window == 0
   1163 #if (BLE_INCLUDED == TRUE)
   1164                   && (p_lcb->transport == BT_TRANSPORT_BR_EDR)
   1165 #endif
   1166                 )
   1167 #if (BLE_INCLUDED == TRUE)
   1168                 || (p_lcb->transport == BT_TRANSPORT_LE && l2cb.controller_le_xmit_window == 0 )
   1169 #endif
   1170               || (l2cb.round_robin_unacked >= l2cb.round_robin_quota) )
   1171                 break;
   1172 
   1173             /* Check for wraparound */
   1174             if (p_lcb == &l2cb.lcb_pool[MAX_L2CAP_LINKS])
   1175                 p_lcb = &l2cb.lcb_pool[0];
   1176 
   1177             if ( (!p_lcb->in_use)
   1178                || (p_lcb->partial_segment_being_sent)
   1179                || (p_lcb->link_state != LST_CONNECTED)
   1180                || (p_lcb->link_xmit_quota != 0)
   1181                || (L2C_LINK_CHECK_POWER_MODE (p_lcb)) )
   1182                 continue;
   1183 
   1184             /* See if we can send anything from the Link Queue */
   1185             if ((p_buf = (BT_HDR *)GKI_dequeue (&p_lcb->link_xmit_data_q)) != NULL)
   1186             {
   1187                 l2c_link_send_to_lower (p_lcb, p_buf);
   1188             }
   1189             else if (single_write)
   1190             {
   1191                 /* If only doing one write, break out */
   1192                 break;
   1193             }
   1194             /* If nothing on the link queue, check the channel queue */
   1195             else if ((p_buf = l2cu_get_next_buffer_to_send (p_lcb)) != NULL)
   1196             {
   1197                 l2c_link_send_to_lower (p_lcb, p_buf);
   1198             }
   1199         }
   1200 
   1201         /* If we finished without using up our quota, no need for a safety check */
   1202         if ( (l2cb.controller_xmit_window > 0)
   1203           && (l2cb.round_robin_unacked < l2cb.round_robin_quota)
   1204 #if (BLE_INCLUDED == TRUE)
   1205           && (p_lcb->transport == BT_TRANSPORT_BR_EDR)
   1206 #endif
   1207           )
   1208             l2cb.check_round_robin = FALSE;
   1209 
   1210 #if (BLE_INCLUDED == TRUE)
   1211         if ( (l2cb.controller_le_xmit_window > 0)
   1212           && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota)
   1213           && (p_lcb->transport == BT_TRANSPORT_LE))
   1214             l2cb.ble_check_round_robin = FALSE;
   1215 #endif
   1216     }
   1217     else /* if this is not round-robin service */
   1218     {
   1219         /* If a partial segment is being sent, can't send anything else */
   1220         if ( (p_lcb->partial_segment_being_sent)
   1221           || (p_lcb->link_state != LST_CONNECTED)
   1222           || (L2C_LINK_CHECK_POWER_MODE (p_lcb)) )
   1223             return;
   1224 
   1225         /* See if we can send anything from the link queue */
   1226 #if (BLE_INCLUDED == TRUE)
   1227         while ( ((l2cb.controller_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
   1228                  (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE)))
   1229              && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
   1230 #else
   1231         while ( (l2cb.controller_xmit_window != 0)
   1232              && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
   1233 #endif
   1234         {
   1235             if ((p_buf = (BT_HDR *)GKI_dequeue (&p_lcb->link_xmit_data_q)) == NULL)
   1236                 break;
   1237 
   1238             if (!l2c_link_send_to_lower (p_lcb, p_buf))
   1239                 break;
   1240         }
   1241 
   1242         if (!single_write)
   1243         {
   1244             /* See if we can send anything for any channel */
   1245 #if (BLE_INCLUDED == TRUE)
   1246             while ( ((l2cb.controller_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
   1247                     (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE)))
   1248                     && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
   1249 #else
   1250             while ((l2cb.controller_xmit_window != 0) && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
   1251 #endif
   1252             {
   1253                 if ((p_buf = l2cu_get_next_buffer_to_send (p_lcb)) == NULL)
   1254                     break;
   1255 
   1256                 if (!l2c_link_send_to_lower (p_lcb, p_buf))
   1257                     break;
   1258             }
   1259         }
   1260 
   1261         /* There is a special case where we have readjusted the link quotas and  */
   1262         /* this link may have sent anything but some other link sent packets so  */
   1263         /* so we may need a timer to kick off this link's transmissions.         */
   1264         if ( (p_lcb->link_xmit_data_q.count) && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) )
   1265             btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_FLOW_CONTROL_TOUT);
   1266     }
   1267 
   1268 }
   1269 
   1270 /*******************************************************************************
   1271 **
   1272 ** Function         l2c_link_send_to_lower
   1273 **
   1274 ** Description      This function queues the buffer for HCI transmission
   1275 **
   1276 ** Returns          TRUE for success, FALSE for fail
   1277 **
   1278 *******************************************************************************/
   1279 static BOOLEAN l2c_link_send_to_lower (tL2C_LCB *p_lcb, BT_HDR *p_buf)
   1280 {
   1281     UINT16      num_segs;
   1282     UINT16      xmit_window, acl_data_size;
   1283 
   1284     if ((p_buf->len <= btu_cb.hcit_acl_pkt_size
   1285 #if (BLE_INCLUDED == TRUE)
   1286         && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
   1287         ((p_lcb->transport == BT_TRANSPORT_LE) && (p_buf->len <= btu_cb.hcit_ble_acl_pkt_size))
   1288 #else
   1289         )
   1290 #endif
   1291         )
   1292     {
   1293         if (p_lcb->link_xmit_quota == 0)
   1294         {
   1295 #if (BLE_INCLUDED == TRUE)
   1296             if (p_lcb->transport == BT_TRANSPORT_LE)
   1297                 l2cb.ble_round_robin_unacked++;
   1298             else
   1299 #endif
   1300                 l2cb.round_robin_unacked++;
   1301         }
   1302         p_lcb->sent_not_acked++;
   1303         p_buf->layer_specific = 0;
   1304 
   1305 #if (BLE_INCLUDED == TRUE)
   1306         if (p_lcb->transport == BT_TRANSPORT_LE)
   1307         {
   1308             l2cb.controller_le_xmit_window--;
   1309             L2C_LINK_SEND_BLE_ACL_DATA (p_buf);
   1310         }
   1311         else
   1312 #endif
   1313         {
   1314             l2cb.controller_xmit_window--;
   1315             L2C_LINK_SEND_ACL_DATA (p_buf);
   1316         }
   1317     }
   1318     else
   1319     {
   1320 #if BLE_INCLUDED == TRUE
   1321         if (p_lcb->transport == BT_TRANSPORT_LE)
   1322         {
   1323             acl_data_size = btu_cb.hcit_ble_acl_data_size;
   1324             xmit_window = l2cb.controller_le_xmit_window;
   1325 
   1326         }
   1327         else
   1328 #endif
   1329         {
   1330             acl_data_size = btu_cb.hcit_acl_data_size;
   1331             xmit_window = l2cb.controller_xmit_window;
   1332         }
   1333         num_segs = (p_buf->len - HCI_DATA_PREAMBLE_SIZE + acl_data_size - 1) / acl_data_size;
   1334 
   1335 
   1336         /* If doing round-robin, then only 1 segment each time */
   1337         if (p_lcb->link_xmit_quota == 0)
   1338         {
   1339             num_segs = 1;
   1340             p_lcb->partial_segment_being_sent = TRUE;
   1341         }
   1342         else
   1343         {
   1344             /* Multi-segment packet. Make sure it can fit */
   1345             if (num_segs > xmit_window)
   1346             {
   1347                 num_segs = xmit_window;
   1348                 p_lcb->partial_segment_being_sent = TRUE;
   1349             }
   1350 
   1351             if (num_segs > (p_lcb->link_xmit_quota - p_lcb->sent_not_acked))
   1352             {
   1353                 num_segs = (p_lcb->link_xmit_quota - p_lcb->sent_not_acked);
   1354                 p_lcb->partial_segment_being_sent = TRUE;
   1355             }
   1356         }
   1357 
   1358         p_buf->layer_specific        = num_segs;
   1359 #if BLE_INCLUDED == TRUE
   1360         if (p_lcb->transport == BT_TRANSPORT_LE)
   1361         {
   1362             l2cb.controller_le_xmit_window -= num_segs;
   1363             if (p_lcb->link_xmit_quota == 0)
   1364                 l2cb.ble_round_robin_unacked += num_segs;
   1365         }
   1366         else
   1367 #endif
   1368         {
   1369             l2cb.controller_xmit_window -= num_segs;
   1370 
   1371             if (p_lcb->link_xmit_quota == 0)
   1372                 l2cb.round_robin_unacked += num_segs;
   1373         }
   1374 
   1375         p_lcb->sent_not_acked += num_segs;
   1376 #if BLE_INCLUDED == TRUE
   1377         if (p_lcb->transport == BT_TRANSPORT_LE)
   1378         {
   1379             L2C_LINK_SEND_BLE_ACL_DATA(p_buf);
   1380         }
   1381         else
   1382 #endif
   1383         {
   1384             L2C_LINK_SEND_ACL_DATA (p_buf);
   1385         }
   1386     }
   1387 
   1388 #if (L2CAP_HCI_FLOW_CONTROL_DEBUG == TRUE)
   1389 #if (BLE_INCLUDED == TRUE)
   1390     if (p_lcb->transport == BT_TRANSPORT_LE)
   1391     {
   1392         L2CAP_TRACE_DEBUG ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
   1393                 l2cb.controller_le_xmit_window,
   1394                 p_lcb->handle,
   1395                 p_lcb->link_xmit_quota, p_lcb->sent_not_acked,
   1396                 l2cb.ble_round_robin_quota, l2cb.ble_round_robin_unacked);
   1397     }
   1398     else
   1399 #endif
   1400     {
   1401         L2CAP_TRACE_DEBUG ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
   1402                 l2cb.controller_xmit_window,
   1403                 p_lcb->handle,
   1404                 p_lcb->link_xmit_quota, p_lcb->sent_not_acked,
   1405                 l2cb.round_robin_quota, l2cb.round_robin_unacked);
   1406     }
   1407 #endif
   1408 
   1409     return TRUE;
   1410 }
   1411 
   1412 /*******************************************************************************
   1413 **
   1414 ** Function         l2c_link_process_num_completed_pkts
   1415 **
   1416 ** Description      This function is called when a "number-of-completed-packets"
   1417 **                  event is received from the controller. It updates all the
   1418 **                  LCB transmit counts.
   1419 **
   1420 ** Returns          void
   1421 **
   1422 *******************************************************************************/
   1423 void l2c_link_process_num_completed_pkts (UINT8 *p)
   1424 {
   1425     UINT8       num_handles, xx;
   1426     UINT16      handle;
   1427     UINT16      num_sent;
   1428     tL2C_LCB    *p_lcb;
   1429 
   1430     STREAM_TO_UINT8 (num_handles, p);
   1431 
   1432     for (xx = 0; xx < num_handles; xx++)
   1433     {
   1434         STREAM_TO_UINT16 (handle, p);
   1435         STREAM_TO_UINT16 (num_sent, p);
   1436 
   1437         p_lcb = l2cu_find_lcb_by_handle (handle);
   1438 
   1439         /* Callback for number of completed packet event    */
   1440         /* Originally designed for [3DSG]                   */
   1441         if((p_lcb != NULL) && (p_lcb->p_nocp_cb))
   1442         {
   1443             L2CAP_TRACE_DEBUG ("L2CAP - calling NoCP callback");
   1444             (*p_lcb->p_nocp_cb)(p_lcb->remote_bd_addr);
   1445         }
   1446 
   1447         if (p_lcb)
   1448         {
   1449 #if (BLE_INCLUDED == TRUE)
   1450         if (p_lcb && (p_lcb->transport == BT_TRANSPORT_LE))
   1451             l2cb.controller_le_xmit_window += num_sent;
   1452         else
   1453 #endif
   1454             {
   1455                 /* Maintain the total window to the controller */
   1456                 l2cb.controller_xmit_window += num_sent;
   1457             }
   1458             /* If doing round-robin, adjust communal counts */
   1459             if (p_lcb->link_xmit_quota == 0)
   1460             {
   1461 #if BLE_INCLUDED == TRUE
   1462                 if (p_lcb->transport == BT_TRANSPORT_LE)
   1463                 {
   1464                    /* Don't go negative */
   1465                     if (l2cb.ble_round_robin_unacked > num_sent)
   1466                         l2cb.ble_round_robin_unacked -= num_sent;
   1467                     else
   1468                         l2cb.ble_round_robin_unacked = 0;
   1469                 }
   1470                 else
   1471 #endif
   1472                 {
   1473                     /* Don't go negative */
   1474                     if (l2cb.round_robin_unacked > num_sent)
   1475                         l2cb.round_robin_unacked -= num_sent;
   1476                     else
   1477                         l2cb.round_robin_unacked = 0;
   1478                 }
   1479             }
   1480 
   1481             /* Don't go negative */
   1482             if (p_lcb->sent_not_acked > num_sent)
   1483                 p_lcb->sent_not_acked -= num_sent;
   1484             else
   1485                 p_lcb->sent_not_acked = 0;
   1486 
   1487             l2c_link_check_send_pkts (p_lcb, NULL, NULL);
   1488 
   1489             /* If we were doing round-robin for low priority links, check 'em */
   1490             if ( (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
   1491               && (l2cb.check_round_robin)
   1492               && (l2cb.round_robin_unacked < l2cb.round_robin_quota) )
   1493             {
   1494               l2c_link_check_send_pkts (NULL, NULL, NULL);
   1495             }
   1496 #if BLE_INCLUDED == TRUE
   1497             if ((p_lcb->transport == BT_TRANSPORT_LE)
   1498                 && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
   1499                 && ((l2cb.ble_check_round_robin)
   1500                 && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota)))
   1501             {
   1502               l2c_link_check_send_pkts (NULL, NULL, NULL);
   1503             }
   1504 #endif
   1505         }
   1506 
   1507 #if (L2CAP_HCI_FLOW_CONTROL_DEBUG == TRUE)
   1508         if (p_lcb)
   1509         {
   1510 #if (BLE_INCLUDED == TRUE)
   1511             if (p_lcb->transport == BT_TRANSPORT_LE)
   1512             {
   1513                 L2CAP_TRACE_DEBUG ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
   1514                     l2cb.controller_le_xmit_window,
   1515                     p_lcb->handle, p_lcb->sent_not_acked,
   1516                     l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked);
   1517             }
   1518             else
   1519 #endif
   1520             {
   1521                 L2CAP_TRACE_DEBUG ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
   1522                     l2cb.controller_xmit_window,
   1523                     p_lcb->handle, p_lcb->sent_not_acked,
   1524                     l2cb.check_round_robin, l2cb.round_robin_unacked);
   1525 
   1526             }
   1527         }
   1528         else
   1529         {
   1530 #if (BLE_INCLUDED == TRUE)
   1531             L2CAP_TRACE_DEBUG ("TotalWin=%d  LE_Win: %d, Handle=0x%x, RRCheck=%d, RRUnack=%d",
   1532                 l2cb.controller_xmit_window,
   1533                 l2cb.controller_le_xmit_window,
   1534                 handle,
   1535                 l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked);
   1536 #else
   1537             L2CAP_TRACE_DEBUG ("TotalWin=%d  Handle=0x%x  RRCheck=%d  RRUnack=%d",
   1538                 l2cb.controller_xmit_window,
   1539                 handle,
   1540                 l2cb.check_round_robin, l2cb.round_robin_unacked);
   1541 #endif
   1542         }
   1543 #endif
   1544     }
   1545 
   1546 #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
   1547     /* only full stack can enable sleep mode */
   1548     btu_check_bt_sleep ();
   1549 #endif
   1550 }
   1551 
   1552 /*******************************************************************************
   1553 **
   1554 ** Function         l2cap_link_chk_pkt_start
   1555 **
   1556 ** Description      This function is called from the HCI transport when the first
   1557 **                  4 bytes of an HCI ACL packet have been received. It checks if the
   1558 **                  packet is the next segment of a fragmented L2CAP message. If it
   1559 **                  is, and the length is OK, it returns the address of the
   1560 **                  starting L2CAP message segment buffer.
   1561 **
   1562 ** Returns          the address of the receive buffer HCIT should use
   1563 **                  (CR419: Modified to return NULL in case of error.)
   1564 **
   1565 ** NOTE             This assumes that the L2CAP MTU size is less than the size
   1566 **                  of an HCI ACL buffer, so the maximum L2CAP message will fit
   1567 **                  into one buffer.
   1568 **
   1569 *******************************************************************************/
   1570 BT_HDR *l2cap_link_chk_pkt_start (BT_HDR *p_cur_buf)
   1571 {
   1572     UINT8       *p;
   1573     UINT16      handle;
   1574     UINT16      hci_len;
   1575     UINT16      pkt_type;
   1576     tL2C_LCB    *p_lcb;
   1577     BT_HDR *	p_return_buf;       /* CR419: To avoid returning from too many places */
   1578 
   1579 
   1580     if (p_cur_buf)
   1581     {
   1582         p = (UINT8 *)(p_cur_buf + 1) + p_cur_buf->offset;
   1583     }
   1584     else
   1585     {
   1586         return (NULL);
   1587     }
   1588 
   1589     /* L2CAP expects all rcvd packets to have a layer-specific value of 0 */
   1590     p_cur_buf->layer_specific = 0;
   1591 
   1592     STREAM_TO_UINT16 (handle, p);
   1593     STREAM_TO_UINT16 (hci_len, p);
   1594 
   1595     pkt_type = HCID_GET_EVENT (handle);
   1596     handle   = HCID_GET_HANDLE (handle);
   1597 
   1598     l2cb.p_cur_hcit_lcb = NULL;
   1599 
   1600     /* Find the link that is associated with this handle */
   1601     p_lcb = l2cu_find_lcb_by_handle (handle);
   1602 
   1603     /* If no link for this handle, nothing to do. */
   1604     if (!p_lcb)
   1605         return (p_cur_buf) ;
   1606 
   1607     if (pkt_type == L2CAP_PKT_START)            /*** START PACKET ***/
   1608     {
   1609         /* Start of packet. If we were in the middle of receiving */
   1610         /* a packet, it is incomplete. Drop it.                   */
   1611         if (p_lcb->p_hcit_rcv_acl)
   1612         {
   1613             L2CAP_TRACE_WARNING ("L2CAP - dropping incomplete pkt");
   1614             GKI_freebuf (p_lcb->p_hcit_rcv_acl);
   1615             p_lcb->p_hcit_rcv_acl = NULL;
   1616         }
   1617 
   1618         /* Save the active buffer address in the LCB  */
   1619         if ((p_return_buf = p_cur_buf) != NULL)
   1620         {
   1621             p_lcb->p_hcit_rcv_acl = p_return_buf;
   1622             l2cb.p_cur_hcit_lcb   = p_lcb;
   1623         }
   1624     }
   1625     else                                        /*** CONTINUATION PACKET ***/
   1626     {
   1627         /* Packet continuation. Check if we were expecting it */
   1628         if (p_lcb->p_hcit_rcv_acl)
   1629         {
   1630             UINT16  total_len;
   1631             BT_HDR  *p_base_buf = p_lcb->p_hcit_rcv_acl;
   1632             UINT8   *p_f        = (UINT8 *)(p_base_buf + 1) + p_base_buf->offset + 2;
   1633 
   1634             STREAM_TO_UINT16 (total_len, p_f);
   1635 
   1636             /* We were expecting the CONTINUATION packet. If length fits, it can go in the  */
   1637             /* current buffer.                                                              */
   1638             if ((total_len + hci_len) <= (L2CAP_MTU_SIZE + HCI_DATA_PREAMBLE_SIZE))
   1639             {
   1640                 /* GKI_freebuf (p_cur_buf); CR419:Do not free it yet */
   1641                 p_return_buf        = p_lcb->p_hcit_rcv_acl;	/* CR419: return base buffer */
   1642                 l2cb.p_cur_hcit_lcb = p_lcb;
   1643 
   1644                 if ((p_cur_buf->len > HCI_DATA_PREAMBLE_SIZE))
   1645                 {
   1646                     UINT8 *	p		= (UINT8 *)(p_cur_buf + 1)
   1647                                                 + p_cur_buf->offset
   1648                                                 + HCI_DATA_PREAMBLE_SIZE;
   1649                     UINT8 *	p1		= (UINT8 *)(p_return_buf + 1)
   1650                                                 + p_return_buf->offset
   1651                                                 + p_return_buf->len;
   1652 
   1653                     /* Copy data from new buffer into base buffer then update the data  */
   1654                     /* count in the base buffer accordingly.                            */
   1655                     memcpy (p1, p, p_cur_buf->len - HCI_DATA_PREAMBLE_SIZE);
   1656                     p_return_buf->len   += (p_cur_buf->len - HCI_DATA_PREAMBLE_SIZE);
   1657                 }
   1658 
   1659                 GKI_freebuf (p_cur_buf);
   1660                 p_cur_buf = NULL;
   1661 
   1662                 /* Update HCI header of first segment (base buffer) with new length */
   1663                 total_len += hci_len;
   1664                 p_f        = (UINT8 *)(p_base_buf + 1) + p_base_buf->offset + 2;
   1665                 UINT16_TO_STREAM (p_f, total_len);
   1666             }
   1667             else
   1668             {
   1669                 /* Packet too long. Drop the base packet */
   1670                 L2CAP_TRACE_WARNING ("L2CAP - dropping too long pkt BufLen: %d  total_len: %d  hci_len: %d",
   1671                                       p_lcb->p_hcit_rcv_acl->len, total_len, hci_len);
   1672 
   1673                 GKI_freebuf (p_lcb->p_hcit_rcv_acl);
   1674                 p_lcb->p_hcit_rcv_acl = NULL;
   1675                 p_return_buf          = NULL ; /* Can't hold onto it any more */
   1676             }
   1677         }
   1678         else                                    /*** NEITHER START OR CONTINUATION PACKET ***/
   1679         {
   1680             p_return_buf = NULL ;
   1681         }
   1682     }
   1683 
   1684     if (p_return_buf == NULL)                   /* if error is indicated..  */
   1685     {
   1686         if (p_cur_buf != NULL)                  /* ..drop input buffer      */
   1687             GKI_freebuf(p_cur_buf);             /*     (if present)         */
   1688     }
   1689 
   1690     return (p_return_buf);
   1691 }
   1692 
   1693 /*******************************************************************************
   1694 **
   1695 ** Function         l2cap_link_chk_pkt_end
   1696 **
   1697 ** Description      This function is called from the HCI transport when the last
   1698 **                  byte of an HCI ACL packet has been received. It checks if the
   1699 **                  L2CAP message is complete, i.e. no more continuation packets
   1700 **                  are expected.
   1701 **
   1702 ** Returns          TRUE if message complete, FALSE if continuation expected
   1703 **
   1704 *******************************************************************************/
   1705 BOOLEAN l2cap_link_chk_pkt_end (void)
   1706 {
   1707     UINT8       *p;
   1708     BT_HDR      *p_buf;
   1709     UINT16      l2cap_len;
   1710     tL2C_LCB    *p_lcb;
   1711 
   1712     /* If link or buffer pointer not set up, let main line handle it */
   1713     if (((p_lcb = l2cb.p_cur_hcit_lcb) == NULL) || ((p_buf = p_lcb->p_hcit_rcv_acl) == NULL))
   1714         return (TRUE);
   1715 
   1716     /* Point to the L2CAP length */
   1717     p = (UINT8 *)(p_buf + 1) + p_buf->offset + HCI_DATA_PREAMBLE_SIZE;
   1718 
   1719     STREAM_TO_UINT16 (l2cap_len, p);
   1720 
   1721     /* If the L2CAP length has not been reached, tell HCIT not to send this buffer to BTU */
   1722     if (l2cap_len > (p_buf->len - (HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD)))
   1723     {
   1724         return (FALSE);
   1725     }
   1726     else
   1727     {
   1728         p_lcb->p_hcit_rcv_acl = NULL;
   1729         return (TRUE);
   1730     }
   1731 }
   1732 
   1733 
   1734 /*******************************************************************************
   1735 **
   1736 ** Function         l2c_link_segments_xmitted
   1737 **
   1738 ** Description      This function is called from the HCI Interface when an ACL
   1739 **                  data packet segment is transmitted.
   1740 **
   1741 ** Returns          void
   1742 **
   1743 *******************************************************************************/
   1744 void l2c_link_segments_xmitted (BT_HDR *p_msg)
   1745 {
   1746     UINT8       *p = (UINT8 *)(p_msg + 1) + p_msg->offset;
   1747     UINT16      handle;
   1748     tL2C_LCB    *p_lcb;
   1749 
   1750     /* Extract the handle */
   1751     STREAM_TO_UINT16 (handle, p);
   1752     handle   = HCID_GET_HANDLE (handle);
   1753 
   1754     /* Find the LCB based on the handle */
   1755     if ((p_lcb = l2cu_find_lcb_by_handle (handle)) == NULL)
   1756     {
   1757         L2CAP_TRACE_WARNING ("L2CAP - rcvd segment complete, unknown handle: %d", handle);
   1758         GKI_freebuf (p_msg);
   1759         return;
   1760     }
   1761 
   1762     if (p_lcb->link_state == LST_CONNECTED)
   1763     {
   1764         /* Enqueue the buffer to the head of the transmit queue, and see */
   1765         /* if we can transmit anything more.                             */
   1766         GKI_enqueue_head (&p_lcb->link_xmit_data_q, p_msg);
   1767 
   1768         p_lcb->partial_segment_being_sent = FALSE;
   1769 
   1770         l2c_link_check_send_pkts (p_lcb, NULL, NULL);
   1771     }
   1772     else
   1773         GKI_freebuf (p_msg);
   1774 }
   1775