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 UCD code
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 "gki.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.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 "btu.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN l2c_ucd_connect ( BD_ADDR rem_bda );
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_ucd_discover_cback
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      UCD Discover callback
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_ucd_discover_cback (BD_ADDR rem_bda, UINT8 info_type, UINT32 data)
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB    *p_rcb = &l2cb.rcb_pool[0];
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      xx;
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_discover_cback");
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb->in_use)
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if this application is waiting UCD reception info */
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (( info_type == L2CAP_UCD_INFO_TYPE_RECEPTION )
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && ( p_rcb->ucd.state & L2C_UCD_STATE_W4_RECEPTION ))
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb (rem_bda, info_type, data);
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rcb->ucd.state &= ~(L2C_UCD_STATE_W4_RECEPTION);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if this application is waiting UCD MTU info */
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (( info_type == L2CAP_UCD_INFO_TYPE_MTU )
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && ( p_rcb->ucd.state & L2C_UCD_STATE_W4_MTU ))
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb (rem_bda, info_type, data);
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rcb->ucd.state &= ~(L2C_UCD_STATE_W4_MTU);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_ucd_data_ind_cback
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      UCD Data callback
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_ucd_data_ind_cback (BD_ADDR rem_bda, BT_HDR *p_buf)
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p;
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 psm;
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB    *p_rcb;
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
96a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_data_ind_cback");
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + p_buf->offset;
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16(psm, p)
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset += L2CAP_UCD_OVERHEAD;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len    -= L2CAP_UCD_OVERHEAD;
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
106a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - no RCB for l2c_ucd_data_ind_cback, PSM: 0x%04x", psm);
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb->ucd.cb_info.pL2CA_UCD_Data_Cb(rem_bda, p_buf);
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_ucd_congestion_status_cback
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      UCD Congestion Status callback
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_ucd_congestion_status_cback (BD_ADDR rem_bda, BOOLEAN is_congested)
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB    *p_rcb = &l2cb.rcb_pool[0];
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      xx;
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
129a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_congestion_status_cback");
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (( p_rcb->in_use )
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          &&( p_rcb->ucd.state != L2C_UCD_STATE_UNUSED ))
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
138a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                L2CAP_TRACE_DEBUG ("L2CAP - Calling UCDCongestionStatus_Cb (%d), PSM=0x%04x, BDA: %08x%04x,",
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    is_congested, p_rcb->psm,
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    (rem_bda[4]<<8)+rem_bda[5]);
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb ( rem_bda, is_congested );
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_ucd_disconnect_ind_cback
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      UCD disconnect callback (This prevent to access null pointer)
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_ucd_disconnect_ind_cback (UINT16 cid, BOOLEAN result)
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* do nothing */
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_ucd_config_ind_cback
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      UCD config callback (This prevent to access null pointer)
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_ucd_config_ind_cback (UINT16 cid, tL2CAP_CFG_INFO *p_cfg)
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* do nothing */
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_ucd_config_cfm_cback
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      UCD config callback (This prevent to access null pointer)
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void l2c_ucd_config_cfm_cback (UINT16 cid, tL2CAP_CFG_INFO *p_cfg)
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* do nothing */
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_UcdRegister
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Register PSM on UCD.
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     tL2CAP_UCD_CB_INFO
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if successs
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_UcdRegister ( UINT16 psm, tL2CAP_UCD_CB_INFO *p_cb_info )
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB             *p_rcb;
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
206a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_API  ("L2CA_UcdRegister()  PSM: 0x%04x", psm);
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!p_cb_info->pL2CA_UCD_Discover_Cb)
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || (!p_cb_info->pL2CA_UCD_Data_Cb))
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
211a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - no callback registering PSM(0x%04x) on UCD", psm);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
217a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - no RCB for L2CA_UcdRegister, PSM: 0x%04x", psm);
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rcb->ucd.state   = L2C_UCD_STATE_W4_DATA;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rcb->ucd.cb_info = *p_cb_info;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if master rcb is created for UCD */
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) == NULL)
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_rcb = l2cu_allocate_rcb (L2C_UCD_RCB_ID)) == NULL)
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
229a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_ERROR ("L2CAP - no RCB available for L2CA_UcdRegister");
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (FALSE);
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* these callback functions will forward data to each UCD application */
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb            = l2c_ucd_discover_cback;
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rcb->ucd.cb_info.pL2CA_UCD_Data_Cb                = l2c_ucd_data_ind_cback;
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb   = l2c_ucd_congestion_status_cback;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (&p_rcb->api, 0, sizeof(tL2CAP_APPL_INFO));
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rcb->api.pL2CA_DisconnectInd_Cb        = l2c_ucd_disconnect_ind_cback;
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* This will make L2CAP check UCD congestion callback */
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rcb->api.pL2CA_CongestionStatus_Cb     = NULL;
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* do nothing but prevent crash */
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rcb->api.pL2CA_ConfigInd_Cb            = l2c_ucd_config_ind_cback;
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rcb->api.pL2CA_ConfigCfm_Cb            = l2c_ucd_config_cfm_cback;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_UcdDeregister
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Deregister PSM on UCD.
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     PSM
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if successs
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_UcdDeregister ( UINT16 psm )
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CCB    *p_ccb;
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB    *p_rcb;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      xx;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
271a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_API  ("L2CA_UcdDeregister()  PSM: 0x%04x", psm);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
275a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - no RCB for L2CA_UcdDeregister, PSM: 0x%04x", psm);
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rcb->ucd.state = L2C_UCD_STATE_UNUSED;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check this was the last UCD registration */
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rcb = &l2cb.rcb_pool[0];
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_rcb->in_use) && (p_rcb->ucd.state != L2C_UCD_STATE_UNUSED))
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (TRUE);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* delete master rcb for UCD */
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) != NULL)
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_rcb (p_rcb);
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* delete CCB for UCD */
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb = l2cb.ccb_pool;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( xx = 0; xx < MAX_L2CAP_CHANNELS; xx++ )
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (( p_ccb->in_use )
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          &&( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ))
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_ccb (p_ccb);
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb++;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_UcdDiscover
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Discover UCD of remote device.
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     PSM
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BD_ADDR of remote device
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  info_type : L2CAP_UCD_INFO_TYPE_RECEPTION
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                              L2CAP_UCD_INFO_TYPE_MTU
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if successs
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_UcdDiscover ( UINT16 psm, BD_ADDR rem_bda, UINT8 info_type )
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB        *p_lcb;
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CCB        *p_ccb;
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB        *p_rcb;
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
332a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_API ("L2CA_UcdDiscover()  PSM: 0x%04x  BDA: %08x%04x, InfoType=0x%02x", psm,
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[4]<<8)+rem_bda[5], info_type);
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Fail if the PSM is not registered */
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ||( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED ))
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
340a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_UcdDiscover, PSM: 0x%04x", psm);
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, see if we already have a link to the remote */
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* then find the channel control block for UCD. */
3468fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_connect (rem_bda) == FALSE )
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (FALSE);
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set waiting flags in rcb */
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( info_type & L2CAP_UCD_INFO_TYPE_RECEPTION )
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb->ucd.state |= L2C_UCD_STATE_W4_RECEPTION;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( info_type & L2CAP_UCD_INFO_TYPE_MTU )
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb->ucd.state |= L2C_UCD_STATE_W4_MTU;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if link is already established */
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_lcb)&&(p_lcb->link_state == LST_CONNECTED))
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb)
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID);
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_ucd_check_pending_info_req(p_ccb);
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_UcdDataWrite
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Send UCD to remote device
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     PSM
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BD Address of remote
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Pointer to buffer of type BT_HDR
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  flags : L2CAP_FLUSHABLE_CH_BASED
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          L2CAP_FLUSHABLE_PKT
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          L2CAP_NON_FLUSHABLE_PKT
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Return value     L2CAP_DW_SUCCESS, if data accepted
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  L2CAP_DW_FAILED,  if error
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 L2CA_UcdDataWrite (UINT16 psm, BD_ADDR rem_bda, BT_HDR *p_buf, UINT16 flags)
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB        *p_lcb;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CCB        *p_ccb;
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB        *p_rcb;
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p;
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
399a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_API ("L2CA_UcdDataWrite()  PSM: 0x%04x  BDA: %08x%04x", psm,
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[4]<<8)+rem_bda[5]);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Fail if the PSM is not registered */
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ||( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED ))
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
407a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_UcdDataWrite, PSM: 0x%04x", psm);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (L2CAP_DW_FAILED);
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, see if we already have a link to the remote */
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*  then find the channel control block for UCD */
4148fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( l2c_ucd_connect (rem_bda) == FALSE )
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf (p_buf);
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (L2CAP_DW_FAILED);
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If we still don't have lcb and ccb after connect attempt, then can't proceed */
4248fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf (p_buf);
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (L2CAP_DW_FAILED);
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* write PSM */
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset -= L2CAP_UCD_OVERHEAD;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len += L2CAP_UCD_OVERHEAD;
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + p_buf->offset;
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (p, psm);
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* UCD MTU check */
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_lcb->ucd_mtu) && (p_buf->len > p_lcb->ucd_mtu))
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
442a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_WARNING ("L2CAP - Handle: 0x%04x  UCD bigger than peer's UCD mtu size cannot be sent", p_lcb->handle);
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (L2CAP_DW_FAILED);
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If already congested, do not accept any more packets */
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->cong_sent)
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
450a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - Handle: 0x%04x UCD cannot be sent, already congested count: %u  buff_quota: %u",
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_lcb->handle,
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            (p_ccb->xmit_hold_q.count + p_lcb->ucd_out_sec_pending_q.count),
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_ccb->buff_quota);
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (L2CAP_DW_FAILED);
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* channel based, packet based flushable or non-flushable */
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->layer_specific = flags;
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_csm_execute (p_ccb, L2CEVT_L2CA_DATA_WRITE, p_buf);
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->cong_sent)
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (L2CAP_DW_CONGESTED);
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (L2CAP_DW_SUCCESS);
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_UcdSetIdleTimeout
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Set UCD Idle timeout.
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     BD Addr
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Timeout in second
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if successs
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_UcdSetIdleTimeout ( BD_ADDR rem_bda, UINT16 timeout )
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB        *p_lcb;
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CCB        *p_ccb;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
487a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_API ("L2CA_UcdSetIdleTimeout()  Timeout: 0x%04x  BDA: %08x%04x", timeout,
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[4]<<8)+rem_bda[5]);
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, see if we already have a link to the remote */
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* then find the channel control block. */
4938fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
496a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_WARNING ("L2CAP - no UCD channel");
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->fixed_chnl_idle_tout = timeout;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (TRUE);
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         L2CA_UCDSetTxPriority
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Sets the transmission priority for a connectionless channel.
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if a valid channel, else FALSE
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_UCDSetTxPriority ( BD_ADDR rem_bda, tL2CAP_CHNL_PRIORITY priority )
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB        *p_lcb;
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CCB        *p_ccb;
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
520a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_API ("L2CA_UCDSetTxPriority()  priority: 0x%02x  BDA: %08x%04x", priority,
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[4]<<8)+rem_bda[5]);
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5248fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
526a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_UCDSetTxPriority");
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the channel control block */
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
533a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_UCDSetTxPriority");
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* it will update the order of CCB in LCB by priority and update round robin service variables */
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cu_change_pri_ccb (p_ccb, priority);
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_connect
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Connect UCD to remote device.
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     BD_ADDR of remote device
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if successs
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN l2c_ucd_connect ( BD_ADDR rem_bda )
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB        *p_lcb;
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CCB        *p_ccb;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB        *p_rcb;
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
560a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    L2CAP_TRACE_DEBUG ("l2c_ucd_connect()  BDA: %08x%04x",
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (rem_bda[4]<<8)+rem_bda[5]);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Fail if we have not established communications with the controller */
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_IsDeviceUp())
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
567a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_WARNING ("l2c_ucd_connect - BTU not ready");
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, see if we already have a link to the remote */
5728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* No link. Get an LCB and start link establishment */
5758fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        if ( ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
5768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta         ||  (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) )
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
578a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_WARNING ("L2CAP - conn not started l2c_ucd_connect");
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (FALSE);
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if ( p_lcb->info_rx_bits & (1 << L2CAP_EXTENDED_FEATURES_INFO_TYPE) )
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION))
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
586a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_WARNING ("L2CAP - UCD is not supported by peer, l2c_ucd_connect");
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (FALSE);
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the channel control block. */
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Allocate a channel control block */
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
597a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            L2CAP_TRACE_WARNING ("L2CAP - no CCB for l2c_ucd_connect");
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (FALSE);
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Set CID for the connection */
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->local_cid  = L2CAP_CONNECTIONLESS_CID;
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->remote_cid = L2CAP_CONNECTIONLESS_CID;
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Set the default idle timeout value to use */
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->fixed_chnl_idle_tout = L2CAP_UCD_IDLE_TIMEOUT;
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Set the default channel priority value to use */
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_change_pri_ccb (p_ccb, L2CAP_UCD_CH_PRIORITY);
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) == NULL)
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
614a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                L2CAP_TRACE_WARNING ("L2CAP - no UCD registered, l2c_ucd_connect");
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (FALSE);
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Save UCD registration info */
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->p_rcb = p_rcb;
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* There is no configuration, so if the link is up, the channel is up */
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_lcb->link_state == LST_CONNECTED)
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->chnl_state = CST_OPEN;
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_delete_sec_pending_q
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      discard all of UCD packets in security pending queue
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_ucd_delete_sec_pending_q(tL2C_LCB  *p_lcb)
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clean up any security pending UCD */
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_lcb->ucd_out_sec_pending_q.p_first)
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (GKI_dequeue (&p_lcb->ucd_out_sec_pending_q));
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_lcb->ucd_in_sec_pending_q.p_first)
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (GKI_dequeue (&p_lcb->ucd_in_sec_pending_q));
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_check_pending_info_req
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      check if any application is waiting for UCD information
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          TRUE if any pending UCD info request
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN l2c_ucd_check_pending_info_req(tL2C_CCB  *p_ccb)
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB    *p_rcb = &l2cb.rcb_pool[0];
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      xx;
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     pending = FALSE;
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb == NULL)
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
667a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        L2CAP_TRACE_ERROR ("L2CAP - NULL p_ccb in l2c_ucd_check_pending_info_req");
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb->in_use)
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if application is waiting UCD reception info */
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rcb->ucd.state & L2C_UCD_STATE_W4_RECEPTION)
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if this information is available */
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( p_ccb->p_lcb->info_rx_bits & (1 << L2CAP_EXTENDED_FEATURES_INFO_TYPE) )
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION))
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
683a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                        L2CAP_TRACE_WARNING ("L2CAP - UCD is not supported by peer, l2c_ucd_check_pending_info_req");
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        l2c_ucd_delete_sec_pending_q(p_ccb->p_lcb);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        l2cu_release_ccb (p_ccb);
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb (p_ccb->p_lcb->remote_bd_addr,
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                                     L2CAP_UCD_INFO_TYPE_RECEPTION,
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                                     p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION);
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pending = TRUE;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_ccb->p_lcb->w4_info_rsp == FALSE)
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        l2cu_send_peer_info_req (p_ccb->p_lcb, L2CAP_EXTENDED_FEATURES_INFO_TYPE);
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if application is waiting for UCD MTU */
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_rcb->ucd.state & L2C_UCD_STATE_W4_MTU)
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if this information is available */
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( p_ccb->p_lcb->info_rx_bits & (1 << L2CAP_CONNLESS_MTU_INFO_TYPE))
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb (p_ccb->p_lcb->remote_bd_addr,
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                                     L2CAP_UCD_INFO_TYPE_MTU,
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                                     p_ccb->p_lcb->ucd_mtu);
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pending = TRUE;
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_ccb->p_lcb->w4_info_rsp == FALSE)
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        l2cu_send_peer_info_req (p_ccb->p_lcb, L2CAP_CONNLESS_MTU_INFO_TYPE);
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (pending);
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_enqueue_pending_out_sec_q
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     enqueue outgoing UCD packet into security pending queue
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and check congestion
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          None
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_ucd_enqueue_pending_out_sec_q(tL2C_CCB  *p_ccb, void *p_data)
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enqueue (&p_ccb->p_lcb->ucd_out_sec_pending_q, p_data);
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cu_check_channel_congestion (p_ccb);
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_check_pending_out_sec_q
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     check outgoing security
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          TRUE if any UCD packet for security
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN l2c_ucd_check_pending_out_sec_q(tL2C_CCB  *p_ccb)
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p;
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 psm;
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count )
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf = (BT_HDR*)(p_ccb->p_lcb->ucd_out_sec_pending_q.p_first);
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + p_buf->offset;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(psm, p)
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_ORIG_W4_SEC_COMP;
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, psm,
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, CONNLESS_ORIG, &l2c_link_sec_comp, p_ccb);
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (TRUE);
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_send_pending_out_sec_q
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     dequeue UCD packet from security pending queue and
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  enqueue it into CCB
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          None
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_ucd_send_pending_out_sec_q(tL2C_CCB  *p_ccb)
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count )
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf = (BT_HDR*)GKI_dequeue (&p_ccb->p_lcb->ucd_out_sec_pending_q);
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_enqueue_peer_data (p_ccb, (BT_HDR *)p_buf);
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL);
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_discard_pending_out_sec_q
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     dequeue UCD packet from security pending queue and
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  discard it.
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          None
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_ucd_discard_pending_out_sec_q(tL2C_CCB  *p_ccb)
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf = (BT_HDR*)GKI_dequeue (&p_ccb->p_lcb->ucd_out_sec_pending_q);
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we may need to report to application */
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf)
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_check_pending_in_sec_q
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     check incoming security
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          TRUE if any UCD packet for security
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN l2c_ucd_check_pending_in_sec_q(tL2C_CCB  *p_ccb)
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p;
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 psm;
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count )
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf = (BT_HDR*)(p_ccb->p_lcb->ucd_in_sec_pending_q.p_first);
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + p_buf->offset;
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(psm, p)
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->chnl_state = CST_TERM_W4_SEC_COMP;
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, psm,
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  p_ccb->p_lcb->handle, CONNLESS_TERM, &l2c_link_sec_comp, p_ccb);
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (TRUE);
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_send_pending_in_sec_q
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     dequeue UCD packet from security pending queue and
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  send it to application
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          None
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_ucd_send_pending_in_sec_q(tL2C_CCB  *p_ccb)
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count )
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf = (BT_HDR*)GKI_dequeue (&p_ccb->p_lcb->ucd_in_sec_pending_q);
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Data_Cb(p_ccb->p_lcb->remote_bd_addr, (BT_HDR *)p_buf);
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_discard_pending_in_sec_q
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     dequeue UCD packet from security pending queue and
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  discard it.
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          None
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_ucd_discard_pending_in_sec_q(tL2C_CCB  *p_ccb)
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf = (BT_HDR*)GKI_dequeue (&p_ccb->p_lcb->ucd_in_sec_pending_q);
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf)
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_check_rx_pkts
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Check if UCD reception is registered.
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Process received UCD packet if application is expecting.
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          TRUE if UCD reception is registered
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN l2c_ucd_check_rx_pkts(tL2C_LCB  *p_lcb, BT_HDR *p_msg)
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_CCB   *p_ccb;
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_RCB   *p_rcb;
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) != NULL)
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      ||((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) != NULL))
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb == NULL)
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Allocate a channel control block */
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
917a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                L2CAP_TRACE_WARNING ("L2CAP - no CCB for UCD reception");
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf (p_msg);
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return TRUE;
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Set CID for the connection */
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->local_cid  = L2CAP_CONNECTIONLESS_CID;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->remote_cid = L2CAP_CONNECTIONLESS_CID;
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Set the default idle timeout value to use */
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->fixed_chnl_idle_tout = L2CAP_UCD_IDLE_TIMEOUT;
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Set the default channel priority value to use */
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_change_pri_ccb (p_ccb, L2CAP_UCD_CH_PRIORITY);
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Save registration info */
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->p_rcb = p_rcb;
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->chnl_state = CST_OPEN;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2c_csm_execute(p_ccb, L2CEVT_L2CAP_DATA, p_msg);
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        l2c_ucd_process_event
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     This is called from main state machine when LCID is connectionless
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Process the event if it is for UCD.
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return          TRUE if the event is consumed by UCD
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  FALSE if the event needs to be processed by main state machine
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data)
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if the event is not processed by this function, this variable will be set to FALSE */
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN done = TRUE;
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_ccb->chnl_state)
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_CLOSED:
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_LP_CONNECT_CFM:     /* Link came up         */
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if waiting for UCD info */
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2c_ucd_check_pending_info_req (p_ccb))
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* check if any outgoing UCD packet is waiting security check */
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!l2c_ucd_check_pending_out_sec_q(p_ccb))
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->chnl_state = CST_OPEN;
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CAP_DATA:         /* Peer data packet rcvd    */
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_enqueue (&p_ccb->p_lcb->ucd_in_sec_pending_q, p_data);
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CA_DATA_WRITE:    /* Upper layer data to send */
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_enqueue_pending_out_sec_q(p_ccb, p_data);
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CAP_INFO_RSP:
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if waiting for UCD info */
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2c_ucd_check_pending_info_req (p_ccb))
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* check if any outgoing UCD packet is waiting security check */
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!l2c_ucd_check_pending_out_sec_q(p_ccb))
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->chnl_state = CST_OPEN;
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            done = FALSE;   /* main state machine continues to process event */
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_ORIG_W4_SEC_COMP:
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_SEC_RE_SEND_CMD:    /* BTM has enough info to proceed */
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if any outgoing UCD packet is waiting security check */
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2c_ucd_check_pending_out_sec_q(p_ccb))
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->chnl_state = CST_OPEN;
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_SEC_COMP:           /* Security completed success */
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_OPEN;
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_send_pending_out_sec_q(p_ccb);
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count )
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* start a timer to send next UCD packet in OPEN state */
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* it will prevent stack overflow */
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 0);
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* start a timer for idle timeout of UCD */
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, p_ccb->fixed_chnl_idle_tout);
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_SEC_COMP_NEG:
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_OPEN;
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_discard_pending_out_sec_q(p_ccb);
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start a timer for idle timeout of UCD */
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, p_ccb->fixed_chnl_idle_tout);
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CA_DATA_WRITE:    /* Upper layer data to send */
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_enqueue_pending_out_sec_q(p_ccb, p_data);
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CAP_DATA:         /* Peer data packet rcvd    */
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_enqueue (&p_ccb->p_lcb->ucd_in_sec_pending_q, p_data);
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CAP_INFO_RSP:
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if waiting for UCD info */
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_check_pending_info_req (p_ccb);
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            done = FALSE;   /* main state machine continues to process event */
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_TERM_W4_SEC_COMP:
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_SEC_COMP:
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_OPEN;
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_send_pending_in_sec_q (p_ccb);
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count )
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* start a timer to check next UCD packet in OPEN state */
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* it will prevent stack overflow */
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 0);
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* start a timer for idle timeout of UCD */
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, p_ccb->fixed_chnl_idle_tout);
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_SEC_COMP_NEG:
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((tL2C_CONN_INFO *)p_data)->status == BTM_DELAY_CHECK)
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                done = FALSE;
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->chnl_state = CST_OPEN;
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_discard_pending_in_sec_q (p_ccb);
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start a timer for idle timeout of UCD */
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, p_ccb->fixed_chnl_idle_tout);
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CA_DATA_WRITE:        /* Upper layer data to send */
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_enqueue_pending_out_sec_q(p_ccb, p_data);
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CAP_DATA:             /* Peer data packet rcvd    */
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_enqueue (&p_ccb->p_lcb->ucd_in_sec_pending_q, p_data);
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_SEC_RE_SEND_CMD:        /* BTM has enough info to proceed */
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if any incoming UCD packet is waiting security check */
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2c_ucd_check_pending_in_sec_q(p_ccb))
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->chnl_state = CST_OPEN;
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CAP_INFO_RSP:
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if waiting for UCD info */
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_check_pending_info_req (p_ccb);
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            done = FALSE;   /* main state machine continues to process event */
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case CST_OPEN:
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CAP_DATA:             /* Peer data packet rcvd    */
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop idle timer of UCD */
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&p_ccb->timer_entry);
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_enqueue (&p_ccb->p_lcb->ucd_in_sec_pending_q, p_data);
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_check_pending_in_sec_q (p_ccb);
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CA_DATA_WRITE:        /* Upper layer data to send */
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop idle timer of UCD */
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&p_ccb->timer_entry);
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_enqueue_pending_out_sec_q(p_ccb, p_data);
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* coverity[check_return] */ /* coverity[unchecked_value] */
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* success changes state, failure stays in current state */
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_check_pending_out_sec_q (p_ccb);
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_TIMEOUT:
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if any UCD packet is waiting security check */
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((!l2c_ucd_check_pending_in_sec_q(p_ccb))
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              &&(!l2c_ucd_check_pending_out_sec_q(p_ccb)))
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_release_ccb (p_ccb);
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CEVT_L2CAP_INFO_RSP:
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if waiting for UCD info */
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2c_ucd_check_pending_info_req (p_ccb);
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            done = FALSE;   /* main state machine continues to process event */
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        done = FALSE;   /* main state machine continues to process event */
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return done;
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (L2CAP_UCD_INCLUDED == TRUE) */
1171