avct_api.cc revision ee96a3c60fca590d38025925c072d264e06493c4
1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/****************************************************************************** 2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Copyright (C) 2003-2016 Broadcom Corporation 4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License"); 6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * you may not use this file except in compliance with the License. 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * You may obtain a copy of the License at: 8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * http://www.apache.org/licenses/LICENSE-2.0 10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Unless required by applicable law or agreed to in writing, software 12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS, 13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * See the License for the specific language governing permissions and 15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * limitations under the License. 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ******************************************************************************/ 18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/****************************************************************************** 20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * This module contains API of the audio/video control transport protocol. 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ******************************************************************************/ 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <string.h> 26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "bt_types.h" 27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "bt_target.h" 28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "bt_utils.h" 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "bt_common.h" 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "l2c_api.h" 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "l2cdefs.h" 32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "btm_api.h" 33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "avct_api.h" 34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "avct_int.h" 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "osi/include/osi.h" 36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/* Control block for AVCT */ 38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmanntAVCT_CB avct_cb; 39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/******************************************************************************* 41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Function AVCT_Register 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Description This is the system level registration function for the 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * AVCTP protocol. This function initializes AVCTP and 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * prepares the protocol stack for its use. This function 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * must be called once by the system or platform using AVCTP 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * before the other functions of the API an be used. 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Returns void 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ******************************************************************************/ 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid AVCT_Register(uint16_t mtu, 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann UNUSED_ATTR uint16_t mtu_br, uint8_t sec_mask) 56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann{ 57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann AVCT_TRACE_API("AVCT_Register"); 58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* register PSM with L2CAP */ 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L2CA_Register(AVCT_PSM, (tL2CAP_APPL_INFO *) &avct_l2c_appl); 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* set security level */ 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVCTP, sec_mask, AVCT_PSM, 0, 0); 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann BTM_SetSecurityLevel(false, "", BTM_SEC_SERVICE_AVCTP, sec_mask, AVCT_PSM, 0, 0); 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* initialize AVCTP data structures */ 67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann memset(&avct_cb, 0, sizeof(tAVCT_CB)); 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* Include the browsing channel which uses eFCR */ 70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L2CA_Register(AVCT_BR_PSM, (tL2CAP_APPL_INFO *) &avct_l2c_br_appl); 71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* AVCTP browsing channel uses the same security service as AVCTP control channel */ 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVCTP, sec_mask, AVCT_BR_PSM, 0, 0); 74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann BTM_SetSecurityLevel(false, "", BTM_SEC_SERVICE_AVCTP, sec_mask, AVCT_BR_PSM, 0, 0); 75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (mtu_br < AVCT_MIN_BROWSE_MTU) 77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann mtu_br = AVCT_MIN_BROWSE_MTU; 78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_cb.mtu_br = mtu_br; 79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#if defined(AVCT_INITIAL_TRACE_LEVEL) 81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_cb.trace_level = AVCT_INITIAL_TRACE_LEVEL; 82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#else 83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_cb.trace_level = BT_TRACE_LEVEL_NONE; 84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#endif 85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (mtu < AVCT_MIN_CONTROL_MTU) 87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann mtu = AVCT_MIN_CONTROL_MTU; 88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* store mtu */ 89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_cb.mtu = mtu; 90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/******************************************************************************* 93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Function AVCT_Deregister 95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Description This function is called to deregister use AVCTP protocol. 97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * It is called when AVCTP is no longer being used by any 98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * application in the system. Before this function can be 99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * called, all connections must be removed with 100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * AVCT_RemoveConn(). 101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Returns void 104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ******************************************************************************/ 106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid AVCT_Deregister(void) 107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann{ 108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann AVCT_TRACE_API("AVCT_Deregister"); 109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* deregister PSM with L2CAP */ 111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L2CA_Deregister(AVCT_PSM); 112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/******************************************************************************* 115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Function AVCT_CreateConn 117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Description Create an AVCTP connection. There are two types of 119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * connections, initiator and acceptor, as determined by 120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * the p_cc->role parameter. When this function is called to 121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * create an initiator connection, an AVCTP connection to 122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * the peer device is initiated if one does not already exist. 123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * If an acceptor connection is created, the connection waits 124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * passively for an incoming AVCTP connection from a peer device. 125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Returns AVCT_SUCCESS if successful, otherwise error. 128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ******************************************************************************/ 130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint16_t AVCT_CreateConn(uint8_t *p_handle, tAVCT_CC *p_cc, BD_ADDR peer_addr) 131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann{ 132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint16_t result = AVCT_SUCCESS; 133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann tAVCT_CCB *p_ccb; 134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann tAVCT_LCB *p_lcb; 135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann AVCT_TRACE_API("AVCT_CreateConn: %d, control:%d", p_cc->role, p_cc->control); 137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* Allocate ccb; if no ccbs, return failure */ 139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann p_ccb = avct_ccb_alloc(p_cc); 140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (p_ccb == NULL) 141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result = AVCT_NO_RESOURCES; 143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann else 145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* get handle */ 147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *p_handle = avct_ccb_to_idx(p_ccb); 148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* if initiator connection */ 150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (p_cc->role == AVCT_INT) 151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* find link; if none allocate a new one */ 153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann p_lcb = avct_lcb_by_bd(peer_addr); 154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (p_lcb == NULL) 155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann p_lcb = avct_lcb_alloc(peer_addr); 157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (p_lcb == NULL) 158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* no link resources; free ccb as well */ 160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_ccb_dealloc(p_ccb, AVCT_NO_EVT, 0, NULL); 161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result = AVCT_NO_RESOURCES; 162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* check if PID already in use */ 165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann else if (avct_lcb_has_pid(p_lcb, p_cc->pid)) 166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_ccb_dealloc(p_ccb, AVCT_NO_EVT, 0, NULL); 168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result = AVCT_PID_IN_USE; 169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (result == AVCT_SUCCESS) 172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* bind lcb to ccb */ 174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann p_ccb->p_lcb = p_lcb; 175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann AVCT_TRACE_DEBUG("ch_state: %d", p_lcb->ch_state); 176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_lcb_event(p_lcb, AVCT_LCB_UL_BIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return result; 181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/******************************************************************************* 184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Function AVCT_RemoveConn 186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Description Remove an AVCTP connection. This function is called when 188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * the application is no longer using a connection. If this 189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * is the last connection to a peer the L2CAP channel for AVCTP 190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * will be closed. 191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Returns AVCT_SUCCESS if successful, otherwise error. 194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ******************************************************************************/ 196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint16_t AVCT_RemoveConn(uint8_t handle) 197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann{ 198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint16_t result = AVCT_SUCCESS; 199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann tAVCT_CCB *p_ccb; 200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann AVCT_TRACE_API("AVCT_RemoveConn"); 202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* map handle to ccb */ 204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann p_ccb = avct_ccb_by_idx(handle); 205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (p_ccb == NULL) 206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result = AVCT_BAD_HANDLE; 208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* if connection not bound to lcb, dealloc */ 210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann else if (p_ccb->p_lcb == NULL) 211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_ccb_dealloc(p_ccb, AVCT_NO_EVT, 0, NULL); 213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann /* send unbind event to lcb */ 215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann else 216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann avct_lcb_event(p_ccb->p_lcb, AVCT_LCB_UL_UNBIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return result; 220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/******************************************************************************* 223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Function AVCT_CreateBrowse 225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Description Create an AVCTP Browse channel. There are two types of 227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * connections, initiator and acceptor, as determined by 228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * the role parameter. When this function is called to 229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * create an initiator connection, the Browse channel to 230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * the peer device is initiated if one does not already exist. 231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * If an acceptor connection is created, the connection waits 232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * passively for an incoming AVCTP connection from a peer device. 233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Returns AVCT_SUCCESS if successful, otherwise error. 236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * 237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ******************************************************************************/ 238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint16_t AVCT_CreateBrowse (uint8_t handle, uint8_t role) 239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann{ 240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint16_t result = AVCT_SUCCESS; 241 tAVCT_CCB *p_ccb; 242 tAVCT_BCB *p_bcb; 243 int index; 244 245 AVCT_TRACE_API("AVCT_CreateBrowse: %d", role); 246 247 /* map handle to ccb */ 248 p_ccb = avct_ccb_by_idx(handle); 249 if (p_ccb == NULL) 250 { 251 return AVCT_BAD_HANDLE; 252 } 253 else 254 { 255 /* mark this CCB as supporting browsing channel */ 256 if ((p_ccb->allocated & AVCT_ALOC_BCB) == 0) 257 { 258 p_ccb->allocated |= AVCT_ALOC_BCB; 259 } 260 } 261 262 /* if initiator connection */ 263 if (role == AVCT_INT) 264 { 265 /* the link control block must exist before this function is called as INT. */ 266 if ((p_ccb->p_lcb == NULL) || (p_ccb->p_lcb->allocated == 0)) 267 { 268 result = AVCT_NOT_OPEN; 269 } 270 else 271 { 272 /* find link; if none allocate a new one */ 273 index = p_ccb->p_lcb->allocated; 274 if (index > AVCT_NUM_LINKS) 275 { 276 result = AVCT_BAD_HANDLE; 277 } 278 else 279 { 280 p_bcb = &avct_cb.bcb[index - 1]; 281 p_bcb->allocated = index; 282 } 283 } 284 285 if (result == AVCT_SUCCESS) 286 { 287 /* bind bcb to ccb */ 288 p_ccb->p_bcb = p_bcb; 289 memcpy(p_bcb->peer_addr, p_ccb->p_lcb->peer_addr, BD_ADDR_LEN); 290 AVCT_TRACE_DEBUG("ch_state: %d", p_bcb->ch_state); 291 avct_bcb_event(p_bcb, AVCT_LCB_UL_BIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 292 } 293 } 294 295 return result; 296} 297 298/******************************************************************************* 299 * 300 * Function AVCT_RemoveBrowse 301 * 302 * Description Remove an AVCTP Browse channel. This function is called when 303 * the application is no longer using a connection. If this 304 * is the last connection to a peer the L2CAP channel for AVCTP 305 * will be closed. 306 * 307 * 308 * Returns AVCT_SUCCESS if successful, otherwise error. 309 * 310 ******************************************************************************/ 311uint16_t AVCT_RemoveBrowse (uint8_t handle) 312{ 313 uint16_t result = AVCT_SUCCESS; 314 tAVCT_CCB *p_ccb; 315 316 AVCT_TRACE_API("AVCT_RemoveBrowse"); 317 318 /* map handle to ccb */ 319 p_ccb = avct_ccb_by_idx(handle); 320 if (p_ccb == NULL) 321 { 322 result = AVCT_BAD_HANDLE; 323 } 324 else if (p_ccb->p_bcb != NULL) 325 /* send unbind event to bcb */ 326 { 327 avct_bcb_event(p_ccb->p_bcb, AVCT_LCB_UL_UNBIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 328 } 329 330 return result; 331} 332 333/******************************************************************************* 334 * 335 * Function AVCT_GetBrowseMtu 336 * 337 * Description Get the peer_mtu for the AVCTP Browse channel of the given 338 * connection. 339 * 340 * Returns the peer browsing channel MTU. 341 * 342 ******************************************************************************/ 343uint16_t AVCT_GetBrowseMtu (uint8_t handle) 344{ 345 uint16_t peer_mtu = AVCT_MIN_BROWSE_MTU; 346 347 tAVCT_CCB *p_ccb; 348 349 if ((p_ccb = avct_ccb_by_idx(handle)) != NULL && p_ccb->p_bcb != NULL) 350 { 351 peer_mtu = p_ccb->p_bcb->peer_mtu; 352 } 353 354 return peer_mtu; 355} 356 357/******************************************************************************* 358 * 359 * Function AVCT_GetPeerMtu 360 * 361 * Description Get the peer_mtu for the AVCTP channel of the given 362 * connection. 363 * 364 * Returns the peer MTU size. 365 * 366 ******************************************************************************/ 367uint16_t AVCT_GetPeerMtu (uint8_t handle) 368{ 369 uint16_t peer_mtu = L2CAP_DEFAULT_MTU; 370 tAVCT_CCB *p_ccb; 371 372 /* map handle to ccb */ 373 p_ccb = avct_ccb_by_idx(handle); 374 if (p_ccb != NULL) 375 { 376 if (p_ccb->p_lcb) 377 { 378 peer_mtu = p_ccb->p_lcb->peer_mtu; 379 } 380 } 381 382 return peer_mtu; 383} 384 385/******************************************************************************* 386 * 387 * Function AVCT_MsgReq 388 * 389 * Description Send an AVCTP message to a peer device. In calling 390 * AVCT_MsgReq(), the application should keep track of the 391 * congestion state of AVCTP as communicated with events 392 * AVCT_CONG_IND_EVT and AVCT_UNCONG_IND_EVT. If the 393 * application calls AVCT_MsgReq() when AVCTP is congested 394 * the message may be discarded. The application may make its 395 * first call to AVCT_MsgReq() after it receives an 396 * AVCT_CONNECT_CFM_EVT or AVCT_CONNECT_IND_EVT on control channel or 397 * AVCT_BROWSE_CONN_CFM_EVT or AVCT_BROWSE_CONN_IND_EVT on browsing channel. 398 * 399 * p_msg->layer_specific must be set to 400 * AVCT_DATA_CTRL for control channel traffic; 401 * AVCT_DATA_BROWSE for for browse channel traffic. 402 * 403 * Returns AVCT_SUCCESS if successful, otherwise error. 404 * 405 ******************************************************************************/ 406uint16_t AVCT_MsgReq(uint8_t handle, uint8_t label, uint8_t cr, BT_HDR *p_msg) 407{ 408 uint16_t result = AVCT_SUCCESS; 409 tAVCT_CCB *p_ccb; 410 tAVCT_UL_MSG ul_msg; 411 412 AVCT_TRACE_API("%s", __func__); 413 414 /* verify p_msg parameter */ 415 if (p_msg == NULL) 416 { 417 return AVCT_NO_RESOURCES; 418 } 419 AVCT_TRACE_API("%s len: %d layer_specific: %d", __func__, p_msg->len, p_msg->layer_specific); 420 421 /* map handle to ccb */ 422 p_ccb = avct_ccb_by_idx(handle); 423 if (p_ccb == NULL) 424 { 425 result = AVCT_BAD_HANDLE; 426 osi_free(p_msg); 427 } 428 /* verify channel is bound to link */ 429 else if (p_ccb->p_lcb == NULL) 430 { 431 result = AVCT_NOT_OPEN; 432 osi_free(p_msg); 433 } 434 435 if (result == AVCT_SUCCESS) 436 { 437 ul_msg.p_buf = p_msg; 438 ul_msg.p_ccb = p_ccb; 439 ul_msg.label = label; 440 ul_msg.cr = cr; 441 442 /* send msg event to bcb */ 443 if (p_msg->layer_specific == AVCT_DATA_BROWSE) 444 { 445 if (p_ccb->p_bcb == NULL && (p_ccb->allocated & AVCT_ALOC_BCB) == 0) 446 { 447 /* BCB channel is not open and not allocated */ 448 result = AVCT_BAD_HANDLE; 449 osi_free(p_msg); 450 } 451 else 452 { 453 p_ccb->p_bcb = avct_bcb_by_lcb(p_ccb->p_lcb); 454 avct_bcb_event(p_ccb->p_bcb, AVCT_LCB_UL_MSG_EVT, (tAVCT_LCB_EVT *) &ul_msg); 455 } 456 } 457 /* send msg event to lcb */ 458 else 459 { 460 avct_lcb_event(p_ccb->p_lcb, AVCT_LCB_UL_MSG_EVT, (tAVCT_LCB_EVT *) &ul_msg); 461 } 462 } 463 return result; 464} 465 466