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 functions which operate on the AVCTP connection
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  control block.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "data_types.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avct_api.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avct_int.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avct_ccb_alloc
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Allocate a connection control block; copy parameters to ccb.
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the ccb, or NULL if none could be allocated.
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVCT_CCB *avct_ccb_alloc(tAVCT_CC *p_cc)
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVCT_CCB   *p_ccb = &avct_cb.ccb[0];
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int         i;
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < AVCT_NUM_CONN; i++, p_ccb++)
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb->allocated)
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->allocated = AVCT_ALOC_LCB;
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(&p_ccb->cc, p_cc, sizeof(tAVCT_CC));
53158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati            AVCT_TRACE_DEBUG("avct_ccb_alloc %d", i);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (i == AVCT_NUM_CONN)
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* out of ccbs */
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb = NULL;
62158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVCT_TRACE_WARNING("Out of ccbs");
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ccb;
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avct_ccb_dealloc
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Deallocate a connection control block and call application
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback.
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avct_ccb_dealloc(tAVCT_CCB *p_ccb, UINT8 event, UINT16 result, BD_ADDR bd_addr)
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVCT_CTRL_CBACK    *p_cback = p_ccb->cc.p_ctrl_cback;
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
82158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati    AVCT_TRACE_DEBUG("avct_ccb_dealloc %d", avct_ccb_to_idx(p_ccb));
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVCT_BROWSE_INCLUDED == TRUE)
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_ccb->p_bcb == NULL)
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_ccb, 0, sizeof(tAVCT_CCB));
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* control channel is down, but the browsing channel is still connected 0 disconnect it now */
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avct_bcb_event(p_ccb->p_bcb, AVCT_LCB_UL_UNBIND_EVT, (tAVCT_LCB_EVT *) &p_ccb);
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_lcb = NULL;
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_ccb, 0, sizeof(tAVCT_CCB));
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (event != AVCT_NO_EVT)
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cback)(avct_ccb_to_idx(p_ccb), event, result, bd_addr);
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avct_ccb_to_idx
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Given a pointer to an ccb, return its index.
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Index of ccb.
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 avct_ccb_to_idx(tAVCT_CCB *p_ccb)
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* use array arithmetic to determine index */
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (UINT8) (p_ccb - avct_cb.ccb);
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avct_ccb_by_idx
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return ccb pointer based on ccb index (or handle).
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the ccb, or NULL if none found.
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVCT_CCB *avct_ccb_by_idx(UINT8 idx)
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVCT_CCB   *p_ccb;
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify index */
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (idx < AVCT_NUM_CONN)
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb = &avct_cb.ccb[idx];
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* verify ccb is allocated */
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ccb->allocated)
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb = NULL;
141158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati            AVCT_TRACE_WARNING("ccb %d not allocated", idx);
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb = NULL;
147158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVCT_TRACE_WARNING("No ccb for idx %d", idx);
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ccb;
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
151