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