15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains the L2CAP channel state machine
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_closed (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_orig_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2cap_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2ca_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_open (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2cap_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2ca_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data);
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *l2c_csm_get_event_name (UINT16 event);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_execute
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function executes the state machine.
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_csm_execute (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_ccb->chnl_state)
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_CLOSED:
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_closed (p_ccb, event, p_data);
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_ORIG_W4_SEC_COMP:
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_orig_w4_sec_comp (p_ccb, event, p_data);
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_TERM_W4_SEC_COMP:
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_term_w4_sec_comp (p_ccb, event, p_data);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_W4_L2CAP_CONNECT_RSP:
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_w4_l2cap_connect_rsp (p_ccb, event, p_data);
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_W4_L2CA_CONNECT_RSP:
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_w4_l2ca_connect_rsp (p_ccb, event, p_data);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_CONFIG:
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_config (p_ccb, event, p_data);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_OPEN:
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_open (p_ccb, event, p_data);
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_W4_L2CAP_DISCONNECT_RSP:
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_w4_l2cap_disconnect_rsp (p_ccb, event, p_data);
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_W4_L2CA_DISCONNECT_RSP:
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_w4_l2ca_disconnect_rsp (p_ccb, event, p_data);
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
1068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz        L2CAP_TRACE_DEBUG("Unhandled event! event = %d",event);
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_closed
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CLOSED state. This state exists only when the link is
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  being initially established.
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_closed (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CONN_INFO          *p_ci = (tL2C_CONN_INFO *)p_data;
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind;
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_CONNECT_CFM_CB    *connect_cfm;
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_rcb == NULL)
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
132a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: %s p_rcb == NULL", p_ccb->local_cid, l2c_csm_get_event_name (event));
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
134a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: 0x%04x p_rcb == NULL", p_ccb->local_cid, event);
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( local_cid == L2CAP_CONNECTIONLESS_CID )
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if this event can be processed by UCD */
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_process_event (p_ccb, event, p_data) )
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The event is processed by UCD state machine */
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    connect_cfm    = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
155a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
157a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: CLOSED evt: %d", event);
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
163a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM:                         /* Link came up         */
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_ORIG_W4_SEC_COMP;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, TRUE, &l2c_link_sec_comp, p_ccb);
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM_NEG:                     /* Link failed          */
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Disconnect unless ACL collision and upper layer wants to handle it */
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ci->status != HCI_ERR_CONNECTION_EXISTS
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || !btm_acl_notif_conn_collision(p_ccb->p_lcb->remote_bd_addr))
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
179a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, p_ci->status);
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*connect_cfm)(local_cid, p_ci->status);
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_REQ:                       /* API connect request  */
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Cancel sniff mode if needed */
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTM_PM_PWR_MD settings;
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset((void*)&settings, 0, sizeof(settings));
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            settings.mode = BTM_PM_MD_ACTIVE;
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* COVERITY
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings" (field "settings".timeout uninitialized) in call to function "BTM_SetPowerMode" [details]
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings.max" in call to function "BTM_SetPowerMode" [details]
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings.min" in call to function "BTM_SetPowerMode"
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// FALSE-POSITIVE error from Coverity test-tool. Please do NOT remove following comment.
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// coverity[uninit_use_in_call] False-positive: setting the mode to BTM_PM_MD_ACTIVE only uses settings.mode the other data members of tBTM_PM_PWR_MD are ignored
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If sec access does not result in started SEC_COM or COMP_NEG are already processed */
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_ccb->p_lcb->handle, TRUE, &l2c_link_sec_comp, p_ccb) == BTM_CMD_STARTED)
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_ORIG_W4_SEC_COMP;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP:
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_CONNECT_RSP;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Wait for the info resp in this state before sending connect req (if needed) */
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb->p_lcb->w4_info_rsp)
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Need to have at least one compatible channel to continue */
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2c_fcr_chk_chan_modes(p_ccb))
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_release_ccb (p_ccb);
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb)(local_cid, L2CAP_CONN_NO_LINK);
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_send_peer_connect_req (p_ccb);
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP_NEG:                           /* something is really bad with security */
230a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, L2CAP_CONN_SECURITY_BLOCK);
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_REQ:                      /* Peer connect request */
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* stop link timer to avoid race condition between A2MP, Security, and L2CAP */
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer (&p_ccb->p_lcb->timer_entry);
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Cancel sniff mode if needed */
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTM_PM_PWR_MD settings;
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset((void*)&settings, 0, sizeof(settings));
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            settings.mode = BTM_PM_MD_ACTIVE;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* COVERITY
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings" (field "settings".timeout uninitialized) in call to function "BTM_SetPowerMode" [details]
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings.max" in call to function "BTM_SetPowerMode" [details]
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings.min" in call to function "BTM_SetPowerMode"
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// FALSE-POSITIVE error from Coverity test-tool. Please do NOT remove following comment.
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// coverity[uninit_use_in_call] False-positive: setting the mode to BTM_PM_MD_ACTIVE only uses settings.mode the other data members of tBTM_PM_PWR_MD are ignored
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_TERM_W4_SEC_COMP;
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, FALSE, &l2c_link_sec_comp, p_ccb) == BTM_CMD_STARTED)
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* started the security process, tell the peer to set a longer timer */
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp(p_ccb, L2CAP_CONN_PENDING, 0);
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
266a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, L2CAP_CONN_TIMEOUT);
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_orig_w4_sec_comp
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_ORIG_W4_SEC_COMP state.
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_orig_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_CONNECT_CFM_CB    *connect_cfm = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
300a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: ORIG_W4_SEC_COMP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
302a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: ORIG_W4_SEC_COMP evt: %d", event);
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( local_cid == L2CAP_CONNECTIONLESS_CID )
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if this event can be processed by UCD */
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_process_event (p_ccb, event, p_data) )
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The event is processed by UCD state machine */
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                   /* Link was disconnected */
320a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_RE_SEND_CMD:                    /* BTM has enough info to proceed */
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM:                     /* Link came up         */
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, TRUE, &l2c_link_sec_comp, p_ccb);
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP:                            /* Security completed success */
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Wait for the info resp in this state before sending connect req (if needed) */
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_CONNECT_RSP;
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb->p_lcb->w4_info_rsp)
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Need to have at least one compatible channel to continue */
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2c_fcr_chk_chan_modes(p_ccb))
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_release_ccb (p_ccb);
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*connect_cfm)(local_cid, L2CAP_CONN_NO_LINK);
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_send_peer_connect_req (p_ccb);          /* Start Connection     */
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP_NEG:
351a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, HCI_ERR_AUTH_FAILURE);
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If last channel immediately disconnect the ACL for better security.
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           Also prevents a race condition between BTM and L2CAP */
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_ccb == p_ccb->p_lcb->ccb_queue.p_first_ccb) && (p_ccb == p_ccb->p_lcb->ccb_queue.p_last_ccb) )
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->p_lcb->idle_timeout = 0;
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, HCI_ERR_AUTH_FAILURE);
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell security manager to abort */
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_abort_access_req (p_ccb->p_lcb->remote_bd_addr);
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_term_w4_sec_comp
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_TERM_W4_SEC_COMP state.
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
392a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: TERM_W4_SEC_COMP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
394a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: TERM_W4_SEC_COMP evt: %d", event);
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if this event can be processed by UCD */
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_process_event (p_ccb, event, p_data) )
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The event is processed by UCD state machine */
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell security manager to abort */
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_abort_access_req (p_ccb->p_lcb->remote_bd_addr);
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP:
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CA_CONNECT_RSP;
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Wait for the info resp in next state before sending connect ind (if needed) */
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb->p_lcb->w4_info_rsp)
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Don't need to get info from peer or already retrieved so continue */
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
426a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr, p_ccb->local_cid,
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                      p_ccb->p_rcb->psm, p_ccb->remote_id);
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** L2CAP Connect Response will be sent out by 3 sec timer expiration
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** because Bluesoleil doesn't respond to L2CAP Information Request.
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Bluesoleil seems to disconnect ACL link as failure case, because
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** it takes too long (4~7secs) to get response.
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** product version : Bluesoleil 2.1.1.0 EDR Release 060123
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** stack version   : 05.04.11.20060119
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Waiting for the info resp, tell the peer to set a longer timer */
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp(p_ccb, L2CAP_CONN_PENDING, 0);
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP_NEG:
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((tL2C_CONN_INFO *)p_data)->status == BTM_DELAY_CHECK)
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start a timer - encryption change not received before L2CAP connect req */
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_DELAY_CHECK_SM4);
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_SECURITY_BLOCK, 0);
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:                  /* Peer disconnected request */
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_rsp (p_ccb->p_lcb, p_ccb->remote_id, p_ccb->local_cid, p_ccb->remote_cid);
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell security manager to abort */
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_abort_access_req (p_ccb->p_lcb->remote_bd_addr);
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SM4 related. */
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_disconnect (p_ccb->p_lcb->handle, HCI_ERR_AUTH_FAILURE))
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
482a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling btsnd_hcic_disconnect for handle %i failed", p_ccb->p_lcb->handle);
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 1);
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_RE_SEND_CMD:                    /* BTM has enough info to proceed */
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, FALSE, &l2c_link_sec_comp, p_ccb);
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_w4_l2cap_connect_rsp
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_W4_L2CAP_CONNECT_RSP state.
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2cap_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CONN_INFO          *p_ci = (tL2C_CONN_INFO *)p_data;
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_CONNECT_CFM_CB    *connect_cfm = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
513a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: W4_L2CAP_CON_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
515a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_CON_RSP evt: %d", event);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Send disc indication unless peer to peer race condition AND normal disconnect */
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* *((UINT8 *)p_data) != HCI_ERR_PEER_USER happens when peer device try to disconnect for normal reason */
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_CLOSED;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ccb->flags & CCB_FLAG_NO_RETRY) || !p_data || (*((UINT8 *)p_data) != HCI_ERR_PEER_USER))
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
526a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed",
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_ccb->local_cid);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*disconnect_ind)(local_cid, FALSE);
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->flags |= CCB_FLAG_NO_RETRY;
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP:                  /* Got peer connect confirm */
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->remote_cid = p_ci->remote_cid;
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_CONFIG;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
538a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Success", p_ccb->local_cid);
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb)(local_cid, L2CAP_CONN_OK);
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP_PND:              /* Got peer connect pending */
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->remote_cid = p_ci->remote_cid;
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT_EXT);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
548a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling Connect_Pnd_Cb(), CID: 0x%04x", p_ccb->local_cid);
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)(p_ccb->local_cid);
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP_NEG:              /* Peer rejected connection */
554a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Failure Code: %d", p_ccb->local_cid, p_ci->l2cap_result);
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, p_ci->l2cap_result);
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
560a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Timeout", p_ccb->local_cid);
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, L2CAP_CONN_TIMEOUT);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If we know peer CID from connect pending, we can send disconnect */
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->remote_cid != 0)
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_disc_req (p_ccb);
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP;
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_INFO_RSP:
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Need to have at least one compatible channel to continue */
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!l2c_fcr_chk_chan_modes(p_ccb))
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*connect_cfm)(local_cid, L2CAP_CONN_NO_LINK);
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We have feature info, so now send peer connect request */
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_req (p_ccb);          /* Start Connection     */
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_w4_l2ca_connect_rsp
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_W4_L2CA_CONNECT_RSP state.
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2ca_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CONN_INFO          *p_ci;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
617a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: W4_L2CA_CON_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
619a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_CON_RSP evt: %d", event);
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
625a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_RSP:
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ci = (tL2C_CONN_INFO *)p_data;
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Result should be OK or PENDING */
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((!p_ci) || (p_ci->l2cap_result == L2CAP_CONN_OK))
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_OK, 0);
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_CONFIG;
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If pending, stay in same state and start extended timer */
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp (p_ccb, p_ci->l2cap_result, p_ci->l2cap_status);
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT_EXT);
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_RSP_NEG:
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ci = (tL2C_CONN_INFO *)p_data;
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_connect_rsp (p_ccb, p_ci->l2cap_result, p_ci->l2cap_status);
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_NO_PSM, 0);
656a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_req (p_ccb);
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_INFO_RSP:
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We have feature info, so now give the upper layer connect IND */
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
675a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr,
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_ccb->local_cid,
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_ccb->p_rcb->psm,
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_ccb->remote_id);
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_config
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CONFIG state.
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CAP_CFG_INFO         *p_cfg = (tL2CAP_CFG_INFO *)p_data;
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   cfg_result;
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
704a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: CONFIG  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
706a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: CONFIG evt: %d", event);
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
712a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_REQ:                  /* Peer config request   */
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK)
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
721a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_EVENT ("L2CAP - Calling Config_Req_Cb(), CID: 0x%04x, C-bit %d",
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                p_ccb->local_cid, (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT));
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, p_cfg);
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (cfg_result == L2CAP_PEER_CFG_DISCONNECT)
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Disconnect if channels are incompatible */
728a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations disconnect");
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_disconnect_chnl (p_ccb);
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* Return error to peer so he can renegotiate if possible */
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
733a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations trying reconfig");
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_config_rsp (p_ccb, p_cfg);
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_RSP:                  /* Peer config response  */
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         l2cu_process_peer_cfg_rsp (p_ccb, p_cfg);
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         if (p_cfg->result != L2CAP_CFG_PENDING)
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         {
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* TBD: When config options grow beyong minimum MTU (48 bytes)
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              *      logic needs to be added to handle responses with
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              *      continuation bit set in flags field.
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              *       1. Send additional config request out until C-bit is cleared in response
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              */
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             p_ccb->config_done |= OB_CFG_DONE;
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             if (p_ccb->config_done & IB_CFG_DONE)
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Verify two sides are in compatible modes before continuing */
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode)
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_send_peer_disc_req (p_ccb);
756a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                    L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_release_ccb (p_ccb);
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*disconnect_ind)(local_cid, FALSE);
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->config_done |= RECONFIG_FLAG;
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->chnl_state = CST_OPEN;
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2c_link_adjust_chnl_allocation ();
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_stop_timer (&p_ccb->timer_entry);
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* If using eRTM and waiting for an ACK, restart the ACK timer */
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_ccb->fcrb.wait_ack)
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2c_fcr_start_timer(p_ccb);
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** check p_ccb->our_cfg.fcr.mon_tout and p_ccb->our_cfg.fcr.rtrans_tout
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** we may set them to zero when sending config request during renegotiation
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                */
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_ccb->our_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE)
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   &&((p_ccb->our_cfg.fcr.mon_tout == 0)||(p_ccb->our_cfg.fcr.rtrans_tout)))
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2c_fcr_adj_monitor_retran_timeout (p_ccb);
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_ERTM_STATS == TRUE)
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->fcrb.connect_tick_count = GKI_get_os_tick_count();
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* See if we can forward anything on the hold queue */
785fe7216ca12f91baae733e7c93063db73121af308Chris Manton                if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q))
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL);
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
792a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x", p_ccb->local_cid);
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg);
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_RSP_NEG:              /* Peer config error rsp */
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Disable the Timer */
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         btu_stop_timer (&p_ccb->timer_entry);
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If failure was channel mode try to renegotiate */
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (l2c_fcr_renegotiate_chan(p_ccb, p_cfg) == FALSE)
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
803a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x, Failure: %d", p_ccb->local_cid, p_cfg->result);
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg);
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:                  /* Peer disconnected request */
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP;
811a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  Conf Needed", p_ccb->local_cid);
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE);
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_REQ:                   /* Upper layer config req   */
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_process_our_cfg_req (p_ccb, p_cfg);
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_config_req (p_ccb, p_cfg);
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_RSP:                   /* Upper layer config rsp   */
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_process_our_cfg_rsp (p_ccb, p_cfg);
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Not finished if continuation flag is set */
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT) || (p_cfg->result == L2CAP_CFG_PENDING) )
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Send intermediate response; remain in cfg state */
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_config_rsp (p_ccb, p_cfg);
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Local config done; clear cached configuration in case reconfig takes place later */
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->peer_cfg.mtu_present = FALSE;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->peer_cfg.flush_to_present = FALSE;
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->peer_cfg.qos_present = FALSE;
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->config_done |= IB_CFG_DONE;
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->config_done & OB_CFG_DONE)
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Verify two sides are in compatible modes before continuing */
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode)
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_send_peer_disc_req (p_ccb);
845a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_release_ccb (p_ccb);
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*disconnect_ind)(local_cid, FALSE);
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->config_done |= RECONFIG_FLAG;
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_OPEN;
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_link_adjust_chnl_allocation ();
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&p_ccb->timer_entry);
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_config_rsp (p_ccb, p_cfg);
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If using eRTM and waiting for an ACK, restart the ACK timer */
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->fcrb.wait_ack)
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_fcr_start_timer(p_ccb);
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_ERTM_STATS == TRUE)
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->fcrb.connect_tick_count = GKI_get_os_tick_count();
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* See if we can forward anything on the hold queue */
868fe7216ca12f91baae733e7c93063db73121af308Chris Manton        if ( (p_ccb->chnl_state == CST_OPEN) && (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)))
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL);
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_RSP_NEG:               /* Upper layer config reject */
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_config_rsp (p_ccb, p_cfg);
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_req (p_ccb);
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP;
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                        /* Peer data packet rcvd    */
886a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling DataInd_Cb(), CID: 0x%04x", p_ccb->local_cid);
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_NUM_FIXED_CHNLS > 0)
8882a2701cdddac0859a95e58aec542742c450145b9Kim Schulz        if (p_ccb->local_cid >= L2CAP_FIRST_FIXED_CHNL &&
8892a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                p_ccb->local_cid <= L2CAP_LAST_FIXED_CHNL)
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8912a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            if (p_ccb->local_cid < L2CAP_BASE_APPL_CID)
8922a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            {
8932a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                if (l2cb.fixed_reg[p_ccb->local_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb)
8948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz                    (*l2cb.fixed_reg[p_ccb->local_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb)
8958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz                        (p_ccb->local_cid, p_ccb->p_lcb->remote_bd_addr,(BT_HDR *)p_data);
8962a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                else
8972a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                    GKI_freebuf (p_data);
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8992a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            }
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_DataInd_Cb)(p_ccb->local_cid, (BT_HDR *)p_data);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                   /* Upper layer data to send */
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->config_done & OB_CFG_DONE)
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_enqueue_peer_data (p_ccb, (BT_HDR *)p_data);
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf (p_data);
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_req (p_ccb);
9148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed",
9158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz                p_ccb->local_cid);
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_open
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  OPEN state.
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_open (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CAP_CFG_INFO         *p_cfg;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CHNL_STATE         tempstate;
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   tempcfgdone;
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   cfg_result;
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
9428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: OPEN  evt: %s",
9438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz            p_ccb->local_cid, l2c_csm_get_event_name (event));
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
945a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: OPEN evt: %d", event);
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( local_cid == L2CAP_CONNECTIONLESS_CID )
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if this event can be processed by UCD */
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_process_event (p_ccb, event, p_data) )
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The event is processed by UCD state machine */
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
9638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed",
9648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz                p_ccb->local_cid);
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rcb)
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(local_cid, FALSE);
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_QOS_VIOLATION_IND:               /* QOS violation         */
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell upper layer. If service guaranteed, then clear the channel   */
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb)
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb)(p_ccb->p_lcb->remote_bd_addr);
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_REQ:                  /* Peer config request   */
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cfg = (tL2CAP_CFG_INFO *)p_data;
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tempstate = p_ccb->chnl_state;
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tempcfgdone = p_ccb->config_done;
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_CONFIG;
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->config_done &= ~CFG_DONE_MASK;
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK)
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, p_cfg);
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Error in config parameters: reset state and config flag */
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (cfg_result == L2CAP_PEER_CFG_UNACCEPTABLE)
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer(&p_ccb->timer_entry);
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = tempstate;
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->config_done = tempcfgdone;
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_config_rsp (p_ccb, p_cfg);
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else    /* L2CAP_PEER_CFG_DISCONNECT */
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Disconnect if channels are incompatible
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * Note this should not occur if reconfigure
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * since this should have never passed original config.
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             */
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_disconnect_chnl (p_ccb);
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:                  /* Peer disconnected request */
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we are not in sniff mode */
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTM_PM_PWR_MD settings;
1014f6418a11dd4bb80ad871dde90445b878b58e4134Adam Hampson            memset((void*)&settings, 0, sizeof(settings));
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            settings.mode = BTM_PM_MD_ACTIVE;
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP;
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
1022a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  Conf Needed", p_ccb->local_cid);
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
1027780afa366705dfe53b9c69e8deb075e0bcbf31c4Srinu Jella        if((p_ccb->p_rcb) && (p_ccb->p_rcb->api.pL2CA_DataInd_Cb))
1028780afa366705dfe53b9c69e8deb075e0bcbf31c4Srinu Jella            (*p_ccb->p_rcb->api.pL2CA_DataInd_Cb)(p_ccb->local_cid, (BT_HDR *)p_data);
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we are not in sniff mode */
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTM_PM_PWR_MD settings;
1035f6418a11dd4bb80ad871dde90445b878b58e4134Adam Hampson            memset((void*)&settings, 0, sizeof(settings));
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            settings.mode = BTM_PM_MD_ACTIVE;
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_req (p_ccb);
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP;
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_enqueue_peer_data (p_ccb, (BT_HDR *)p_data);
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL);
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_REQ:                   /* Upper layer config req   */
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_CONFIG;
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->config_done &= ~CFG_DONE_MASK;
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_process_our_cfg_req (p_ccb, (tL2CAP_CFG_INFO *)p_data);
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_config_req (p_ccb, (tL2CAP_CFG_INFO *)p_data);
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Process the monitor/retransmission time-outs in flow control/retrans mode */
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE)
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_fcr_proc_tout (p_ccb);
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_ACK_TIMEOUT:
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_fcr_proc_ack_tout (p_ccb);
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_w4_l2cap_disconnect_rsp
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_W4_L2CAP_DISCONNECT_RSP state.
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2cap_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_CFM_CB *disconnect_cfm = p_ccb->p_rcb->api.pL2CA_DisconnectCfm_Cb;
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1087a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: W4_L2CAP_DISC_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1089a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_DISC_RSP evt: %d", event);
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_RSP:                /* Peer disconnect response */
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disconnect_cfm)
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1098a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*disconnect_cfm)(local_cid, L2CAP_DISC_OK);
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:                /* Peer disconnect request  */
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_rsp (p_ccb->p_lcb, p_ccb->remote_id, p_ccb->local_cid, p_ccb->remote_cid);
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disconnect_cfm)
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1108a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*disconnect_cfm)(local_cid, L2CAP_DISC_OK);
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       break;
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:                            /* Timeout */
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disconnect_cfm)
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1118a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*disconnect_cfm)(local_cid, L2CAP_DISC_TIMEOUT);
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_w4_l2ca_disconnect_rsp
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_W4_L2CA_DISCONNECT_RSP state.
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2ca_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1147a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: W4_L2CA_DISC_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1149a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_DISC_RSP evt: %d", event);
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
1155a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_rsp (p_ccb->p_lcb, p_ccb->remote_id, p_ccb->local_cid, p_ccb->remote_cid);
1162a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                /* Upper disconnect request */
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_RSP:                /* Upper disconnect response */
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_rsp (p_ccb->p_lcb, p_ccb->remote_id, p_ccb->local_cid, p_ccb->remote_cid);
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_get_event_name
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the event name.
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE             conditionally compiled to save memory.
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the name
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *l2c_csm_get_event_name (UINT16 event)
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM:                  /* Lower layer connect confirm          */
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_CONNECT_CFM");
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM_NEG:              /* Lower layer connect confirm (failed) */
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_CONNECT_CFM_NEG");
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_IND:                  /* Lower layer connect indication       */
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_CONNECT_IND");
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:               /* Lower layer disconnect indication    */
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_DISCONNECT_IND");
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_QOS_CFM:                      /* Lower layer QOS confirmation         */
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_QOS_CFM");
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_QOS_CFM_NEG:                  /* Lower layer QOS confirmation (failed)*/
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_QOS_CFM_NEG");
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_QOS_VIOLATION_IND:            /* Lower layer QOS violation indication */
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_QOS_VIOLATION_IND");
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP:                        /* Security cleared successfully        */
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("SECURITY_COMPLETE");
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP_NEG:                    /* Security procedure failed            */
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("SECURITY_COMPLETE_NEG");
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_REQ:               /* Peer connection request              */
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONNECT_REQ");
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP:               /* Peer connection response             */
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONNECT_RSP");
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP_PND:           /* Peer connection response pending     */
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONNECT_RSP_PND");
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP_NEG:           /* Peer connection response (failed)    */
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONNECT_RSP_NEG");
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_REQ:                /* Peer configuration request           */
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONFIG_REQ");
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_RSP:                /* Peer configuration response          */
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONFIG_RSP");
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_RSP_NEG:            /* Peer configuration response (failed) */
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONFIG_RSP_NEG");
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:            /* Peer disconnect request              */
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_DISCONNECT_REQ");
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_RSP:            /* Peer disconnect response             */
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_DISCONNECT_RSP");
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                      /* Peer data                            */
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_DATA");
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_REQ:                /* Upper layer connect request          */
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONNECT_REQ");
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_RSP:                /* Upper layer connect response         */
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONNECT_RSP");
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_RSP_NEG:            /* Upper layer connect response (failed)*/
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONNECT_RSP_NEG");
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_REQ:                 /* Upper layer config request           */
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONFIG_REQ");
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_RSP:                 /* Upper layer config response          */
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONFIG_RSP");
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_RSP_NEG:             /* Upper layer config response (failed) */
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONFIG_RSP_NEG");
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:             /* Upper layer disconnect request       */
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_DISCONNECT_REQ");
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_RSP:             /* Upper layer disconnect response      */
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_DISCONNECT_RSP");
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_READ:                  /* Upper layer data read                */
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_DATA_READ");
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                 /* Upper layer data write               */
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_DATA_WRITE");
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:                         /* Timeout                              */
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("TIMEOUT");
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_RE_SEND_CMD:
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("SEC_RE_SEND_CMD");
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_INFO_RSP:                  /* Peer information response            */
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("L2CEVT_L2CAP_INFO_RSP");
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_ACK_TIMEOUT:
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("L2CEVT_ACK_TIMEOUT");
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("???? UNKNOWN EVENT");
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BT_TRACE_VERBOSE == TRUE) */
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_enqueue_peer_data
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Enqueues data destined for the peer in the ccb. Handles
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  FCR segmentation and checks for congestion.
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_enqueue_peer_data (tL2C_CCB *p_ccb, BT_HDR *p_buf)
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->event = 0;
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Save the channel ID for faster counting */
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->event = p_ccb->local_cid;
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Step back to add the L2CAP header */
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset -= L2CAP_PKT_OVERHEAD;
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len    += L2CAP_PKT_OVERHEAD;
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the pointer to the beginning of the data */
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + p_buf->offset;
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Now the L2CAP header */
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM (p, p_buf->len - L2CAP_PKT_OVERHEAD);
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM (p, p_ccb->remote_cid);
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enqueue (&p_ccb->xmit_hold_q, p_buf);
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cu_check_channel_congestion (p_ccb);
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE)
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if new packet is higher priority than serving ccb and it is not overrun */
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (( p_ccb->p_lcb->rr_pri > p_ccb->ccb_priority )
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      &&( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota > 0))
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send out higher priority packet */
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_lcb->rr_pri = p_ccb->ccb_priority;
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if we are doing a round robin scheduling, set the flag */
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_lcb->link_xmit_quota == 0)
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cb.check_round_robin = TRUE;
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1329