1 /******************************************************************************
2  *
3  *  Copyright 2002-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  This module contains the stream control block and functions which
22  *  operate on the stream control block.
23  *
24  ******************************************************************************/
25 
26 #define LOG_TAG "bluetooth-a2dp"
27 
28 #include <bluetooth/log.h>
29 #include <string.h>
30 
31 #include <cstdint>
32 
33 #include "avdt_api.h"
34 #include "avdt_int.h"
35 #include "avdtc_api.h"
36 #include "internal_include/bt_target.h"
37 #include "osi/include/alarm.h"
38 
39 using namespace bluetooth;
40 
41 /*****************************************************************************
42  * state machine constants and types
43  ****************************************************************************/
44 /* verbose state strings for trace */
45 const char* const avdt_scb_st_str[] = {"SCB_IDLE_ST", "SCB_CONF_ST",   "SCB_OPENING_ST",
46                                        "SCB_OPEN_ST", "SCB_STREAM_ST", "SCB_CLOSING_ST"};
47 
48 /* verbose event strings for trace */
49 const char* const avdt_scb_evt_str[] = {
50         "API_REMOVE_EVT",        "API_WRITE_REQ_EVT",     "API_GETCONFIG_REQ_EVT",
51         "API_DELAY_RPT_REQ",     "API_SETCONFIG_REQ_EVT", "API_OPEN_REQ_EVT",
52         "API_CLOSE_REQ_EVT",     "API_RECONFIG_REQ_EVT",  "API_SECURITY_REQ_EVT",
53         "API_ABORT_REQ_EVT",     "API_GETCONFIG_RSP_EVT", "API_SETCONFIG_RSP_EVT",
54         "API_SETCONFIG_REJ_EVT", "API_OPEN_RSP_EVT",      "API_CLOSE_RSP_EVT",
55         "API_RECONFIG_RSP_EVT",  "API_SECURITY_RSP_EVT",  "API_ABORT_RSP_EVT",
56         "MSG_SETCONFIG_CMD_EVT", "MSG_GETCONFIG_CMD_EVT", "MSG_OPEN_CMD_EVT",
57         "MSG_START_CMD_EVT",     "MSG_SUSPEND_CMD_EVT",   "MSG_CLOSE_CMD_EVT",
58         "MSG_ABORT_CMD_EVT",     "MSG_RECONFIG_CMD_EVT",  "MSG_SECURITY_CMD_EVT",
59         "MSG_DELAY_RPT_CMD_EVT", "MSG_DELAY_RPT_RSP_EVT", "MSG_SETCONFIG_RSP_EVT",
60         "MSG_GETCONFIG_RSP_EVT", "MSG_OPEN_RSP_EVT",      "MSG_START_RSP_EVT",
61         "MSG_SUSPEND_RSP_EVT",   "MSG_CLOSE_RSP_EVT",     "MSG_ABORT_RSP_EVT",
62         "MSG_RECONFIG_RSP_EVT",  "MSG_SECURITY_RSP_EVT",  "MSG_SETCONFIG_REJ_EVT",
63         "MSG_OPEN_REJ_EVT",      "MSG_START_REJ_EVT",     "MSG_SUSPEND_REJ_EVT",
64         "TC_TOUT_EVT",           "TC_OPEN_EVT",           "TC_CLOSE_EVT",
65         "TC_CONG_EVT",           "TC_DATA_EVT",           "CC_CLOSE_EVT"};
66 
67 /* action function list */
68 const tAVDT_SCB_ACTION avdt_scb_action[] = {avdt_scb_hdl_abort_cmd,
69                                             avdt_scb_hdl_abort_rsp,
70                                             avdt_scb_hdl_close_cmd,
71                                             avdt_scb_hdl_close_rsp,
72                                             avdt_scb_hdl_getconfig_cmd,
73                                             avdt_scb_hdl_getconfig_rsp,
74                                             avdt_scb_hdl_open_cmd,
75                                             avdt_scb_hdl_open_rej,
76                                             avdt_scb_hdl_open_rsp,
77                                             avdt_scb_hdl_pkt,
78                                             avdt_scb_drop_pkt,
79                                             avdt_scb_hdl_reconfig_cmd,
80                                             avdt_scb_hdl_reconfig_rsp,
81                                             avdt_scb_hdl_security_cmd,
82                                             avdt_scb_hdl_security_rsp,
83                                             avdt_scb_hdl_setconfig_cmd,
84                                             avdt_scb_hdl_setconfig_rej,
85                                             avdt_scb_hdl_setconfig_rsp,
86                                             avdt_scb_hdl_start_cmd,
87                                             avdt_scb_hdl_start_rsp,
88                                             avdt_scb_hdl_suspend_cmd,
89                                             avdt_scb_hdl_suspend_rsp,
90                                             avdt_scb_hdl_tc_close,
91                                             avdt_scb_hdl_tc_close_sto,
92                                             avdt_scb_hdl_tc_open,
93                                             avdt_scb_hdl_tc_open_sto,
94                                             avdt_scb_snd_delay_rpt_req,
95                                             avdt_scb_hdl_delay_rpt_cmd,
96                                             avdt_scb_hdl_delay_rpt_rsp,
97                                             avdt_scb_hdl_write_req,
98                                             avdt_scb_snd_abort_req,
99                                             avdt_scb_snd_abort_rsp,
100                                             avdt_scb_snd_close_req,
101                                             avdt_scb_snd_stream_close,
102                                             avdt_scb_snd_close_rsp,
103                                             avdt_scb_snd_getconfig_req,
104                                             avdt_scb_snd_getconfig_rsp,
105                                             avdt_scb_snd_open_req,
106                                             avdt_scb_snd_open_rsp,
107                                             avdt_scb_snd_reconfig_req,
108                                             avdt_scb_snd_reconfig_rsp,
109                                             avdt_scb_snd_security_req,
110                                             avdt_scb_snd_security_rsp,
111                                             avdt_scb_snd_setconfig_req,
112                                             avdt_scb_snd_setconfig_rej,
113                                             avdt_scb_snd_setconfig_rsp,
114                                             avdt_scb_snd_snk_delay_rpt_req,
115                                             avdt_scb_snd_tc_close,
116                                             avdt_scb_cb_err,
117                                             avdt_scb_cong_state,
118                                             avdt_scb_rej_state,
119                                             avdt_scb_rej_in_use,
120                                             avdt_scb_rej_not_in_use,
121                                             avdt_scb_set_remove,
122                                             avdt_scb_free_pkt,
123                                             avdt_scb_clr_pkt,
124                                             avdt_scb_chk_snd_pkt,
125                                             avdt_scb_transport_channel_timer,
126                                             avdt_scb_clr_vars,
127                                             avdt_scb_dealloc};
128 
129 /* state table information */
130 #define AVDT_SCB_ACTIONS 2    /* number of actions */
131 #define AVDT_SCB_NEXT_STATE 2 /* position of next state */
132 #define AVDT_SCB_NUM_COLS 3   /* number of columns in state tables */
133 
134 /* state table for idle state */
135 const uint8_t avdt_scb_st_idle[][AVDT_SCB_NUM_COLS] = {
136         /* Event */
137         /* Action 1                       Action 2                    Next state */
138         /* AVDT_SCB_API_REMOVE_EVT */
139         {AVDT_SCB_DEALLOC, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
140         /* AVDT_SCB_API_WRITE_REQ_EVT */
141         {AVDT_SCB_FREE_PKT, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
142         /* AVDT_SCB_API_GETCONFIG_REQ_EVT */
143         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
144         /* AVDT_SCB_API_DELAY_RPT_REQ_EVT */
145         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
146         /* AVDT_SCB_API_SETCONFIG_REQ_EVT */
147         {AVDT_SCB_SND_SETCONFIG_REQ, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
148         /* AVDT_SCB_API_OPEN_REQ_EVT */
149         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
150         /* AVDT_SCB_API_CLOSE_REQ_EVT */
151         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
152         /* AVDT_SCB_API_RECONFIG_REQ_EVT */
153         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
154         /* AVDT_SCB_API_SECURITY_REQ_EVT */
155         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
156         /* AVDT_SCB_API_ABORT_REQ_EVT */
157         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
158         /* AVDT_SCB_API_GETCONFIG_RSP_EVT */
159         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
160         /* AVDT_SCB_API_SETCONFIG_RSP_EVT */
161         {AVDT_SCB_SND_SETCONFIG_RSP, AVDT_SCB_SND_SNK_DELAY_RPT_REQ, AVDT_SCB_CONF_ST},
162         /* AVDT_SCB_API_SETCONFIG_REJ_EVT */
163         {AVDT_SCB_SND_SETCONFIG_REJ, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
164         /* AVDT_SCB_API_OPEN_RSP_EVT */
165         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
166         /* AVDT_SCB_API_CLOSE_RSP_EVT */
167         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
168         /* AVDT_SCB_API_RECONFIG_RSP_EVT */
169         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
170         /* AVDT_SCB_API_SECURITY_RSP_EVT */
171         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
172         /* AVDT_SCB_API_ABORT_RSP_EVT */
173         {AVDT_SCB_SND_ABORT_RSP, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
174         /* AVDT_SCB_MSG_SETCONFIG_CMD_EVT */
175         {AVDT_SCB_HDL_SETCONFIG_CMD, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
176         /* AVDT_SCB_MSG_GETCONFIG_CMD_EVT */
177         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
178         /* AVDT_SCB_MSG_OPEN_CMD_EVT */
179         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
180         /* AVDT_SCB_MSG_START_CMD_EVT */
181         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
182         /* AVDT_SCB_MSG_SUSPEND_CMD_EVT */
183         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
184         /* AVDT_SCB_MSG_CLOSE_CMD_EVT */
185         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
186         /* AVDT_SCB_MSG_ABORT_CMD_EVT */
187         {AVDT_SCB_HDL_ABORT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
188         /* AVDT_SCB_MSG_RECONFIG_CMD_EVT */
189         {AVDT_SCB_REJ_NOT_IN_USE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
190         /* AVDT_SCB_MSG_SECURITY_CMD_EVT */
191         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
192         /* AVDT_SCB_MSG_DELAY_RPT_CMD_EVT */
193         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
194         /* AVDT_SCB_MSG_DELAY_RPT_RSP_EVT */
195         {AVDT_SCB_HDL_DELAY_RPT_RSP, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
196         /* AVDT_SCB_MSG_SETCONFIG_RSP_EVT */
197         {AVDT_SCB_HDL_SETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
198         /* AVDT_SCB_MSG_GETCONFIG_RSP_EVT */
199         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
200         /* AVDT_SCB_MSG_OPEN_RSP_EVT */
201         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
202         /* AVDT_SCB_MSG_START_RSP_EVT */
203         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
204         /* AVDT_SCB_MSG_SUSPEND_RSP_EVT */
205         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
206         /* AVDT_SCB_MSG_CLOSE_RSP_EVT */
207         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
208         /* AVDT_SCB_MSG_ABORT_RSP_EVT */
209         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
210         /* AVDT_SCB_MSG_RECONFIG_RSP_EVT */
211         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
212         /* AVDT_SCB_MSG_SECURITY_RSP_EVT */
213         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
214         /* AVDT_SCB_MSG_SETCONFIG_REJ_EVT */
215         {AVDT_SCB_HDL_SETCONFIG_REJ, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
216         /* AVDT_SCB_MSG_OPEN_REJ_EVT */
217         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
218         /* AVDT_SCB_MSG_START_REJ_EVT */
219         {AVDT_SCB_HDL_START_RSP, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
220         /* AVDT_SCB_MSG_SUSPEND_REJ_EVT */
221         {AVDT_SCB_HDL_SUSPEND_RSP, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
222         /* AVDT_SCB_TC_TOUT_EVT */
223         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
224         /* AVDT_SCB_TC_OPEN_EVT */
225         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
226         /* AVDT_SCB_TC_CLOSE_EVT */
227         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
228         /* AVDT_SCB_TC_CONG_EVT */
229         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
230         /* AVDT_SCB_TC_DATA_EVT */
231         {AVDT_SCB_DROP_PKT, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
232         /* AVDT_SCB_CC_CLOSE_EVT */
233         {AVDT_SCB_CLR_VARS, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST}};
234 
235 /* state table for configured state */
236 const uint8_t avdt_scb_st_conf[][AVDT_SCB_NUM_COLS] = {
237         /* Event */
238         /* Action 1                       Action 2                    Next state */
239         /* AVDT_SCB_API_REMOVE_EVT */
240         {AVDT_SCB_SND_ABORT_REQ, AVDT_SCB_SET_REMOVE, AVDT_SCB_CONF_ST},
241         /* AVDT_SCB_API_WRITE_REQ_EVT */
242         {AVDT_SCB_FREE_PKT, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
243         /* AVDT_SCB_API_GETCONFIG_REQ_EVT */
244         {AVDT_SCB_SND_GETCONFIG_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
245         /* AVDT_SCB_API_DELAY_RPT_REQ_EVT */
246         {AVDT_SCB_SND_DELAY_RPT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
247         /* AVDT_SCB_API_SETCONFIG_REQ_EVT */
248         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
249         /* AVDT_SCB_API_OPEN_REQ_EVT */
250         {AVDT_SCB_SND_OPEN_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
251         /* AVDT_SCB_API_CLOSE_REQ_EVT */
252         {AVDT_SCB_SND_ABORT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
253         /* AVDT_SCB_API_RECONFIG_REQ_EVT */
254         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
255         /* AVDT_SCB_API_SECURITY_REQ_EVT */
256         {AVDT_SCB_SND_SECURITY_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
257         /* AVDT_SCB_API_ABORT_REQ_EVT */
258         {AVDT_SCB_SND_ABORT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
259         /* AVDT_SCB_API_GETCONFIG_RSP_EVT */
260         {AVDT_SCB_SND_GETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
261         /* AVDT_SCB_API_SETCONFIG_RSP_EVT */
262         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
263         /* AVDT_SCB_API_SETCONFIG_REJ_EVT */
264         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
265         /* AVDT_SCB_API_OPEN_RSP_EVT */
266         {AVDT_SCB_SND_OPEN_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
267         /* AVDT_SCB_API_CLOSE_RSP_EVT */
268         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
269         /* AVDT_SCB_API_RECONFIG_RSP_EVT */
270         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
271         /* AVDT_SCB_API_SECURITY_RSP_EVT */
272         {AVDT_SCB_SND_SECURITY_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
273         /* AVDT_SCB_API_ABORT_RSP_EVT */
274         {AVDT_SCB_SND_ABORT_RSP, AVDT_SCB_HDL_TC_CLOSE, AVDT_SCB_IDLE_ST},
275         /* AVDT_SCB_MSG_SETCONFIG_CMD_EVT */
276         {AVDT_SCB_REJ_IN_USE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
277         /* AVDT_SCB_MSG_GETCONFIG_CMD_EVT */
278         {AVDT_SCB_HDL_GETCONFIG_CMD, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
279         /* AVDT_SCB_MSG_OPEN_CMD_EVT */
280         {AVDT_SCB_HDL_OPEN_CMD, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
281         /* AVDT_SCB_MSG_START_CMD_EVT */
282         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
283         /* AVDT_SCB_MSG_SUSPEND_CMD_EVT */
284         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
285         /* AVDT_SCB_MSG_CLOSE_CMD_EVT */
286         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
287         /* AVDT_SCB_MSG_ABORT_CMD_EVT */
288         {AVDT_SCB_HDL_ABORT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
289         /* AVDT_SCB_MSG_RECONFIG_CMD_EVT */
290         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
291         /* AVDT_SCB_MSG_SECURITY_CMD_EVT */
292         {AVDT_SCB_HDL_SECURITY_CMD, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
293         /* AVDT_SCB_MSG_DELAY_RPT_CMD_EVT */
294         {AVDT_SCB_HDL_DELAY_RPT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
295         /* AVDT_SCB_MSG_DELAY_RPT_RSP_EVT */
296         {AVDT_SCB_HDL_DELAY_RPT_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
297         /* AVDT_SCB_MSG_SETCONFIG_RSP_EVT */
298         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
299         /* AVDT_SCB_MSG_GETCONFIG_RSP_EVT */
300         {AVDT_SCB_HDL_GETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
301         /* AVDT_SCB_MSG_OPEN_RSP_EVT */
302         {AVDT_SCB_HDL_OPEN_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
303         /* AVDT_SCB_MSG_START_RSP_EVT */
304         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
305         /* AVDT_SCB_MSG_SUSPEND_RSP_EVT */
306         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
307         /* AVDT_SCB_MSG_CLOSE_RSP_EVT */
308         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
309         /* AVDT_SCB_MSG_ABORT_RSP_EVT */
310         {AVDT_SCB_HDL_ABORT_RSP, AVDT_SCB_HDL_TC_CLOSE, AVDT_SCB_IDLE_ST},
311         /* AVDT_SCB_MSG_RECONFIG_RSP_EVT */
312         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
313         /* AVDT_SCB_MSG_SECURITY_RSP_EVT */
314         {AVDT_SCB_HDL_SECURITY_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
315         /* AVDT_SCB_MSG_SETCONFIG_REJ_EVT */
316         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
317         /* AVDT_SCB_MSG_OPEN_REJ_EVT */
318         {AVDT_SCB_HDL_OPEN_REJ, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
319         /* AVDT_SCB_MSG_START_REJ_EVT */
320         {AVDT_SCB_HDL_START_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
321         /* AVDT_SCB_MSG_SUSPEND_REJ_EVT */
322         {AVDT_SCB_HDL_SUSPEND_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
323         /* AVDT_SCB_TC_TOUT_EVT */
324         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
325         /* AVDT_SCB_TC_OPEN_EVT */
326         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
327         /* AVDT_SCB_TC_CLOSE_EVT */
328         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
329         /* AVDT_SCB_TC_CONG_EVT */
330         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
331         /* AVDT_SCB_TC_DATA_EVT */
332         {AVDT_SCB_DROP_PKT, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
333         /* AVDT_SCB_CC_CLOSE_EVT */
334         {AVDT_SCB_HDL_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST}};
335 
336 /* state table for opening state */
337 const uint8_t avdt_scb_st_opening[][AVDT_SCB_NUM_COLS] = {
338         /* Event */
339         /* Action 1                       Action 2                    Next state */
340         /* AVDT_SCB_API_REMOVE_EVT */
341         {AVDT_SCB_SND_CLOSE_REQ, AVDT_SCB_SET_REMOVE, AVDT_SCB_CLOSING_ST},
342         /* AVDT_SCB_API_WRITE_REQ_EVT */
343         {AVDT_SCB_FREE_PKT, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
344         /* AVDT_SCB_API_GETCONFIG_REQ_EVT */
345         {AVDT_SCB_SND_GETCONFIG_REQ, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
346         /* AVDT_SCB_API_DELAY_RPT_REQ_EVT */
347         {AVDT_SCB_SND_DELAY_RPT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
348         /* AVDT_SCB_API_SETCONFIG_REQ_EVT */
349         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
350         /* AVDT_SCB_API_OPEN_REQ_EVT */
351         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
352         /* AVDT_SCB_API_CLOSE_REQ_EVT */
353         {AVDT_SCB_SND_CLOSE_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
354         /* AVDT_SCB_API_RECONFIG_REQ_EVT */
355         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
356         /* AVDT_SCB_API_SECURITY_REQ_EVT */
357         {AVDT_SCB_SND_SECURITY_REQ, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
358         /* AVDT_SCB_API_ABORT_REQ_EVT */
359         {AVDT_SCB_SND_ABORT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
360         /* AVDT_SCB_API_GETCONFIG_RSP_EVT */
361         {AVDT_SCB_SND_GETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
362         /* AVDT_SCB_API_SETCONFIG_RSP_EVT */
363         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
364         /* AVDT_SCB_API_SETCONFIG_REJ_EVT */
365         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
366         /* AVDT_SCB_API_OPEN_RSP_EVT */
367         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
368         /* AVDT_SCB_API_CLOSE_RSP_EVT */
369         {AVDT_SCB_SND_CLOSE_RSP, AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_CLOSING_ST},
370         /* AVDT_SCB_API_RECONFIG_RSP_EVT */
371         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
372         /* AVDT_SCB_API_SECURITY_RSP_EVT */
373         {AVDT_SCB_SND_SECURITY_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
374         /* AVDT_SCB_API_ABORT_RSP_EVT */
375         {AVDT_SCB_SND_ABORT_RSP, AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_CLOSING_ST},
376         /* AVDT_SCB_MSG_SETCONFIG_CMD_EVT */
377         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
378         /* AVDT_SCB_MSG_GETCONFIG_CMD_EVT */
379         {AVDT_SCB_HDL_GETCONFIG_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
380         /* AVDT_SCB_MSG_OPEN_CMD_EVT */
381         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
382         /* AVDT_SCB_MSG_START_CMD_EVT */
383         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
384         /* AVDT_SCB_MSG_SUSPEND_CMD_EVT */
385         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
386         /* AVDT_SCB_MSG_CLOSE_CMD_EVT */
387         {AVDT_SCB_HDL_CLOSE_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
388         /* AVDT_SCB_MSG_ABORT_CMD_EVT */
389         {AVDT_SCB_HDL_ABORT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
390         /* AVDT_SCB_MSG_RECONFIG_CMD_EVT */
391         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
392         /* AVDT_SCB_MSG_SECURITY_CMD_EVT */
393         {AVDT_SCB_HDL_SECURITY_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
394         /* AVDT_SCB_MSG_DELAY_RPT_CMD_EVT */
395         {AVDT_SCB_HDL_DELAY_RPT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
396         /* AVDT_SCB_MSG_DELAY_RPT_RSP_EVT */
397         {AVDT_SCB_HDL_DELAY_RPT_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
398         /* AVDT_SCB_MSG_SETCONFIG_RSP_EVT */
399         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
400         /* AVDT_SCB_MSG_GETCONFIG_RSP_EVT */
401         {AVDT_SCB_HDL_GETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
402         /* AVDT_SCB_MSG_OPEN_RSP_EVT */
403         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
404         /* AVDT_SCB_MSG_START_RSP_EVT */
405         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
406         /* AVDT_SCB_MSG_SUSPEND_RSP_EVT */
407         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
408         /* AVDT_SCB_MSG_CLOSE_RSP_EVT */
409         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
410         /* AVDT_SCB_MSG_ABORT_RSP_EVT */
411         {AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_HDL_ABORT_RSP, AVDT_SCB_CLOSING_ST},
412         /* AVDT_SCB_MSG_RECONFIG_RSP_EVT */
413         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
414         /* AVDT_SCB_MSG_SECURITY_RSP_EVT */
415         {AVDT_SCB_HDL_SECURITY_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
416         /* AVDT_SCB_MSG_SETCONFIG_REJ_EVT */
417         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
418         /* AVDT_SCB_MSG_OPEN_REJ_EVT */
419         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
420         /* AVDT_SCB_MSG_START_REJ_EVT */
421         {AVDT_SCB_HDL_START_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
422         /* AVDT_SCB_MSG_SUSPEND_REJ_EVT */
423         {AVDT_SCB_HDL_SUSPEND_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
424         /* AVDT_SCB_TC_TOUT_EVT */
425         {AVDT_SCB_SND_ABORT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
426         /* AVDT_SCB_TC_OPEN_EVT */
427         {AVDT_SCB_HDL_TC_OPEN, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
428         /* AVDT_SCB_TC_CLOSE_EVT */
429         {AVDT_SCB_HDL_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
430         /* AVDT_SCB_TC_CONG_EVT */
431         {AVDT_SCB_CONG_STATE, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
432         /* AVDT_SCB_TC_DATA_EVT */
433         {AVDT_SCB_DROP_PKT, AVDT_SCB_IGNORE, AVDT_SCB_OPENING_ST},
434         /* AVDT_SCB_CC_CLOSE_EVT */
435         {AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST}};
436 
437 /* state table for open state */
438 const uint8_t avdt_scb_st_open[][AVDT_SCB_NUM_COLS] = {
439         /* Event */
440         /* Action 1                       Action 2                    Next state */
441         /* AVDT_SCB_API_REMOVE_EVT */
442         {AVDT_SCB_SND_CLOSE_REQ, AVDT_SCB_SET_REMOVE, AVDT_SCB_CLOSING_ST},
443         /* AVDT_SCB_API_WRITE_REQ_EVT */
444         {AVDT_SCB_FREE_PKT, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
445         /* AVDT_SCB_API_GETCONFIG_REQ_EVT */
446         {AVDT_SCB_SND_GETCONFIG_REQ, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
447         /* AVDT_SCB_API_DELAY_RPT_REQ_EVT */
448         {AVDT_SCB_SND_DELAY_RPT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
449         /* AVDT_SCB_API_SETCONFIG_REQ_EVT */
450         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
451         /* AVDT_SCB_API_OPEN_REQ_EVT */
452         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
453         /* AVDT_SCB_API_CLOSE_REQ_EVT */
454         {AVDT_SCB_SND_CLOSE_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
455         /* AVDT_SCB_API_RECONFIG_REQ_EVT */
456         {AVDT_SCB_SND_RECONFIG_REQ, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
457         /* AVDT_SCB_API_SECURITY_REQ_EVT */
458         {AVDT_SCB_SND_SECURITY_REQ, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
459         /* AVDT_SCB_API_ABORT_REQ_EVT */
460         {AVDT_SCB_SND_ABORT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
461         /* AVDT_SCB_API_GETCONFIG_RSP_EVT */
462         {AVDT_SCB_SND_GETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
463         /* AVDT_SCB_API_SETCONFIG_RSP_EVT */
464         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
465         /* AVDT_SCB_API_SETCONFIG_REJ_EVT */
466         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
467         /* AVDT_SCB_API_OPEN_RSP_EVT */
468         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
469         /* AVDT_SCB_API_CLOSE_RSP_EVT */
470         {AVDT_SCB_SND_CLOSE_RSP, AVDT_SCB_TC_TIMER, AVDT_SCB_CLOSING_ST},
471         /* AVDT_SCB_API_RECONFIG_RSP_EVT */
472         {AVDT_SCB_SND_RECONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
473         /* AVDT_SCB_API_SECURITY_RSP_EVT */
474         {AVDT_SCB_SND_SECURITY_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
475         /* AVDT_SCB_API_ABORT_RSP_EVT */
476         {AVDT_SCB_SND_ABORT_RSP, AVDT_SCB_TC_TIMER, AVDT_SCB_CLOSING_ST},
477         /* AVDT_SCB_MSG_SETCONFIG_CMD_EVT */
478         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
479         /* AVDT_SCB_MSG_GETCONFIG_CMD_EVT */
480         {AVDT_SCB_HDL_GETCONFIG_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
481         /* AVDT_SCB_MSG_OPEN_CMD_EVT */
482         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
483         /* AVDT_SCB_MSG_START_CMD_EVT */
484         {AVDT_SCB_HDL_START_CMD, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
485         /* AVDT_SCB_MSG_SUSPEND_CMD_EVT */
486         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
487         /* AVDT_SCB_MSG_CLOSE_CMD_EVT */
488         {AVDT_SCB_HDL_CLOSE_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
489         /* AVDT_SCB_MSG_ABORT_CMD_EVT */
490         {AVDT_SCB_HDL_ABORT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
491         /* AVDT_SCB_MSG_RECONFIG_CMD_EVT */
492         {AVDT_SCB_HDL_RECONFIG_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
493         /* AVDT_SCB_MSG_SECURITY_CMD_EVT */
494         {AVDT_SCB_HDL_SECURITY_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
495         /* AVDT_SCB_MSG_DELAY_RPT_CMD_EVT */
496         {AVDT_SCB_HDL_DELAY_RPT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
497         /* AVDT_SCB_MSG_DELAY_RPT_RSP_EVT */
498         {AVDT_SCB_HDL_DELAY_RPT_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
499         /* AVDT_SCB_MSG_SETCONFIG_RSP_EVT */
500         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
501         /* AVDT_SCB_MSG_GETCONFIG_RSP_EVT */
502         {AVDT_SCB_HDL_GETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
503         /* AVDT_SCB_MSG_OPEN_RSP_EVT */
504         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
505         /* AVDT_SCB_MSG_START_RSP_EVT */
506         {AVDT_SCB_HDL_START_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
507         /* AVDT_SCB_MSG_SUSPEND_RSP_EVT */
508         {AVDT_SCB_HDL_SUSPEND_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
509         /* AVDT_SCB_MSG_CLOSE_RSP_EVT */
510         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
511         /* AVDT_SCB_MSG_ABORT_RSP_EVT */
512         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
513         /* AVDT_SCB_MSG_RECONFIG_RSP_EVT */
514         {AVDT_SCB_HDL_RECONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
515         /* AVDT_SCB_MSG_SECURITY_RSP_EVT */
516         {AVDT_SCB_HDL_SECURITY_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
517         /* AVDT_SCB_MSG_SETCONFIG_REJ_EVT */
518         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
519         /* AVDT_SCB_MSG_OPEN_REJ_EVT */
520         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
521         /* AVDT_SCB_MSG_START_REJ_EVT */
522         {AVDT_SCB_HDL_START_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
523         /* AVDT_SCB_MSG_SUSPEND_REJ_EVT */
524         {AVDT_SCB_HDL_SUSPEND_RSP, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
525         /* AVDT_SCB_TC_TOUT_EVT */
526         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
527         /* AVDT_SCB_TC_OPEN_EVT */
528         {AVDT_SCB_HDL_TC_OPEN_STO, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
529         /* AVDT_SCB_TC_CLOSE_EVT */
530         {AVDT_SCB_HDL_TC_CLOSE_STO, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
531         /* AVDT_SCB_TC_CONG_EVT */
532         {AVDT_SCB_CONG_STATE, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
533         /* AVDT_SCB_TC_DATA_EVT */
534         {AVDT_SCB_DROP_PKT, AVDT_SCB_IGNORE, AVDT_SCB_OPEN_ST},
535         /* AVDT_SCB_CC_CLOSE_EVT */
536         {AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST}};
537 
538 /* state table for streaming state */
539 const uint8_t avdt_scb_st_stream[][AVDT_SCB_NUM_COLS] = {
540         /* Event */
541         /* Action 1                       Action 2                    Next state */
542         /* AVDT_SCB_API_REMOVE_EVT */
543         {AVDT_SCB_SND_STREAM_CLOSE, AVDT_SCB_SET_REMOVE, AVDT_SCB_CLOSING_ST},
544         /* AVDT_SCB_API_WRITE_REQ_EVT */
545         {AVDT_SCB_HDL_WRITE_REQ, AVDT_SCB_CHK_SND_PKT, AVDT_SCB_STREAM_ST},
546         /* AVDT_SCB_API_GETCONFIG_REQ_EVT */
547         {AVDT_SCB_SND_GETCONFIG_REQ, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
548         /* AVDT_SCB_API_DELAY_RPT_REQ_EVT */
549         {AVDT_SCB_SND_DELAY_RPT_REQ, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
550         /* AVDT_SCB_API_SETCONFIG_REQ_EVT */
551         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
552         /* AVDT_SCB_API_OPEN_REQ_EVT */
553         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
554         /* AVDT_SCB_API_CLOSE_REQ_EVT */
555         {AVDT_SCB_SND_STREAM_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
556         /* AVDT_SCB_API_RECONFIG_REQ_EVT */
557         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
558         /* AVDT_SCB_API_SECURITY_REQ_EVT */
559         {AVDT_SCB_SND_SECURITY_REQ, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
560         /* AVDT_SCB_API_ABORT_REQ_EVT */
561         {AVDT_SCB_SND_ABORT_REQ, AVDT_SCB_CLR_PKT, AVDT_SCB_CLOSING_ST},
562         /* AVDT_SCB_API_GETCONFIG_RSP_EVT */
563         {AVDT_SCB_SND_GETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
564         /* AVDT_SCB_API_SETCONFIG_RSP_EVT */
565         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
566         /* AVDT_SCB_API_SETCONFIG_REJ_EVT */
567         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
568         /* AVDT_SCB_API_OPEN_RSP_EVT */
569         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
570         /* AVDT_SCB_API_CLOSE_RSP_EVT */
571         {AVDT_SCB_SND_CLOSE_RSP, AVDT_SCB_TC_TIMER, AVDT_SCB_CLOSING_ST},
572         /* AVDT_SCB_API_RECONFIG_RSP_EVT */
573         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
574         /* AVDT_SCB_API_SECURITY_RSP_EVT */
575         {AVDT_SCB_SND_SECURITY_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
576         /* AVDT_SCB_API_ABORT_RSP_EVT */
577         {AVDT_SCB_SND_ABORT_RSP, AVDT_SCB_TC_TIMER, AVDT_SCB_CLOSING_ST},
578         /* AVDT_SCB_MSG_SETCONFIG_CMD_EVT */
579         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
580         /* AVDT_SCB_MSG_GETCONFIG_CMD_EVT */
581         {AVDT_SCB_HDL_GETCONFIG_CMD, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
582         /* AVDT_SCB_MSG_OPEN_CMD_EVT */
583         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
584         /* AVDT_SCB_MSG_START_CMD_EVT */
585         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
586         /* AVDT_SCB_MSG_SUSPEND_CMD_EVT */
587         {AVDT_SCB_HDL_SUSPEND_CMD, AVDT_SCB_CLR_PKT, AVDT_SCB_OPEN_ST},
588         /* AVDT_SCB_MSG_CLOSE_CMD_EVT */
589         {AVDT_SCB_HDL_CLOSE_CMD, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
590         /* AVDT_SCB_MSG_ABORT_CMD_EVT */
591         {AVDT_SCB_HDL_ABORT_CMD, AVDT_SCB_CLR_PKT, AVDT_SCB_STREAM_ST},
592         /* AVDT_SCB_MSG_RECONFIG_CMD_EVT */
593         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
594         /* AVDT_SCB_MSG_SECURITY_CMD_EVT */
595         {AVDT_SCB_HDL_SECURITY_CMD, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
596         /* AVDT_SCB_MSG_DELAY_RPT_CMD_EVT */
597         {AVDT_SCB_HDL_DELAY_RPT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
598         /* AVDT_SCB_MSG_DELAY_RPT_RSP_EVT */
599         {AVDT_SCB_HDL_DELAY_RPT_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
600         /* AVDT_SCB_MSG_SETCONFIG_RSP_EVT */
601         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
602         /* AVDT_SCB_MSG_GETCONFIG_RSP_EVT */
603         {AVDT_SCB_HDL_GETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
604         /* AVDT_SCB_MSG_OPEN_RSP_EVT */
605         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
606         /* AVDT_SCB_MSG_START_RSP_EVT */
607         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
608         /* AVDT_SCB_MSG_SUSPEND_RSP_EVT */
609         {AVDT_SCB_HDL_SUSPEND_RSP, AVDT_SCB_CLR_PKT, AVDT_SCB_OPEN_ST},
610         /* AVDT_SCB_MSG_CLOSE_RSP_EVT */
611         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
612         /* AVDT_SCB_MSG_ABORT_RSP_EVT */
613         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
614         /* AVDT_SCB_MSG_RECONFIG_RSP_EVT */
615         {AVDT_SCB_HDL_RECONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
616         /* AVDT_SCB_MSG_SECURITY_RSP_EVT */
617         {AVDT_SCB_HDL_SECURITY_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
618         /* AVDT_SCB_MSG_SETCONFIG_REJ_EVT */
619         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
620         /* AVDT_SCB_MSG_OPEN_REJ_EVT */
621         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
622         /* AVDT_SCB_MSG_START_REJ_EVT */
623         {AVDT_SCB_HDL_START_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
624         /* AVDT_SCB_MSG_SUSPEND_REJ_EVT */
625         {AVDT_SCB_HDL_SUSPEND_RSP, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
626         /* AVDT_SCB_TC_TOUT_EVT */
627         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
628         /* AVDT_SCB_TC_OPEN_EVT */
629         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
630         /* AVDT_SCB_TC_CLOSE_EVT */
631         {AVDT_SCB_HDL_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
632         /* AVDT_SCB_TC_CONG_EVT */
633         {AVDT_SCB_CONG_STATE, AVDT_SCB_CHK_SND_PKT, AVDT_SCB_STREAM_ST},
634         /* AVDT_SCB_TC_DATA_EVT */
635         {AVDT_SCB_HDL_PKT, AVDT_SCB_IGNORE, AVDT_SCB_STREAM_ST},
636         /* AVDT_SCB_CC_CLOSE_EVT */
637         {AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST}};
638 
639 /* state table for closing state */
640 const uint8_t avdt_scb_st_closing[][AVDT_SCB_NUM_COLS] = {
641         /* Event */
642         /* Action 1                       Action 2                    Next state */
643         /* AVDT_SCB_API_REMOVE_EVT */
644         {AVDT_SCB_SET_REMOVE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
645         /* AVDT_SCB_API_WRITE_REQ_EVT */
646         {AVDT_SCB_FREE_PKT, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
647         /* AVDT_SCB_API_GETCONFIG_REQ_EVT */
648         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
649         /* AVDT_SCB_API_DELAY_RPT_REQ_EVT */
650         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
651         /* AVDT_SCB_API_SETCONFIG_REQ_EVT */
652         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
653         /* AVDT_SCB_API_OPEN_REQ_EVT */
654         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
655         /* AVDT_SCB_API_CLOSE_REQ_EVT */
656         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
657         /* AVDT_SCB_API_RECONFIG_REQ_EVT */
658         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
659         /* AVDT_SCB_API_SECURITY_REQ_EVT */
660         {AVDT_SCB_CB_ERR, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
661         /* AVDT_SCB_API_ABORT_REQ_EVT */
662         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
663         /* AVDT_SCB_API_GETCONFIG_RSP_EVT */
664         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
665         /* AVDT_SCB_API_SETCONFIG_RSP_EVT */
666         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
667         /* AVDT_SCB_API_SETCONFIG_REJ_EVT */
668         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
669         /* AVDT_SCB_API_OPEN_RSP_EVT */
670         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
671         /* AVDT_SCB_API_CLOSE_RSP_EVT */
672         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
673         /* AVDT_SCB_API_RECONFIG_RSP_EVT */
674         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
675         /* AVDT_SCB_API_SECURITY_RSP_EVT */
676         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
677         /* AVDT_SCB_API_ABORT_RSP_EVT */
678         {AVDT_SCB_SND_ABORT_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
679         /* AVDT_SCB_MSG_SETCONFIG_CMD_EVT */
680         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
681         /* AVDT_SCB_MSG_GETCONFIG_CMD_EVT */
682         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
683         /* AVDT_SCB_MSG_OPEN_CMD_EVT */
684         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
685         /* AVDT_SCB_MSG_START_CMD_EVT */
686         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
687         /* AVDT_SCB_MSG_SUSPEND_CMD_EVT */
688         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
689         /* AVDT_SCB_MSG_CLOSE_CMD_EVT */
690         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
691         /* AVDT_SCB_MSG_ABORT_CMD_EVT */
692         {AVDT_SCB_HDL_ABORT_CMD, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
693         /* AVDT_SCB_MSG_RECONFIG_CMD_EVT */
694         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
695         /* AVDT_SCB_MSG_SECURITY_CMD_EVT */
696         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
697         /* AVDT_SCB_MSG_DELAY_RPT_CMD_EVT */
698         {AVDT_SCB_REJ_STATE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
699         /* AVDT_SCB_MSG_DELAY_RPT_RSP_EVT */
700         {AVDT_SCB_HDL_DELAY_RPT_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
701         /* AVDT_SCB_MSG_SETCONFIG_RSP_EVT */
702         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
703         /* AVDT_SCB_MSG_GETCONFIG_RSP_EVT */
704         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
705         /* AVDT_SCB_MSG_OPEN_RSP_EVT */
706         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
707         /* AVDT_SCB_MSG_START_RSP_EVT */
708         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
709         /* AVDT_SCB_MSG_SUSPEND_RSP_EVT */
710         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
711         /* AVDT_SCB_MSG_CLOSE_RSP_EVT */
712         {AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_HDL_CLOSE_RSP, AVDT_SCB_CLOSING_ST},
713         /* AVDT_SCB_MSG_ABORT_RSP_EVT */
714         {AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_HDL_ABORT_RSP, AVDT_SCB_CLOSING_ST},
715         /* AVDT_SCB_MSG_RECONFIG_RSP_EVT */
716         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
717         /* AVDT_SCB_MSG_SECURITY_RSP_EVT */
718         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
719         /* AVDT_SCB_MSG_SETCONFIG_REJ_EVT */
720         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
721         /* AVDT_SCB_MSG_OPEN_REJ_EVT */
722         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
723         /* AVDT_SCB_MSG_START_REJ_EVT */
724         {AVDT_SCB_HDL_START_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
725         /* AVDT_SCB_MSG_SUSPEND_REJ_EVT */
726         {AVDT_SCB_HDL_SUSPEND_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
727         /* AVDT_SCB_TC_TOUT_EVT */
728         {AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
729         /* AVDT_SCB_TC_OPEN_EVT */
730         {AVDT_SCB_SND_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
731         /* AVDT_SCB_TC_CLOSE_EVT */
732         {AVDT_SCB_HDL_TC_CLOSE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
733         /* AVDT_SCB_TC_CONG_EVT */
734         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
735         /* AVDT_SCB_TC_DATA_EVT */
736         {AVDT_SCB_DROP_PKT, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST},
737         /* AVDT_SCB_CC_CLOSE_EVT */
738         {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_CLOSING_ST}};
739 
740 /* type for state table */
741 typedef const uint8_t (*tAVDT_SCB_ST_TBL)[AVDT_SCB_NUM_COLS];
742 
743 /* state table */
744 const tAVDT_SCB_ST_TBL avdt_scb_st_tbl[] = {avdt_scb_st_idle,    avdt_scb_st_conf,
745                                             avdt_scb_st_opening, avdt_scb_st_open,
746                                             avdt_scb_st_stream,  avdt_scb_st_closing};
747 
748 /*******************************************************************************
749  *
750  * Function         avdt_scb_event
751  *
752  * Description      State machine event handling function for scb
753  *
754  *
755  * Returns          Nothing.
756  *
757  ******************************************************************************/
avdt_scb_event(AvdtpScb * p_scb,uint8_t event,tAVDT_SCB_EVT * p_data)758 void avdt_scb_event(AvdtpScb* p_scb, uint8_t event, tAVDT_SCB_EVT* p_data) {
759   tAVDT_SCB_ST_TBL state_table;
760   uint8_t action;
761 
762   log::verbose("SCB hdl={} event={}/{} state={} p_avdt_scb={} scb_index={}", avdt_scb_to_hdl(p_scb),
763                event, avdt_scb_evt_str[event], avdt_scb_st_str[p_scb->state],
764                std::format_ptr(p_scb), p_scb->stream_config.scb_index);
765 
766   /* Check that we only send AVDT_SCB_API_WRITE_REQ_EVT to the active stream
767    * device */
768   uint8_t num_st_streams = 0;
769   int ccb_index = -1;
770   int scb_index = -1;
771 
772   for (int i = 0; i < AVDT_NUM_LINKS; i++) {
773     for (int j = 0; j < AVDT_NUM_SEPS; j++) {
774       AvdtpScb* p_avdt_scb = &avdtp_cb.ccb[i].scb[j];
775       if (p_avdt_scb->allocated && avdt_scb_st_tbl[p_avdt_scb->state] == avdt_scb_st_stream) {
776         num_st_streams++;
777         ccb_index = i;
778         scb_index = j;
779       } else {
780         p_avdt_scb->curr_stream = false;
781       }
782     }
783   }
784 
785   if (num_st_streams == 1) {
786     avdtp_cb.ccb[ccb_index].scb[scb_index].curr_stream = true;
787   } else if (num_st_streams > 1 && !p_scb->curr_stream && event == AVDT_SCB_API_WRITE_REQ_EVT) {
788     log::error("ignore AVDT_SCB_API_WRITE_REQ_EVT");
789     avdt_scb_free_pkt(p_scb, p_data);
790     return;
791   }
792 
793   /* set current event */
794   p_scb->curr_evt = event;
795 
796   /* look up the state table for the current state */
797   state_table = avdt_scb_st_tbl[p_scb->state];
798 
799   /* set next state */
800   if (p_scb->state != state_table[event][AVDT_SCB_NEXT_STATE]) {
801     p_scb->state = state_table[event][AVDT_SCB_NEXT_STATE];
802   }
803 
804   /* execute action functions */
805   for (int i = 0; i < AVDT_SCB_ACTIONS; i++) {
806     action = state_table[event][i];
807     if (action != AVDT_SCB_IGNORE) {
808       (*avdtp_cb.p_scb_act[action])(p_scb, p_data);
809     } else {
810       break;
811     }
812   }
813 }
814 
815 /*******************************************************************************
816  *
817  * Function         avdt_scb_init
818  *
819  * Description      Initialize stream control block module.
820  *
821  *
822  * Returns          Nothing.
823  *
824  ******************************************************************************/
avdt_scb_init(void)825 void avdt_scb_init(void) {
826   for (size_t i = 0; i < AVDT_NUM_LINKS; i++) {
827     for (size_t j = 0; j < AVDT_NUM_SEPS; j++) {
828       avdtp_cb.ccb[i].scb[j].Reset(0);
829     }
830   }
831 
832   avdtp_cb.p_scb_act = avdt_scb_action;
833 }
834 
835 /*******************************************************************************
836  *
837  * Function         avdt_scb_alloc
838  *
839  * Description      Allocate a stream control block.
840  *
841  *
842  * Returns          pointer to the scb, or NULL if none could be allocated.
843  *
844  ******************************************************************************/
avdt_scb_alloc(uint8_t peer_id,const AvdtpStreamConfig & avdtp_stream_config)845 AvdtpScb* avdt_scb_alloc(uint8_t peer_id, const AvdtpStreamConfig& avdtp_stream_config) {
846   log::assert_that(peer_id < AVDT_NUM_LINKS, "assert failed: peer_id < AVDT_NUM_LINKS");
847 
848   // Find available entry
849   AvdtpScb* p_scb = &avdtp_cb.ccb[peer_id].scb[0];
850   for (int i = 0; i < AVDT_NUM_SEPS; i++, p_scb++) {
851     if (!p_scb->allocated) {
852       p_scb->Allocate(&avdtp_cb.ccb[peer_id], avdtp_stream_config);
853       log::verbose("allocated (handle={}, psc_mask:0x{:x})", p_scb->ScbHandle(),
854                    avdtp_stream_config.cfg.psc_mask);
855       return p_scb;
856     }
857   }
858 
859   log::warn("out of AvdtScb entries for peer_id {}", peer_id);
860   return nullptr;
861 }
862 
Allocate(AvdtpCcb * p_avdtp_ccb,const AvdtpStreamConfig & avdtp_stream_config)863 void AvdtpScb::Allocate(AvdtpCcb* p_avdtp_ccb, const AvdtpStreamConfig& avdtp_stream_config) {
864   uint8_t scb_handle = avdtp_cb.ComputeScbHandle(this);
865   Reset(scb_handle);
866   p_ccb = p_avdtp_ccb;
867   stream_config = avdtp_stream_config;
868   transport_channel_timer = alarm_new("avdtp_scb.transport_channel_timer");
869   allocated = true;
870 }
871 
872 /*******************************************************************************
873  *
874  * Function         avdt_scb_dealloc
875  *
876  * Description      Deallocate a stream control block.
877  *
878  *
879  * Returns          void.
880  *
881  ******************************************************************************/
avdt_scb_dealloc(AvdtpScb * p_scb,tAVDT_SCB_EVT *)882 void avdt_scb_dealloc(AvdtpScb* p_scb, tAVDT_SCB_EVT* /* p_data */) {
883   log::verbose("hdl={}", avdt_scb_to_hdl(p_scb));
884   p_scb->Recycle();
885 }
886 
887 /*******************************************************************************
888  *
889  * Function         avdt_scb_to_hdl
890  *
891  * Description      Given a pointer to an scb, return its handle (or seid).
892  *
893  *
894  * Returns          Index of scb.
895  *
896  ******************************************************************************/
avdt_scb_to_hdl(AvdtpScb * p_scb)897 uint8_t avdt_scb_to_hdl(AvdtpScb* p_scb) { return p_scb->ScbHandle(); }
898 
899 /*******************************************************************************
900  *
901  * Function         avdt_scb_by_hdl
902  *
903  * Description      Given an scb handle (or seid), return a pointer to the scb.
904  *
905  *
906  * Returns          Pointer to scb or NULL if index is out of range or scb
907  *                  is not allocated.
908  *
909  ******************************************************************************/
avdt_scb_by_hdl(uint8_t hdl)910 AvdtpScb* avdt_scb_by_hdl(uint8_t hdl) {
911   // Verify the index
912   if ((hdl < 1) || (hdl > AVDT_NUM_LINKS * AVDT_NUM_SEPS)) {
913     log::warn("SCB handle {} out of range", hdl);
914     return nullptr;
915   }
916 
917   uint8_t index = hdl - 1;
918   size_t i = index / AVDT_NUM_SEPS;
919   size_t j = index % AVDT_NUM_SEPS;
920 
921   AvdtpScb* p_scb = &avdtp_cb.ccb[i].scb[j];
922   // Verify the whether the scb is allocated
923   if (!p_scb->allocated) {
924     log::warn("SCB handle {} not allocated", hdl);
925     return nullptr;
926   }
927 
928   log::verbose("SCB for handle {} found: p_scb={} scb_index={}", hdl, std::format_ptr(p_scb),
929                p_scb->stream_config.scb_index);
930   return p_scb;
931 }
932 
933 /*******************************************************************************
934  *
935  * Function         avdt_scb_verify
936  *
937  * Description      Verify the condition of a list of scbs.
938  *
939  *
940  * Returns          SEID that failed, or 0 if success.
941  *
942  ******************************************************************************/
avdt_scb_verify(AvdtpCcb * p_ccb,uint8_t state,uint8_t * p_seid,uint16_t num_seid,uint8_t * p_err_code)943 uint8_t avdt_scb_verify(AvdtpCcb* p_ccb, uint8_t state, uint8_t* p_seid, uint16_t num_seid,
944                         uint8_t* p_err_code) {
945   log::verbose("avdt_scb_verify state {}", state);
946   /* set nonsupported command mask */
947   /* translate public state into private state */
948   uint8_t nsc_mask = 0;
949   if (state == AVDT_VERIFY_SUSPEND) {
950     nsc_mask = AvdtpStreamConfig::AVDT_NSC_SUSPEND;
951   }
952 
953   /* verify every scb */
954   *p_err_code = 0;
955   for (int i = 0; (i < num_seid) && (i < AVDT_NUM_SEPS); i++) {
956     AvdtpScb* p_scb = avdt_scb_by_hdl(p_seid[i]);
957     if (p_scb == NULL) {
958       *p_err_code = AVDT_ERR_BAD_STATE;
959       return p_seid[i];
960     }
961 
962     if (p_scb->p_ccb != p_ccb) {
963       *p_err_code = AVDT_ERR_BAD_STATE;
964       return p_seid[i];
965     }
966 
967     if (p_scb->stream_config.nsc_mask & nsc_mask) {
968       *p_err_code = AVDT_ERR_NSC;
969       return p_seid[i];
970     }
971 
972     switch (state) {
973       case AVDT_VERIFY_OPEN:
974       case AVDT_VERIFY_START:
975         if (p_scb->state != AVDT_SCB_OPEN_ST && p_scb->state != AVDT_SCB_STREAM_ST) {
976           *p_err_code = AVDT_ERR_BAD_STATE;
977           return p_seid[i];
978         }
979         break;
980 
981       case AVDT_VERIFY_SUSPEND:
982       case AVDT_VERIFY_STREAMING:
983         if (p_scb->state != AVDT_SCB_STREAM_ST) {
984           *p_err_code = AVDT_ERR_BAD_STATE;
985           return p_seid[i];
986         }
987         break;
988     }
989   }
990 
991   return 0;
992 }
993 
994 /*******************************************************************************
995  *
996  * Function         avdt_scb_peer_seid_list
997  *
998  * Description      Given a list of SCB handles, return a list of peer SEIDs
999  *                  for the handles, copied in place into the struct passed in.
1000  *
1001  *
1002  * Returns          Nothing.
1003  *
1004  ******************************************************************************/
avdt_scb_peer_seid_list(tAVDT_MULTI * p_multi)1005 void avdt_scb_peer_seid_list(tAVDT_MULTI* p_multi) {
1006   int i;
1007   AvdtpScb* p_scb;
1008 
1009   for (i = 0; i < p_multi->num_seps; i++) {
1010     p_scb = avdt_scb_by_hdl(p_multi->seid_list[i]);
1011     if (p_scb != NULL) {
1012       p_multi->seid_list[i] = p_scb->peer_seid;
1013     }
1014   }
1015 }
1016