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>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_int.h"
29911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "avdtc_api.h"
30258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_target.h"
32911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_types.h"
33911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_utils.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
35911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "btu.h"
36d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
40ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_clear_ccb
41ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
42ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function clears out certain buffers, queues, and
43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  other data elements of a ccb.
44ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
45ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
46ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
47ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
48ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void avdt_ccb_clear_ccb(tAVDT_CCB* p_ccb) {
50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p_buf;
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* clear certain ccb variables */
53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->cong = false;
54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->ret_count = 0;
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* free message being fragmented */
57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free_and_reset((void**)&p_ccb->p_curr_msg);
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* free message being reassembled */
60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free_and_reset((void**)&p_ccb->p_rx_msg);
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* clear out response queue */
63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->rsp_q)) != NULL)
64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    osi_free(p_buf);
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
69ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_chan_open
70ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function calls avdt_ad_open_req() to
72ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  initiate a signaling channel connection.
73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
74ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
75ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
76ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chan_open(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
79903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski  BTM_SetOutService(p_ccb->peer_addr, BTM_SEC_SERVICE_AVDTP, AVDT_CHAN_SIG);
80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ad_open_req(AVDT_CHAN_SIG, p_ccb, NULL, AVDT_INT);
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
84ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
85ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_chan_close
86ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
87ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function calls avdt_ad_close_req() to close a
88ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  signaling channel connection.
89ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
90ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
91ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
92ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
93ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chan_close(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* close the transport channel used by this CCB */
96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ad_close_req(AVDT_CHAN_SIG, p_ccb, NULL);
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
100ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
101ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_chk_close
102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function checks for active streams on this CCB.
104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  If there are none, it starts an idle timer.
105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chk_close(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb = &avdt_cb.scb[0];
113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* see if there are any active scbs associated with this ccb */
115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++) {
116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((p_scb->allocated) && (p_scb->p_ccb == p_ccb)) {
117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if no active scbs start idle timer */
122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (i == AVDT_NUM_SEPS) {
123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    alarm_cancel(p_ccb->ret_ccb_timer);
124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    alarm_cancel(p_ccb->rsp_ccb_timer);
125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    period_ms_t interval_ms = avdt_cb.rcb.idle_tout * 1000;
12647616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski    alarm_set_on_mloop(p_ccb->idle_ccb_timer, interval_ms,
12747616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski                       avdt_ccb_idle_ccb_timer_timeout, p_ccb);
128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_hdl_discover_cmd
134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when a discover command is
136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  received from the peer.  It gathers up the stream
137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  information for all allocated streams and initiates
138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  sending of a discover response.
139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
140ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_discover_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SEP_INFO sep_info[AVDT_NUM_SEPS];
146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb = &avdt_cb.scb[0];
147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_data->msg.discover_rsp.p_sep_info = sep_info;
150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_data->msg.discover_rsp.num_seps = 0;
151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* for all allocated scbs */
153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++) {
154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_scb->allocated) {
155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* copy sep info */
156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      sep_info[p_data->msg.discover_rsp.num_seps].in_use = p_scb->in_use;
157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      sep_info[p_data->msg.discover_rsp.num_seps].seid = i + 1;
158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      sep_info[p_data->msg.discover_rsp.num_seps].media_type =
159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_scb->cs.media_type;
160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      sep_info[p_data->msg.discover_rsp.num_seps].tsep = p_scb->cs.tsep;
161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->msg.discover_rsp.num_seps++;
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send response */
167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCOVER_RSP_EVT, p_data);
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_hdl_discover_rsp
173ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when a discover response or
175ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  reject is received from the peer.  It calls the application
176ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  callback function with the results.
177ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
178ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
179ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
180ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
181ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_discover_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* we're done with procedure */
184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->proc_busy = false;
185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* call app callback with results */
187903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski  (*p_ccb->proc_cback)(0, &p_ccb->peer_addr, AVDT_DISCOVER_CFM_EVT,
188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                       (tAVDT_CTRL*)(&p_data->msg.discover_rsp));
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_hdl_getcap_cmd
194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
195ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when a get capabilities command
196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  is received from the peer.  It retrieves the stream
197ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  configuration for the requested stream and initiates
198ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  sending of a get capabilities response.
199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_getcap_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb;
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* look up scb for seid sent to us */
208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_scb = avdt_scb_by_hdl(p_data->msg.single.seid);
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_data->msg.svccap.p_cfg = &p_scb->cs.cfg;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ccb_event(p_ccb, AVDT_CCB_API_GETCAP_RSP_EVT, p_data);
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_hdl_getcap_rsp
218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called with a get capabilities response
220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  or reject is received from the peer.  It calls the
221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  application callback function with the results.
222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_getcap_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* we're done with procedure */
229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->proc_busy = false;
230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* call app callback with results */
232903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski  (*p_ccb->proc_cback)(0, &p_ccb->peer_addr, AVDT_GETCAP_CFM_EVT,
233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                       (tAVDT_CTRL*)(&p_data->msg.svccap));
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_hdl_start_cmd
239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when a start command is received
241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  from the peer.  It verifies that all requested streams
242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  are in the proper state.  If so, it initiates sending of
243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  a start response.  Otherwise it sends a start reject.
244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_start_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t err_code = 0;
251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* verify all streams in the right state */
253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t seid =
254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_scb_verify(p_ccb, AVDT_VERIFY_START, p_data->msg.multi.seid_list,
255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_data->msg.multi.num_seps, &err_code);
256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (seid == 0 && err_code == 0) {
257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* we're ok, send response */
258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ccb_event(p_ccb, AVDT_CCB_API_START_RSP_EVT, p_data);
259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* not ok, send reject */
261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_data->msg.hdr.err_code = err_code;
262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_data->msg.hdr.err_param = seid;
263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_msg_send_rej(p_ccb, AVDT_SIG_START, &p_data->msg);
264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
268ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_hdl_start_rsp
270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when a start response or reject
272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  is received from the peer.  Using the SEIDs stored in the
273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  current command message, it sends a start response or start
274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  reject event to each SCB associated with the command.
275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_start_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t event;
282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p;
284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb;
285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* determine rsp or rej event */
287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  event = (p_data->msg.hdr.err_code == 0) ? AVDT_SCB_MSG_START_RSP_EVT
288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                          : AVDT_SCB_MSG_START_REJ_EVT;
289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* get to where seid's are stashed in current cmd */
291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = (uint8_t*)(p_ccb->p_curr_cmd + 1);
292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* little trick here; length of current command equals number of streams */
294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (i = 0; i < p_ccb->p_curr_cmd->len; i++) {
295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_scb = avdt_scb_by_hdl(p[i]);
296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_scb != NULL) {
297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_scb_event(p_scb, event, (tAVDT_SCB_EVT*)&p_data->msg);
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_hdl_suspend_cmd
305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when a suspend command is received
307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  from the peer.  It verifies that all requested streams are
308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  in the proper state.  If so, it initiates sending of a
309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  suspend response.  Otherwise it sends a suspend reject.
310ee96a3c60fca590d38025925c072d264e06493c4Myles Watson
311ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
312ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
315ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_suspend_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t seid;
318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t err_code = 0;
319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* verify all streams in the right state */
321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((seid = avdt_scb_verify(p_ccb, AVDT_VERIFY_SUSPEND,
322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              p_data->msg.multi.seid_list,
323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              p_data->msg.multi.num_seps, &err_code)) == 0 &&
324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      err_code == 0) {
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* we're ok, send response */
326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ccb_event(p_ccb, AVDT_CCB_API_SUSPEND_RSP_EVT, p_data);
327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* not ok, send reject */
329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_data->msg.hdr.err_code = err_code;
330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_data->msg.hdr.err_param = seid;
331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_msg_send_rej(p_ccb, AVDT_SIG_SUSPEND, &p_data->msg);
332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_hdl_suspend_rsp
338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when a suspend response or reject
340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  is received from the peer.  Using the SEIDs stored in the
341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  current command message, it sends a suspend response or
3429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  suspend reject event to each SCB associated with the
3439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  command.
344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_suspend_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t event;
352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p;
354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb;
355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* determine rsp or rej event */
357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  event = (p_data->msg.hdr.err_code == 0) ? AVDT_SCB_MSG_SUSPEND_RSP_EVT
358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                          : AVDT_SCB_MSG_SUSPEND_REJ_EVT;
359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* get to where seid's are stashed in current cmd */
361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = (uint8_t*)(p_ccb->p_curr_cmd + 1);
362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* little trick here; length of current command equals number of streams */
364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (i = 0; i < p_ccb->p_curr_cmd->len; i++) {
365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_scb = avdt_scb_by_hdl(p[i]);
366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_scb != NULL) {
367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_scb_event(p_scb, event, (tAVDT_SCB_EVT*)&p_data->msg);
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_discover_cmd
375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to send a discover command to the
377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  peer.  It copies variables needed for the procedure from
378ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the event to the CCB.  It marks the CCB as busy and then
379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  sends a discover command.
380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
382ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
383ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
384ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_discover_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* store info in ccb struct */
387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->p_proc_data = p_data->discover.p_sep_info;
388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->proc_cback = p_data->discover.p_cback;
389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->proc_param = p_data->discover.num_seps;
390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* we're busy */
392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->proc_busy = true;
393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* build and queue discover req */
395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_msg_send_cmd(p_ccb, NULL, AVDT_SIG_DISCOVER, NULL);
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_discover_rsp
401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to send a discover response to
403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the peer.  It takes the stream information passed in the
404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  event and sends a discover response.
405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_discover_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send response */
412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_msg_send_rsp(p_ccb, AVDT_SIG_DISCOVER, &p_data->msg);
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_getcap_cmd
418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to send a get capabilities command
420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  to the peer.  It copies variables needed for the procedure
421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  from the event to the CCB.  It marks the CCB as busy and
422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  then sends a get capabilities command.
423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
425ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
426ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
427ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_getcap_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t sig_id = AVDT_SIG_GETCAP;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* store info in ccb struct */
432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->p_proc_data = p_data->getcap.p_cfg;
433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->proc_cback = p_data->getcap.p_cback;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* we're busy */
436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->proc_busy = true;
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* build and queue discover req */
439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_data->msg.hdr.sig_id == AVDT_SIG_GET_ALLCAP)
440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    sig_id = AVDT_SIG_GET_ALLCAP;
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_msg_send_cmd(p_ccb, NULL, sig_id, (tAVDT_MSG*)&p_data->getcap.single);
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_getcap_rsp
448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to send a get capabilities response
450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  to the peer.  It takes the stream information passed in the
451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  event and sends a get capabilities response.
452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
456ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_getcap_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t sig_id = AVDT_SIG_GETCAP;
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_data->msg.hdr.sig_id == AVDT_SIG_GET_ALLCAP)
461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    sig_id = AVDT_SIG_GET_ALLCAP;
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send response */
464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_msg_send_rsp(p_ccb, sig_id, &p_data->msg);
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_start_cmd
470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to send a start command to the
472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  peer.  It verifies that all requested streams are in the
473ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  proper state.  If so, it sends a start command.  Otherwise
474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  send ourselves back a start reject.
475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
477ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
479ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_start_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb;
483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_MSG avdt_msg;
484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t seid_list[AVDT_NUM_SEPS];
485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
486c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov  AVDT_TRACE_DEBUG("%s", __func__);
487c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov
488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* make copy of our seid list */
489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(seid_list, p_data->msg.multi.seid_list, p_data->msg.multi.num_seps);
490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* verify all streams in the right state */
492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_msg.hdr.err_param =
493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_scb_verify(p_ccb, AVDT_VERIFY_OPEN, p_data->msg.multi.seid_list,
494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_data->msg.multi.num_seps, &avdt_msg.hdr.err_code);
495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (avdt_msg.hdr.err_param == 0) {
496c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov    AVDT_TRACE_DEBUG("%s: AVDT_SIG_START", __func__);
497c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov
498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* set peer seid list in messsage */
499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_scb_peer_seid_list(&p_data->msg.multi);
500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* send command */
502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_msg_send_cmd(p_ccb, seid_list, AVDT_SIG_START, &p_data->msg);
503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* failed; send ourselves a reject for each stream */
505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    for (i = 0; i < p_data->msg.multi.num_seps; i++) {
506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_scb = avdt_scb_by_hdl(seid_list[i]);
507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_scb != NULL) {
508c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov        AVDT_TRACE_DEBUG("%s: AVDT_SCB_MSG_START_REJ_EVT: i=%d", __func__, i);
5098e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        tAVDT_SCB_EVT avdt_scb_evt;
5108e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        avdt_scb_evt.msg.hdr = avdt_msg.hdr;
5118e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        avdt_scb_event(p_scb, AVDT_SCB_MSG_START_REJ_EVT, &avdt_scb_evt);
512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
518ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
519ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_start_rsp
520ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to send a start response to the
522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  peer.  It takes the stream information passed in the event
523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  and sends a start response.  Then it sends a start event
524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  to the SCB for each stream.
525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_start_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb;
532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send response message */
535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_msg_send_rsp(p_ccb, AVDT_SIG_START, &p_data->msg);
536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send start event to each scb */
538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (i = 0; i < p_data->msg.multi.num_seps; i++) {
539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_scb = avdt_scb_by_hdl(p_data->msg.multi.seid_list[i]);
540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_scb != NULL) {
541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_scb_event(p_scb, AVDT_SCB_MSG_START_CMD_EVT, NULL);
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
547ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
548ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_suspend_cmd
549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to send a suspend command to the
551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  peer.  It verifies that all requested streams are in the
552ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  proper state.  If so, it sends a suspend command.
553ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  Otherwise it calls the callback function for each requested
554ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  stream and sends a suspend confirmation with failure.
555ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
556ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
557ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
559ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_suspend_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb;
563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_MSG avdt_msg;
564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t seid_list[AVDT_NUM_SEPS];
565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* make copy of our seid list */
567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(seid_list, p_data->msg.multi.seid_list, p_data->msg.multi.num_seps);
568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* verify all streams in the right state */
570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_msg.hdr.err_param =
571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_scb_verify(p_ccb, AVDT_VERIFY_STREAMING, p_data->msg.multi.seid_list,
572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_data->msg.multi.num_seps, &avdt_msg.hdr.err_code);
573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (avdt_msg.hdr.err_param == 0) {
574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* set peer seid list in messsage */
575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_scb_peer_seid_list(&p_data->msg.multi);
576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* send command */
578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_msg_send_cmd(p_ccb, seid_list, AVDT_SIG_SUSPEND, &p_data->msg);
579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* failed; send ourselves a reject for each stream */
581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    for (i = 0; i < p_data->msg.multi.num_seps; i++) {
582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_scb = avdt_scb_by_hdl(seid_list[i]);
583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_scb != NULL) {
5848e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        tAVDT_SCB_EVT avdt_scb_evt;
5858e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        avdt_scb_evt.msg.hdr = avdt_msg.hdr;
5868e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        avdt_scb_event(p_scb, AVDT_SCB_MSG_SUSPEND_REJ_EVT, &avdt_scb_evt);
587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
593ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
594ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_suspend_rsp
595ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
596ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to send a suspend response to the
597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  peer.  It takes the stream information passed in the event
598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  and sends a suspend response.  Then it sends a suspend event
599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  to the SCB for each stream.
600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_suspend_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb;
607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send response message */
610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_msg_send_rsp(p_ccb, AVDT_SIG_SUSPEND, &p_data->msg);
611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send start event to each scb */
613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (i = 0; i < p_data->msg.multi.num_seps; i++) {
614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_scb = avdt_scb_by_hdl(p_data->msg.multi.seid_list[i]);
615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_scb != NULL) {
616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_scb_event(p_scb, AVDT_SCB_MSG_SUSPEND_CMD_EVT, NULL);
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_clear_cmds
624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
625ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when the signaling channel is
626ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  closed to clean up any pending commands.  For each pending
627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  command in the command queue, it frees the command and
628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  calls the application callback function indicating failure.
629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  Certain CCB variables are also initialized.
630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
632ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
633ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
634ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_clear_cmds(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int i;
637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb = &avdt_cb.scb[0];
638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t err_code = AVDT_ERR_CONNECT;
639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* clear the ccb */
641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ccb_clear_ccb(p_ccb);
642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* clear out command queue; this is a little tricky here; we need
644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ** to handle the case where there is a command on deck in p_curr_cmd,
645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ** plus we need to clear out the queue
646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  */
647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  do {
648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* we know p_curr_cmd = NULL after this */
6498e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    tAVDT_CCB_EVT avdt_ccb_evt;
6508e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    avdt_ccb_evt.err_code = err_code;
6518e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    avdt_ccb_cmd_fail(p_ccb, &avdt_ccb_evt);
652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* set up next message */
654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_ccb->p_curr_cmd = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->cmd_q);
655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } while (p_ccb->p_curr_cmd != NULL);
657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send a CC_CLOSE_EVT any active scbs associated with this ccb */
659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++) {
660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((p_scb->allocated) && (p_scb->p_ccb == p_ccb)) {
661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_scb_event(p_scb, AVDT_SCB_CC_CLOSE_EVT, NULL);
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
668ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_cmd_fail
669ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
670ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when there is a response timeout.
671ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  The currently pending command is freed and we fake a
672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  reject message back to ourselves.
673ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
674ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
675ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
676ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
677ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_cmd_fail(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_MSG msg;
680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t evt;
681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_SCB* p_scb;
682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ccb->p_curr_cmd != NULL) {
684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* set up data */
685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    msg.hdr.err_code = p_data->err_code;
686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    msg.hdr.err_param = 0;
687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    msg.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb);
688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* pretend that we received a rej message */
690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    evt = avdt_msg_rej_2_evt[p_ccb->p_curr_cmd->event - 1];
691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (evt & AVDT_CCB_MKR) {
6938e89469b5e223a48e1915f16862e81a3f4581259Myles Watson      tAVDT_CCB_EVT avdt_ccb_evt;
6948e89469b5e223a48e1915f16862e81a3f4581259Myles Watson      avdt_ccb_evt.msg = msg;
6958e89469b5e223a48e1915f16862e81a3f4581259Myles Watson      avdt_ccb_event(p_ccb, (uint8_t)(evt & ~AVDT_CCB_MKR), &avdt_ccb_evt);
696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* we get the scb out of the current cmd */
698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_scb = avdt_scb_by_hdl(*((uint8_t*)(p_ccb->p_curr_cmd + 1)));
699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_scb != NULL) {
7008e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        tAVDT_SCB_EVT avdt_scb_evt;
7018e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        avdt_scb_evt.msg = msg;
7028e89469b5e223a48e1915f16862e81a3f4581259Myles Watson        avdt_scb_event(p_scb, evt, &avdt_scb_evt);
703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    osi_free_and_reset((void**)&p_ccb->p_curr_cmd);
707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_free_cmd
713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when a response is received for a
715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  currently pending command.  The command is freed.
716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
718ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
719ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
720ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_free_cmd(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free_and_reset((void**)&p_ccb->p_curr_cmd);
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
726ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
727ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_cong_state
728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
729ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to set the congestion state for
730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the CCB.
731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
734ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
735ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_cong_state(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->cong = p_data->llcong;
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
741ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
742ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_ret_cmd
743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to retransmit the currently
745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  pending command.  The retransmission count is incremented.
746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  If the count reaches the maximum number of retransmissions,
747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the event is treated as a response timeout.
748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
751ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
752ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_ret_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->ret_count++;
755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ccb->ret_count == AVDT_RET_MAX) {
756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* command failed */
757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_ccb->ret_count = 0;
7588e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    tAVDT_CCB_EVT avdt_ccb_evt;
7598e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    avdt_ccb_evt.err_code = AVDT_ERR_TIMEOUT;
7608e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    avdt_ccb_cmd_fail(p_ccb, &avdt_ccb_evt);
761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* go to next queued command */
763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ccb_snd_cmd(p_ccb, p_data);
764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if command pending and we're not congested and not sending a fragment */
766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((!p_ccb->cong) && (p_ccb->p_curr_msg == NULL) &&
767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (p_ccb->p_curr_cmd != NULL)) {
768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* make copy of message in p_curr_cmd and send it */
769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BT_HDR* p_msg = (BT_HDR*)osi_malloc(AVDT_CMD_BUF_SIZE);
770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memcpy(p_msg, p_ccb->p_curr_cmd,
771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson             (sizeof(BT_HDR) + p_ccb->p_curr_cmd->offset +
772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_ccb->p_curr_cmd->len));
773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_msg_send(p_ccb, p_msg);
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* restart ret timer */
777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    alarm_cancel(p_ccb->idle_ccb_timer);
778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    alarm_cancel(p_ccb->rsp_ccb_timer);
779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    period_ms_t interval_ms = avdt_cb.rcb.ret_tout * 1000;
78047616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski    alarm_set_on_mloop(p_ccb->ret_ccb_timer, interval_ms,
78147616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski                       avdt_ccb_ret_ccb_timer_timeout, p_ccb);
782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
786ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_cmd
788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
789ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called the send the next command,
790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  if any, in the command queue.
791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
793ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
794ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
795ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_cmd(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p_msg;
798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* do we have commands to send?  send next command;  make sure we're clear;
800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ** not congested, not sending fragment, not waiting for response
801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  */
802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((!p_ccb->cong) && (p_ccb->p_curr_msg == NULL) &&
803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_ccb->p_curr_cmd == NULL)) {
804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_msg = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->cmd_q);
805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_msg != NULL) {
806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* make a copy of buffer in p_curr_cmd */
807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_ccb->p_curr_cmd = (BT_HDR*)osi_malloc(AVDT_CMD_BUF_SIZE);
808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memcpy(p_ccb->p_curr_cmd, p_msg,
809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson             (sizeof(BT_HDR) + p_msg->offset + p_msg->len));
810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_msg_send(p_ccb, p_msg);
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
816ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
817ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_snd_msg
818ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
819ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description
820ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
821ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
822ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
823ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
824ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_msg(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p_msg;
827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if not congested */
829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_ccb->cong) {
830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* are we sending a fragmented message? continue sending fragment */
831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_ccb->p_curr_msg != NULL) {
832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      avdt_msg_send(p_ccb, NULL);
833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* do we have responses to send?  send them */
835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else if (!fixed_queue_is_empty(p_ccb->rsp_q)) {
836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      while ((p_msg = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->rsp_q)) != NULL) {
837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (avdt_msg_send(p_ccb, p_msg) == true) {
838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* break out if congested */
839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* do we have commands to send?  send next command */
845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ccb_snd_cmd(p_ccb, NULL);
846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
851ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_set_reconn
852ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
853ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to enable a reconnect attempt when
854ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  a channel transitions from closing to idle state.  It sets
855ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the reconn variable to true.
856ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
857ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
858ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
859ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
860ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_set_reconn(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->reconn = true;
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
866ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
867ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_clr_reconn
868ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
869ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to clear the reconn variable.
870ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
871ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
872ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
873ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
874ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_clr_reconn(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->reconn = false;
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
880ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
881ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_chk_reconn
882ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to check if a reconnect attempt
884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  is enabled.  If enabled, it sends an AVDT_CCB_UL_OPEN_EVT
885ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  to the CCB.  If disabled, the CCB is deallocated.
886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
890ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chk_reconn(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ccb->reconn) {
893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_ccb->reconn = false;
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* clear out ccb */
896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ccb_clear_ccb(p_ccb);
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* clear out current command, if any */
8998e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    uint8_t err_code = AVDT_ERR_CONNECT;
9008e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    tAVDT_CCB_EVT avdt_ccb_evt;
9018e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    avdt_ccb_evt.err_code = err_code;
9028e89469b5e223a48e1915f16862e81a3f4581259Myles Watson    avdt_ccb_cmd_fail(p_ccb, &avdt_ccb_evt);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* reopen the signaling channel */
905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ccb_event(p_ccb, AVDT_CCB_UL_OPEN_EVT, NULL);
906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ccb_ll_closed(p_ccb, NULL);
908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_chk_timer
914ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
915ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function stops the CCB timer if the idle timer is
916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  running.
917ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
918ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
919ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
920ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
921ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chk_timer(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  alarm_cancel(p_ccb->idle_ccb_timer);
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
927ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_set_conn
929ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
930ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Set CCB variables associated with AVDT_ConnectReq().
931ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
932ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
933ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
934ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
935ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_set_conn(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save callback */
938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->p_conn_cback = p_data->connect.p_cback;
939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* set security level */
941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP,
942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                       p_data->connect.sec_mask, AVDT_PSM, BTM_SEC_PROTO_AVDT,
943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                       AVDT_CHAN_SIG);
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
948ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_set_disconn
949ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
950ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Set CCB variables associated with AVDT_DisconnectReq().
951ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
952ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
953ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
954ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
955ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_set_disconn(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /*
958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  AVDT_TRACE_EVENT("avdt_ccb_set_disconn:conn:x%x, api:x%x",
959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_ccb->p_conn_cback, p_data->disconnect.p_cback);
960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      */
961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save callback */
962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_data->disconnect.p_cback)
963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_ccb->p_conn_cback = p_data->disconnect.p_cback;
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
968ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_do_disconn
969ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Do action associated with AVDT_DisconnectReq().
971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
974ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
975ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_do_disconn(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* clear any pending commands */
978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ccb_clear_cmds(p_ccb, NULL);
979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* close channel */
981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ccb_chan_close(p_ccb, NULL);
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
985ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
986ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_ll_closed
987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Clear commands from and deallocate CCB.
989ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
990ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
993ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_ll_closed(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) {
995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_CTRL_CBACK* p_cback;
996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_CTRL avdt_ctrl;
997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* clear any pending commands */
999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ccb_clear_cmds(p_ccb, NULL);
1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save callback pointer, bd addr */
1002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cback = p_ccb->p_conn_cback;
1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cback) p_cback = avdt_cb.p_conn_cback;
10049e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski  RawAddress bd_addr = p_ccb->peer_addr;
1005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* dealloc ccb */
1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  avdt_ccb_dealloc(p_ccb, NULL);
1008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* call callback */
1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cback) {
1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ctrl.hdr.err_code = 0;
1012903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski    (*p_cback)(0, &bd_addr, AVDT_DISCONNECT_IND_EVT, &avdt_ctrl);
1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1017ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1018ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         avdt_ccb_ll_opened
1019ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1020ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Call callback on open.
1021ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1022ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1023ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void.
1024ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1025ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_ll_opened(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) {
1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tAVDT_CTRL avdt_ctrl;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ccb->ll_opened = true;
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_ccb->p_conn_cback) p_ccb->p_conn_cback = avdt_cb.p_conn_cback;
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* call callback */
1034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ccb->p_conn_cback) {
1035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ctrl.hdr.err_code = 0;
1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    avdt_ctrl.hdr.err_param = p_data->msg.hdr.err_param;
1037903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski    (*p_ccb->p_conn_cback)(0, &p_ccb->peer_addr, AVDT_CONNECT_IND_EVT,
1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                           &avdt_ctrl);
1039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1041