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