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