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