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 L2CAP utility functions
     22  *
     23  ******************************************************************************/
     24 
     25 #include <stdlib.h>
     26 #include <string.h>
     27 #include <stdio.h>
     28 
     29 #include "gki.h"
     30 #include "bt_types.h"
     31 #include "hcimsgs.h"
     32 #include "l2cdefs.h"
     33 #include "l2c_int.h"
     34 #include "hcidefs.h"
     35 #include "btu.h"
     36 #include "btm_api.h"
     37 #include "btm_int.h"
     38 #include "hcidefs.h"
     39 
     40 /*******************************************************************************
     41 **
     42 ** Function         l2cu_allocate_lcb
     43 **
     44 ** Description      Look for an unused LCB
     45 **
     46 ** Returns          LCB address or NULL if none found
     47 **
     48 *******************************************************************************/
     49 tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding)
     50 {
     51     int         xx;
     52     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
     53 
     54     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
     55     {
     56         if (!p_lcb->in_use)
     57         {
     58             memset (p_lcb, 0, sizeof (tL2C_LCB));
     59 
     60             memcpy (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN);
     61 
     62             p_lcb->in_use          = TRUE;
     63             p_lcb->link_state      = LST_DISCONNECTED;
     64             p_lcb->handle          = HCI_INVALID_HANDLE;
     65             p_lcb->link_flush_tout = 0xFFFF;
     66             p_lcb->timer_entry.param = (TIMER_PARAM_TYPE)p_lcb;
     67             p_lcb->info_timer_entry.param = (TIMER_PARAM_TYPE)p_lcb;
     68             p_lcb->idle_timeout    = l2cb.idle_timeout;
     69             p_lcb->id              = 1;                     /* spec does not allow '0' */
     70             p_lcb->is_bonding      = is_bonding;
     71 
     72             l2cb.num_links_active++;
     73 
     74             l2c_link_adjust_allocation();
     75             return (p_lcb);
     76         }
     77     }
     78 
     79     /* If here, no free LCB found */
     80     return (NULL);
     81 }
     82 
     83 /*******************************************************************************
     84 **
     85 ** Function         l2cu_update_lcb_4_bonding
     86 **
     87 ** Description      Mark the lcb for bonding. Used when bonding takes place on
     88 **                  an existing ACL connection.  (Pre-Lisbon devices)
     89 **
     90 ** Returns          Nothing
     91 **
     92 *******************************************************************************/
     93 void l2cu_update_lcb_4_bonding (BD_ADDR p_bd_addr, BOOLEAN is_bonding)
     94 {
     95     tL2C_LCB    *p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr);
     96 
     97     if (p_lcb)
     98     {
     99         L2CAP_TRACE_DEBUG3 ("l2cu_update_lcb_4_bonding  BDA: %08x%04x is_bonding: %d",
    100                           (p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3],
    101                           (p_bd_addr[4]<<8)+p_bd_addr[5], is_bonding);
    102         p_lcb->is_bonding = is_bonding;
    103     }
    104 }
    105 
    106 /*******************************************************************************
    107 **
    108 ** Function         l2cu_release_lcb
    109 **
    110 ** Description      Release an LCB. All timers will be stopped, channels
    111 **                  dropped, buffers returned etc.
    112 **
    113 ** Returns          void
    114 **
    115 *******************************************************************************/
    116 void l2cu_release_lcb (tL2C_LCB *p_lcb)
    117 {
    118     tL2C_CCB    *p_ccb;
    119 
    120     p_lcb->in_use     = FALSE;
    121     p_lcb->is_bonding = FALSE;
    122 
    123     /* Stop timers */
    124     btu_stop_timer (&p_lcb->timer_entry);
    125     btu_stop_timer (&p_lcb->info_timer_entry);
    126 
    127     /* Release any unfinished L2CAP packet on this link */
    128     if (p_lcb->p_hcit_rcv_acl)
    129     {
    130         GKI_freebuf(p_lcb->p_hcit_rcv_acl);
    131         p_lcb->p_hcit_rcv_acl = NULL;
    132     }
    133 
    134 #if BTM_SCO_INCLUDED == TRUE
    135     /* Release all SCO links */
    136     btm_remove_sco_links(p_lcb->remote_bd_addr);
    137 #endif
    138 
    139     if (p_lcb->sent_not_acked > 0)
    140     {
    141 #if (BLE_INCLUDED == TRUE)
    142         if (p_lcb->is_ble_link)
    143         {
    144             l2cb.controller_le_xmit_window += p_lcb->sent_not_acked;
    145             if (l2cb.controller_le_xmit_window > l2cb.num_lm_ble_bufs)
    146             {
    147                 l2cb.controller_le_xmit_window = l2cb.num_lm_ble_bufs;
    148             }
    149         }
    150         else
    151 #endif
    152         {
    153             l2cb.controller_xmit_window += p_lcb->sent_not_acked;
    154             if (l2cb.controller_xmit_window > l2cb.num_lm_acl_bufs)
    155             {
    156                 l2cb.controller_xmit_window = l2cb.num_lm_acl_bufs;
    157             }
    158         }
    159     }
    160 
    161 #if (BLE_INCLUDED == TRUE)
    162     p_lcb->is_ble_link = FALSE;
    163     l2cb.is_ble_connecting = FALSE;
    164 #endif
    165 
    166 #if (L2CAP_NUM_FIXED_CHNLS > 0)
    167     {
    168         int         xx;
    169 
    170         for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
    171         {
    172             if (p_lcb->p_fixed_ccbs[xx])
    173             {
    174                 l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
    175                 p_lcb->p_fixed_ccbs[xx] = NULL;
    176                 (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
    177             }
    178             else if ( (p_lcb->peer_chnl_mask[0] & (1 << (xx + L2CAP_FIRST_FIXED_CHNL)))
    179                    && (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) )
    180                     (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
    181         }
    182     }
    183 #endif
    184 
    185     /* Ensure no CCBs left on this LCB */
    186     for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_lcb->ccb_queue.p_first_ccb)
    187     {
    188         l2cu_release_ccb (p_ccb);
    189     }
    190 
    191     /* Tell BTM Acl management the link was removed */
    192     if ((p_lcb->link_state == LST_CONNECTED) || (p_lcb->link_state == LST_DISCONNECTING))
    193         btm_acl_removed (p_lcb->remote_bd_addr);
    194 
    195     /* Release any held buffers */
    196     while (p_lcb->link_xmit_data_q.p_first)
    197         GKI_freebuf (GKI_dequeue (&p_lcb->link_xmit_data_q));
    198 
    199 #if (L2CAP_UCD_INCLUDED == TRUE)
    200     /* clean up any security pending UCD */
    201     l2c_ucd_delete_sec_pending_q(p_lcb);
    202 #endif
    203 
    204     /* Re-adjust flow control windows make sure it does not go negative */
    205     if (l2cb.num_links_active >= 1)
    206         l2cb.num_links_active--;
    207 
    208     l2c_link_adjust_allocation();
    209 
    210     /* Check for ping outstanding */
    211     if (p_lcb->p_echo_rsp_cb)
    212     {
    213         tL2CA_ECHO_RSP_CB *p_cb = p_lcb->p_echo_rsp_cb;
    214 
    215         /* Zero out the callback in case app immediately calls us again */
    216         p_lcb->p_echo_rsp_cb = NULL;
    217 
    218         (*p_cb) (L2CAP_PING_RESULT_NO_LINK);
    219     }
    220 }
    221 
    222 
    223 /*******************************************************************************
    224 **
    225 ** Function         l2cu_find_lcb_by_bd_addr
    226 **
    227 ** Description      Look through all active LCBs for a match based on the
    228 **                  remote BD address.
    229 **
    230 ** Returns          pointer to matched LCB, or NULL if no match
    231 **
    232 *******************************************************************************/
    233 tL2C_LCB  *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr)
    234 {
    235     int         xx;
    236     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
    237 
    238     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
    239     {
    240         if ((p_lcb->in_use) && (!memcmp (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN)))
    241         {
    242             return (p_lcb);
    243         }
    244     }
    245 
    246     /* If here, no match found */
    247     return (NULL);
    248 }
    249 
    250 /*******************************************************************************
    251 **
    252 ** Function         l2cu_get_conn_role
    253 **
    254 ** Description      Determine the desired role (master or slave) of a link.
    255 **                  If it is the previous connected remote device, use the same
    256 **                  role as previous used role.
    257 **                  If already got a slave link, this one must be a master. If
    258 **                  already got at least 1 link where we are the master, make this
    259 **                  also a master.
    260 **
    261 ** Returns          HCI_ROLE_MASTER or HCI_ROLE_SLAVE
    262 **
    263 *******************************************************************************/
    264 UINT8 l2cu_get_conn_role (BD_ADDR bd_addr)
    265 {
    266     UINT8 i;
    267     for (i = 0; i < BTM_ROLE_DEVICE_NUM; i++) {
    268         if ((btm_cb.previous_connected_role[i] != BTM_ROLE_UNDEFINED) &&
    269             (!bdcmp(bd_addr, btm_cb.previous_connected_remote_addr[i]))) {
    270             L2CAP_TRACE_WARNING1 ("l2cu_get_conn_role %d",
    271                                   btm_cb.previous_connected_role[i]);
    272             return btm_cb.previous_connected_role[i];
    273         }
    274     }
    275     return l2cb.desire_role;
    276 }
    277 
    278 /*******************************************************************************
    279 **
    280 ** Function         l2cu_build_header
    281 **
    282 ** Description      Builds the L2CAP command packet header
    283 **
    284 ** Returns          Pointer to allocated packet or NULL if no resources
    285 **
    286 *******************************************************************************/
    287 BT_HDR *l2cu_build_header (tL2C_LCB *p_lcb, UINT16 len, UINT8 cmd, UINT8 id)
    288 {
    289     BT_HDR  *p_buf = (BT_HDR *)GKI_getpoolbuf (L2CAP_CMD_POOL_ID);
    290     UINT8   *p;
    291 
    292     if (!p_buf)
    293     {
    294         L2CAP_TRACE_ERROR0 ("l2cu_build_header - no buffer");
    295         return (NULL);
    296     }
    297 
    298     p_buf->offset = L2CAP_SEND_CMD_OFFSET;
    299     p_buf->len = len + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    300     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET;
    301 
    302     /* Put in HCI header - handle + pkt boundary */
    303 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
    304     UINT16_TO_STREAM (p, p_lcb->handle | l2cb.non_flushable_pbf);
    305 #else
    306     UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
    307 #endif
    308 
    309     UINT16_TO_STREAM (p, len + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD);
    310     UINT16_TO_STREAM (p, len + L2CAP_CMD_OVERHEAD);
    311 
    312 #if (BLE_INCLUDED == TRUE)
    313     if (p_lcb->is_ble_link)
    314     {
    315         UINT16_TO_STREAM (p, L2CAP_BLE_SIGNALLING_CID);
    316     }
    317     else
    318 #endif
    319     {
    320         UINT16_TO_STREAM (p, L2CAP_SIGNALLING_CID);
    321     }
    322 
    323     /* Put in L2CAP command header */
    324     UINT8_TO_STREAM  (p, cmd);
    325     UINT8_TO_STREAM  (p, id);
    326     UINT16_TO_STREAM (p, len);
    327 
    328     return (p_buf);
    329 }
    330 
    331 /*******************************************************************************
    332 **
    333 ** Function         l2cu_adj_id
    334 **
    335 ** Description      Checks for valid ID based on specified mask
    336 **                  and adjusts the id if invalid.
    337 **
    338 ** Returns          void
    339 **
    340 *******************************************************************************/
    341 void l2cu_adj_id (tL2C_LCB *p_lcb, UINT8 adj_mask)
    342 {
    343     if ((adj_mask & L2CAP_ADJ_ZERO_ID) && !p_lcb->id)
    344     {
    345         p_lcb->id++;
    346     }
    347 }
    348 
    349 /*******************************************************************************
    350 **
    351 ** Function         l2cu_send_peer_cmd_reject
    352 **
    353 ** Description      Build and send an L2CAP "command reject" message
    354 **                  to the peer.
    355 **
    356 ** Returns          void
    357 **
    358 *******************************************************************************/
    359 void l2cu_send_peer_cmd_reject (tL2C_LCB *p_lcb, UINT16 reason, UINT8 rem_id,
    360                                 UINT16 p1, UINT16 p2)
    361 {
    362     UINT16  param_len;
    363     BT_HDR  *p_buf;
    364     UINT8   *p;
    365 
    366     /* Put in L2CAP packet header */
    367     if (reason == L2CAP_CMD_REJ_MTU_EXCEEDED)
    368         param_len = 2;
    369     else if (reason == L2CAP_CMD_REJ_INVALID_CID)
    370         param_len = 4;
    371     else
    372         param_len = 0;
    373 
    374     if ((p_buf = l2cu_build_header (p_lcb, (UINT16) (L2CAP_CMD_REJECT_LEN + param_len), L2CAP_CMD_REJECT, rem_id)) == NULL )
    375     {
    376         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer cmd_rej");
    377         return;
    378     }
    379 
    380     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE +
    381                                L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    382 
    383     UINT16_TO_STREAM (p, reason);
    384 
    385     if (param_len >= 2)
    386         UINT16_TO_STREAM (p, p1);
    387 
    388     if (param_len >= 4)
    389         UINT16_TO_STREAM (p, p2);
    390 
    391     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
    392 }
    393 
    394 
    395 /*******************************************************************************
    396 **
    397 ** Function         l2cu_send_peer_connect_req
    398 **
    399 ** Description      Build and send an L2CAP "connection request" message
    400 **                  to the peer.
    401 **
    402 ** Returns          void
    403 **
    404 *******************************************************************************/
    405 void l2cu_send_peer_connect_req (tL2C_CCB *p_ccb)
    406 {
    407     BT_HDR  *p_buf;
    408     UINT8   *p;
    409 
    410     /* Create an identifier for this packet */
    411     p_ccb->p_lcb->id++;
    412     l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
    413 
    414     p_ccb->local_id = p_ccb->p_lcb->id;
    415 
    416     if ((p_buf = l2cu_build_header (p_ccb->p_lcb, L2CAP_CONN_REQ_LEN, L2CAP_CMD_CONN_REQ,
    417                                     p_ccb->local_id)) == NULL)
    418     {
    419         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
    420         return;
    421     }
    422 
    423     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE +
    424         L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    425 
    426     UINT16_TO_STREAM (p, p_ccb->p_rcb->real_psm);
    427     UINT16_TO_STREAM (p, p_ccb->local_cid);
    428 
    429     l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
    430 }
    431 
    432 
    433 /*******************************************************************************
    434 **
    435 ** Function         l2cu_send_peer_connect_rsp
    436 **
    437 ** Description      Build and send an L2CAP "connection response" message
    438 **                  to the peer.
    439 **
    440 ** Returns          void
    441 **
    442 *******************************************************************************/
    443 void l2cu_send_peer_connect_rsp (tL2C_CCB *p_ccb, UINT16 result, UINT16 status)
    444 {
    445     BT_HDR  *p_buf;
    446     UINT8   *p;
    447 
    448     if (result == L2CAP_CONN_PENDING)
    449     {
    450         /* if we already sent pending response */
    451         if (p_ccb->flags & CCB_FLAG_SENT_PENDING)
    452             return;
    453         else
    454             p_ccb->flags |= CCB_FLAG_SENT_PENDING;
    455     }
    456 
    457     if ((p_buf=l2cu_build_header(p_ccb->p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, p_ccb->remote_id)) == NULL)
    458     {
    459         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_rsp");
    460         return;
    461     }
    462 
    463     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE +
    464         L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    465 
    466     UINT16_TO_STREAM (p, p_ccb->local_cid);
    467     UINT16_TO_STREAM (p, p_ccb->remote_cid);
    468     UINT16_TO_STREAM (p, result);
    469     UINT16_TO_STREAM (p, status);
    470 
    471     l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
    472 }
    473 
    474 
    475 /*******************************************************************************
    476 **
    477 ** Function         l2cu_reject_connection
    478 **
    479 ** Description      Build and send an L2CAP "connection response neg" message
    480 **                  to the peer. This function is called when there is no peer
    481 **                  CCB (non-existant PSM or no resources).
    482 **
    483 ** Returns          void
    484 **
    485 *******************************************************************************/
    486 void l2cu_reject_connection (tL2C_LCB *p_lcb, UINT16 remote_cid, UINT8 rem_id, UINT16 result)
    487 {
    488     BT_HDR  *p_buf;
    489     UINT8   *p;
    490 
    491     if ((p_buf = l2cu_build_header(p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, rem_id)) == NULL )
    492     {
    493         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
    494         return;
    495     }
    496 
    497     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    498 
    499     UINT16_TO_STREAM (p, 0);                    /* Local CID of 0   */
    500     UINT16_TO_STREAM (p, remote_cid);
    501     UINT16_TO_STREAM (p, result);
    502     UINT16_TO_STREAM (p, 0);                    /* Status of 0      */
    503 
    504     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
    505 }
    506 
    507 /*******************************************************************************
    508 **
    509 ** Function         l2cu_send_peer_config_req
    510 **
    511 ** Description      Build and send an L2CAP "configuration request" message
    512 **                  to the peer.
    513 **
    514 ** Returns          void
    515 **
    516 *******************************************************************************/
    517 void l2cu_send_peer_config_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
    518 {
    519     BT_HDR  *p_buf;
    520     UINT16  cfg_len=0;
    521     UINT8   *p;
    522 
    523     /* Create an identifier for this packet */
    524     p_ccb->p_lcb->id++;
    525     l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
    526 
    527     p_ccb->local_id = p_ccb->p_lcb->id;
    528 
    529     if (p_cfg->mtu_present)
    530         cfg_len += L2CAP_CFG_MTU_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    531     if (p_cfg->flush_to_present)
    532         cfg_len += L2CAP_CFG_FLUSH_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    533     if (p_cfg->qos_present)
    534         cfg_len += L2CAP_CFG_QOS_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    535     if (p_cfg->fcr_present)
    536         cfg_len += L2CAP_CFG_FCR_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    537     if (p_cfg->fcs_present)
    538         cfg_len += L2CAP_CFG_FCS_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    539     if (p_cfg->ext_flow_spec_present)
    540         cfg_len += L2CAP_CFG_EXT_FLOW_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    541 
    542     if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16) (L2CAP_CONFIG_REQ_LEN + cfg_len),
    543         L2CAP_CMD_CONFIG_REQ, p_ccb->local_id)) == NULL )
    544     {
    545         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
    546         return;
    547     }
    548 
    549     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE +
    550                                L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    551 
    552     UINT16_TO_STREAM (p, p_ccb->remote_cid);
    553     UINT16_TO_STREAM (p, p_cfg->flags);                    /* Flags (continuation) */
    554 
    555     /* Now, put the options */
    556     if (p_cfg->mtu_present)
    557     {
    558         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_MTU);
    559         UINT8_TO_STREAM  (p, L2CAP_CFG_MTU_OPTION_LEN);
    560         UINT16_TO_STREAM (p, p_cfg->mtu);
    561     }
    562     if (p_cfg->flush_to_present)
    563     {
    564         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_FLUSH_TOUT);
    565         UINT8_TO_STREAM  (p, L2CAP_CFG_FLUSH_OPTION_LEN);
    566         UINT16_TO_STREAM (p, p_cfg->flush_to);
    567     }
    568     if (p_cfg->qos_present)
    569     {
    570         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_QOS);
    571         UINT8_TO_STREAM  (p, L2CAP_CFG_QOS_OPTION_LEN);
    572         UINT8_TO_STREAM  (p, p_cfg->qos.qos_flags);
    573         UINT8_TO_STREAM  (p, p_cfg->qos.service_type);
    574         UINT32_TO_STREAM (p, p_cfg->qos.token_rate);
    575         UINT32_TO_STREAM (p, p_cfg->qos.token_bucket_size);
    576         UINT32_TO_STREAM (p, p_cfg->qos.peak_bandwidth);
    577         UINT32_TO_STREAM (p, p_cfg->qos.latency);
    578         UINT32_TO_STREAM (p, p_cfg->qos.delay_variation);
    579     }
    580     if (p_cfg->fcr_present)
    581     {
    582         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_FCR);
    583         UINT8_TO_STREAM  (p, L2CAP_CFG_FCR_OPTION_LEN);
    584         UINT8_TO_STREAM  (p, p_cfg->fcr.mode);
    585         UINT8_TO_STREAM  (p, p_cfg->fcr.tx_win_sz);
    586         UINT8_TO_STREAM  (p, p_cfg->fcr.max_transmit);
    587         UINT16_TO_STREAM (p, p_cfg->fcr.rtrans_tout);
    588         UINT16_TO_STREAM (p, p_cfg->fcr.mon_tout);
    589         UINT16_TO_STREAM (p, p_cfg->fcr.mps);
    590     }
    591 
    592     if (p_cfg->fcs_present)
    593     {
    594         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_FCS);
    595         UINT8_TO_STREAM  (p, L2CAP_CFG_FCS_OPTION_LEN);
    596         UINT8_TO_STREAM  (p, p_cfg->fcs);
    597     }
    598 
    599     if (p_cfg->ext_flow_spec_present)
    600     {
    601         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_EXT_FLOW);
    602         UINT8_TO_STREAM  (p, L2CAP_CFG_EXT_FLOW_OPTION_LEN);
    603         UINT8_TO_STREAM  (p, p_cfg->ext_flow_spec.id);
    604         UINT8_TO_STREAM  (p, p_cfg->ext_flow_spec.stype);
    605         UINT16_TO_STREAM (p, p_cfg->ext_flow_spec.max_sdu_size);
    606         UINT32_TO_STREAM (p, p_cfg->ext_flow_spec.sdu_inter_time);
    607         UINT32_TO_STREAM (p, p_cfg->ext_flow_spec.access_latency);
    608         UINT32_TO_STREAM (p, p_cfg->ext_flow_spec.flush_timeout);
    609     }
    610 
    611     l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
    612 }
    613 
    614 /*******************************************************************************
    615 **
    616 ** Function         l2cu_send_peer_config_rsp
    617 **
    618 ** Description      Build and send an L2CAP "configuration response" message
    619 **                  to the peer.
    620 **
    621 ** Returns          void
    622 **
    623 *******************************************************************************/
    624 void l2cu_send_peer_config_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
    625 {
    626     BT_HDR  *p_buf;
    627     UINT16  cfg_len = 0;
    628     UINT8   *p;
    629 
    630     /* Create an identifier for this packet */
    631     if (p_cfg->mtu_present)
    632         cfg_len += L2CAP_CFG_MTU_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    633     if (p_cfg->flush_to_present)
    634         cfg_len += L2CAP_CFG_FLUSH_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    635     if (p_cfg->qos_present)
    636         cfg_len += L2CAP_CFG_QOS_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    637     if (p_cfg->fcr_present)
    638         cfg_len += L2CAP_CFG_FCR_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    639     if (p_cfg->ext_flow_spec_present)
    640         cfg_len += L2CAP_CFG_EXT_FLOW_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD;
    641 
    642     if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16)(L2CAP_CONFIG_RSP_LEN + cfg_len),
    643                                     L2CAP_CMD_CONFIG_RSP, p_ccb->remote_id)) == NULL )
    644     {
    645         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
    646         return;
    647     }
    648 
    649     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    650 
    651     UINT16_TO_STREAM (p, p_ccb->remote_cid);
    652     UINT16_TO_STREAM (p, p_cfg->flags);           /* Flags (continuation) Must match request */
    653     UINT16_TO_STREAM (p, p_cfg->result);
    654 
    655     /* Now, put the options */
    656     if (p_cfg->mtu_present)
    657     {
    658         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_MTU);
    659         UINT8_TO_STREAM  (p, L2CAP_CFG_MTU_OPTION_LEN);
    660         UINT16_TO_STREAM (p, p_cfg->mtu);
    661     }
    662     if (p_cfg->flush_to_present)
    663     {
    664         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_FLUSH_TOUT);
    665         UINT8_TO_STREAM  (p, L2CAP_CFG_FLUSH_OPTION_LEN);
    666         UINT16_TO_STREAM (p, p_cfg->flush_to);
    667     }
    668     if (p_cfg->qos_present)
    669     {
    670         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_QOS);
    671         UINT8_TO_STREAM  (p, L2CAP_CFG_QOS_OPTION_LEN);
    672         UINT8_TO_STREAM  (p, p_cfg->qos.qos_flags);
    673         UINT8_TO_STREAM  (p, p_cfg->qos.service_type);
    674         UINT32_TO_STREAM (p, p_cfg->qos.token_rate);
    675         UINT32_TO_STREAM (p, p_cfg->qos.token_bucket_size);
    676         UINT32_TO_STREAM (p, p_cfg->qos.peak_bandwidth);
    677         UINT32_TO_STREAM (p, p_cfg->qos.latency);
    678         UINT32_TO_STREAM (p, p_cfg->qos.delay_variation);
    679     }
    680     if (p_cfg->fcr_present)
    681     {
    682         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_FCR);
    683         UINT8_TO_STREAM  (p, L2CAP_CFG_FCR_OPTION_LEN);
    684         UINT8_TO_STREAM  (p, p_cfg->fcr.mode);
    685         UINT8_TO_STREAM  (p, p_cfg->fcr.tx_win_sz);
    686         UINT8_TO_STREAM  (p, p_cfg->fcr.max_transmit);
    687         UINT16_TO_STREAM (p, p_ccb->our_cfg.fcr.rtrans_tout);
    688         UINT16_TO_STREAM (p, p_ccb->our_cfg.fcr.mon_tout);
    689         UINT16_TO_STREAM (p, p_cfg->fcr.mps);
    690     }
    691 
    692     if (p_cfg->ext_flow_spec_present)
    693     {
    694         UINT8_TO_STREAM  (p, L2CAP_CFG_TYPE_EXT_FLOW);
    695         UINT8_TO_STREAM  (p, L2CAP_CFG_EXT_FLOW_OPTION_LEN);
    696         UINT8_TO_STREAM  (p, p_cfg->ext_flow_spec.id);
    697         UINT8_TO_STREAM  (p, p_cfg->ext_flow_spec.stype);
    698         UINT16_TO_STREAM (p, p_cfg->ext_flow_spec.max_sdu_size);
    699         UINT32_TO_STREAM (p, p_cfg->ext_flow_spec.sdu_inter_time);
    700         UINT32_TO_STREAM (p, p_cfg->ext_flow_spec.access_latency);
    701         UINT32_TO_STREAM (p, p_cfg->ext_flow_spec.flush_timeout);
    702     }
    703 
    704     l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
    705 }
    706 
    707 /*******************************************************************************
    708 **
    709 ** Function         l2cu_send_peer_config_rej
    710 **
    711 ** Description      Build and send an L2CAP "configuration reject" message
    712 **                  to the peer.
    713 **
    714 ** Returns          void
    715 **
    716 *******************************************************************************/
    717 void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, UINT16 rej_len)
    718 {
    719     BT_HDR  *p_buf = (BT_HDR *)GKI_getpoolbuf (L2CAP_CMD_POOL_ID);
    720     UINT16  len, cfg_len;
    721     UINT8   *p, *p_hci_len, *p_data_end;
    722     UINT8   cfg_code;
    723 
    724     if (!p_buf)
    725     {
    726         L2CAP_TRACE_ERROR0 ("L2CAP - no buffer for cfg_rej");
    727         return;
    728     }
    729 
    730     p_buf->offset = L2CAP_SEND_CMD_OFFSET;
    731     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET;
    732 
    733     /* Put in HCI header - handle + pkt boundary */
    734 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
    735     if (HCI_NON_FLUSHABLE_PB_SUPPORTED(BTM_ReadLocalFeatures ()))
    736     {
    737         UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT)));
    738     }
    739     else
    740 #endif
    741     {
    742         UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
    743     }
    744 
    745     /* Remember the HCI header length position, and save space for it */
    746     p_hci_len = p;
    747     p += 2;
    748 
    749     /* Put in L2CAP packet header */
    750     UINT16_TO_STREAM (p, L2CAP_CMD_OVERHEAD + L2CAP_CONFIG_RSP_LEN + rej_len);
    751     UINT16_TO_STREAM (p, L2CAP_SIGNALLING_CID);
    752 
    753     /* Put in L2CAP command header */
    754     UINT8_TO_STREAM  (p, L2CAP_CMD_CONFIG_RSP);
    755     UINT8_TO_STREAM  (p, p_ccb->remote_id);
    756 
    757     UINT16_TO_STREAM (p, L2CAP_CONFIG_RSP_LEN + rej_len);
    758 
    759     UINT16_TO_STREAM (p, p_ccb->remote_cid);
    760     UINT16_TO_STREAM (p, 0);                    /* Flags = 0 (no continuation) */
    761     UINT16_TO_STREAM (p, L2CAP_CFG_UNKNOWN_OPTIONS);
    762 
    763     /* Now, put the rejected options */
    764     p_data_end = p_data + data_len;
    765     while (p_data < p_data_end)
    766     {
    767         cfg_code = *p_data;
    768         cfg_len = *(p_data + 1);
    769 
    770         switch (cfg_code & 0x7F)
    771         {
    772             /* skip known options */
    773             case L2CAP_CFG_TYPE_MTU:
    774             case L2CAP_CFG_TYPE_FLUSH_TOUT:
    775             case L2CAP_CFG_TYPE_QOS:
    776                 p_data += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
    777                 break;
    778 
    779             /* unknown options; copy into rsp if not hints */
    780             default:
    781                 /* sanity check option length */
    782                 if ((cfg_len + L2CAP_CFG_OPTION_OVERHEAD) <= data_len)
    783                 {
    784                     if ((cfg_code & 0x80) == 0)
    785                     {
    786                         memcpy(p, p_data, cfg_len + L2CAP_CFG_OPTION_OVERHEAD);
    787                         p += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
    788                     }
    789                     p_data += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
    790                 }
    791                 /* bad length; force loop exit */
    792                 else
    793                 {
    794                     p_data = p_data_end;
    795                 }
    796                 break;
    797         }
    798     }
    799 
    800     len = (UINT16) (p - p_hci_len - 2);
    801     UINT16_TO_STREAM (p_hci_len, len);
    802 
    803     p_buf->len = len + 4;
    804 
    805     l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
    806 }
    807 
    808 /*******************************************************************************
    809 **
    810 ** Function         l2cu_send_peer_disc_req
    811 **
    812 ** Description      Build and send an L2CAP "disconnect request" message
    813 **                  to the peer.
    814 **
    815 ** Returns          void
    816 **
    817 *******************************************************************************/
    818 void l2cu_send_peer_disc_req (tL2C_CCB *p_ccb)
    819 {
    820     BT_HDR  *p_buf, *p_buf2;
    821     UINT8   *p;
    822 
    823     /* Create an identifier for this packet */
    824     p_ccb->p_lcb->id++;
    825     l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
    826 
    827     p_ccb->local_id = p_ccb->p_lcb->id;
    828 
    829     if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_DISC_REQ_LEN, L2CAP_CMD_DISC_REQ, p_ccb->local_id)) == NULL)
    830     {
    831         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for disc_req");
    832         return;
    833     }
    834 
    835     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    836 
    837     UINT16_TO_STREAM (p, p_ccb->remote_cid);
    838     UINT16_TO_STREAM (p, p_ccb->local_cid);
    839 
    840     /* Move all queued data packets to the LCB. In FCR mode, assume the higher
    841        layer checks that all buffers are sent before disconnecting.
    842     */
    843     if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE)
    844     {
    845         while (p_ccb->xmit_hold_q.p_first)
    846         {
    847             p_buf2 = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
    848             l2cu_set_acl_hci_header (p_buf2, p_ccb);
    849             l2c_link_check_send_pkts (p_ccb->p_lcb, p_ccb, p_buf2);
    850         }
    851     }
    852 
    853     l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
    854 }
    855 
    856 
    857 /*******************************************************************************
    858 **
    859 ** Function         l2cu_send_peer_disc_rsp
    860 **
    861 ** Description      Build and send an L2CAP "disconnect response" message
    862 **                  to the peer.
    863 **
    864 **                  This function is passed the parameters for the disconnect
    865 **                  response instead of the CCB address, as it may be called
    866 **                  to send a disconnect response when there is no CCB.
    867 **
    868 ** Returns          void
    869 **
    870 *******************************************************************************/
    871 void l2cu_send_peer_disc_rsp (tL2C_LCB *p_lcb, UINT8 remote_id, UINT16 local_cid,
    872                               UINT16 remote_cid)
    873 {
    874     BT_HDR  *p_buf;
    875     UINT8   *p;
    876 
    877     if ((p_buf=l2cu_build_header(p_lcb, L2CAP_DISC_RSP_LEN, L2CAP_CMD_DISC_RSP, remote_id)) == NULL)
    878     {
    879         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for disc_rsp");
    880         return;
    881     }
    882 
    883     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    884 
    885     UINT16_TO_STREAM (p, local_cid);
    886     UINT16_TO_STREAM (p, remote_cid);
    887 
    888     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
    889 }
    890 
    891 
    892 /*******************************************************************************
    893 **
    894 ** Function         l2cu_send_peer_echo_req
    895 **
    896 ** Description      Build and send an L2CAP "echo request" message
    897 **                  to the peer. Note that we do not currently allow
    898 **                  data in the echo request.
    899 **
    900 ** Returns          void
    901 **
    902 *******************************************************************************/
    903 void l2cu_send_peer_echo_req (tL2C_LCB *p_lcb, UINT8 *p_data, UINT16 data_len)
    904 {
    905     BT_HDR  *p_buf;
    906     UINT8   *p;
    907 
    908     p_lcb->id++;
    909     l2cu_adj_id(p_lcb, L2CAP_ADJ_ZERO_ID);  /* check for wrap to '0' */
    910 
    911     if ((p_buf = l2cu_build_header(p_lcb, (UINT16) (L2CAP_ECHO_REQ_LEN + data_len), L2CAP_CMD_ECHO_REQ, p_lcb->id)) == NULL)
    912     {
    913         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for echo_req");
    914         return;
    915     }
    916 
    917     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    918 
    919     if (data_len)
    920     {
    921         ARRAY_TO_STREAM  (p, p_data, data_len);
    922     }
    923 
    924     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
    925 }
    926 
    927 
    928 /*******************************************************************************
    929 **
    930 ** Function         l2cu_send_peer_echo_rsp
    931 **
    932 ** Description      Build and send an L2CAP "echo response" message
    933 **                  to the peer.
    934 **
    935 ** Returns          void
    936 **
    937 *******************************************************************************/
    938 void l2cu_send_peer_echo_rsp (tL2C_LCB *p_lcb, UINT8 id, UINT8 *p_data, UINT16 data_len)
    939 {
    940     BT_HDR  *p_buf;
    941     UINT8   *p;
    942     UINT16   maxlen;
    943 
    944     /* Don't return data if it does not fit in ACL and L2CAP MTU */
    945     maxlen = (GKI_get_pool_bufsize(L2CAP_CMD_POOL_ID) > btu_cb.hcit_acl_pkt_size) ?
    946                btu_cb.hcit_acl_data_size : (UINT16)GKI_get_pool_bufsize(L2CAP_CMD_POOL_ID);
    947     maxlen -= (UINT16)(BT_HDR_SIZE + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD +
    948                 L2CAP_CMD_OVERHEAD + L2CAP_ECHO_RSP_LEN);
    949 
    950     if (data_len > maxlen)
    951         data_len = 0;
    952 
    953     if ((p_buf = l2cu_build_header (p_lcb, (UINT16)(L2CAP_ECHO_RSP_LEN + data_len), L2CAP_CMD_ECHO_RSP, id)) == NULL)
    954     {
    955         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for echo_rsp");
    956         return;
    957     }
    958 
    959     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE +
    960                                L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    961 
    962     if (data_len)
    963     {
    964         ARRAY_TO_STREAM  (p, p_data, data_len);
    965     }
    966 
    967     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
    968 }
    969 
    970 /*******************************************************************************
    971 **
    972 ** Function         l2cu_send_peer_info_req
    973 **
    974 ** Description      Build and send an L2CAP "info request" message
    975 **                  to the peer.
    976 ** Returns          void
    977 **
    978 *******************************************************************************/
    979 void l2cu_send_peer_info_req (tL2C_LCB *p_lcb, UINT16 info_type)
    980 {
    981     BT_HDR  *p_buf;
    982     UINT8   *p;
    983 
    984     /* check for wrap and/or BRCM ID */
    985     p_lcb->id++;
    986     l2cu_adj_id(p_lcb, L2CAP_ADJ_ID);
    987 
    988     if ((p_buf = l2cu_build_header(p_lcb, 2, L2CAP_CMD_INFO_REQ, p_lcb->id)) == NULL)
    989     {
    990         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for info_req");
    991         return;
    992     }
    993 
    994     L2CAP_TRACE_EVENT1 ("l2cu_send_peer_info_req: type 0x%04x", info_type);
    995 
    996     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE +
    997         L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
    998 
    999     UINT16_TO_STREAM (p, info_type);
   1000 
   1001     p_lcb->w4_info_rsp = TRUE;
   1002     btu_start_timer (&p_lcb->info_timer_entry, BTU_TTYPE_L2CAP_INFO, L2CAP_WAIT_INFO_RSP_TOUT);
   1003 
   1004     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
   1005 }
   1006 
   1007 
   1008 /*******************************************************************************
   1009 **
   1010 ** Function         l2cu_send_peer_info_rsp
   1011 **
   1012 ** Description      Build and send an L2CAP "info response" message
   1013 **                  to the peer.
   1014 **
   1015 ** Returns          void
   1016 **
   1017 *******************************************************************************/
   1018 void l2cu_send_peer_info_rsp (tL2C_LCB *p_lcb, UINT8 remote_id, UINT16 info_type)
   1019 {
   1020     BT_HDR  *p_buf;
   1021     UINT8   *p;
   1022     UINT16   len = L2CAP_INFO_RSP_LEN;
   1023 
   1024 #if (L2CAP_CONFORMANCE_TESTING == TRUE)
   1025     if ((info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE)
   1026         && (l2cb.test_info_resp & (L2CAP_EXTFEA_ENH_RETRANS   | L2CAP_EXTFEA_STREAM_MODE |
   1027                                    L2CAP_EXTFEA_NO_CRC | L2CAP_EXTFEA_EXT_FLOW_SPEC |
   1028                                    L2CAP_EXTFEA_FIXED_CHNLS | L2CAP_EXTFEA_EXT_WINDOW |
   1029                                    L2CAP_EXTFEA_UCD_RECEPTION )) )
   1030 #else
   1031     if ((info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE)
   1032         && (L2CAP_EXTFEA_SUPPORTED_MASK & (L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE |
   1033                                            L2CAP_EXTFEA_NO_CRC |L2CAP_EXTFEA_FIXED_CHNLS |
   1034                                            L2CAP_EXTFEA_UCD_RECEPTION )) )
   1035 #endif
   1036     {
   1037         len += L2CAP_EXTENDED_FEATURES_ARRAY_SIZE;
   1038     }
   1039     else if (info_type == L2CAP_FIXED_CHANNELS_INFO_TYPE)
   1040     {
   1041         len += L2CAP_FIXED_CHNL_ARRAY_SIZE;
   1042     }
   1043     else if (info_type == L2CAP_CONNLESS_MTU_INFO_TYPE)
   1044     {
   1045         len += L2CAP_CONNLESS_MTU_INFO_SIZE;
   1046     }
   1047 
   1048     if ((p_buf = l2cu_build_header(p_lcb, len, L2CAP_CMD_INFO_RSP, remote_id)) == NULL)
   1049     {
   1050         L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for info_rsp");
   1051         return;
   1052     }
   1053 
   1054     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE +
   1055                                L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
   1056 
   1057     UINT16_TO_STREAM (p, info_type);
   1058 
   1059 #if (L2CAP_CONFORMANCE_TESTING == TRUE)
   1060     if ((info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE)
   1061         && (l2cb.test_info_resp & ( L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE
   1062                                   | L2CAP_EXTFEA_UCD_RECEPTION )) )
   1063 #else
   1064     if ((info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE)
   1065         && (L2CAP_EXTFEA_SUPPORTED_MASK & ( L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE
   1066                                           | L2CAP_EXTFEA_UCD_RECEPTION )) )
   1067 #endif
   1068     {
   1069         UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_SUCCESS);
   1070 #if (BLE_INCLUDED == TRUE)
   1071         if (p_lcb->is_ble_link)
   1072         {
   1073             /* optional data are not added for now */
   1074             UINT32_TO_STREAM (p, L2CAP_BLE_EXTFEA_MASK);
   1075         }
   1076         else
   1077 #endif
   1078         {
   1079 #if L2CAP_CONFORMANCE_TESTING == TRUE
   1080         UINT32_TO_STREAM (p, l2cb.test_info_resp);
   1081 #else
   1082 #if (L2CAP_NUM_FIXED_CHNLS > 0)
   1083         UINT32_TO_STREAM (p, L2CAP_EXTFEA_SUPPORTED_MASK | L2CAP_EXTFEA_FIXED_CHNLS);
   1084 #else
   1085         UINT32_TO_STREAM (p, L2CAP_EXTFEA_SUPPORTED_MASK);
   1086 #endif
   1087 #endif
   1088         }
   1089     }
   1090     else if (info_type == L2CAP_FIXED_CHANNELS_INFO_TYPE)
   1091     {
   1092         UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_SUCCESS);
   1093         memset (p, 0, L2CAP_FIXED_CHNL_ARRAY_SIZE);
   1094 
   1095         p[0] = L2CAP_FIXED_CHNL_SIG_BIT;
   1096 
   1097         if ( L2CAP_EXTFEA_SUPPORTED_MASK & L2CAP_EXTFEA_UCD_RECEPTION )
   1098         	p[0] |= L2CAP_FIXED_CHNL_CNCTLESS_BIT;
   1099 
   1100 #if (L2CAP_NUM_FIXED_CHNLS > 0)
   1101         {
   1102             int xx;
   1103 
   1104             for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
   1105                 if (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL)
   1106                     p[0] |= 1 << (xx + L2CAP_FIRST_FIXED_CHNL);
   1107         }
   1108 #endif
   1109     }
   1110     else if (info_type == L2CAP_CONNLESS_MTU_INFO_TYPE)
   1111     {
   1112         UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_SUCCESS);
   1113         UINT16_TO_STREAM (p, L2CAP_UCD_MTU);
   1114     }
   1115     else
   1116     {
   1117         UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_NOT_SUPPORTED);  /* 'not supported' */
   1118     }
   1119 
   1120     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
   1121 }
   1122 
   1123 /******************************************************************************
   1124 **
   1125 ** Function         l2cu_enqueue_ccb
   1126 **
   1127 ** Description      queue CCB by priority. The first CCB is highest priority and
   1128 **                  is served at first. The CCB is queued to an LLCB or an LCB.
   1129 **
   1130 ** Returns          None
   1131 **
   1132 *******************************************************************************/
   1133 void l2cu_enqueue_ccb (tL2C_CCB *p_ccb)
   1134 {
   1135     tL2C_CCB        *p_ccb1;
   1136     tL2C_CCB_Q      *p_q = NULL;
   1137 
   1138     /* Find out which queue the channel is on
   1139     */
   1140     if (p_ccb->p_lcb != NULL)
   1141         p_q = &p_ccb->p_lcb->ccb_queue;
   1142 
   1143     if ( (!p_ccb->in_use) || (p_q == NULL) )
   1144     {
   1145         L2CAP_TRACE_ERROR3 ("l2cu_enqueue_ccb  CID: 0x%04x ERROR in_use: %u  p_lcb: 0x%08x",
   1146                             p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb);
   1147         return;
   1148     }
   1149 
   1150     L2CAP_TRACE_DEBUG2 ("l2cu_enqueue_ccb CID: 0x%04x  priority: %d",
   1151                         p_ccb->local_cid, p_ccb->ccb_priority);
   1152 
   1153     /* If the queue is empty, we go at the front */
   1154     if (!p_q->p_first_ccb)
   1155     {
   1156         p_q->p_first_ccb  = p_q->p_last_ccb   = p_ccb;
   1157         p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
   1158     }
   1159     else
   1160     {
   1161         p_ccb1 = p_q->p_first_ccb;
   1162 
   1163         while (p_ccb1 != NULL)
   1164         {
   1165             /* Insert new ccb at the end of the same priority. Lower number, higher priority */
   1166             if (p_ccb->ccb_priority < p_ccb1->ccb_priority)
   1167             {
   1168                 /* Are we at the head of the queue ? */
   1169                 if (p_ccb1 == p_q->p_first_ccb)
   1170                     p_q->p_first_ccb = p_ccb;
   1171                 else
   1172                     p_ccb1->p_prev_ccb->p_next_ccb  = p_ccb;
   1173 
   1174                 p_ccb->p_next_ccb  = p_ccb1;
   1175                 p_ccb->p_prev_ccb  = p_ccb1->p_prev_ccb;
   1176                 p_ccb1->p_prev_ccb = p_ccb;
   1177                 break;
   1178             }
   1179 
   1180             p_ccb1 = p_ccb1->p_next_ccb;
   1181         }
   1182 
   1183         /* If we are lower then anyone in the list, we go at the end */
   1184         if (!p_ccb1)
   1185         {
   1186             /* add new ccb at the end of the list */
   1187             p_q->p_last_ccb->p_next_ccb = p_ccb;
   1188 
   1189             p_ccb->p_next_ccb   = NULL;
   1190             p_ccb->p_prev_ccb   = p_q->p_last_ccb;
   1191             p_q->p_last_ccb = p_ccb;
   1192         }
   1193     }
   1194 
   1195 #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE)
   1196     /* Adding CCB into round robin service table of its LCB */
   1197     if (p_ccb->p_lcb != NULL)
   1198     {
   1199         /* if this is the first channel in this priority group */
   1200         if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 )
   1201         {
   1202         	/* Set the first channel to this CCB */
   1203             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb;
   1204         	/* Set the next serving channel in this group to this CCB */
   1205             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb;
   1206         	/* Initialize quota of this priority group based on its priority */
   1207             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority);
   1208         }
   1209         /* increase number of channels in this group */
   1210         p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb++;
   1211     }
   1212 #endif
   1213 
   1214 }
   1215 
   1216 /******************************************************************************
   1217 **
   1218 ** Function         l2cu_dequeue_ccb
   1219 **
   1220 ** Description      dequeue CCB from a queue
   1221 **
   1222 ** Returns          -
   1223 **
   1224 *******************************************************************************/
   1225 void l2cu_dequeue_ccb (tL2C_CCB *p_ccb)
   1226 {
   1227     tL2C_CCB_Q      *p_q = NULL;
   1228 
   1229     L2CAP_TRACE_DEBUG1 ("l2cu_dequeue_ccb  CID: 0x%04x", p_ccb->local_cid);
   1230 
   1231     /* Find out which queue the channel is on
   1232     */
   1233     if (p_ccb->p_lcb != NULL)
   1234         p_q = &p_ccb->p_lcb->ccb_queue;
   1235 
   1236     if ( (!p_ccb->in_use) || (p_q == NULL) || (p_q->p_first_ccb == NULL) )
   1237     {
   1238         L2CAP_TRACE_ERROR5 ("l2cu_dequeue_ccb  CID: 0x%04x ERROR in_use: %u  p_lcb: 0x%08x  p_q: 0x%08x  p_q->p_first_ccb: 0x%08x",
   1239                             p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb, p_q, p_q ? p_q->p_first_ccb : 0);
   1240         return;
   1241     }
   1242 
   1243 #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE)
   1244     /* Removing CCB from round robin service table of its LCB */
   1245     if (p_ccb->p_lcb != NULL)
   1246     {
   1247         /* decrease number of channels in this priority group */
   1248         p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb--;
   1249 
   1250         /* if it was the last channel in the priority group */
   1251         if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 )
   1252         {
   1253             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL;
   1254             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL;
   1255         }
   1256         else
   1257         {
   1258             /* if it is the first channel of this group */
   1259             if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb == p_ccb )
   1260             {
   1261                 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb->p_next_ccb;
   1262             }
   1263             /* if it is the next serving channel of this group */
   1264             if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb == p_ccb )
   1265             {
   1266                 /* simply, start serving from the first channel */
   1267                 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb
   1268                     = p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb;
   1269             }
   1270         }
   1271     }
   1272 #endif
   1273 
   1274     if (p_ccb == p_q->p_first_ccb)
   1275     {
   1276         /* We are removing the first in a queue */
   1277         p_q->p_first_ccb = p_ccb->p_next_ccb;
   1278 
   1279         if (p_q->p_first_ccb)
   1280             p_q->p_first_ccb->p_prev_ccb = NULL;
   1281         else
   1282             p_q->p_last_ccb = NULL;
   1283     }
   1284     else if (p_ccb == p_q->p_last_ccb)
   1285     {
   1286         /* We are removing the last in a queue */
   1287         p_q->p_last_ccb = p_ccb->p_prev_ccb;
   1288         p_q->p_last_ccb->p_next_ccb = NULL;
   1289     }
   1290     else
   1291     {
   1292         /* In the middle of a chain. */
   1293         p_ccb->p_prev_ccb->p_next_ccb = p_ccb->p_next_ccb;
   1294         p_ccb->p_next_ccb->p_prev_ccb = p_ccb->p_prev_ccb;
   1295     }
   1296 
   1297     p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
   1298 }
   1299 
   1300 /******************************************************************************
   1301 **
   1302 ** Function         l2cu_change_pri_ccb
   1303 **
   1304 ** Description
   1305 **
   1306 ** Returns          -
   1307 **
   1308 *******************************************************************************/
   1309 void l2cu_change_pri_ccb (tL2C_CCB *p_ccb, tL2CAP_CHNL_PRIORITY priority)
   1310 {
   1311     if (p_ccb->ccb_priority != priority)
   1312     {
   1313         /* If CCB is not the only guy on the queue */
   1314         if ( (p_ccb->p_next_ccb != NULL) || (p_ccb->p_prev_ccb != NULL) )
   1315         {
   1316             L2CAP_TRACE_DEBUG0 ("Update CCB list in logical link");
   1317 
   1318             /* Remove CCB from queue and re-queue it at new priority */
   1319             l2cu_dequeue_ccb (p_ccb);
   1320 
   1321             p_ccb->ccb_priority = priority;
   1322             l2cu_enqueue_ccb (p_ccb);
   1323         }
   1324 #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE)
   1325         else
   1326         {
   1327         	/* If CCB is the only guy on the queue, no need to re-enqueue */
   1328             /* update only round robin service data */
   1329             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 0;
   1330             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL;
   1331             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL;
   1332 
   1333             p_ccb->ccb_priority = priority;
   1334 
   1335             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb;
   1336             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb;
   1337             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority);
   1338             p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 1;
   1339         }
   1340 #endif
   1341     }
   1342 }
   1343 
   1344 /*******************************************************************************
   1345 **
   1346 ** Function         l2cu_allocate_ccb
   1347 **
   1348 ** Description      This function allocates a Channel Control Block and
   1349 **                  attaches it to a link control block. The local CID
   1350 **                  is also assigned.
   1351 **
   1352 ** Returns          pointer to CCB, or NULL if none
   1353 **
   1354 *******************************************************************************/
   1355 tL2C_CCB *l2cu_allocate_ccb (tL2C_LCB *p_lcb, UINT16 cid)
   1356 {
   1357     tL2C_CCB    *p_ccb;
   1358     tL2C_CCB    *p_prev;
   1359 
   1360     L2CAP_TRACE_DEBUG1 ("l2cu_allocate_ccb: cid 0x%04x", cid);
   1361 
   1362     if (!l2cb.p_free_ccb_first)
   1363         return (NULL);
   1364 
   1365     /* If a CID was passed in, use that, else take the first free one */
   1366     if (cid == 0)
   1367     {
   1368         p_ccb = l2cb.p_free_ccb_first;
   1369         l2cb.p_free_ccb_first = p_ccb->p_next_ccb;
   1370     }
   1371     else
   1372     {
   1373         p_prev = NULL;
   1374 
   1375         p_ccb = &l2cb.ccb_pool[cid - L2CAP_BASE_APPL_CID];
   1376 
   1377         if (p_ccb == l2cb.p_free_ccb_first)
   1378             l2cb.p_free_ccb_first = p_ccb->p_next_ccb;
   1379         else
   1380         {
   1381             for (p_prev = l2cb.p_free_ccb_first; p_prev != NULL; p_prev = p_prev->p_next_ccb)
   1382             {
   1383                 if (p_prev->p_next_ccb == p_ccb)
   1384                 {
   1385                     p_prev->p_next_ccb = p_ccb->p_next_ccb;
   1386 
   1387                     if (p_ccb == l2cb.p_free_ccb_last)
   1388                         l2cb.p_free_ccb_last = p_prev;
   1389 
   1390                     break;
   1391                 }
   1392             }
   1393             if (p_prev == NULL)
   1394             {
   1395                 L2CAP_TRACE_ERROR1 ("l2cu_allocate_ccb: could not find CCB for CID 0x%04x in the free list", cid);
   1396                 return NULL;
   1397             }
   1398         }
   1399     }
   1400 
   1401     p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
   1402 
   1403     p_ccb->in_use = TRUE;
   1404 
   1405     /* Get a CID for the connection */
   1406     p_ccb->local_cid = L2CAP_BASE_APPL_CID + (UINT16)(p_ccb - l2cb.ccb_pool);
   1407 
   1408     p_ccb->p_lcb = p_lcb;
   1409     p_ccb->p_rcb = NULL;
   1410 
   1411     /* Set priority then insert ccb into LCB queue (if we have an LCB) */
   1412     p_ccb->ccb_priority = L2CAP_CHNL_PRIORITY_LOW;
   1413 
   1414     if (p_lcb)
   1415         l2cu_enqueue_ccb (p_ccb);
   1416 
   1417     /* clear what peer wants to configure */
   1418     p_ccb->peer_cfg_bits = 0;
   1419 
   1420     /* Put in default values for configuration */
   1421     memset (&p_ccb->our_cfg, 0, sizeof(tL2CAP_CFG_INFO));
   1422     memset (&p_ccb->peer_cfg, 0, sizeof(tL2CAP_CFG_INFO));
   1423 
   1424     /* Put in default values for local/peer configurations */
   1425     p_ccb->our_cfg.flush_to              = p_ccb->peer_cfg.flush_to              = L2CAP_DEFAULT_FLUSH_TO;
   1426     p_ccb->our_cfg.mtu                   = p_ccb->peer_cfg.mtu                   = L2CAP_DEFAULT_MTU;
   1427     p_ccb->our_cfg.qos.service_type      = p_ccb->peer_cfg.qos.service_type      = L2CAP_DEFAULT_SERV_TYPE;
   1428     p_ccb->our_cfg.qos.token_rate        = p_ccb->peer_cfg.qos.token_rate        = L2CAP_DEFAULT_TOKEN_RATE;
   1429     p_ccb->our_cfg.qos.token_bucket_size = p_ccb->peer_cfg.qos.token_bucket_size = L2CAP_DEFAULT_BUCKET_SIZE;
   1430     p_ccb->our_cfg.qos.peak_bandwidth    = p_ccb->peer_cfg.qos.peak_bandwidth    = L2CAP_DEFAULT_PEAK_BANDWIDTH;
   1431     p_ccb->our_cfg.qos.latency           = p_ccb->peer_cfg.qos.latency           = L2CAP_DEFAULT_LATENCY;
   1432     p_ccb->our_cfg.qos.delay_variation   = p_ccb->peer_cfg.qos.delay_variation   = L2CAP_DEFAULT_DELAY;
   1433 
   1434     p_ccb->bypass_fcs = 0;
   1435     memset (&p_ccb->ertm_info, 0, sizeof(tL2CAP_ERTM_INFO));
   1436     p_ccb->peer_cfg_already_rejected = FALSE;
   1437     p_ccb->fcr_cfg_tries         = L2CAP_MAX_FCR_CFG_TRIES;
   1438     p_ccb->fcrb.ack_timer.param  = (TIMER_PARAM_TYPE)p_ccb;
   1439 
   1440     /* if timer is running, remove it from timer list */
   1441     if (p_ccb->fcrb.ack_timer.in_use)
   1442         btu_stop_quick_timer (&p_ccb->fcrb.ack_timer);
   1443 
   1444     p_ccb->fcrb.mon_retrans_timer.param  = (TIMER_PARAM_TYPE)p_ccb;
   1445 
   1446 // btla-specific ++
   1447    /*  CSP408639 Fix: When L2CAP send amp move channel request or receive
   1448      * L2CEVT_AMP_MOVE_REQ do following sequence. Send channel move
   1449      * request -> Stop retrans/monitor timer -> Change channel state to CST_AMP_MOVING. */
   1450    if (p_ccb->fcrb.mon_retrans_timer.in_use)
   1451          btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer);
   1452 // btla-specific --
   1453 
   1454     l2c_fcr_stop_timer (p_ccb);
   1455 
   1456     p_ccb->ertm_info.preferred_mode  = L2CAP_FCR_BASIC_MODE;        /* Default mode for channel is basic mode */
   1457     p_ccb->ertm_info.allowed_modes   = L2CAP_FCR_CHAN_OPT_BASIC;    /* Default mode for channel is basic mode */
   1458     p_ccb->ertm_info.fcr_rx_pool_id  = L2CAP_FCR_RX_POOL_ID;
   1459     p_ccb->ertm_info.fcr_tx_pool_id  = L2CAP_FCR_TX_POOL_ID;
   1460     p_ccb->ertm_info.user_rx_pool_id = HCI_ACL_POOL_ID;
   1461     p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID;
   1462     p_ccb->max_rx_mtu                = L2CAP_MTU_SIZE;
   1463     p_ccb->tx_mps                    = GKI_get_pool_bufsize(HCI_ACL_POOL_ID) - 32;
   1464 
   1465     GKI_init_q (&p_ccb->xmit_hold_q);
   1466 
   1467     p_ccb->cong_sent    = FALSE;
   1468     p_ccb->buff_quota   = 2;                /* This gets set after config */
   1469 
   1470     /* If CCB was reserved Config_Done can already have some value */
   1471     if (cid == 0)
   1472         p_ccb->config_done  = 0;
   1473     else
   1474     {
   1475         L2CAP_TRACE_DEBUG2 ("l2cu_allocate_ccb: cid 0x%04x config_done:0x%x", cid, p_ccb->config_done);
   1476     }
   1477 
   1478     p_ccb->chnl_state   = CST_CLOSED;
   1479     p_ccb->flags        = 0;
   1480     p_ccb->tx_data_rate = L2CAP_CHNL_DATA_RATE_LOW;
   1481     p_ccb->rx_data_rate = L2CAP_CHNL_DATA_RATE_LOW;
   1482 
   1483 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
   1484     p_ccb->is_flushable = FALSE;
   1485 #endif
   1486 
   1487     p_ccb->timer_entry.param = (TIMER_PARAM_TYPE)p_ccb;
   1488     p_ccb->timer_entry.in_use = 0;
   1489 
   1490     l2c_link_adjust_chnl_allocation ();
   1491 
   1492     return (p_ccb);
   1493 }
   1494 
   1495 /*******************************************************************************
   1496 **
   1497 ** Function         l2cu_start_post_bond_timer
   1498 **
   1499 ** Description      This function starts the ACL Link inactivity timer after
   1500 **                  dedicated bonding
   1501 **                  This timer can be longer than the normal link inactivity
   1502 **                  timer for some platforms.
   1503 **
   1504 ** Returns          BOOLEAN  - TRUE if idle timer started or disconnect initiated
   1505 **                             FALSE if there's one or more pending CCB's exist
   1506 **
   1507 *******************************************************************************/
   1508 BOOLEAN l2cu_start_post_bond_timer (UINT16 handle)
   1509 {
   1510     UINT16    timeout;
   1511     tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(handle);
   1512 
   1513     if (!p_lcb)
   1514         return (TRUE);
   1515 
   1516     p_lcb->is_bonding = FALSE;
   1517 
   1518     /* Only start timer if no control blocks allocated */
   1519     if (p_lcb->ccb_queue.p_first_ccb != NULL)
   1520         return (FALSE);
   1521 
   1522     /* If no channels on the connection, start idle timeout */
   1523     if ( (p_lcb->link_state == LST_CONNECTED) || (p_lcb->link_state == LST_CONNECTING) || (p_lcb->link_state == LST_DISCONNECTING) )
   1524     {
   1525         if (p_lcb->idle_timeout == 0)
   1526         {
   1527             if (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER))
   1528             {
   1529                 p_lcb->link_state = LST_DISCONNECTING;
   1530                 timeout = L2CAP_LINK_DISCONNECT_TOUT;
   1531             }
   1532             else
   1533                 timeout = BT_1SEC_TIMEOUT;
   1534         }
   1535         else
   1536         {
   1537             timeout = L2CAP_BONDING_TIMEOUT;
   1538         }
   1539 
   1540         if (timeout != 0xFFFF)
   1541             btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, timeout);
   1542 
   1543         return (TRUE);
   1544     }
   1545 
   1546     return (FALSE);
   1547 }
   1548 
   1549 /*******************************************************************************
   1550 **
   1551 ** Function         l2cu_release_ccb
   1552 **
   1553 ** Description      This function releases a Channel Control Block. The timer
   1554 **                  is stopped, any attached buffers freed, and the CCB is removed
   1555 **                  from the link control block.
   1556 **
   1557 ** Returns          void
   1558 **
   1559 *******************************************************************************/
   1560 void l2cu_release_ccb (tL2C_CCB *p_ccb)
   1561 {
   1562     tL2C_LCB    *p_lcb = p_ccb->p_lcb;
   1563     tL2C_RCB    *p_rcb = p_ccb->p_rcb;
   1564 
   1565     L2CAP_TRACE_DEBUG2 ("l2cu_release_ccb: cid 0x%04x  in_use: %u", p_ccb->local_cid, p_ccb->in_use);
   1566 
   1567     /* If already released, could be race condition */
   1568     if (!p_ccb->in_use)
   1569         return;
   1570 
   1571     if (p_rcb && (p_rcb->psm != p_rcb->real_psm))
   1572     {
   1573         btm_sec_clr_service_by_psm(p_rcb->psm);
   1574     }
   1575 
   1576     btm_sec_clr_temp_auth_service (p_lcb->remote_bd_addr);
   1577 
   1578     /* Stop the timer */
   1579     btu_stop_timer (&p_ccb->timer_entry);
   1580 
   1581     while (p_ccb->xmit_hold_q.p_first)
   1582         GKI_freebuf (GKI_dequeue (&p_ccb->xmit_hold_q));
   1583 
   1584     l2c_fcr_cleanup (p_ccb);
   1585 
   1586     /* Channel may not be assigned to any LCB if it was just pre-reserved */
   1587     if ( (p_lcb) &&
   1588          ( (p_ccb->local_cid >= L2CAP_BASE_APPL_CID)
   1589 #if (L2CAP_UCD_INCLUDED == TRUE)
   1590          ||(p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID)
   1591 #endif
   1592          )
   1593        )
   1594     {
   1595         l2cu_dequeue_ccb (p_ccb);
   1596 
   1597         /* Delink the CCB from the LCB */
   1598         p_ccb->p_lcb = NULL;
   1599     }
   1600 
   1601     /* Put the CCB back on the free pool */
   1602     if (!l2cb.p_free_ccb_first)
   1603     {
   1604         l2cb.p_free_ccb_first = p_ccb;
   1605         l2cb.p_free_ccb_last  = p_ccb;
   1606         p_ccb->p_next_ccb     = NULL;
   1607         p_ccb->p_prev_ccb     = NULL;
   1608     }
   1609     else
   1610     {
   1611         p_ccb->p_next_ccb  = NULL;
   1612         p_ccb->p_prev_ccb  = l2cb.p_free_ccb_last;
   1613         l2cb.p_free_ccb_last->p_next_ccb = p_ccb;
   1614         l2cb.p_free_ccb_last  = p_ccb;
   1615     }
   1616 
   1617     /* Flag as not in use */
   1618     p_ccb->in_use = FALSE;
   1619 
   1620     /* If no channels on the connection, start idle timeout */
   1621     if ((p_lcb) && p_lcb->in_use && (p_lcb->link_state == LST_CONNECTED))
   1622     {
   1623         if (!p_lcb->ccb_queue.p_first_ccb)
   1624         {
   1625             l2cu_no_dynamic_ccbs (p_lcb);
   1626         }
   1627         else
   1628         {
   1629             /* Link is still active, adjust channel quotas. */
   1630             l2c_link_adjust_chnl_allocation ();
   1631         }
   1632     }
   1633 }
   1634 
   1635 /*******************************************************************************
   1636 **
   1637 ** Function         l2cu_find_ccb_by_remote_cid
   1638 **
   1639 ** Description      Look through all active CCBs on a link for a match based
   1640 **                  on the remote CID.
   1641 **
   1642 ** Returns          pointer to matched CCB, or NULL if no match
   1643 **
   1644 *******************************************************************************/
   1645 tL2C_CCB *l2cu_find_ccb_by_remote_cid (tL2C_LCB *p_lcb, UINT16 remote_cid)
   1646 {
   1647     tL2C_CCB    *p_ccb;
   1648 
   1649     /* If LCB is NULL, look through all active links */
   1650     if (!p_lcb)
   1651     {
   1652         return NULL;
   1653     }
   1654     else
   1655     {
   1656         for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
   1657             if ((p_ccb->in_use) && (p_ccb->remote_cid == remote_cid))
   1658                 return (p_ccb);
   1659     }
   1660 
   1661     /* If here, no match found */
   1662     return (NULL);
   1663 }
   1664 
   1665 /*******************************************************************************
   1666 **
   1667 ** Function         l2cu_allocate_rcb
   1668 **
   1669 ** Description      Look through the Registration Control Blocks for a free
   1670 **                  one.
   1671 **
   1672 ** Returns          Pointer to the RCB or NULL if not found
   1673 **
   1674 *******************************************************************************/
   1675 tL2C_RCB *l2cu_allocate_rcb (UINT16 psm)
   1676 {
   1677     tL2C_RCB    *p_rcb = &l2cb.rcb_pool[0];
   1678     UINT16      xx;
   1679 
   1680     for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
   1681     {
   1682         if (!p_rcb->in_use)
   1683         {
   1684             p_rcb->in_use = TRUE;
   1685             p_rcb->psm    = psm;
   1686 #if (L2CAP_UCD_INCLUDED == TRUE)
   1687             p_rcb->ucd.state = L2C_UCD_STATE_UNUSED;
   1688 #endif
   1689             return (p_rcb);
   1690         }
   1691     }
   1692 
   1693     /* If here, no free RCB found */
   1694     return (NULL);
   1695 }
   1696 
   1697 
   1698 /*******************************************************************************
   1699 **
   1700 ** Function         l2cu_release_rcb
   1701 **
   1702 ** Description      Mark an RCB as no longet in use
   1703 **
   1704 ** Returns          void
   1705 **
   1706 *******************************************************************************/
   1707 void l2cu_release_rcb (tL2C_RCB *p_rcb)
   1708 {
   1709     p_rcb->in_use = FALSE;
   1710     p_rcb->psm    = 0;
   1711 }
   1712 
   1713 
   1714 /*******************************************************************************
   1715 **
   1716 ** Function         l2cu_disconnect_chnl
   1717 **
   1718 ** Description      Disconnect a channel. Typically, this is due to either
   1719 **                  receiving a bad configuration,  bad packet or max_retries expiring.
   1720 **
   1721 *******************************************************************************/
   1722 void l2cu_disconnect_chnl (tL2C_CCB *p_ccb)
   1723 {
   1724     UINT16      local_cid = p_ccb->local_cid;
   1725 
   1726     if (local_cid >= L2CAP_BASE_APPL_CID)
   1727     {
   1728         tL2CA_DISCONNECT_IND_CB   *p_disc_cb = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
   1729 
   1730         L2CAP_TRACE_WARNING1 ("L2CAP - disconnect_chnl CID: 0x%04x", local_cid);
   1731 
   1732         l2cu_send_peer_disc_req (p_ccb);
   1733 
   1734         l2cu_release_ccb (p_ccb);
   1735 
   1736         (*p_disc_cb)(local_cid, FALSE);
   1737     }
   1738     else
   1739     {
   1740         /* failure on the AMP channel, probably need to disconnect ACL */
   1741         L2CAP_TRACE_ERROR1 ("L2CAP - disconnect_chnl CID: 0x%04x Ignored", local_cid);
   1742     }
   1743 }
   1744 
   1745 
   1746 /*******************************************************************************
   1747 **
   1748 ** Function         l2cu_find_rcb_by_psm
   1749 **
   1750 ** Description      Look through the Registration Control Blocks to see if
   1751 **                  anyone registered to handle the PSM in question
   1752 **
   1753 ** Returns          Pointer to the RCB or NULL if not found
   1754 **
   1755 *******************************************************************************/
   1756 tL2C_RCB *l2cu_find_rcb_by_psm (UINT16 psm)
   1757 {
   1758     tL2C_RCB    *p_rcb = &l2cb.rcb_pool[0];
   1759     UINT16      xx;
   1760 
   1761     for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
   1762     {
   1763         if ((p_rcb->in_use) && (p_rcb->psm == psm))
   1764             return (p_rcb);
   1765     }
   1766 
   1767     /* If here, no match found */
   1768     return (NULL);
   1769 }
   1770 
   1771 
   1772 /*******************************************************************************
   1773 **
   1774 ** Function         l2cu_process_peer_cfg_req
   1775 **
   1776 ** Description      This function is called when the peer sends us a "config request"
   1777 **                  message. It extracts the configuration of interest and saves
   1778 **                  it in the CCB.
   1779 **
   1780 **                  Note:  Negotiation of the FCR channel type is handled internally,
   1781 **                         all others are passed to the upper layer.
   1782 **
   1783 ** Returns          UINT8 - L2CAP_PEER_CFG_OK if passed to upper layer,
   1784 **                          L2CAP_PEER_CFG_UNACCEPTABLE if automatically responded to
   1785 **                              because parameters are unnacceptable from a specification
   1786 **                              point of view.
   1787 **                          L2CAP_PEER_CFG_DISCONNECT if no compatible channel modes
   1788 **                              between the two devices, and shall be closed.
   1789 **
   1790 *******************************************************************************/
   1791 UINT8 l2cu_process_peer_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
   1792 {
   1793     BOOLEAN  mtu_ok      = TRUE;
   1794     BOOLEAN  qos_type_ok = TRUE;
   1795     BOOLEAN  flush_to_ok = TRUE;
   1796     BOOLEAN  fcr_ok      = TRUE;
   1797     UINT8    fcr_status;
   1798 
   1799     /* Ignore FCR parameters for basic mode */
   1800     if (!p_cfg->fcr_present)
   1801         p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE;
   1802 
   1803     /* Save the MTU that our peer can receive */
   1804     if (p_cfg->mtu_present)
   1805     {
   1806         /* Make sure MTU is at least the minimum */
   1807         if (p_cfg->mtu >= L2CAP_MIN_MTU)
   1808         {
   1809             /* In basic mode, limit the MTU to our buffer size */
   1810             if ( (p_cfg->fcr_present == FALSE) && (p_cfg->mtu > L2CAP_MTU_SIZE) )
   1811                 p_cfg->mtu = L2CAP_MTU_SIZE;
   1812 
   1813             /* Save the accepted value in case of renegotiation */
   1814             p_ccb->peer_cfg.mtu = p_cfg->mtu;
   1815             p_ccb->peer_cfg.mtu_present = TRUE;
   1816             p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_MTU;
   1817         }
   1818         else    /* Illegal MTU value */
   1819         {
   1820             p_cfg->mtu = L2CAP_MIN_MTU;
   1821             mtu_ok     = FALSE;
   1822         }
   1823     }
   1824     /* Reload mtu from a previously accepted config request */
   1825     else if (p_ccb->peer_cfg.mtu_present)
   1826     {
   1827         p_cfg->mtu_present = TRUE;
   1828         p_cfg->mtu = p_ccb->peer_cfg.mtu;
   1829     }
   1830 
   1831     /* Verify that the flush timeout is a valid value (0 is illegal) */
   1832     if (p_cfg->flush_to_present)
   1833     {
   1834         if (!p_cfg->flush_to)
   1835         {
   1836             p_cfg->flush_to = 0xFFFF;   /* Infinite retransmissions (spec default) */
   1837             flush_to_ok     = FALSE;
   1838         }
   1839         else    /* Save the accepted value in case of renegotiation */
   1840         {
   1841             p_ccb->peer_cfg.flush_to_present = TRUE;
   1842             p_ccb->peer_cfg.flush_to = p_cfg->flush_to;
   1843             p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_FLUSH_TO;
   1844         }
   1845     }
   1846     /* Reload flush_to from a previously accepted config request */
   1847     else if (p_ccb->peer_cfg.flush_to_present)
   1848     {
   1849         p_cfg->flush_to_present = TRUE;
   1850         p_cfg->flush_to = p_ccb->peer_cfg.flush_to;
   1851     }
   1852 
   1853     /* Save the QOS settings the the peer is using */
   1854     if (p_cfg->qos_present)
   1855     {
   1856         /* Make sure service type is not a reserved value; otherwise let upper
   1857            layer decide if acceptable
   1858         */
   1859         if (p_cfg->qos.service_type <= GUARANTEED)
   1860         {
   1861             p_ccb->peer_cfg.qos         = p_cfg->qos;
   1862             p_ccb->peer_cfg.qos_present = TRUE;
   1863             p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_QOS;
   1864         }
   1865         else    /* Illegal service type value */
   1866         {
   1867             p_cfg->qos.service_type = BEST_EFFORT;
   1868             qos_type_ok             = FALSE;
   1869         }
   1870     }
   1871     /* Reload QOS from a previously accepted config request */
   1872     else if (p_ccb->peer_cfg.qos_present)
   1873     {
   1874         p_cfg->qos_present = TRUE;
   1875         p_cfg->qos         = p_ccb->peer_cfg.qos;
   1876     }
   1877 
   1878     if ((fcr_status = l2c_fcr_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_DISCONNECT)
   1879     {
   1880         /* Notify caller to disconnect the channel (incompatible modes) */
   1881         p_cfg->result = L2CAP_CFG_FAILED_NO_REASON;
   1882         p_cfg->mtu_present = p_cfg->qos_present = p_cfg->flush_to_present = 0;
   1883 
   1884         return (L2CAP_PEER_CFG_DISCONNECT);
   1885     }
   1886 
   1887     fcr_ok = (fcr_status == L2CAP_PEER_CFG_OK);
   1888 
   1889     /* Return any unacceptable parameters */
   1890     if (mtu_ok && flush_to_ok && qos_type_ok && fcr_ok)
   1891     {
   1892         l2cu_adjust_out_mps (p_ccb);
   1893         return (L2CAP_PEER_CFG_OK);
   1894     }
   1895     else
   1896     {
   1897         p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS;
   1898 
   1899         if (mtu_ok)
   1900             p_cfg->mtu_present = FALSE;
   1901         if (flush_to_ok)
   1902             p_cfg->flush_to_present = FALSE;
   1903         if (qos_type_ok)
   1904             p_cfg->qos_present = FALSE;
   1905         if (fcr_ok)
   1906             p_cfg->fcr_present = FALSE;
   1907 
   1908         return (L2CAP_PEER_CFG_UNACCEPTABLE);
   1909     }
   1910 }
   1911 
   1912 
   1913 /*******************************************************************************
   1914 **
   1915 ** Function         l2cu_process_peer_cfg_rsp
   1916 **
   1917 ** Description      This function is called when the peer sends us a "config response"
   1918 **                  message. It extracts the configuration of interest and saves
   1919 **                  it in the CCB.
   1920 **
   1921 ** Returns          void
   1922 **
   1923 *******************************************************************************/
   1924 void l2cu_process_peer_cfg_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
   1925 {
   1926     /* If we wanted QoS and the peer sends us a positive response with QoS, use his values */
   1927     if ( (p_cfg->qos_present) && (p_ccb->our_cfg.qos_present) )
   1928         p_ccb->our_cfg.qos = p_cfg->qos;
   1929 
   1930     if (p_cfg->fcr_present)
   1931     {
   1932         /* Save the retransmission and monitor timeout values */
   1933         if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE)
   1934         {
   1935             p_ccb->peer_cfg.fcr.rtrans_tout = p_cfg->fcr.rtrans_tout;
   1936             p_ccb->peer_cfg.fcr.mon_tout = p_cfg->fcr.mon_tout;
   1937         }
   1938 
   1939         /* Calculate the max number of packets for which we can delay sending an ack */
   1940         if (p_cfg->fcr.tx_win_sz < p_ccb->our_cfg.fcr.tx_win_sz)
   1941             p_ccb->fcrb.max_held_acks = p_cfg->fcr.tx_win_sz / 3;
   1942         else
   1943             p_ccb->fcrb.max_held_acks = p_ccb->our_cfg.fcr.tx_win_sz / 3;
   1944 
   1945         L2CAP_TRACE_DEBUG3 ("l2cu_process_peer_cfg_rsp(): peer tx_win_sz: %d, our tx_win_sz: %d, max_held_acks: %d",
   1946                              p_cfg->fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz, p_ccb->fcrb.max_held_acks);
   1947     }
   1948 }
   1949 
   1950 /*******************************************************************************
   1951 **
   1952 ** Function         l2cu_process_our_cfg_req
   1953 **
   1954 ** Description      This function is called when we send a "config request"
   1955 **                  message. It extracts the configuration of interest and saves
   1956 **                  it in the CCB.
   1957 **
   1958 ** Returns          void
   1959 **
   1960 *******************************************************************************/
   1961 void l2cu_process_our_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
   1962 {
   1963     tL2C_LCB    *p_lcb;
   1964     UINT16      hci_flush_to;
   1965 
   1966     /* Save the QOS settings we are using for transmit */
   1967     if (p_cfg->qos_present)
   1968     {
   1969         p_ccb->our_cfg.qos_present = TRUE;
   1970         p_ccb->our_cfg.qos         = p_cfg->qos;
   1971     }
   1972 
   1973     if (p_cfg->fcr_present)
   1974     {
   1975         /* Override FCR options if attempting streaming or basic */
   1976         if (p_cfg->fcr.mode == L2CAP_FCR_BASIC_MODE)
   1977             memset(&p_cfg->fcr, 0, sizeof(tL2CAP_FCR_OPTS));
   1978         else
   1979         {
   1980             /* On BR/EDR, timer values are zero in config request */
   1981             /* On class 2 AMP, timer value in config request shall be non-0 processing time */
   1982             /*                 timer value in config response shall be greater than received processing time */
   1983             p_cfg->fcr.mon_tout = p_cfg->fcr.rtrans_tout = 0;
   1984 
   1985             if (p_cfg->fcr.mode == L2CAP_FCR_STREAM_MODE)
   1986                 p_cfg->fcr.max_transmit = p_cfg->fcr.tx_win_sz = 0;
   1987         }
   1988 
   1989         /* Set the threshold to send acks (may be updated in the cfg response) */
   1990         p_ccb->fcrb.max_held_acks = p_cfg->fcr.tx_win_sz / 3;
   1991 
   1992         /* Include FCS option only if peer can handle it */
   1993         if (p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_NO_CRC)
   1994         {
   1995             /* FCS check can be bypassed if peer also desires to bypass */
   1996             if (p_cfg->fcs_present && p_cfg->fcs == L2CAP_CFG_FCS_BYPASS)
   1997                 p_ccb->bypass_fcs |= L2CAP_CFG_FCS_OUR;
   1998         }
   1999         else
   2000             p_cfg->fcs_present = FALSE;
   2001     }
   2002     else
   2003     {
   2004         p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE;
   2005     }
   2006 
   2007     p_ccb->our_cfg.fcr.mode    = p_cfg->fcr.mode;
   2008     p_ccb->our_cfg.fcr_present = p_cfg->fcr_present;
   2009 
   2010     /* Check the flush timeout. If it is lower than the current one used */
   2011     /* then we need to adjust the flush timeout sent to the controller   */
   2012     if (p_cfg->flush_to_present)
   2013     {
   2014         if ((p_cfg->flush_to == 0)||(p_cfg->flush_to == L2CAP_NO_AUTOMATIC_FLUSH))
   2015         {
   2016             /* don't send invalid flush timeout */
   2017             /* SPEC: The sender of the Request shall specify its flush timeout value */
   2018             /*       if it differs from the default value of 0xFFFF                  */
   2019             p_cfg->flush_to_present = FALSE;
   2020         }
   2021         else
   2022         {
   2023             p_ccb->our_cfg.flush_to = p_cfg->flush_to;
   2024             p_lcb = p_ccb->p_lcb;
   2025 
   2026             if (p_cfg->flush_to < p_lcb->link_flush_tout)
   2027             {
   2028                 p_lcb->link_flush_tout = p_cfg->flush_to;
   2029 
   2030                 /* If the timeout is within range of HCI, set the flush timeout */
   2031                 if (p_cfg->flush_to <= ((HCI_MAX_AUTO_FLUSH_TOUT * 5) / 8))
   2032                 {
   2033                     /* Convert flush timeout to 0.625 ms units, with round */
   2034                     hci_flush_to = ((p_cfg->flush_to * 8) + 3) / 5;
   2035                     btsnd_hcic_write_auto_flush_tout (p_lcb->handle, hci_flush_to);
   2036                 }
   2037             }
   2038         }
   2039     }
   2040 }
   2041 
   2042 
   2043 /*******************************************************************************
   2044 **
   2045 ** Function         l2cu_process_our_cfg_rsp
   2046 **
   2047 ** Description      This function is called when we send the peer a "config response"
   2048 **                  message. It extracts the configuration of interest and saves
   2049 **                  it in the CCB.
   2050 **
   2051 ** Returns          void
   2052 **
   2053 *******************************************************************************/
   2054 void l2cu_process_our_cfg_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
   2055 {
   2056     /* If peer wants QoS, we are allowed to change the values in a positive response */
   2057     if ( (p_cfg->qos_present) && (p_ccb->peer_cfg.qos_present) )
   2058         p_ccb->peer_cfg.qos = p_cfg->qos;
   2059     else
   2060         p_cfg->qos_present = FALSE;
   2061 
   2062     l2c_fcr_adj_our_rsp_options (p_ccb, p_cfg);
   2063 }
   2064 
   2065 
   2066 /*******************************************************************************
   2067 **
   2068 ** Function         l2cu_device_reset
   2069 **
   2070 ** Description      This function is called when reset of the device is
   2071 **                  completed.  For all active connection simulate HCI_DISC
   2072 **
   2073 ** Returns          void
   2074 **
   2075 *******************************************************************************/
   2076 void l2cu_device_reset (void)
   2077 {
   2078     int         xx;
   2079     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
   2080 
   2081     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
   2082     {
   2083         if ((p_lcb->in_use) && (p_lcb->handle != HCI_INVALID_HANDLE))
   2084         {
   2085             l2c_link_hci_disc_comp (p_lcb->handle, (UINT8) -1);
   2086         }
   2087     }
   2088 #if (BLE_INCLUDED == TRUE)
   2089     l2cb.is_ble_connecting = FALSE;
   2090 #endif
   2091 }
   2092 
   2093 #if (TCS_WUG_MEMBER_INCLUDED == TRUE && TCS_INCLUDED == TRUE)
   2094 extern UINT16 tcs_wug_get_clk_offset( BD_ADDR addr ) ;
   2095 #endif
   2096 
   2097 /*******************************************************************************
   2098 **
   2099 ** Function         l2cu_create_conn
   2100 **
   2101 ** Description      This function initiates an acl connection via HCI
   2102 **
   2103 ** Returns          TRUE if successful, FALSE if gki get buffer fails.
   2104 **
   2105 *******************************************************************************/
   2106 BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb)
   2107 {
   2108     int             xx;
   2109     tL2C_LCB        *p_lcb_cur = &l2cb.lcb_pool[0];
   2110 #if BTM_SCO_INCLUDED == TRUE
   2111     BOOLEAN         is_sco_active;
   2112 #endif
   2113 
   2114 #if (BLE_INCLUDED == TRUE)
   2115     tBT_DEVICE_TYPE     dev_type;
   2116     tBLE_ADDR_TYPE      addr_type;
   2117 
   2118     BTM_ReadDevInfo(p_lcb->remote_bd_addr, &dev_type, &addr_type);
   2119 
   2120     if (dev_type == BT_DEVICE_TYPE_BLE)
   2121     {
   2122         if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
   2123             return FALSE;
   2124 
   2125         p_lcb->ble_addr_type = addr_type;
   2126         p_lcb->is_ble_link   = TRUE;
   2127 
   2128         return (l2cble_create_conn(p_lcb));
   2129     }
   2130 #endif
   2131 
   2132     /* If there is a connection where we perform as a slave, try to switch roles
   2133        for this connection */
   2134     for (xx = 0, p_lcb_cur = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb_cur++)
   2135     {
   2136         if (p_lcb_cur == p_lcb)
   2137             continue;
   2138 
   2139         if ((p_lcb_cur->in_use) && (p_lcb_cur->link_role == HCI_ROLE_SLAVE))
   2140         {
   2141 
   2142 #if BTM_SCO_INCLUDED == TRUE
   2143             /* The LMP_switch_req shall be sent only if the ACL logical transport
   2144             is in active mode, when encryption is disabled, and all synchronous
   2145             logical transports on the same physical link are disabled." */
   2146 
   2147             /* Check if there is any SCO Active on this BD Address */
   2148             is_sco_active = btm_is_sco_active_by_bdaddr(p_lcb_cur->remote_bd_addr);
   2149 
   2150             L2CAP_TRACE_API1 ("l2cu_create_conn - btm_is_sco_active_by_bdaddr() is_sco_active = %s", \
   2151                 (is_sco_active == TRUE) ? "TRUE":"FALSE");
   2152 
   2153             if (is_sco_active == TRUE)
   2154                 continue; /* No Master Slave switch not allowed when SCO Active */
   2155 #endif
   2156 
   2157             if (HCI_SWITCH_SUPPORTED(BTM_ReadLocalFeatures()))
   2158             {
   2159                 /* mark this lcb waiting for switch to be completed and
   2160                    start switch on the other one */
   2161                 p_lcb->link_state = LST_CONNECTING_WAIT_SWITCH;
   2162                 p_lcb->link_role  = HCI_ROLE_MASTER;
   2163 
   2164                 if (BTM_SwitchRole (p_lcb_cur->remote_bd_addr, HCI_ROLE_MASTER, NULL) == BTM_CMD_STARTED)
   2165                 {
   2166                     btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_ROLE_SWITCH_TOUT);
   2167                     return (TRUE);
   2168                 }
   2169             }
   2170         }
   2171     }
   2172 
   2173     p_lcb->link_state = LST_CONNECTING;
   2174 
   2175     return (l2cu_create_conn_after_switch (p_lcb));
   2176 }
   2177 
   2178 /*******************************************************************************
   2179 **
   2180 ** Function         l2cu_get_num_hi_priority
   2181 **
   2182 ** Description      Gets the number of high priority channels.
   2183 **
   2184 ** Returns
   2185 **
   2186 *******************************************************************************/
   2187 UINT8 l2cu_get_num_hi_priority (void)
   2188 {
   2189     UINT8       no_hi = 0;
   2190     int         xx;
   2191     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
   2192 
   2193     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
   2194     {
   2195         if ((p_lcb->in_use) && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH))
   2196         {
   2197             no_hi++;
   2198         }
   2199     }
   2200     return no_hi;
   2201 }
   2202 
   2203 
   2204 /*******************************************************************************
   2205 **
   2206 ** Function         l2cu_create_conn_after_switch
   2207 **
   2208 ** Description      This function initiates an acl connection via HCI
   2209 **                  If switch required to create connection it is already done.
   2210 **
   2211 ** Returns          TRUE if successful, FALSE if gki get buffer fails.
   2212 **
   2213 *******************************************************************************/
   2214 
   2215 BOOLEAN l2cu_create_conn_after_switch (tL2C_LCB *p_lcb)
   2216 {
   2217     UINT8            allow_switch = HCI_CR_CONN_ALLOW_SWITCH;
   2218     tBTM_INQ_INFO    *p_inq_info;
   2219     UINT8            page_scan_rep_mode;
   2220     UINT8            page_scan_mode;
   2221     UINT16           clock_offset;
   2222     UINT8            *p_features;
   2223     UINT16           num_acl = BTM_GetNumAclLinks();
   2224     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_lcb->remote_bd_addr);
   2225     UINT8            no_hi_prio_chs = l2cu_get_num_hi_priority();
   2226 
   2227     p_features = BTM_ReadLocalFeatures();
   2228 
   2229     L2CAP_TRACE_DEBUG4 ("l2cu_create_conn_after_switch :%d num_acl:%d no_hi: %d is_bonding:%d",
   2230         l2cb.disallow_switch, num_acl, no_hi_prio_chs, p_lcb->is_bonding);
   2231     /* FW team says that we can participant in 4 piconets
   2232      * typically 3 piconet + 1 for scanning.
   2233      * We can enhance the code to count the number of piconets later. */
   2234     if ( ((!l2cb.disallow_switch && (num_acl < 3)) || (p_lcb->is_bonding && (no_hi_prio_chs==0)))
   2235         && HCI_SWITCH_SUPPORTED(p_features))
   2236         allow_switch = HCI_CR_CONN_ALLOW_SWITCH;
   2237     else
   2238         allow_switch = HCI_CR_CONN_NOT_ALLOW_SWITCH;
   2239 
   2240     p_lcb->link_state = LST_CONNECTING;
   2241 
   2242 
   2243 #if (TCS_WUG_MEMBER_INCLUDED == TRUE && TCS_INCLUDED == TRUE)
   2244     if ( (clock_offset = tcs_wug_get_clk_offset( p_lcb->remote_bd_addr )) != 0 )
   2245     {
   2246         page_scan_rep_mode = HCI_PAGE_SCAN_REP_MODE_R0;
   2247         page_scan_mode = HCI_MANDATARY_PAGE_SCAN_MODE;
   2248     }
   2249     else
   2250     {
   2251 #endif
   2252 
   2253         /* Check with the BT manager if details about remote device are known */
   2254         if ((p_inq_info = BTM_InqDbRead(p_lcb->remote_bd_addr)) != NULL)
   2255         {
   2256             page_scan_rep_mode = p_inq_info->results.page_scan_rep_mode;
   2257             page_scan_mode = p_inq_info->results.page_scan_mode;
   2258             clock_offset = (UINT16)(p_inq_info->results.clock_offset);
   2259         }
   2260         else
   2261         {
   2262             /* No info known. Use default settings */
   2263             page_scan_rep_mode = HCI_PAGE_SCAN_REP_MODE_R1;
   2264             page_scan_mode = HCI_MANDATARY_PAGE_SCAN_MODE;
   2265 
   2266             clock_offset = (p_dev_rec) ? p_dev_rec->clock_offset : 0;
   2267         }
   2268 #if (TCS_WUG_MEMBER_INCLUDED == TRUE && TCS_INCLUDED == TRUE)
   2269     }
   2270 #endif
   2271 
   2272     if (!btsnd_hcic_create_conn (p_lcb->remote_bd_addr,
   2273                                  HCI_PKT_TYPES_MASK_DM1 + HCI_PKT_TYPES_MASK_DH1,
   2274                                  page_scan_rep_mode,
   2275                                  page_scan_mode,
   2276                                  clock_offset,
   2277                                  allow_switch))
   2278 
   2279     {
   2280         L2CAP_TRACE_ERROR0 ("L2CAP - no buffer for l2cu_create_conn");
   2281         l2cu_release_lcb (p_lcb);
   2282         return (FALSE);
   2283     }
   2284 
   2285 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   2286     btm_acl_update_busy_level (BTM_BLI_PAGE_EVT);
   2287 #endif
   2288 
   2289     btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK,
   2290                      L2CAP_LINK_CONNECT_TOUT);
   2291 
   2292     return (TRUE);
   2293 }
   2294 
   2295 
   2296 /*******************************************************************************
   2297 **
   2298 ** Function         l2cu_find_lcb_by_state
   2299 **
   2300 ** Description      Look through all active LCBs for a match based on the
   2301 **                  LCB state.
   2302 **
   2303 ** Returns          pointer to first matched LCB, or NULL if no match
   2304 **
   2305 *******************************************************************************/
   2306 tL2C_LCB *l2cu_find_lcb_by_state (tL2C_LINK_STATE state)
   2307 {
   2308     UINT16      i;
   2309     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
   2310 
   2311     for (i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++)
   2312     {
   2313         if ((p_lcb->in_use) && (p_lcb->link_state == state))
   2314         {
   2315             return (p_lcb);
   2316         }
   2317     }
   2318 
   2319     /* If here, no match found */
   2320     return (NULL);
   2321 }
   2322 
   2323 
   2324 /*******************************************************************************
   2325 **
   2326 ** Function         l2cu_lcb_disconnecting
   2327 **
   2328 ** Description      On each active lcb, check if the lcb is in disconnecting
   2329 **                  state, or if there are no ccb's on the lcb (implying
   2330                     idle timeout is running), or if last ccb on the link
   2331                     is in disconnecting state.
   2332 **
   2333 ** Returns          TRUE if any of above conditions met, FALSE otherwise
   2334 **
   2335 *******************************************************************************/
   2336 BOOLEAN l2cu_lcb_disconnecting (void)
   2337 {
   2338     tL2C_LCB    *p_lcb;
   2339     tL2C_CCB    *p_ccb;
   2340     UINT16      i;
   2341     BOOLEAN     status = FALSE;
   2342 
   2343     p_lcb = &l2cb.lcb_pool[0];
   2344 
   2345     for (i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++)
   2346     {
   2347         if (p_lcb->in_use)
   2348         {
   2349             /* no ccbs on lcb, or lcb is in disconnecting state */
   2350             if ((!p_lcb->ccb_queue.p_first_ccb) || (p_lcb->link_state == LST_DISCONNECTING))
   2351             {
   2352                 status = TRUE;
   2353                 break;
   2354             }
   2355             /* only one ccb left on lcb */
   2356             else if (p_lcb->ccb_queue.p_first_ccb == p_lcb->ccb_queue.p_last_ccb)
   2357             {
   2358                 p_ccb = p_lcb->ccb_queue.p_first_ccb;
   2359 
   2360                 if ((p_ccb->in_use) &&
   2361                     ((p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP) ||
   2362                      (p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP)))
   2363                 {
   2364                     status = TRUE;
   2365                     break;
   2366                 }
   2367             }
   2368         }
   2369     }
   2370     return status;
   2371 }
   2372 
   2373 
   2374 /*******************************************************************************
   2375 **
   2376 ** Function         l2cu_set_acl_priority
   2377 **
   2378 ** Description      Sets the transmission priority for a channel.
   2379 **                  (For initial implementation only two values are valid.
   2380 **                  L2CAP_PRIORITY_NORMAL and L2CAP_PRIORITY_HIGH).
   2381 **
   2382 ** Returns          TRUE if a valid channel, else FALSE
   2383 **
   2384 *******************************************************************************/
   2385 
   2386 BOOLEAN l2cu_set_acl_priority (BD_ADDR bd_addr, UINT8 priority, BOOLEAN reset_after_rs)
   2387 {
   2388     tL2C_LCB            *p_lcb;
   2389     UINT8               *pp;
   2390     UINT8                command[HCI_BRCM_ACL_PRIORITY_PARAM_SIZE];
   2391     UINT8                vs_param;
   2392 
   2393     APPL_TRACE_EVENT1("SET ACL PRIORITY %d", priority);
   2394 
   2395     /* Find the link control block for the acl channel */
   2396     if ((p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr)) == NULL)
   2397     {
   2398         L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_SetAclPriority");
   2399         return (FALSE);
   2400     }
   2401 
   2402     if (BTM_IS_BRCM_CONTROLLER())
   2403     {
   2404         /* Called from above L2CAP through API; send VSC if changed */
   2405         if ((!reset_after_rs && (priority != p_lcb->acl_priority)) ||
   2406               /* Called because of a master/slave role switch; if high resend VSC */
   2407             ( reset_after_rs && p_lcb->acl_priority == L2CAP_PRIORITY_HIGH))
   2408         {
   2409             pp = command;
   2410 
   2411             vs_param = (priority == L2CAP_PRIORITY_HIGH) ? HCI_BRCM_ACL_PRIORITY_HIGH : HCI_BRCM_ACL_PRIORITY_LOW;
   2412 
   2413             UINT16_TO_STREAM (pp, p_lcb->handle);
   2414             UINT8_TO_STREAM  (pp, vs_param);
   2415 
   2416             BTM_VendorSpecificCommand (HCI_BRCM_SET_ACL_PRIORITY, HCI_BRCM_ACL_PRIORITY_PARAM_SIZE, command, NULL);
   2417 
   2418             /* Adjust lmp buffer allocation for this channel if priority changed */
   2419             if (p_lcb->acl_priority != priority)
   2420             {
   2421                 p_lcb->acl_priority = priority;
   2422                 l2c_link_adjust_allocation();
   2423             }
   2424         }
   2425     }
   2426     return(TRUE);
   2427 }
   2428 
   2429 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
   2430 /******************************************************************************
   2431 **
   2432 ** Function         l2cu_set_non_flushable_pbf
   2433 **
   2434 ** Description      set L2CAP_PKT_START_NON_FLUSHABLE if controller supoorts
   2435 **
   2436 ** Returns          void
   2437 **
   2438 *******************************************************************************/
   2439 void l2cu_set_non_flushable_pbf (BOOLEAN is_supported)
   2440 {
   2441     if (is_supported)
   2442         l2cb.non_flushable_pbf = (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT);
   2443     else
   2444         l2cb.non_flushable_pbf = (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT);
   2445 }
   2446 #endif
   2447 
   2448 /*******************************************************************************
   2449 **
   2450 ** Function         l2cu_resubmit_pending_sec_req
   2451 **
   2452 ** Description      This function is called when required security procedures
   2453 **                  are completed and any pending requests can be re-submitted.
   2454 **
   2455 ** Returns          void
   2456 **
   2457 *******************************************************************************/
   2458 void l2cu_resubmit_pending_sec_req (BD_ADDR p_bda)
   2459 {
   2460     tL2C_LCB        *p_lcb;
   2461     tL2C_CCB        *p_ccb;
   2462     tL2C_CCB        *p_next_ccb;
   2463     int             xx;
   2464 
   2465     L2CAP_TRACE_DEBUG1 ("l2cu_resubmit_pending_sec_req  p_bda: 0x%08x", p_bda);
   2466 
   2467     /* If we are called with a BDA, only resubmit for that BDA */
   2468     if (p_bda)
   2469     {
   2470         p_lcb = l2cu_find_lcb_by_bd_addr (p_bda);
   2471 
   2472         /* If we don't have one, this is an error */
   2473         if (p_lcb)
   2474         {
   2475             /* For all channels, send the event through their FSMs */
   2476             for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
   2477             {
   2478                 p_next_ccb = p_ccb->p_next_ccb;
   2479                 l2c_csm_execute (p_ccb, L2CEVT_SEC_RE_SEND_CMD, NULL);
   2480             }
   2481         }
   2482         else
   2483         {
   2484             L2CAP_TRACE_WARNING0 ("l2cu_resubmit_pending_sec_req - unknown BD_ADDR");
   2485         }
   2486     }
   2487     else
   2488     {
   2489         /* No BDA pasesed in, so check all links */
   2490         for (xx = 0, p_lcb = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
   2491         {
   2492             if (p_lcb->in_use)
   2493             {
   2494                 /* For all channels, send the event through their FSMs */
   2495                 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
   2496                 {
   2497                     p_next_ccb = p_ccb->p_next_ccb;
   2498                     l2c_csm_execute (p_ccb, L2CEVT_SEC_RE_SEND_CMD, NULL);
   2499                 }
   2500             }
   2501         }
   2502     }
   2503 }
   2504 
   2505 #if L2CAP_CONFORMANCE_TESTING == TRUE
   2506 /*******************************************************************************
   2507 **
   2508 ** Function         l2cu_set_info_rsp_mask
   2509 **
   2510 ** Description      This function allows the script wrapper to change the
   2511 **                  info resp mask for conformance testing.
   2512 **
   2513 ** Returns          pointer to CCB, or NULL if none
   2514 **
   2515 *******************************************************************************/
   2516 void l2cu_set_info_rsp_mask (UINT32 mask)
   2517 {
   2518     l2cb.test_info_resp = mask;
   2519 }
   2520 #endif  /* L2CAP_CONFORMANCE_TESTING */
   2521 
   2522 /*******************************************************************************
   2523 **
   2524 ** Function         l2cu_adjust_out_mps
   2525 **
   2526 ** Description      Sets our MPS based on current controller capabilities
   2527 **
   2528 ** Returns          void
   2529 **
   2530 *******************************************************************************/
   2531 void l2cu_adjust_out_mps (tL2C_CCB *p_ccb)
   2532 {
   2533     UINT16 packet_size;
   2534 
   2535     /* on the tx side MTU is selected based on packet size of the controller */
   2536     packet_size = btm_get_max_packet_size (p_ccb->p_lcb->remote_bd_addr);
   2537 
   2538     if (packet_size <= (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + L2CAP_FCS_LEN))
   2539     {
   2540         /* something is very wrong */
   2541         L2CAP_TRACE_ERROR2 ("l2cu_adjust_out_mps bad packet size: %u  will use MPS: %u", packet_size, p_ccb->peer_cfg.fcr.mps);
   2542         p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
   2543     }
   2544     else
   2545     {
   2546         packet_size -= (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + L2CAP_FCS_LEN);
   2547 
   2548         /* We try to negotiate MTU that each packet can be split into whole
   2549         number of max packets.  For example if link is 1.2 max packet size is 339 bytes.
   2550         At first calculate how many whole packets it is.  MAX L2CAP is 1691 + 4 overhead.
   2551         1695, that will be 5 Dh5 packets.  Now maximum L2CAP packet is
   2552         5 * 339 = 1695. Minus 4 bytes L2CAP header 1691.
   2553 
   2554         For EDR 2.0 packet size is 1027.  So we better send RFCOMM packet as 1 3DH5 packet
   2555         1 * 1027 = 1027.  Minus 4 bytes L2CAP header 1023.  */
   2556         if (p_ccb->peer_cfg.fcr.mps >= packet_size)
   2557             p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps / packet_size * packet_size;
   2558         else
   2559             p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
   2560 
   2561         L2CAP_TRACE_DEBUG3 ("l2cu_adjust_out_mps use %d   Based on peer_cfg.fcr.mps: %u  packet_size: %u",
   2562                             p_ccb->tx_mps, p_ccb->peer_cfg.fcr.mps, packet_size);
   2563     }
   2564 }
   2565 
   2566 
   2567 /*******************************************************************************
   2568 **
   2569 ** Function         l2cu_initialize_fixed_ccb
   2570 **
   2571 ** Description      Initialize a fixed channel's CCB
   2572 **
   2573 ** Returns          TRUE or FALSE
   2574 **
   2575 *******************************************************************************/
   2576 BOOLEAN l2cu_initialize_fixed_ccb (tL2C_LCB *p_lcb, UINT16 fixed_cid, tL2CAP_FCR_OPTS *p_fcr)
   2577 {
   2578 #if (L2CAP_NUM_FIXED_CHNLS > 0)
   2579     tL2C_CCB    *p_ccb;
   2580 
   2581     /* If we already have a CCB, then simply return */
   2582     if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] != NULL)
   2583         return (TRUE);
   2584 
   2585     if ((p_ccb = l2cu_allocate_ccb (NULL, 0)) == NULL)
   2586         return (FALSE);
   2587 
   2588     btu_stop_timer(&p_lcb->timer_entry);
   2589 
   2590     /* Set CID for the connection */
   2591     p_ccb->local_cid  = fixed_cid;
   2592     p_ccb->remote_cid = fixed_cid;
   2593 
   2594     GKI_init_q (&p_ccb->xmit_hold_q);
   2595 
   2596     p_ccb->is_flushable = FALSE;
   2597 
   2598     p_ccb->timer_entry.param  = (TIMER_PARAM_TYPE)p_ccb;
   2599 
   2600 
   2601     if (p_fcr)
   2602     {
   2603         /* Set the FCR parameters. For now, we will use default pools */
   2604         p_ccb->our_cfg.fcr = p_ccb->peer_cfg.fcr = *p_fcr;
   2605 
   2606         p_ccb->ertm_info.fcr_rx_pool_id  = HCI_ACL_POOL_ID;
   2607         p_ccb->ertm_info.fcr_tx_pool_id  = HCI_ACL_POOL_ID;
   2608         p_ccb->ertm_info.user_rx_pool_id = HCI_ACL_POOL_ID;
   2609         p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID;
   2610 
   2611         p_ccb->fcrb.max_held_acks = p_fcr->tx_win_sz / 3;
   2612     }
   2613 
   2614     /* Link ccb to lcb and lcb to ccb */
   2615     p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] = p_ccb;
   2616     p_ccb->p_lcb = p_lcb;
   2617 
   2618     /* There is no configuration, so if the link is up, the channel is up */
   2619     if (p_lcb->link_state == LST_CONNECTED)
   2620         p_ccb->chnl_state = CST_OPEN;
   2621 
   2622     /* Set the default idle timeout value to use */
   2623     p_ccb->fixed_chnl_idle_tout = l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].default_idle_tout;
   2624 #endif
   2625     return (TRUE);
   2626 }
   2627 
   2628 /*******************************************************************************
   2629 **
   2630 ** Function         l2cu_no_dynamic_ccbs
   2631 **
   2632 ** Description      Handles the case when there are no more dynamic CCBs. If there
   2633 **                  are any fixed CCBs, start the longest of the fixed CCB timeouts,
   2634 **                  otherwise start the default link idle timeout or disconnect.
   2635 **
   2636 ** Returns          void
   2637 **
   2638 *******************************************************************************/
   2639 void l2cu_no_dynamic_ccbs (tL2C_LCB *p_lcb)
   2640 {
   2641     tBTM_STATUS     rc;
   2642     UINT16          timeout = p_lcb->idle_timeout;
   2643 
   2644 #if (L2CAP_NUM_FIXED_CHNLS > 0)
   2645     int         xx;
   2646 
   2647     for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
   2648     {
   2649         if ( (p_lcb->p_fixed_ccbs[xx] != NULL) && (p_lcb->p_fixed_ccbs[xx]->fixed_chnl_idle_tout > timeout) )
   2650             timeout = p_lcb->p_fixed_ccbs[xx]->fixed_chnl_idle_tout;
   2651     }
   2652 #endif
   2653 
   2654     /* If the link is pairing, do not mess with the timeouts */
   2655     if (p_lcb->is_bonding)
   2656         return;
   2657 
   2658     if (timeout == 0)
   2659     {
   2660         L2CAP_TRACE_DEBUG0 ("l2cu_no_dynamic_ccbs() IDLE timer 0, disconnecting link");
   2661 
   2662         rc = btm_sec_disconnect (p_lcb->handle, HCI_ERR_PEER_USER);
   2663         if (rc == BTM_CMD_STARTED)
   2664         {
   2665             p_lcb->link_state = LST_DISCONNECTING;
   2666             timeout = L2CAP_LINK_DISCONNECT_TOUT;
   2667         }
   2668         else if (rc == BTM_SUCCESS)
   2669         {
   2670             /* BTM SEC will make sure that link is release (probably after pairing is done) */
   2671             p_lcb->link_state = LST_DISCONNECTING;
   2672             timeout = 0xFFFF;
   2673         }
   2674         else if ( (p_lcb->is_bonding)
   2675             &&   (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) )
   2676         {
   2677             p_lcb->link_state = LST_DISCONNECTING;
   2678             timeout = L2CAP_LINK_DISCONNECT_TOUT;
   2679         }
   2680         else
   2681         {
   2682             /* probably no buffer to send disconnect */
   2683             timeout = BT_1SEC_TIMEOUT;
   2684         }
   2685     }
   2686 
   2687     if (timeout != 0xFFFF)
   2688     {
   2689         L2CAP_TRACE_DEBUG1 ("l2cu_no_dynamic_ccbs() starting IDLE timeout: %d", timeout);
   2690         btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, timeout);
   2691     }
   2692     else
   2693     {
   2694         btu_stop_timer(&p_lcb->timer_entry);
   2695     }
   2696 }
   2697 
   2698 #if (L2CAP_NUM_FIXED_CHNLS > 0)
   2699 /*******************************************************************************
   2700 **
   2701 ** Function         l2cu_process_fixed_chnl_resp
   2702 **
   2703 ** Description      handle a fixed channel response (or lack thereof)
   2704 **                  if the link failed, or a fixed channel response was
   2705 **                  not received, the bitfield is all zeros.
   2706 **
   2707 *******************************************************************************/
   2708 void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb)
   2709 {
   2710     int     xx;
   2711 #if BLE_INCLUDED == TRUE
   2712     UINT16  reason = (p_lcb->is_ble_link ) ? 1 : 0;
   2713 #else
   2714     UINT16 reason =0;
   2715 #endif
   2716 
   2717     /* Tell all registered fixed channels about the connection */
   2718     for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
   2719     {
   2720         if (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL)
   2721         {
   2722             if (p_lcb->peer_chnl_mask[0] & (1 << (xx + L2CAP_FIRST_FIXED_CHNL)))
   2723             {
   2724                 if (p_lcb->p_fixed_ccbs[xx])
   2725                     p_lcb->p_fixed_ccbs[xx]->chnl_state = CST_OPEN;
   2726 
   2727                 (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, reason);
   2728             }
   2729             else
   2730             {
   2731                 (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
   2732 
   2733                 if (p_lcb->p_fixed_ccbs[xx])
   2734                 {
   2735                     l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
   2736                     p_lcb->p_fixed_ccbs[xx] = NULL;
   2737                 }
   2738             }
   2739         }
   2740     }
   2741 }
   2742 #endif
   2743 
   2744 #if (BLE_INCLUDED == TRUE)
   2745 /*******************************************************************************
   2746 **
   2747 ** Function         l2cu_send_peer_ble_par_req
   2748 **
   2749 ** Description      Build and send a BLE parameter update request message
   2750 **                  to the peer.
   2751 **
   2752 ** Returns          void
   2753 **
   2754 *******************************************************************************/
   2755 void l2cu_send_peer_ble_par_req (tL2C_LCB *p_lcb, UINT16 min_int, UINT16 max_int, UINT16 latency, UINT16 timeout)
   2756 {
   2757     BT_HDR  *p_buf;
   2758     UINT8   *p;
   2759 
   2760     /* Create an identifier for this packet */
   2761     p_lcb->id++;
   2762     l2cu_adj_id (p_lcb, L2CAP_ADJ_ID);
   2763 
   2764     if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_REQ_LEN, L2CAP_CMD_BLE_UPDATE_REQ, p_lcb->id)) == NULL )
   2765     {
   2766         L2CAP_TRACE_WARNING0 ("l2cu_send_peer_ble_par_req - no buffer");
   2767         return;
   2768     }
   2769 
   2770     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE +
   2771                                L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
   2772 
   2773     UINT16_TO_STREAM (p, min_int);
   2774     UINT16_TO_STREAM (p, max_int);
   2775     UINT16_TO_STREAM (p, latency);
   2776     UINT16_TO_STREAM (p, timeout);
   2777 
   2778     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
   2779 }
   2780 
   2781 /*******************************************************************************
   2782 **
   2783 ** Function         l2cu_send_peer_ble_par_rsp
   2784 **
   2785 ** Description      Build and send a BLE parameter update response message
   2786 **                  to the peer.
   2787 **
   2788 ** Returns          void
   2789 **
   2790 *******************************************************************************/
   2791 void l2cu_send_peer_ble_par_rsp (tL2C_LCB *p_lcb, UINT16 reason, UINT8 rem_id)
   2792 {
   2793     BT_HDR  *p_buf;
   2794     UINT8   *p;
   2795 
   2796     if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_RSP_LEN, L2CAP_CMD_BLE_UPDATE_RSP, rem_id)) == NULL )
   2797     {
   2798         L2CAP_TRACE_WARNING0 ("l2cu_send_peer_ble_par_rsp - no buffer");
   2799         return;
   2800     }
   2801 
   2802     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE +
   2803                                L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
   2804 
   2805     UINT16_TO_STREAM (p, reason);
   2806 
   2807     l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
   2808 }
   2809 
   2810 #endif /* BLE_INCLUDED == TRUE */
   2811 
   2812 
   2813 /*******************************************************************************
   2814 ** Functions used by both Full and Light Stack
   2815 ********************************************************************************/
   2816 
   2817 /*******************************************************************************
   2818 **
   2819 ** Function         l2cu_find_lcb_by_handle
   2820 **
   2821 ** Description      Look through all active LCBs for a match based on the
   2822 **                  HCI handle.
   2823 **
   2824 ** Returns          pointer to matched LCB, or NULL if no match
   2825 **
   2826 *******************************************************************************/
   2827 tL2C_LCB  *l2cu_find_lcb_by_handle (UINT16 handle)
   2828 {
   2829     int         xx;
   2830     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
   2831 
   2832     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
   2833     {
   2834         if ((p_lcb->in_use) && (p_lcb->handle == handle))
   2835         {
   2836             return (p_lcb);
   2837         }
   2838     }
   2839 
   2840     /* If here, no match found */
   2841     return (NULL);
   2842 }
   2843 
   2844 /*******************************************************************************
   2845 **
   2846 ** Function         l2cu_find_ccb_by_cid
   2847 **
   2848 ** Description      Look through all active CCBs on a link for a match based
   2849 **                  on the local CID. If passed the link pointer is NULL, all
   2850 **                  active links are searched.
   2851 **
   2852 ** Returns          pointer to matched CCB, or NULL if no match
   2853 **
   2854 *******************************************************************************/
   2855 tL2C_CCB *l2cu_find_ccb_by_cid (tL2C_LCB *p_lcb, UINT16 local_cid)
   2856 {
   2857     tL2C_CCB    *p_ccb = NULL;
   2858 #if (L2CAP_UCD_INCLUDED == TRUE)
   2859     UINT8 xx;
   2860 #endif
   2861 
   2862     if (local_cid >= L2CAP_BASE_APPL_CID)
   2863     {
   2864         /* find the associated CCB by "index" */
   2865         local_cid -= L2CAP_BASE_APPL_CID;
   2866 
   2867         if (local_cid >= MAX_L2CAP_CHANNELS)
   2868             return NULL;
   2869 
   2870         p_ccb = l2cb.ccb_pool + local_cid;
   2871 
   2872         /* make sure the CCB is in use */
   2873         if (!p_ccb->in_use)
   2874         {
   2875             p_ccb = NULL;
   2876         }
   2877         /* make sure it's for the same LCB */
   2878         else if (p_lcb && p_lcb != p_ccb->p_lcb)
   2879         {
   2880             p_ccb = NULL;
   2881         }
   2882     }
   2883 #if (L2CAP_UCD_INCLUDED == TRUE)
   2884     else
   2885     {
   2886         /* searching fixed channel */
   2887         p_ccb = l2cb.ccb_pool;
   2888         for ( xx = 0; xx < MAX_L2CAP_CHANNELS; xx++ )
   2889         {
   2890             if ((p_ccb->local_cid == local_cid)
   2891               &&(p_ccb->in_use)
   2892               &&(p_lcb == p_ccb->p_lcb))
   2893                 break;
   2894             else
   2895                 p_ccb++;
   2896         }
   2897         if ( xx >= MAX_L2CAP_CHANNELS )
   2898             return NULL;
   2899     }
   2900 #endif
   2901 
   2902     return (p_ccb);
   2903 }
   2904 
   2905 #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE)
   2906 
   2907 /******************************************************************************
   2908 **
   2909 ** Function         l2cu_get_next_channel_in_rr
   2910 **
   2911 ** Description      get the next channel to send on a link. It also adjusts the
   2912 **                  CCB queue to do a basic priority and round-robin scheduling.
   2913 **
   2914 ** Returns          pointer to CCB or NULL
   2915 **
   2916 *******************************************************************************/
   2917 static tL2C_CCB *l2cu_get_next_channel_in_rr(tL2C_LCB *p_lcb)
   2918 {
   2919     tL2C_CCB    *p_serve_ccb = NULL;
   2920     tL2C_CCB    *p_ccb;
   2921 
   2922     int i, j;
   2923 
   2924     /* scan all of priority until finding a channel to serve */
   2925     for ( i = 0; (i < L2CAP_NUM_CHNL_PRIORITY)&&(!p_serve_ccb); i++ )
   2926     {
   2927         /* scan all channel within serving priority group until finding a channel to serve */
   2928         for ( j = 0; (j < p_lcb->rr_serv[p_lcb->rr_pri].num_ccb)&&(!p_serve_ccb); j++)
   2929         {
   2930             /* scaning from next serving channel */
   2931             p_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb;
   2932 
   2933             if (!p_ccb)
   2934             {
   2935                 L2CAP_TRACE_ERROR1("p_serve_ccb is NULL, rr_pri=%d", p_lcb->rr_pri);
   2936                 return NULL;
   2937             }
   2938 
   2939             L2CAP_TRACE_DEBUG3("RR scan pri=%d, lcid=0x%04x, q_cout=%d",
   2940                                 p_ccb->ccb_priority, p_ccb->local_cid, p_ccb->xmit_hold_q.count );
   2941 
   2942             /* store the next serving channel */
   2943             /* this channel is the last channel of its priority group */
   2944             if (( p_ccb->p_next_ccb == NULL )
   2945               ||( p_ccb->p_next_ccb->ccb_priority != p_ccb->ccb_priority ))
   2946             {
   2947                 /* next serving channel is set to the first channel in the group */
   2948                 p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_first_ccb;
   2949             }
   2950             else
   2951             {
   2952                 /* next serving channel is set to the next channel in the group */
   2953                 p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb = p_ccb->p_next_ccb;
   2954             }
   2955 
   2956             if (p_ccb->chnl_state != CST_OPEN)
   2957                 continue;
   2958 
   2959             /* eL2CAP option in use */
   2960             if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
   2961             {
   2962                 if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
   2963                     continue;
   2964 
   2965                 if ( p_ccb->fcrb.retrans_q.count == 0 )
   2966                 {
   2967                     if ( p_ccb->xmit_hold_q.count == 0 )
   2968                         continue;
   2969 
   2970                     /* If using the common pool, should be at least 10% free. */
   2971                     if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
   2972                         continue;
   2973 
   2974                     /* If in eRTM mode, check for window closure */
   2975                     if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
   2976                         continue;
   2977                 }
   2978             }
   2979             else
   2980             {
   2981                 if (p_ccb->xmit_hold_q.count == 0)
   2982                     continue;
   2983             }
   2984 
   2985             /* found a channel to serve */
   2986             p_serve_ccb = p_ccb;
   2987             /* decrease quota of its priority group */
   2988             p_lcb->rr_serv[p_lcb->rr_pri].quota--;
   2989         }
   2990 
   2991         /* if there is no more quota of the priority group or no channel to have data to send */
   2992         if ((p_lcb->rr_serv[p_lcb->rr_pri].quota == 0)||(!p_serve_ccb))
   2993         {
   2994             /* serve next priority group */
   2995             p_lcb->rr_pri = (p_lcb->rr_pri + 1) % L2CAP_NUM_CHNL_PRIORITY;
   2996             /* initialize its quota */
   2997             p_lcb->rr_serv[p_lcb->rr_pri].quota = L2CAP_GET_PRIORITY_QUOTA(p_lcb->rr_pri);
   2998         }
   2999     }
   3000 
   3001     if (p_serve_ccb)
   3002     {
   3003         L2CAP_TRACE_DEBUG3("RR service pri=%d, quota=%d, lcid=0x%04x",
   3004                             p_serve_ccb->ccb_priority,
   3005                             p_lcb->rr_serv[p_serve_ccb->ccb_priority].quota,
   3006                             p_serve_ccb->local_cid );
   3007     }
   3008 
   3009     return p_serve_ccb;
   3010 }
   3011 
   3012 #else /* (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE) */
   3013 
   3014 /******************************************************************************
   3015 **
   3016 ** Function         l2cu_get_next_channel
   3017 **
   3018 ** Description      get the next channel to send on a link bassed on priority
   3019 **                  scheduling.
   3020 **
   3021 ** Returns          pointer to CCB or NULL
   3022 **
   3023 *******************************************************************************/
   3024 static tL2C_CCB *l2cu_get_next_channel(tL2C_LCB *p_lcb)
   3025 {
   3026     tL2C_CCB    *p_ccb;
   3027 
   3028     /* Get the first CCB with data to send.
   3029     */
   3030     for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
   3031     {
   3032         if (p_ccb->chnl_state != CST_OPEN)
   3033             continue;
   3034 
   3035         if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
   3036             continue;
   3037 
   3038         if (p_ccb->fcrb.retrans_q.count != 0)
   3039             return p_ccb;
   3040 
   3041         if (p_ccb->xmit_hold_q.count == 0)
   3042             continue;
   3043 
   3044         /* If using the common pool, should be at least 10% free. */
   3045         if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
   3046             continue;
   3047 
   3048         /* If in eRTM mode, check for window closure */
   3049         if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
   3050             continue;
   3051 
   3052         /* If here, we found someone */
   3053         return p_ccb;
   3054     }
   3055 
   3056     return NULL;
   3057 }
   3058 #endif /* (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE) */
   3059 
   3060 /******************************************************************************
   3061 **
   3062 ** Function         l2cu_get_next_buffer_to_send
   3063 **
   3064 ** Description      get the next buffer to send on a link. It also adjusts the
   3065 **                  CCB queue to do a basic priority and round-robin scheduling.
   3066 **
   3067 ** Returns          pointer to buffer or NULL
   3068 **
   3069 *******************************************************************************/
   3070 BT_HDR *l2cu_get_next_buffer_to_send (tL2C_LCB *p_lcb)
   3071 {
   3072     tL2C_CCB    *p_ccb;
   3073     BT_HDR      *p_buf;
   3074 
   3075     /* Highest priority are fixed channels */
   3076 #if (L2CAP_NUM_FIXED_CHNLS > 0)
   3077     int         xx;
   3078 
   3079     for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
   3080     {
   3081         if ((p_ccb = p_lcb->p_fixed_ccbs[xx]) == NULL)
   3082             continue;
   3083 
   3084         /* eL2CAP option in use */
   3085         if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
   3086         {
   3087             if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
   3088                 continue;
   3089 
   3090             /* No more checks needed if sending from the reatransmit queue */
   3091             if (p_ccb->fcrb.retrans_q.count == 0)
   3092             {
   3093                 if (p_ccb->xmit_hold_q.count == 0)
   3094                     continue;
   3095 
   3096                 /* If using the common pool, should be at least 10% free. */
   3097                 if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
   3098                     continue;
   3099 
   3100                 /* If in eRTM mode, check for window closure */
   3101                 if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
   3102                     continue;
   3103             }
   3104 
   3105             if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) != NULL)
   3106             {
   3107                 l2cu_set_acl_hci_header (p_buf, p_ccb);
   3108                 return (p_buf);
   3109             }
   3110         }
   3111         else
   3112         {
   3113             if (p_ccb->xmit_hold_q.count != 0)
   3114             {
   3115                 p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
   3116                 if(NULL == p_buf)
   3117                 {
   3118                     L2CAP_TRACE_ERROR0("l2cu_get_buffer_to_send: No data to be sent");
   3119                     return (NULL);
   3120                 }
   3121                 l2cu_set_acl_hci_header (p_buf, p_ccb);
   3122                 return (p_buf);
   3123             }
   3124         }
   3125     }
   3126 #endif
   3127 
   3128 #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE)
   3129     /* get next serving channel in round-robin */
   3130     p_ccb  = l2cu_get_next_channel_in_rr( p_lcb );
   3131 #else
   3132     p_ccb  = l2cu_get_next_channel( p_lcb );
   3133 #endif
   3134 
   3135     /* Return if no buffer */
   3136     if (p_ccb == NULL)
   3137         return (NULL);
   3138 
   3139     if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
   3140     {
   3141         if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) == NULL)
   3142             return (NULL);
   3143     }
   3144     else
   3145     {
   3146         p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
   3147         if(NULL == p_buf)
   3148         {
   3149             L2CAP_TRACE_ERROR0("l2cu_get_buffer_to_send() #2: No data to be sent");
   3150             return (NULL);
   3151         }
   3152     }
   3153 
   3154     if ( p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_TxComplete_Cb && (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) )
   3155         (*p_ccb->p_rcb->api.pL2CA_TxComplete_Cb)(p_ccb->local_cid, 1);
   3156 
   3157 
   3158     l2cu_check_channel_congestion (p_ccb);
   3159 
   3160     l2cu_set_acl_hci_header (p_buf, p_ccb);
   3161 
   3162     return (p_buf);
   3163 }
   3164 
   3165 /******************************************************************************
   3166 **
   3167 ** Function         l2cu_set_acl_hci_header
   3168 **
   3169 ** Description      Set HCI handle for ACL packet
   3170 **
   3171 ** Returns          None
   3172 **
   3173 *******************************************************************************/
   3174 void l2cu_set_acl_hci_header (BT_HDR *p_buf, tL2C_CCB *p_ccb)
   3175 {
   3176     UINT8       *p;
   3177 
   3178     /* Set the pointer to the beginning of the data minus 4 bytes for the packet header */
   3179     p = (UINT8 *)(p_buf + 1) + p_buf->offset - HCI_DATA_PREAMBLE_SIZE;
   3180 
   3181 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
   3182     if ( (((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_CH_BASED) && (p_ccb->is_flushable))
   3183             || ((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_PKT) )
   3184     {
   3185         UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
   3186     }
   3187     else
   3188     {
   3189         UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf);
   3190     }
   3191 #else
   3192     UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
   3193 #endif
   3194 #if (BLE_INCLUDED == TRUE)
   3195     if (p_ccb->p_lcb->is_ble_link)
   3196     {
   3197         /* The HCI transport will segment the buffers. */
   3198         if (p_buf->len > btu_cb.hcit_ble_acl_data_size)
   3199         {
   3200             UINT16_TO_STREAM (p, btu_cb.hcit_ble_acl_data_size);
   3201         }
   3202         else
   3203         {
   3204             UINT16_TO_STREAM (p, p_buf->len);
   3205         }
   3206     } /* (BLE_INCLUDED == TRUE) */
   3207     else
   3208 #endif
   3209     {
   3210 
   3211         /* The HCI transport will segment the buffers. */
   3212         if (p_buf->len > btu_cb.hcit_acl_data_size)
   3213         {
   3214             UINT16_TO_STREAM (p, btu_cb.hcit_acl_data_size);
   3215         }
   3216         else
   3217         {
   3218             UINT16_TO_STREAM (p, p_buf->len);
   3219         }
   3220     }
   3221     p_buf->offset -= HCI_DATA_PREAMBLE_SIZE;
   3222     p_buf->len    += HCI_DATA_PREAMBLE_SIZE;
   3223 }
   3224 
   3225 /******************************************************************************
   3226 **
   3227 ** Function         l2cu_check_channel_congestion
   3228 **
   3229 ** Description      check if any change in congestion status
   3230 **
   3231 ** Returns          None
   3232 **
   3233 *******************************************************************************/
   3234 void l2cu_check_channel_congestion (tL2C_CCB *p_ccb)
   3235 {
   3236     UINT16 q_count = p_ccb->xmit_hold_q.count;
   3237 
   3238 #if (L2CAP_UCD_INCLUDED == TRUE)
   3239     if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
   3240     {
   3241         q_count += p_ccb->p_lcb->ucd_out_sec_pending_q.count;
   3242     }
   3243 #endif
   3244 
   3245     /* If the CCB queue limit is subject to a quota, check for congestion */
   3246 
   3247     /* if this channel has outgoing traffic */
   3248     if ((p_ccb->p_rcb)&&(p_ccb->buff_quota != 0))
   3249     {
   3250         /* If this channel was congested */
   3251         if ( p_ccb->cong_sent )
   3252         {
   3253             /* If the channel is not congested now, tell the app */
   3254             if (q_count <= (p_ccb->buff_quota / 2))
   3255             {
   3256                 p_ccb->cong_sent = FALSE;
   3257                 if (p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
   3258                 {
   3259                     L2CAP_TRACE_DEBUG3 ("L2CAP - Calling CongestionStatus_Cb (FALSE), CID: 0x%04x  xmit_hold_q.count: %u  buff_quota: %u",
   3260                                       p_ccb->local_cid, q_count, p_ccb->buff_quota);
   3261 
   3262                     /* Prevent recursive calling */
   3263                     l2cb.is_cong_cback_context = TRUE;
   3264                     (*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, FALSE);
   3265                     l2cb.is_cong_cback_context = FALSE;
   3266                 }
   3267 #if (L2CAP_UCD_INCLUDED == TRUE)
   3268                 else if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
   3269                 {
   3270                     if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
   3271                     {
   3272                         L2CAP_TRACE_DEBUG3 ("L2CAP - Calling UCD CongestionStatus_Cb (FALSE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
   3273                                              p_ccb->p_lcb->ucd_out_sec_pending_q.count,
   3274                                              p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
   3275                         p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, FALSE );
   3276                     }
   3277                 }
   3278 #endif
   3279             }
   3280         }
   3281         else
   3282         {
   3283             /* If this channel was not congested but it is congested now, tell the app */
   3284             if (q_count > p_ccb->buff_quota)
   3285             {
   3286                 p_ccb->cong_sent = TRUE;
   3287                 if (p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
   3288                 {
   3289                     L2CAP_TRACE_DEBUG3 ("L2CAP - Calling CongestionStatus_Cb (TRUE),CID:0x%04x,XmitQ:%u,Quota:%u",
   3290                         p_ccb->local_cid, q_count, p_ccb->buff_quota);
   3291 
   3292                     (*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, TRUE);
   3293                 }
   3294 #if (L2CAP_UCD_INCLUDED == TRUE)
   3295                 else if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
   3296                 {
   3297                     if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
   3298                     {
   3299                         L2CAP_TRACE_DEBUG3 ("L2CAP - Calling UCD CongestionStatus_Cb (TRUE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
   3300                                              p_ccb->p_lcb->ucd_out_sec_pending_q.count,
   3301                                              p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
   3302                         p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, TRUE );
   3303                     }
   3304                 }
   3305 #endif
   3306             }
   3307         }
   3308     }
   3309 }
   3310 
   3311