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