avdt_ccb_act.cc revision d7ffd64accbd50a27289a388856e56244ccbb5da
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2006-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 the action functions associated with the channel
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  control block state machine.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
2783e2c342e8b40009f3509425722d309c0b8189b9Chris Manton#include "bt_types.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
295cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdtc_api.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_int.h"
33258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
36d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue;
3978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_clear_ccb
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function clears out certain buffers, queues, and
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  other data elements of a ccb.
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_ccb_clear_ccb(tAVDT_CCB *p_ccb)
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *p_buf;
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear certain ccb variables */
56d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->cong = false;
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->ret_count = 0;
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free message being fragmented */
60cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&p_ccb->p_curr_msg);
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free message being reassembled */
63cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&p_ccb->p_rx_msg);
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear out response queue */
661a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    while ((p_buf = (BT_HDR *) fixed_queue_try_dequeue(p_ccb->rsp_q)) != NULL)
67cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov        osi_free(p_buf);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_chan_open
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function calls avdt_ad_open_req() to
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  initiate a signaling channel connection.
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
81d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_chan_open(tAVDT_CCB *p_ccb,
82d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                        UNUSED_ATTR tAVDT_CCB_EVT *p_data)
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetOutService(p_ccb->peer_addr, BTM_SEC_SERVICE_AVDTP, AVDT_CHAN_SIG);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ad_open_req(AVDT_CHAN_SIG, p_ccb, NULL, AVDT_INT);
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_chan_close
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function calls avdt_ad_close_req() to close a
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  signaling channel connection.
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
99d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_chan_close(tAVDT_CCB *p_ccb,
100d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                         UNUSED_ATTR tAVDT_CCB_EVT *p_data)
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* close the transport channel used by this CCB */
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ad_close_req(AVDT_CHAN_SIG, p_ccb, NULL);
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_chk_close
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function checks for active streams on this CCB.
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If there are none, it starts an idle timer.
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
117d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_chk_close(tAVDT_CCB *p_ccb,
118d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                        UNUSED_ATTR tAVDT_CCB_EVT *p_data)
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int         i;
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB   *p_scb = &avdt_cb.scb[0];
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* see if there are any active scbs associated with this ccb */
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++)
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_scb->allocated) && (p_scb->p_ccb == p_ccb))
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if no active scbs start idle timer */
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (i == AVDT_NUM_SEPS)
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(p_ccb->ret_ccb_timer);
13678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(p_ccb->rsp_ccb_timer);
13778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        period_ms_t interval_ms = avdt_cb.rcb.idle_tout * 1000;
13878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_set_on_queue(p_ccb->idle_ccb_timer, interval_ms,
13978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           avdt_ccb_idle_ccb_timer_timeout, p_ccb,
14078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btu_general_alarm_queue);
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_hdl_discover_cmd
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a discover command is
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received from the peer.  It gathers up the stream
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  information for all allocated streams and initiates
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sending of a discover response.
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_hdl_discover_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SEP_INFO      sep_info[AVDT_NUM_SEPS];
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB           *p_scb = &avdt_cb.scb[0];
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int                 i;
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_data->msg.discover_rsp.p_sep_info = sep_info;
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_data->msg.discover_rsp.num_seps = 0;
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for all allocated scbs */
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++)
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_scb->allocated)
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* copy sep info */
172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            sep_info[p_data->msg.discover_rsp.num_seps].in_use = p_scb->in_use;
173ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            sep_info[p_data->msg.discover_rsp.num_seps].seid = i + 1;
174ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            sep_info[p_data->msg.discover_rsp.num_seps].media_type = p_scb->cs.media_type;
175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            sep_info[p_data->msg.discover_rsp.num_seps].tsep = p_scb->cs.tsep;
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->msg.discover_rsp.num_seps++;
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send response */
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCOVER_RSP_EVT, p_data);
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_hdl_discover_rsp
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a discover response or
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  reject is received from the peer.  It calls the application
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback function with the results.
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_hdl_discover_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we're done with procedure */
200d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->proc_busy = false;
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call app callback with results */
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*p_ccb->proc_cback)(0, p_ccb->peer_addr, AVDT_DISCOVER_CFM_EVT,
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         (tAVDT_CTRL *)(&p_data->msg.discover_rsp));
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_hdl_getcap_cmd
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a get capabilities command
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the peer.  It retrieves the stream
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  configuration for the requested stream and initiates
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sending of a get capabilities response.
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_hdl_getcap_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB       *p_scb;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* look up scb for seid sent to us */
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_scb = avdt_scb_by_hdl(p_data->msg.single.seid);
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_data->msg.svccap.p_cfg = &p_scb->cs.cfg;
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_event(p_ccb, AVDT_CCB_API_GETCAP_RSP_EVT, p_data);
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_hdl_getcap_rsp
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called with a get capabilities response
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or reject is received from the peer.  It calls the
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  application callback function with the results.
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_hdl_getcap_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we're done with procedure */
247d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->proc_busy = false;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call app callback with results */
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*p_ccb->proc_cback)(0, p_ccb->peer_addr, AVDT_GETCAP_CFM_EVT,
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         (tAVDT_CTRL *)(&p_data->msg.svccap));
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_hdl_start_cmd
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a start command is received
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the peer.  It verifies that all requested streams
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  are in the proper state.  If so, it initiates sending of
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a start response.  Otherwise it sends a start reject.
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_hdl_start_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
269d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t err_code = 0;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify all streams in the right state */
272d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t seid = avdt_scb_verify(p_ccb, AVDT_VERIFY_START, p_data->msg.multi.seid_list,
27319165cb562df83f29f7403b9a0f38b199a2edfb3Anubhav Gupta                                 p_data->msg.multi.num_seps, &err_code);
27419165cb562df83f29f7403b9a0f38b199a2edfb3Anubhav Gupta    if (seid == 0 && err_code == 0)
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we're ok, send response */
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_event(p_ccb, AVDT_CCB_API_START_RSP_EVT, p_data);
27819165cb562df83f29f7403b9a0f38b199a2edfb3Anubhav Gupta    } else {
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* not ok, send reject */
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->msg.hdr.err_code = err_code;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->msg.hdr.err_param = seid;
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_msg_send_rej(p_ccb, AVDT_SIG_START, &p_data->msg);
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_hdl_start_rsp
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a start response or reject
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the peer.  Using the SEIDs stored in the
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  current command message, it sends a start response or start
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  reject event to each SCB associated with the command.
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_hdl_start_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
301d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t     event;
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int         i;
303d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t     *p;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB   *p_scb;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* determine rsp or rej event */
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event = (p_data->msg.hdr.err_code == 0) ?
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            AVDT_SCB_MSG_START_RSP_EVT : AVDT_SCB_MSG_START_REJ_EVT;
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get to where seid's are stashed in current cmd */
311d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p = (uint8_t *)(p_ccb->p_curr_cmd + 1);
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* little trick here; length of current command equals number of streams */
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < p_ccb->p_curr_cmd->len; i++)
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_scb = avdt_scb_by_hdl(p[i])) != NULL)
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            avdt_scb_event(p_scb, event, (tAVDT_SCB_EVT *) &p_data->msg);
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_hdl_suspend_cmd
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a suspend command is received
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the peer.  It verifies that all requested streams are
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  in the proper state.  If so, it initiates sending of a
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  suspend response.  Otherwise it sends a suspend reject.
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_hdl_suspend_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
339d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t seid;
340d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t err_code = 0;
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify all streams in the right state */
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((seid = avdt_scb_verify(p_ccb, AVDT_VERIFY_SUSPEND, p_data->msg.multi.seid_list,
34419165cb562df83f29f7403b9a0f38b199a2edfb3Anubhav Gupta                                p_data->msg.multi.num_seps, &err_code)) == 0 &&
34519165cb562df83f29f7403b9a0f38b199a2edfb3Anubhav Gupta                                err_code == 0)
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we're ok, send response */
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_event(p_ccb, AVDT_CCB_API_SUSPEND_RSP_EVT, p_data);
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* not ok, send reject */
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->msg.hdr.err_code = err_code;
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->msg.hdr.err_param = seid;
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_msg_send_rej(p_ccb, AVDT_SIG_SUSPEND, &p_data->msg);
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_hdl_suspend_rsp
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a suspend response or reject
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the peer.  Using the SEIDs stored in the
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  current command message, it sends a suspend response or
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  suspend reject event to each SCB associated with the command.
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_hdl_suspend_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
375d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t     event;
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int         i;
377d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t     *p;
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB   *p_scb;
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* determine rsp or rej event */
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event = (p_data->msg.hdr.err_code == 0) ?
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            AVDT_SCB_MSG_SUSPEND_RSP_EVT : AVDT_SCB_MSG_SUSPEND_REJ_EVT;
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get to where seid's are stashed in current cmd */
385d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p = (uint8_t *)(p_ccb->p_curr_cmd + 1);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* little trick here; length of current command equals number of streams */
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < p_ccb->p_curr_cmd->len; i++)
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_scb = avdt_scb_by_hdl(p[i])) != NULL)
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            avdt_scb_event(p_scb, event, (tAVDT_SCB_EVT *) &p_data->msg);
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_discover_cmd
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a discover command to the
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peer.  It copies variables needed for the procedure from
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the event to the CCB.  It marks the CCB as busy and then
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sends a discover command.
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_snd_discover_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* store info in ccb struct */
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->p_proc_data = p_data->discover.p_sep_info;
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->proc_cback = p_data->discover.p_cback;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->proc_param = p_data->discover.num_seps;
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we're busy */
418d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->proc_busy = true;
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* build and queue discover req */
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_send_cmd(p_ccb, NULL, AVDT_SIG_DISCOVER, NULL);
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_discover_rsp
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a discover response to
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer.  It takes the stream information passed in the
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event and sends a discover response.
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_snd_discover_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send response */
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_send_rsp(p_ccb, AVDT_SIG_DISCOVER, &p_data->msg);
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_getcap_cmd
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a get capabilities command
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to the peer.  It copies variables needed for the procedure
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the event to the CCB.  It marks the CCB as busy and
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  then sends a get capabilities command.
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_snd_getcap_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
457d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t sig_id = AVDT_SIG_GETCAP;
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* store info in ccb struct */
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->p_proc_data = p_data->getcap.p_cfg;
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->proc_cback = p_data->getcap.p_cback;
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we're busy */
464d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->proc_busy = true;
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* build and queue discover req */
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->msg.hdr.sig_id == AVDT_SIG_GET_ALLCAP)
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sig_id = AVDT_SIG_GET_ALLCAP;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_send_cmd(p_ccb, NULL, sig_id, (tAVDT_MSG *) &p_data->getcap.single);
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_getcap_rsp
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a get capabilities response
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to the peer.  It takes the stream information passed in the
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event and sends a get capabilities response.
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_snd_getcap_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
487d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t sig_id = AVDT_SIG_GETCAP;
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->msg.hdr.sig_id == AVDT_SIG_GET_ALLCAP)
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sig_id = AVDT_SIG_GET_ALLCAP;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send response */
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_send_rsp(p_ccb, sig_id, &p_data->msg);
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_start_cmd
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a start command to the
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peer.  It verifies that all requested streams are in the
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  proper state.  If so, it sends a start command.  Otherwise
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  send ourselves back a start reject.
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_snd_start_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int             i;
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB       *p_scb;
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_MSG       avdt_msg;
514d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         seid_list[AVDT_NUM_SEPS];
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* make copy of our seid list */
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(seid_list, p_data->msg.multi.seid_list, p_data->msg.multi.num_seps);
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify all streams in the right state */
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((avdt_msg.hdr.err_param = avdt_scb_verify(p_ccb, AVDT_VERIFY_OPEN, p_data->msg.multi.seid_list,
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_data->msg.multi.num_seps, &avdt_msg.hdr.err_code)) == 0)
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set peer seid list in messsage */
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_scb_peer_seid_list(&p_data->msg.multi);
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send command */
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_msg_send_cmd(p_ccb, seid_list, AVDT_SIG_START, &p_data->msg);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* failed; send ourselves a reject for each stream */
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < p_data->msg.multi.num_seps; i++)
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_scb = avdt_scb_by_hdl(seid_list[i])) != NULL)
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                avdt_scb_event(p_scb, AVDT_SCB_MSG_START_REJ_EVT, (tAVDT_SCB_EVT *) &avdt_msg.hdr);
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_start_rsp
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a start response to the
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peer.  It takes the stream information passed in the event
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and sends a start response.  Then it sends a start event
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to the SCB for each stream.
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_snd_start_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB *p_scb;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send response message */
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_send_rsp(p_ccb, AVDT_SIG_START, &p_data->msg);
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send start event to each scb */
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < p_data->msg.multi.num_seps; i++)
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_scb = avdt_scb_by_hdl(p_data->msg.multi.seid_list[i])) != NULL)
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            avdt_scb_event(p_scb, AVDT_SCB_MSG_START_CMD_EVT, NULL);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_suspend_cmd
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a suspend command to the
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peer.  It verifies that all requested streams are in the
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  proper state.  If so, it sends a suspend command.
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Otherwise it calls the callback function for each requested
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  stream and sends a suspend confirmation with failure.
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_snd_suspend_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int             i;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB       *p_scb;
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_MSG       avdt_msg;
592d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         seid_list[AVDT_NUM_SEPS];
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* make copy of our seid list */
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(seid_list, p_data->msg.multi.seid_list, p_data->msg.multi.num_seps);
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify all streams in the right state */
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((avdt_msg.hdr.err_param = avdt_scb_verify(p_ccb, AVDT_VERIFY_STREAMING, p_data->msg.multi.seid_list,
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_data->msg.multi.num_seps, &avdt_msg.hdr.err_code)) == 0)
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set peer seid list in messsage */
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_scb_peer_seid_list(&p_data->msg.multi);
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send command */
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_msg_send_cmd(p_ccb, seid_list, AVDT_SIG_SUSPEND, &p_data->msg);
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* failed; send ourselves a reject for each stream */
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < p_data->msg.multi.num_seps; i++)
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_scb = avdt_scb_by_hdl(seid_list[i])) != NULL)
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                avdt_scb_event(p_scb, AVDT_SCB_MSG_SUSPEND_REJ_EVT, (tAVDT_SCB_EVT *) &avdt_msg.hdr);
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_suspend_rsp
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a suspend response to the
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peer.  It takes the stream information passed in the event
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and sends a suspend response.  Then it sends a suspend event
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to the SCB for each stream.
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_snd_suspend_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB *p_scb;
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send response message */
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_send_rsp(p_ccb, AVDT_SIG_SUSPEND, &p_data->msg);
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send start event to each scb */
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < p_data->msg.multi.num_seps; i++)
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_scb = avdt_scb_by_hdl(p_data->msg.multi.seid_list[i])) != NULL)
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            avdt_scb_event(p_scb, AVDT_SCB_MSG_SUSPEND_CMD_EVT, NULL);
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_clear_cmds
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the signaling channel is
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  closed to clean up any pending commands.  For each pending
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command in the command queue, it frees the command and
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  calls the application callback function indicating failure.
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Certain CCB variables are also initialized.
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
665d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_clear_cmds(tAVDT_CCB *p_ccb,
666d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                         UNUSED_ATTR tAVDT_CCB_EVT *p_data)
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int             i;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB       *p_scb = &avdt_cb.scb[0];
670d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         err_code = AVDT_ERR_CONNECT;
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear the ccb */
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_clear_ccb(p_ccb);
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear out command queue; this is a little tricky here; we need
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** to handle the case where there is a command on deck in p_curr_cmd,
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** plus we need to clear out the queue
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    do
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we know p_curr_cmd = NULL after this */
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_cmd_fail(p_ccb, (tAVDT_CCB_EVT *) &err_code);
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set up next message */
6851a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        p_ccb->p_curr_cmd = (BT_HDR *) fixed_queue_try_dequeue(p_ccb->cmd_q);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } while (p_ccb->p_curr_cmd != NULL);
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send a CC_CLOSE_EVT any active scbs associated with this ccb */
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++)
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_scb->allocated) && (p_scb->p_ccb == p_ccb))
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            avdt_scb_event(p_scb, AVDT_SCB_CC_CLOSE_EVT, NULL);
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_cmd_fail
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when there is a response timeout.
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The currently pending command is freed and we fake a
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  reject message back to ourselves.
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_cmd_fail(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_MSG       msg;
714d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         evt;
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB       *p_scb;
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_curr_cmd != NULL)
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set up data */
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.hdr.err_code = p_data->err_code;
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.hdr.err_param = 0;
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb);
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* pretend that we received a rej message */
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt = avdt_msg_rej_2_evt[p_ccb->p_curr_cmd->event - 1];
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (evt & AVDT_CCB_MKR)
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
729d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            avdt_ccb_event(p_ccb, (uint8_t) (evt & ~AVDT_CCB_MKR), (tAVDT_CCB_EVT *) &msg);
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we get the scb out of the current cmd */
734d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            p_scb = avdt_scb_by_hdl(*((uint8_t *)(p_ccb->p_curr_cmd + 1)));
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb != NULL)
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                avdt_scb_event(p_scb, evt, (tAVDT_SCB_EVT *) &msg);
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
741cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov        osi_free_and_reset((void **)&p_ccb->p_curr_cmd);
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_free_cmd
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a response is received for a
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  currently pending command.  The command is freed.
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
756d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_free_cmd(tAVDT_CCB *p_ccb,
757d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                       UNUSED_ATTR tAVDT_CCB_EVT *p_data)
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
759cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&p_ccb->p_curr_cmd);
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_cong_state
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the congestion state for
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the CCB.
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_cong_state(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->cong = p_data->llcong;
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_ret_cmd
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to retransmit the currently
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pending command.  The retransmission count is incremented.
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the count reaches the maximum number of retransmissions,
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the event is treated as a response timeout.
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_ret_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
793d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t err_code = AVDT_ERR_TIMEOUT;
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->ret_count++;
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->ret_count == AVDT_RET_MAX)
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* command failed */
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->ret_count = 0;
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_cmd_fail(p_ccb, (tAVDT_CCB_EVT *) &err_code);
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* go to next queued command */
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_snd_cmd(p_ccb, p_data);
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if command pending and we're not congested and not sending a fragment */
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((!p_ccb->cong) && (p_ccb->p_curr_msg == NULL) && (p_ccb->p_curr_cmd != NULL))
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* make copy of message in p_curr_cmd and send it */
811717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            BT_HDR *p_msg = (BT_HDR *)osi_malloc(AVDT_CMD_BUF_SIZE);
812717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            memcpy(p_msg, p_ccb->p_curr_cmd,
813717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                   (sizeof(BT_HDR) + p_ccb->p_curr_cmd->offset + p_ccb->p_curr_cmd->len));
814717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            avdt_msg_send(p_ccb, p_msg);
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
81778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        /* restart ret timer */
81878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(p_ccb->idle_ccb_timer);
81978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(p_ccb->rsp_ccb_timer);
82078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        period_ms_t interval_ms = avdt_cb.rcb.ret_tout * 1000;
82178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_set_on_queue(p_ccb->ret_ccb_timer, interval_ms,
82278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           avdt_ccb_ret_ccb_timer_timeout, p_ccb,
82378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btu_general_alarm_queue);
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_cmd
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called the send the next command,
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if any, in the command queue.
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
838d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_snd_cmd(tAVDT_CCB *p_ccb,
839d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                      UNUSED_ATTR tAVDT_CCB_EVT *p_data)
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR  *p_msg;
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* do we have commands to send?  send next command;  make sure we're clear;
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** not congested, not sending fragment, not waiting for response
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!p_ccb->cong) && (p_ccb->p_curr_msg == NULL) && (p_ccb->p_curr_cmd == NULL))
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8481a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        if ((p_msg = (BT_HDR *) fixed_queue_try_dequeue(p_ccb->cmd_q)) != NULL)
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* make a copy of buffer in p_curr_cmd */
851717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            p_ccb->p_curr_cmd = (BT_HDR *)osi_malloc(AVDT_CMD_BUF_SIZE);
852717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            memcpy(p_ccb->p_curr_cmd, p_msg,
853717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                   (sizeof(BT_HDR) + p_msg->offset + p_msg->len));
854717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            avdt_msg_send(p_ccb, p_msg);
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_snd_msg
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
869d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_snd_msg(tAVDT_CCB *p_ccb,
870d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                      UNUSED_ATTR tAVDT_CCB_EVT *p_data)
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_msg;
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if not congested */
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_ccb->cong)
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* are we sending a fragmented message? continue sending fragment */
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_curr_msg != NULL)
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            avdt_msg_send(p_ccb, NULL);
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do we have responses to send?  send them */
8831a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        else if (!fixed_queue_is_empty(p_ccb->rsp_q))
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8851a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov            while ((p_msg = (BT_HDR *)fixed_queue_try_dequeue(p_ccb->rsp_q)) != NULL)
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
887d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                if (avdt_msg_send(p_ccb, p_msg) == true)
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* break out if congested */
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do we have commands to send?  send next command */
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_snd_cmd(p_ccb, NULL);
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_set_reconn
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to enable a reconnect attempt when
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a channel transitions from closing to idle state.  It sets
906d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen**                  the reconn variable to true.
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
912d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_set_reconn(tAVDT_CCB *p_ccb,
913d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                         UNUSED_ATTR tAVDT_CCB_EVT *p_data)
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
915d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->reconn = true;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_clr_reconn
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to clear the reconn variable.
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
928d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_clr_reconn(tAVDT_CCB *p_ccb,
929d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                         UNUSED_ATTR tAVDT_CCB_EVT *p_data)
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
931d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->reconn = false;
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_chk_reconn
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to check if a reconnect attempt
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is enabled.  If enabled, it sends an AVDT_CCB_UL_OPEN_EVT
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to the CCB.  If disabled, the CCB is deallocated.
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
946d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_chk_reconn(tAVDT_CCB *p_ccb,
947d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                         UNUSED_ATTR tAVDT_CCB_EVT *p_data)
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
949d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t err_code = AVDT_ERR_CONNECT;
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->reconn)
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
953d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        p_ccb->reconn = false;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out ccb */
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_clear_ccb(p_ccb);
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out current command, if any */
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_cmd_fail(p_ccb, (tAVDT_CCB_EVT *) &err_code);
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* reopen the signaling channel */
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_event(p_ccb, AVDT_CCB_UL_OPEN_EVT, NULL);
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_ll_closed(p_ccb, NULL);
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_chk_timer
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function stops the CCB timer if the idle timer is
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  running.
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
981d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_chk_timer(tAVDT_CCB *p_ccb,
982d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                        UNUSED_ATTR tAVDT_CCB_EVT *p_data)
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
98478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_cancel(p_ccb->idle_ccb_timer);
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_set_conn
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set CCB variables associated with AVDT_ConnectReq().
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_set_conn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save callback */
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->p_conn_cback = p_data->connect.p_cback;
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set security level */
1003d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP, p_data->connect.sec_mask,
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_SIG);
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_set_disconn
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set CCB variables associated with AVDT_DisconnectReq().
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_set_disconn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*
1020158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati    AVDT_TRACE_EVENT("avdt_ccb_set_disconn:conn:x%x, api:x%x",
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_conn_cback, p_data->disconnect.p_cback);
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save callback */
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->disconnect.p_cback)
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_conn_cback = p_data->disconnect.p_cback;
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_do_disconn
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Do action associated with AVDT_DisconnectReq().
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1038d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_do_disconn(tAVDT_CCB *p_ccb,
1039d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                         UNUSED_ATTR tAVDT_CCB_EVT *p_data)
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear any pending commands */
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_clear_cmds(p_ccb, NULL);
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* close channel */
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_chan_close(p_ccb, NULL);
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_ll_closed
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Clear commands from and deallocate CCB.
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1058d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid avdt_ccb_ll_closed(tAVDT_CCB *p_ccb,
1059d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                        UNUSED_ATTR tAVDT_CCB_EVT *p_data)
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_CTRL_CBACK    *p_cback;
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR             bd_addr;
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_CTRL          avdt_ctrl;
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear any pending commands */
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_clear_cmds(p_ccb, NULL);
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save callback pointer, bd addr */
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cback = p_ccb->p_conn_cback;
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cback)
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cback = avdt_cb.p_conn_cback;
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(bd_addr, p_ccb->peer_addr, BD_ADDR_LEN);
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* dealloc ccb */
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_dealloc(p_ccb, NULL);
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call callback */
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cback)
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ctrl.hdr.err_code = 0;
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cback)(0, bd_addr, AVDT_DISCONNECT_IND_EVT, &avdt_ctrl);
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_ccb_ll_opened
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Call callback on open.
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_ccb_ll_opened(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_CTRL          avdt_ctrl;
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1099d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->ll_opened = true;
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_ccb->p_conn_cback)
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_conn_cback = avdt_cb.p_conn_cback;
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call callback */
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_conn_cback)
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ctrl.hdr.err_code = 0;
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ctrl.hdr.err_param = p_data->msg.hdr.err_param;
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_conn_cback)(0, p_ccb->peer_addr, AVDT_CONNECT_IND_EVT, &avdt_ctrl);
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1112