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:
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
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** Function         l2c_csm_closed
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CLOSED state. This state exists only when the link is
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  being initially established.
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_closed (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CONN_INFO          *p_ci = (tL2C_CONN_INFO *)p_data;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_CONNECT_CFM_CB    *connect_cfm;
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_rcb == NULL)
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
131a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil 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));
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
133a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: 0x%04x p_rcb == NULL", p_ccb->local_cid, event);
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( local_cid == L2CAP_CONNECTIONLESS_CID )
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if this event can be processed by UCD */
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_process_event (p_ccb, event, p_data) )
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The event is processed by UCD state machine */
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    connect_cfm    = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
154a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
156a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: CLOSED evt: %d", event);
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
162a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM:                         /* Link came up         */
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_ORIG_W4_SEC_COMP;
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, TRUE, &l2c_link_sec_comp, p_ccb);
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM_NEG:                     /* Link failed          */
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Disconnect unless ACL collision and upper layer wants to handle it */
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ci->status != HCI_ERR_CONNECTION_EXISTS
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || !btm_acl_notif_conn_collision(p_ccb->p_lcb->remote_bd_addr))
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
178a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, p_ci->status);
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*connect_cfm)(local_cid, p_ci->status);
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_REQ:                       /* API connect request  */
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Cancel sniff mode if needed */
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_PWR_MGR_INCLUDED == TRUE
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#else
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_CancelSniffMode (p_ccb->p_lcb->remote_bd_addr);
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If sec access does not result in started SEC_COM or COMP_NEG are already processed */
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_ccb->p_lcb->handle, TRUE, &l2c_link_sec_comp, p_ccb) == BTM_CMD_STARTED)
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_ORIG_W4_SEC_COMP;
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP:
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_CONNECT_RSP;
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Wait for the info resp in this state before sending connect req (if needed) */
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb->p_lcb->w4_info_rsp)
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Need to have at least one compatible channel to continue */
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2c_fcr_chk_chan_modes(p_ccb))
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_release_ccb (p_ccb);
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb)(local_cid, L2CAP_CONN_NO_LINK);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_send_peer_connect_req (p_ccb);
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP_NEG:                           /* something is really bad with security */
233a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, L2CAP_CONN_SECURITY_BLOCK);
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_REQ:                      /* Peer connect request */
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* stop link timer to avoid race condition between A2MP, Security, and L2CAP */
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer (&p_ccb->p_lcb->timer_entry);
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Cancel sniff mode if needed */
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_PWR_MGR_INCLUDED == TRUE
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTM_PM_PWR_MD settings;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset((void*)&settings, 0, sizeof(settings));
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            settings.mode = BTM_PM_MD_ACTIVE;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* COVERITY
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings" (field "settings".timeout uninitialized) in call to function "BTM_SetPowerMode" [details]
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings.max" in call to function "BTM_SetPowerMode" [details]
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized value "settings.min" in call to function "BTM_SetPowerMode"
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// FALSE-POSITIVE error from Coverity test-tool. Please do NOT remove following comment.
2555738f83aeb59361a0a2eda2460113f6dc919427The 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
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_CancelSniffMode (p_ccb->p_lcb->remote_bd_addr);
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_TERM_W4_SEC_COMP;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, FALSE, &l2c_link_sec_comp, p_ccb) == BTM_CMD_STARTED)
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* started the security process, tell the peer to set a longer timer */
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp(p_ccb, L2CAP_CONN_PENDING, 0);
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
273a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, L2CAP_CONN_TIMEOUT);
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_orig_w4_sec_comp
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_ORIG_W4_SEC_COMP state.
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_orig_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_CONNECT_CFM_CB    *connect_cfm = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
307a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil 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));
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
309a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: ORIG_W4_SEC_COMP evt: %d", event);
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( local_cid == L2CAP_CONNECTIONLESS_CID )
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if this event can be processed by UCD */
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_process_event (p_ccb, event, p_data) )
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The event is processed by UCD state machine */
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                   /* Link was disconnected */
327a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_RE_SEND_CMD:                    /* BTM has enough info to proceed */
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM:                     /* Link came up         */
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, TRUE, &l2c_link_sec_comp, p_ccb);
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP:                            /* Security completed success */
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Wait for the info resp in this state before sending connect req (if needed) */
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_CONNECT_RSP;
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb->p_lcb->w4_info_rsp)
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Need to have at least one compatible channel to continue */
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2c_fcr_chk_chan_modes(p_ccb))
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_release_ccb (p_ccb);
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*connect_cfm)(local_cid, L2CAP_CONN_NO_LINK);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_send_peer_connect_req (p_ccb);          /* Start Connection     */
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP_NEG:
358a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, HCI_ERR_AUTH_FAILURE);
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If last channel immediately disconnect the ACL for better security.
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           Also prevents a race condition between BTM and L2CAP */
3625738f83aeb59361a0a2eda2460113f6dc919427The 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) )
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->p_lcb->idle_timeout = 0;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, HCI_ERR_AUTH_FAILURE);
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell security manager to abort */
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_abort_access_req (p_ccb->p_lcb->remote_bd_addr);
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_term_w4_sec_comp
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_TERM_W4_SEC_COMP state.
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
399a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil 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));
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
401a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: TERM_W4_SEC_COMP evt: %d", event);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if this event can be processed by UCD */
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_process_event (p_ccb, event, p_data) )
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The event is processed by UCD state machine */
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell security manager to abort */
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_abort_access_req (p_ccb->p_lcb->remote_bd_addr);
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP:
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CA_CONNECT_RSP;
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Wait for the info resp in next state before sending connect ind (if needed) */
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb->p_lcb->w4_info_rsp)
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Don't need to get info from peer or already retrieved so continue */
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
433a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr, p_ccb->local_cid,
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                      p_ccb->p_rcb->psm, p_ccb->remote_id);
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** L2CAP Connect Response will be sent out by 3 sec timer expiration
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** because Bluesoleil doesn't respond to L2CAP Information Request.
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Bluesoleil seems to disconnect ACL link as failure case, because
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** it takes too long (4~7secs) to get response.
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** product version : Bluesoleil 2.1.1.0 EDR Release 060123
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** stack version   : 05.04.11.20060119
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Waiting for the info resp, tell the peer to set a longer timer */
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp(p_ccb, L2CAP_CONN_PENDING, 0);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP_NEG:
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((tL2C_CONN_INFO *)p_data)->status == BTM_DELAY_CHECK)
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start a timer - encryption change not received before L2CAP connect req */
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_DELAY_CHECK_SM4);
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_SECURITY_BLOCK, 0);
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:                  /* Peer disconnected request */
4775738f83aeb59361a0a2eda2460113f6dc919427The 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);
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell security manager to abort */
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_abort_access_req (p_ccb->p_lcb->remote_bd_addr);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SM4 related. */
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_disconnect (p_ccb->p_lcb->handle, HCI_ERR_AUTH_FAILURE))
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
489a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling btsnd_hcic_disconnect for handle %i failed", p_ccb->p_lcb->handle);
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 1);
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_RE_SEND_CMD:                    /* BTM has enough info to proceed */
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm,
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, FALSE, &l2c_link_sec_comp, p_ccb);
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_w4_l2cap_connect_rsp
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_W4_L2CAP_CONNECT_RSP state.
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2cap_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CONN_INFO          *p_ci = (tL2C_CONN_INFO *)p_data;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_CONNECT_CFM_CB    *connect_cfm = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
520a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil 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));
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
522a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_CON_RSP evt: %d", event);
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Send disc indication unless peer to peer race condition AND normal disconnect */
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* *((UINT8 *)p_data) != HCI_ERR_PEER_USER happens when peer device try to disconnect for normal reason */
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_CLOSED;
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ccb->flags & CCB_FLAG_NO_RETRY) || !p_data || (*((UINT8 *)p_data) != HCI_ERR_PEER_USER))
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
533a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed",
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_ccb->local_cid);
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*disconnect_ind)(local_cid, FALSE);
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->flags |= CCB_FLAG_NO_RETRY;
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP:                  /* Got peer connect confirm */
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->remote_cid = p_ci->remote_cid;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_CONFIG;
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
545a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Success", p_ccb->local_cid);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb)(local_cid, L2CAP_CONN_OK);
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP_PND:              /* Got peer connect pending */
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->remote_cid = p_ci->remote_cid;
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT_EXT);
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
555a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling Connect_Pnd_Cb(), CID: 0x%04x", p_ccb->local_cid);
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)(p_ccb->local_cid);
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP_NEG:              /* Peer rejected connection */
561a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Failure Code: %d", p_ccb->local_cid, p_ci->l2cap_result);
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, p_ci->l2cap_result);
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
567a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Timeout", p_ccb->local_cid);
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*connect_cfm)(local_cid, L2CAP_CONN_TIMEOUT);
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If we know peer CID from connect pending, we can send disconnect */
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->remote_cid != 0)
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_disc_req (p_ccb);
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP;
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_INFO_RSP:
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Need to have at least one compatible channel to continue */
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!l2c_fcr_chk_chan_modes(p_ccb))
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*connect_cfm)(local_cid, L2CAP_CONN_NO_LINK);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We have feature info, so now send peer connect request */
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_req (p_ccb);          /* Start Connection     */
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_w4_l2ca_connect_rsp
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_W4_L2CA_CONNECT_RSP state.
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2ca_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CONN_INFO          *p_ci;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
624a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil 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));
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
626a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_CON_RSP evt: %d", event);
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
632a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_RSP:
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ci = (tL2C_CONN_INFO *)p_data;
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Result should be OK or PENDING */
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((!p_ci) || (p_ci->l2cap_result == L2CAP_CONN_OK))
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_OK, 0);
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_CONFIG;
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If pending, stay in same state and start extended timer */
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            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT_EXT);
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_RSP_NEG:
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ci = (tL2C_CONN_INFO *)p_data;
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_connect_rsp (p_ccb, p_ci->l2cap_result, p_ci->l2cap_status);
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_NO_PSM, 0);
663a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_req (p_ccb);
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP;
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_INFO_RSP:
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We have feature info, so now give the upper layer connect IND */
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
682a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr,
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_ccb->local_cid,
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_ccb->p_rcb->psm,
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  p_ccb->remote_id);
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_config
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CONFIG state.
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CAP_CFG_INFO         *p_cfg = (tL2CAP_CFG_INFO *)p_data;
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   cfg_result;
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
711a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: CONFIG  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
713a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: CONFIG evt: %d", event);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
719a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_REQ:                  /* Peer config request   */
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK)
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
728a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_EVENT ("L2CAP - Calling Config_Req_Cb(), CID: 0x%04x, C-bit %d",
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                p_ccb->local_cid, (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT));
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, p_cfg);
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (cfg_result == L2CAP_PEER_CFG_DISCONNECT)
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Disconnect if channels are incompatible */
735a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations disconnect");
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_disconnect_chnl (p_ccb);
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* Return error to peer so he can renegotiate if possible */
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
740a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations trying reconfig");
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_config_rsp (p_ccb, p_cfg);
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_RSP:                  /* Peer config response  */
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         l2cu_process_peer_cfg_rsp (p_ccb, p_cfg);
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         if (p_cfg->result != L2CAP_CFG_PENDING)
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         {
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* TBD: When config options grow beyong minimum MTU (48 bytes)
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              *      logic needs to be added to handle responses with
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              *      continuation bit set in flags field.
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              *       1. Send additional config request out until C-bit is cleared in response
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              */
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             p_ccb->config_done |= OB_CFG_DONE;
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             if (p_ccb->config_done & IB_CFG_DONE)
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Verify two sides are in compatible modes before continuing */
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode)
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_send_peer_disc_req (p_ccb);
763a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                    L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_release_ccb (p_ccb);
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*disconnect_ind)(local_cid, FALSE);
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->config_done |= RECONFIG_FLAG;
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->chnl_state = CST_OPEN;
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2c_link_adjust_chnl_allocation ();
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_stop_timer (&p_ccb->timer_entry);
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* If using eRTM and waiting for an ACK, restart the ACK timer */
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_ccb->fcrb.wait_ack)
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2c_fcr_start_timer(p_ccb);
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** check p_ccb->our_cfg.fcr.mon_tout and p_ccb->our_cfg.fcr.rtrans_tout
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** we may set them to zero when sending config request during renegotiation
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                */
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_ccb->our_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE)
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   &&((p_ccb->our_cfg.fcr.mon_tout == 0)||(p_ccb->our_cfg.fcr.rtrans_tout)))
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2c_fcr_adj_monitor_retran_timeout (p_ccb);
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_ERTM_STATS == TRUE)
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->fcrb.connect_tick_count = GKI_get_os_tick_count();
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* See if we can forward anything on the hold queue */
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_ccb->xmit_hold_q.count)
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL);
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
799a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x", p_ccb->local_cid);
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg);
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_RSP_NEG:              /* Peer config error rsp */
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Disable the Timer */
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         btu_stop_timer (&p_ccb->timer_entry);
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If failure was channel mode try to renegotiate */
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (l2c_fcr_renegotiate_chan(p_ccb, p_cfg) == FALSE)
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
810a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x, Failure: %d", p_ccb->local_cid, p_cfg->result);
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg);
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:                  /* Peer disconnected request */
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP;
818a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  Conf Needed", p_ccb->local_cid);
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE);
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_REQ:                   /* Upper layer config req   */
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_process_our_cfg_req (p_ccb, p_cfg);
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_config_req (p_ccb, p_cfg);
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_RSP:                   /* Upper layer config rsp   */
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_process_our_cfg_rsp (p_ccb, p_cfg);
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Not finished if continuation flag is set */
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT) || (p_cfg->result == L2CAP_CFG_PENDING) )
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Send intermediate response; remain in cfg state */
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_config_rsp (p_ccb, p_cfg);
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Local config done; clear cached configuration in case reconfig takes place later */
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->peer_cfg.mtu_present = FALSE;
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->peer_cfg.flush_to_present = FALSE;
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->peer_cfg.qos_present = FALSE;
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->config_done |= IB_CFG_DONE;
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->config_done & OB_CFG_DONE)
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Verify two sides are in compatible modes before continuing */
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode)
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_send_peer_disc_req (p_ccb);
852a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_release_ccb (p_ccb);
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*disconnect_ind)(local_cid, FALSE);
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->config_done |= RECONFIG_FLAG;
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_OPEN;
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_link_adjust_chnl_allocation ();
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&p_ccb->timer_entry);
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_config_rsp (p_ccb, p_cfg);
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If using eRTM and waiting for an ACK, restart the ACK timer */
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->fcrb.wait_ack)
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_fcr_start_timer(p_ccb);
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_ERTM_STATS == TRUE)
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->fcrb.connect_tick_count = GKI_get_os_tick_count();
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* See if we can forward anything on the hold queue */
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_ccb->chnl_state == CST_OPEN) && (p_ccb->xmit_hold_q.count) )
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL);
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_RSP_NEG:               /* Upper layer config reject */
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_config_rsp (p_ccb, p_cfg);
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_req (p_ccb);
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP;
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                        /* Peer data packet rcvd    */
893a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling DataInd_Cb(), CID: 0x%04x", p_ccb->local_cid);
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_NUM_FIXED_CHNLS > 0)
8952a2701cdddac0859a95e58aec542742c450145b9Kim Schulz        if (p_ccb->local_cid >= L2CAP_FIRST_FIXED_CHNL &&
8962a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                p_ccb->local_cid <= L2CAP_LAST_FIXED_CHNL)
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8982a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            if (p_ccb->local_cid < L2CAP_BASE_APPL_CID)
8992a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            {
9002a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                if (l2cb.fixed_reg[p_ccb->local_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb)
9012a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                    (*l2cb.fixed_reg[p_ccb->local_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb)(p_ccb->p_lcb->remote_bd_addr,(BT_HDR *)p_data);
9022a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                else
9032a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                    GKI_freebuf (p_data);
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9052a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            }
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_DataInd_Cb)(p_ccb->local_cid, (BT_HDR *)p_data);
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                   /* Upper layer data to send */
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->config_done & OB_CFG_DONE)
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_enqueue_peer_data (p_ccb, (BT_HDR *)p_data);
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf (p_data);
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_req (p_ccb);
920a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_open
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  OPEN state.
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_open (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CAP_CFG_INFO         *p_cfg;
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CHNL_STATE         tempstate;
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   tempcfgdone;
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   cfg_result;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
947a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: OPEN  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
949a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: OPEN evt: %d", event);
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( local_cid == L2CAP_CONNECTIONLESS_CID )
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if this event can be processed by UCD */
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_process_event (p_ccb, event, p_data) )
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The event is processed by UCD state machine */
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
967a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rcb)
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(local_cid, FALSE);
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_QOS_VIOLATION_IND:               /* QOS violation         */
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell upper layer. If service guaranteed, then clear the channel   */
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb)
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb)(p_ccb->p_lcb->remote_bd_addr);
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_REQ:                  /* Peer config request   */
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cfg = (tL2CAP_CFG_INFO *)p_data;
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tempstate = p_ccb->chnl_state;
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tempcfgdone = p_ccb->config_done;
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_CONFIG;
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->config_done &= ~CFG_DONE_MASK;
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK)
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, p_cfg);
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Error in config parameters: reset state and config flag */
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (cfg_result == L2CAP_PEER_CFG_UNACCEPTABLE)
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer(&p_ccb->timer_entry);
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = tempstate;
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->config_done = tempcfgdone;
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_config_rsp (p_ccb, p_cfg);
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else    /* L2CAP_PEER_CFG_DISCONNECT */
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Disconnect if channels are incompatible
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * Note this should not occur if reconfigure
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * since this should have never passed original config.
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             */
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_disconnect_chnl (p_ccb);
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:                  /* Peer disconnected request */
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we are not in sniff mode */
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_PWR_MGR_INCLUDED == TRUE
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTM_PM_PWR_MD settings;
1018f6418a11dd4bb80ad871dde90445b878b58e4134Adam Hampson            memset((void*)&settings, 0, sizeof(settings));
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            settings.mode = BTM_PM_MD_ACTIVE;
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_CancelSniffMode (p_ccb->p_lcb->remote_bd_addr);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
1029a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  Conf Needed", p_ccb->local_cid);
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE);
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_rcb->api.pL2CA_DataInd_Cb)(p_ccb->local_cid, (BT_HDR *)p_data);
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                 /* Upper wants to disconnect */
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we are not in sniff mode */
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_PWR_MGR_INCLUDED == TRUE
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTM_PM_PWR_MD settings;
1042f6418a11dd4bb80ad871dde90445b878b58e4134Adam Hampson            memset((void*)&settings, 0, sizeof(settings));
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            settings.mode = BTM_PM_MD_ACTIVE;
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_CancelSniffMode (p_ccb->p_lcb->remote_bd_addr);
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_disc_req (p_ccb);
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP;
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_enqueue_peer_data (p_ccb, (BT_HDR *)p_data);
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL);
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_REQ:                   /* Upper layer config req   */
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_CONFIG;
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->config_done &= ~CFG_DONE_MASK;
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_process_our_cfg_req (p_ccb, (tL2CAP_CFG_INFO *)p_data);
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_send_peer_config_req (p_ccb, (tL2CAP_CFG_INFO *)p_data);
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Process the monitor/retransmission time-outs in flow control/retrans mode */
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE)
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_fcr_proc_tout (p_ccb);
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_ACK_TIMEOUT:
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_fcr_proc_ack_tout (p_ccb);
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_w4_l2cap_disconnect_rsp
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_W4_L2CAP_DISCONNECT_RSP state.
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2cap_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_CFM_CB *disconnect_cfm = p_ccb->p_rcb->api.pL2CA_DisconnectCfm_Cb;
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1097a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil 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));
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1099a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_DISC_RSP evt: %d", event);
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_RSP:                /* Peer disconnect response */
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_L2CAP_DISCONNECT_REQ:                /* Peer disconnect request  */
11145738f83aeb59361a0a2eda2460113f6dc919427The 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);
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_OK);
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       break;
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:                            /* Timeout */
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disconnect_cfm)
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1128a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*disconnect_cfm)(local_cid, L2CAP_DISC_TIMEOUT);
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_w4_l2ca_disconnect_rsp
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the channel is in
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  CST_W4_L2CA_DISCONNECT_RSP state.
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_csm_w4_l2ca_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  local_cid = p_ccb->local_cid;
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1157a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil 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));
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1159a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_DISC_RSP evt: %d", event);
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
1165a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:
11715738f83aeb59361a0a2eda2460113f6dc919427The 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);
1172a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*disconnect_ind)(local_cid, FALSE);
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:                /* Upper disconnect request */
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_RSP:                /* Upper disconnect response */
11795738f83aeb59361a0a2eda2460113f6dc919427The 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);
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_ccb (p_ccb);
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                         /* Peer data packet rcvd    */
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                    /* Upper layer data to send */
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_csm_get_event_name
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the event name.
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE             conditionally compiled to save memory.
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the name
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *l2c_csm_get_event_name (UINT16 event)
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM:                  /* Lower layer connect confirm          */
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_CONNECT_CFM");
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_CFM_NEG:              /* Lower layer connect confirm (failed) */
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_CONNECT_CFM_NEG");
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_CONNECT_IND:                  /* Lower layer connect indication       */
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_CONNECT_IND");
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_DISCONNECT_IND:               /* Lower layer disconnect indication    */
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_DISCONNECT_IND");
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_QOS_CFM:                      /* Lower layer QOS confirmation         */
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_QOS_CFM");
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_QOS_CFM_NEG:                  /* Lower layer QOS confirmation (failed)*/
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_QOS_CFM_NEG");
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_LP_QOS_VIOLATION_IND:            /* Lower layer QOS violation indication */
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("LOWER_LAYER_QOS_VIOLATION_IND");
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP:                        /* Security cleared successfully        */
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("SECURITY_COMPLETE");
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_COMP_NEG:                    /* Security procedure failed            */
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("SECURITY_COMPLETE_NEG");
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_REQ:               /* Peer connection request              */
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONNECT_REQ");
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP:               /* Peer connection response             */
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONNECT_RSP");
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP_PND:           /* Peer connection response pending     */
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONNECT_RSP_PND");
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONNECT_RSP_NEG:           /* Peer connection response (failed)    */
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONNECT_RSP_NEG");
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_REQ:                /* Peer configuration request           */
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONFIG_REQ");
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_RSP:                /* Peer configuration response          */
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONFIG_RSP");
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_CONFIG_RSP_NEG:            /* Peer configuration response (failed) */
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_CONFIG_RSP_NEG");
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_REQ:            /* Peer disconnect request              */
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_DISCONNECT_REQ");
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DISCONNECT_RSP:            /* Peer disconnect response             */
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_DISCONNECT_RSP");
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_DATA:                      /* Peer data                            */
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("PEER_DATA");
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_REQ:                /* Upper layer connect request          */
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONNECT_REQ");
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_RSP:                /* Upper layer connect response         */
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONNECT_RSP");
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONNECT_RSP_NEG:            /* Upper layer connect response (failed)*/
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONNECT_RSP_NEG");
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_REQ:                 /* Upper layer config request           */
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONFIG_REQ");
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_RSP:                 /* Upper layer config response          */
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONFIG_RSP");
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_CONFIG_RSP_NEG:             /* Upper layer config response (failed) */
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_CONFIG_RSP_NEG");
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_REQ:             /* Upper layer disconnect request       */
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_DISCONNECT_REQ");
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DISCONNECT_RSP:             /* Upper layer disconnect response      */
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_DISCONNECT_RSP");
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_READ:                  /* Upper layer data read                */
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_DATA_READ");
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CA_DATA_WRITE:                 /* Upper layer data write               */
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("UPPER_LAYER_DATA_WRITE");
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_TIMEOUT:                         /* Timeout                              */
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("TIMEOUT");
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_SEC_RE_SEND_CMD:
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("SEC_RE_SEND_CMD");
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_L2CAP_INFO_RSP:                  /* Peer information response            */
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("L2CEVT_L2CAP_INFO_RSP");
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case L2CEVT_ACK_TIMEOUT:
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("L2CEVT_ACK_TIMEOUT");
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ("???? UNKNOWN EVENT");
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BT_TRACE_VERBOSE == TRUE) */
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_enqueue_peer_data
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Enqueues data destined for the peer in the ccb. Handles
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  FCR segmentation and checks for congestion.
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_enqueue_peer_data (tL2C_CCB *p_ccb, BT_HDR *p_buf)
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->event = 0;
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Save the channel ID for faster counting */
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->event = p_ccb->local_cid;
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Step back to add the L2CAP header */
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset -= L2CAP_PKT_OVERHEAD;
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len    += L2CAP_PKT_OVERHEAD;
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the pointer to the beginning of the data */
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + p_buf->offset;
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Now the L2CAP header */
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM (p, p_buf->len - L2CAP_PKT_OVERHEAD);
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM (p, p_ccb->remote_cid);
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enqueue (&p_ccb->xmit_hold_q, p_buf);
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cu_check_channel_congestion (p_ccb);
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE)
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if new packet is higher priority than serving ccb and it is not overrun */
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (( p_ccb->p_lcb->rr_pri > p_ccb->ccb_priority )
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      &&( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota > 0))
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send out higher priority packet */
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_lcb->rr_pri = p_ccb->ccb_priority;
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if we are doing a round robin scheduling, set the flag */
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_lcb->link_xmit_quota == 0)
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cb.check_round_robin = TRUE;
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1339