15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2003-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 module contains API of the audio/video control transport protocol. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "data_types.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avct_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avct_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Control block for AVCT */ 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVCT_DYNAMIC_MEMORY == FALSE 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVCT_CB avct_cb; 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_Register 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the system level registration function for the 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVCTP protocol. This function initializes AVCTP and 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** prepares the protocol stack for its use. This function 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** must be called once by the system or platform using AVCTP 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** before the other functions of the API an be used. 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid AVCT_Register(UINT16 mtu, UINT16 mtu_br, UINT8 sec_mask) 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 575cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(mtu_br); 585cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 59158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_API("AVCT_Register"); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* register PSM with L2CAP */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Register(AVCT_PSM, (tL2CAP_APPL_INFO *) &avct_l2c_appl); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set security level */ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_AVCTP, sec_mask, AVCT_PSM, 0, 0); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_AVCTP, sec_mask, AVCT_PSM, 0, 0); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize AVCTP data structures */ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&avct_cb, 0, sizeof(tAVCT_CB)); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVCT_BROWSE_INCLUDED == TRUE) 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Include the browsing channel which uses eFCR */ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Register(AVCT_BR_PSM, (tL2CAP_APPL_INFO *) &avct_l2c_br_appl); 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_AVCTP_BROWSE, sec_mask, AVCT_BR_PSM, 0, 0); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_AVCTP_BROWSE, sec_mask, AVCT_BR_PSM, 0, 0); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (mtu_br < AVCT_MIN_BROWSE_MTU) 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu_br = AVCT_MIN_BROWSE_MTU; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_cb.mtu_br = mtu_br; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(AVCT_INITIAL_TRACE_LEVEL) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_cb.trace_level = AVCT_INITIAL_TRACE_LEVEL; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_cb.trace_level = BT_TRACE_LEVEL_NONE; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (mtu < AVCT_MIN_CONTROL_MTU) 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = AVCT_MIN_CONTROL_MTU; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store mtu */ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_cb.mtu = mtu; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_Deregister 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to deregister use AVCTP protocol. 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It is called when AVCTP is no longer being used by any 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application in the system. Before this function can be 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** called, all connections must be removed with 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVCT_RemoveConn(). 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid AVCT_Deregister(void) 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 111158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_API("AVCT_Deregister"); 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* deregister PSM with L2CAP */ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Deregister(AVCT_PSM); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_CreateConn 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Create an AVCTP connection. There are two types of 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connections, initiator and acceptor, as determined by 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the p_cc->role parameter. When this function is called to 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** create an initiator connection, an AVCTP connection to 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer device is initiated if one does not already exist. 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If an acceptor connection is created, the connection waits 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passively for an incoming AVCTP connection from a peer device. 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVCT_SUCCESS if successful, otherwise error. 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 AVCT_CreateConn(UINT8 *p_handle, tAVCT_CC *p_cc, BD_ADDR peer_addr) 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result = AVCT_SUCCESS; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_LCB *p_lcb; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 139158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_API("AVCT_CreateConn: %d, control:%d", p_cc->role, p_cc->control); 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate ccb; if no ccbs, return failure */ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avct_ccb_alloc(p_cc)) == NULL) 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_NO_RESOURCES; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get handle */ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_handle = avct_ccb_to_idx(p_ccb); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if initiator connection */ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cc->role == AVCT_INT) 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find link; if none allocate a new one */ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_lcb = avct_lcb_by_bd(peer_addr)) == NULL) 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_lcb = avct_lcb_alloc(peer_addr)) == NULL) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no link resources; free ccb as well */ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_ccb_dealloc(p_ccb, AVCT_NO_EVT, 0, NULL); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_NO_RESOURCES; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if PID already in use */ 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (avct_lcb_has_pid(p_lcb, p_cc->pid)) 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_ccb_dealloc(p_ccb, AVCT_NO_EVT, 0, NULL); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_PID_IN_USE; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVCT_SUCCESS) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* bind lcb to ccb */ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->p_lcb = p_lcb; 175158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_DEBUG("ch_state: %d", p_lcb->ch_state); 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_lcb_event(p_lcb, AVCT_LCB_UL_BIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_RemoveConn 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Remove an AVCTP connection. This function is called when 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the application is no longer using a connection. If this 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is the last connection to a peer the L2CAP channel for AVCTP 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** will be closed. 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVCT_SUCCESS if successful, otherwise error. 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 AVCT_RemoveConn(UINT8 handle) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result = AVCT_SUCCESS; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb; 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 201158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_API("AVCT_RemoveConn"); 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to ccb */ 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avct_ccb_by_idx(handle)) == NULL) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_BAD_HANDLE; 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if connection not bound to lcb, dealloc */ 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_ccb->p_lcb == NULL) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_ccb_dealloc(p_ccb, AVCT_NO_EVT, 0, NULL); 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send unbind event to lcb */ 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_lcb_event(p_ccb->p_lcb, AVCT_LCB_UL_UNBIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_CreateBrowse 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Create an AVCTP Browse channel. There are two types of 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connections, initiator and acceptor, as determined by 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the role parameter. When this function is called to 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** create an initiator connection, the Browse channel to 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer device is initiated if one does not already exist. 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If an acceptor connection is created, the connection waits 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passively for an incoming AVCTP connection from a peer device. 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVCT_SUCCESS if successful, otherwise error. 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 AVCT_CreateBrowse (UINT8 handle, UINT8 role) 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVCT_BROWSE_INCLUDED == TRUE) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result = AVCT_SUCCESS; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_BCB *p_bcb; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int index; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 245158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_API("AVCT_CreateBrowse: %d", role); 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to ccb */ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avct_ccb_by_idx(handle)) == NULL) 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return AVCT_BAD_HANDLE; 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mark this CCB as supporting browsing channel */ 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb->allocated & AVCT_ALOC_BCB) == 0) 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->allocated |= AVCT_ALOC_BCB; 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if initiator connection */ 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (role == AVCT_INT) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the link control block must exist before this function is called as INT. */ 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->p_lcb == NULL) 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_NOT_OPEN; 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find link; if none allocate a new one */ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = p_ccb->p_lcb->allocated; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (index > AVCT_NUM_LINKS) 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_BAD_HANDLE; 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = &avct_cb.bcb[index - 1]; 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->allocated = index; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVCT_SUCCESS) 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* bind bcb to ccb */ 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->p_bcb = p_bcb; 288158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_DEBUG("ch_state: %d", p_bcb->ch_state); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_bcb_event(p_bcb, AVCT_LCB_UL_BIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2955cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(handle); 2965cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(role); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return AVCT_NO_RESOURCES; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_RemoveBrowse 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Remove an AVCTP Browse channel. This function is called when 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the application is no longer using a connection. If this 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is the last connection to a peer the L2CAP channel for AVCTP 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** will be closed. 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVCT_SUCCESS if successful, otherwise error. 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 AVCT_RemoveBrowse (UINT8 handle) 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVCT_BROWSE_INCLUDED == TRUE) 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result = AVCT_SUCCESS; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb; 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 320158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_API("AVCT_RemoveBrowse"); 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to ccb */ 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avct_ccb_by_idx(handle)) == NULL) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_BAD_HANDLE; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_ccb->p_bcb != NULL) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send unbind event to bcb */ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_bcb_event(p_ccb->p_bcb, AVCT_LCB_UL_UNBIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 3345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(handle); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return AVCT_NO_RESOURCES; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_GetBrowseMtu 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get the peer_mtu for the AVCTP Browse channel of the given 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection. 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the peer browsing channel MTU. 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 AVCT_GetBrowseMtu (UINT8 handle) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 peer_mtu = AVCT_MIN_BROWSE_MTU; 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVCT_BROWSE_INCLUDED == TRUE) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb; 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avct_ccb_by_idx(handle)) != NULL && p_ccb->p_bcb != NULL) 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project peer_mtu = p_ccb->p_bcb->peer_mtu; 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3595cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#else 3605cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(handle); 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return peer_mtu; 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_GetPeerMtu 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get the peer_mtu for the AVCTP channel of the given 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection. 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the peer MTU size. 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 AVCT_GetPeerMtu (UINT8 handle) 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 peer_mtu = L2CAP_DEFAULT_MTU; 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb; 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to ccb */ 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avct_ccb_by_idx(handle)) != NULL) 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->p_lcb) 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project peer_mtu = p_ccb->p_lcb->peer_mtu; 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return peer_mtu; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVCT_MsgReq 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVCTP message to a peer device. In calling 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVCT_MsgReq(), the application should keep track of the 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** congestion state of AVCTP as communicated with events 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVCT_CONG_IND_EVT and AVCT_UNCONG_IND_EVT. If the 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application calls AVCT_MsgReq() when AVCTP is congested 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the message may be discarded. The application may make its 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** first call to AVCT_MsgReq() after it receives an 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVCT_CONNECT_CFM_EVT or AVCT_CONNECT_IND_EVT on control channel or 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVCT_BROWSE_CONN_CFM_EVT or AVCT_BROWSE_CONN_IND_EVT on browsing channel. 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_msg->layer_specific must be set to 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVCT_DATA_CTRL for control channel traffic; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVCT_DATA_BROWSE for for browse channel traffic. 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVCT_SUCCESS if successful, otherwise error. 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 AVCT_MsgReq(UINT8 handle, UINT8 label, UINT8 cr, BT_HDR *p_msg) 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result = AVCT_SUCCESS; 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_UL_MSG ul_msg; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 419158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_API("AVCT_MsgReq"); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify p_msg parameter */ 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg == NULL) 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return AVCT_NO_RESOURCES; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 426158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_API("len: %d", p_msg->len); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to ccb */ 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avct_ccb_by_idx(handle)) == NULL) 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_BAD_HANDLE; 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_msg); 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify channel is bound to link */ 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_ccb->p_lcb == NULL) 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_NOT_OPEN; 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_msg); 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVCT_SUCCESS) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ul_msg.p_buf = p_msg; 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ul_msg.p_ccb = p_ccb; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ul_msg.label = label; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ul_msg.cr = cr; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVCT_BROWSE_INCLUDED == TRUE) 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send msg event to bcb */ 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg->layer_specific == AVCT_DATA_BROWSE) 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->p_bcb == NULL && (p_ccb->allocated & AVCT_ALOC_BCB) == 0) 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BCB channel is not open and not allocated */ 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVCT_BAD_HANDLE; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_msg); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->p_bcb = avct_bcb_by_lcb(p_ccb->p_lcb); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_bcb_event(p_ccb->p_bcb, AVCT_LCB_UL_MSG_EVT, (tAVCT_LCB_EVT *) &ul_msg); 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send msg event to lcb */ 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_lcb_event(p_ccb->p_lcb, AVCT_LCB_UL_MSG_EVT, (tAVCT_LCB_EVT *) &ul_msg); 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 474