Home | History | Annotate | Download | only in avdt
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 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 file contains interfaces which are internal to AVDTP.
     22  *
     23  ******************************************************************************/
     24 #ifndef AVDT_INT_H
     25 #define AVDT_INT_H
     26 
     27 #include "gki.h"
     28 #include "avdt_api.h"
     29 #include "avdtc_api.h"
     30 #include "avdt_defs.h"
     31 #include "l2c_api.h"
     32 #include "btm_api.h"
     33 
     34 #ifndef AVDT_DEBUG
     35 #if (!defined BTTRC_INCLUDED || BTTRC_INCLUDED == FALSE)
     36 #define AVDT_DEBUG  TRUE
     37 #else
     38 #define AVDT_DEBUG  FALSE
     39 #endif
     40 #endif
     41 
     42 /*****************************************************************************
     43 ** constants
     44 *****************************************************************************/
     45 
     46 /* channel types */
     47 enum {
     48     AVDT_CHAN_SIG,                  /* signaling channel */
     49     AVDT_CHAN_MEDIA,                /* media channel */
     50 #if AVDT_REPORTING == TRUE
     51     AVDT_CHAN_REPORT,               /* reporting channel */
     52 #endif
     53     AVDT_CHAN_NUM_TYPES
     54 };
     55 
     56 /* protocol service capabilities of this AVDTP implementation */
     57 /* for now multiplexing will be used only for fragmentation */
     58 #if ((AVDT_MULTIPLEXING == TRUE) && (AVDT_REPORTING == TRUE))
     59 #define AVDT_PSC                (AVDT_PSC_TRANS | AVDT_PSC_MUX | AVDT_PSC_REPORT | AVDT_PSC_DELAY_RPT)
     60 #define AVDT_LEG_PSC            (AVDT_PSC_TRANS | AVDT_PSC_MUX | AVDT_PSC_REPORT)
     61 #else /* AVDT_MULTIPLEXING && AVDT_REPORTING  */
     62 
     63 #if (AVDT_MULTIPLEXING == TRUE)
     64 #define AVDT_PSC                (AVDT_PSC_TRANS | AVDT_PSC_MUX | AVDT_PSC_DELAY_RPT)
     65 #define AVDT_LEG_PSC            (AVDT_PSC_TRANS | AVDT_PSC_MUX)
     66 #else /* AVDT_MULTIPLEXING */
     67 
     68 #if (AVDT_REPORTING == TRUE)
     69 #define AVDT_PSC                (AVDT_PSC_TRANS | AVDT_PSC_REPORT | AVDT_PSC_DELAY_RPT)
     70 #define AVDT_LEG_PSC            (AVDT_PSC_TRANS | AVDT_PSC_REPORT)
     71 #else /* AVDT_REPORTING  */
     72 #define AVDT_PSC                (AVDT_PSC_TRANS | AVDT_PSC_DELAY_RPT)
     73 #define AVDT_LEG_PSC            (AVDT_PSC_TRANS)
     74 #endif /* AVDT_REPORTING  */
     75 
     76 #endif /* AVDT_MULTIPLEXING */
     77 
     78 #endif /* AVDT_MULTIPLEXING && AVDT_REPORTING  */
     79 
     80 /* initiator/acceptor signaling roles */
     81 #define AVDT_CLOSE_ACP          0
     82 #define AVDT_CLOSE_INT          1
     83 #define AVDT_OPEN_ACP           2
     84 #define AVDT_OPEN_INT           3
     85 
     86 /* states for avdt_scb_verify */
     87 #define AVDT_VERIFY_OPEN        0
     88 #define AVDT_VERIFY_STREAMING   1
     89 #define AVDT_VERIFY_SUSPEND     2
     90 #define AVDT_VERIFY_START       3
     91 
     92 /* to distinguish CCB events from SCB events */
     93 #define AVDT_CCB_MKR            0x80
     94 
     95 /* offset where AVDTP signaling message header starts in message  */
     96 #define AVDT_HDR_OFFSET         (L2CAP_MIN_OFFSET + AVDT_NUM_SEPS)
     97 
     98 /* offset where AVDTP signaling message content starts;
     99 ** use the size of a start header since it's the largest possible
    100 ** layout of signaling message in a buffer is:
    101 **
    102 ** |  BT_HDR  | SCB handles | L2CAP + HCI header | AVDTP header | data ... |
    103 **
    104 ** Note that we "hide" the scb handles at the top of the message buffer.
    105 */
    106 #define AVDT_MSG_OFFSET         (L2CAP_MIN_OFFSET + AVDT_NUM_SEPS + AVDT_LEN_TYPE_START)
    107 
    108 /* scb transport channel connect timeout value */
    109 #define AVDT_SCB_TC_CONN_TOUT   10
    110 
    111 /* scb transport channel disconnect timeout value */
    112 #define AVDT_SCB_TC_DISC_TOUT   10
    113 
    114 /* maximum number of command retransmissions */
    115 #ifndef AVDT_RET_MAX
    116 #define AVDT_RET_MAX            1
    117 #endif
    118 
    119 
    120 /* ccb state machine states */
    121 enum {
    122     AVDT_CCB_IDLE_ST,
    123     AVDT_CCB_OPENING_ST,
    124     AVDT_CCB_OPEN_ST,
    125     AVDT_CCB_CLOSING_ST
    126 };
    127 
    128 /* state machine action enumeration list */
    129 enum {
    130     AVDT_CCB_CHAN_OPEN,
    131     AVDT_CCB_CHAN_CLOSE,
    132     AVDT_CCB_CHK_CLOSE,
    133     AVDT_CCB_HDL_DISCOVER_CMD,
    134     AVDT_CCB_HDL_DISCOVER_RSP,
    135     AVDT_CCB_HDL_GETCAP_CMD,
    136     AVDT_CCB_HDL_GETCAP_RSP,
    137     AVDT_CCB_HDL_START_CMD,
    138     AVDT_CCB_HDL_START_RSP,
    139     AVDT_CCB_HDL_SUSPEND_CMD,
    140     AVDT_CCB_HDL_SUSPEND_RSP,
    141     AVDT_CCB_SND_DISCOVER_CMD,
    142     AVDT_CCB_SND_DISCOVER_RSP,
    143     AVDT_CCB_SND_GETCAP_CMD,
    144     AVDT_CCB_SND_GETCAP_RSP,
    145     AVDT_CCB_SND_START_CMD,
    146     AVDT_CCB_SND_START_RSP,
    147     AVDT_CCB_SND_SUSPEND_CMD,
    148     AVDT_CCB_SND_SUSPEND_RSP,
    149     AVDT_CCB_CLEAR_CMDS,
    150     AVDT_CCB_CMD_FAIL,
    151     AVDT_CCB_FREE_CMD,
    152     AVDT_CCB_CONG_STATE,
    153     AVDT_CCB_RET_CMD,
    154     AVDT_CCB_SND_CMD,
    155     AVDT_CCB_SND_MSG,
    156     AVDT_CCB_SET_RECONN,
    157     AVDT_CCB_CLR_RECONN,
    158     AVDT_CCB_CHK_RECONN,
    159     AVDT_CCB_CHK_TIMER,
    160     AVDT_CCB_SET_CONN,
    161     AVDT_CCB_SET_DISCONN,
    162     AVDT_CCB_DO_DISCONN,
    163     AVDT_CCB_LL_CLOSED,
    164     AVDT_CCB_LL_OPENED,
    165     AVDT_CCB_DEALLOC,
    166     AVDT_CCB_NUM_ACTIONS
    167 };
    168 
    169 #define AVDT_CCB_IGNORE     AVDT_CCB_NUM_ACTIONS
    170 
    171 /* ccb state machine events */
    172 enum {
    173     AVDT_CCB_API_DISCOVER_REQ_EVT,
    174     AVDT_CCB_API_GETCAP_REQ_EVT,
    175     AVDT_CCB_API_START_REQ_EVT,
    176     AVDT_CCB_API_SUSPEND_REQ_EVT,
    177     AVDT_CCB_API_DISCOVER_RSP_EVT,
    178     AVDT_CCB_API_GETCAP_RSP_EVT,
    179     AVDT_CCB_API_START_RSP_EVT,
    180     AVDT_CCB_API_SUSPEND_RSP_EVT,
    181     AVDT_CCB_API_CONNECT_REQ_EVT,
    182     AVDT_CCB_API_DISCONNECT_REQ_EVT,
    183     AVDT_CCB_MSG_DISCOVER_CMD_EVT,
    184     AVDT_CCB_MSG_GETCAP_CMD_EVT,
    185     AVDT_CCB_MSG_START_CMD_EVT,
    186     AVDT_CCB_MSG_SUSPEND_CMD_EVT,
    187     AVDT_CCB_MSG_DISCOVER_RSP_EVT,
    188     AVDT_CCB_MSG_GETCAP_RSP_EVT,
    189     AVDT_CCB_MSG_START_RSP_EVT,
    190     AVDT_CCB_MSG_SUSPEND_RSP_EVT,
    191     AVDT_CCB_RCVRSP_EVT,
    192     AVDT_CCB_SENDMSG_EVT,
    193     AVDT_CCB_RET_TOUT_EVT,
    194     AVDT_CCB_RSP_TOUT_EVT,
    195     AVDT_CCB_IDLE_TOUT_EVT,
    196     AVDT_CCB_UL_OPEN_EVT,
    197     AVDT_CCB_UL_CLOSE_EVT,
    198     AVDT_CCB_LL_OPEN_EVT,
    199     AVDT_CCB_LL_CLOSE_EVT,
    200     AVDT_CCB_LL_CONG_EVT
    201 };
    202 
    203 
    204 /* scb state machine states; these state values are private to this module so
    205 ** the scb state cannot be read or set by actions functions
    206 */
    207 enum {
    208     AVDT_SCB_IDLE_ST,
    209     AVDT_SCB_CONF_ST,
    210     AVDT_SCB_OPENING_ST,
    211     AVDT_SCB_OPEN_ST,
    212     AVDT_SCB_STREAM_ST,
    213     AVDT_SCB_CLOSING_ST
    214 };
    215 
    216 /* state machine action enumeration list */
    217 enum {
    218     AVDT_SCB_HDL_ABORT_CMD,
    219     AVDT_SCB_HDL_ABORT_RSP,
    220     AVDT_SCB_HDL_CLOSE_CMD,
    221     AVDT_SCB_HDL_CLOSE_RSP,
    222     AVDT_SCB_HDL_GETCONFIG_CMD,
    223     AVDT_SCB_HDL_GETCONFIG_RSP,
    224     AVDT_SCB_HDL_OPEN_CMD,
    225     AVDT_SCB_HDL_OPEN_REJ,
    226     AVDT_SCB_HDL_OPEN_RSP,
    227     AVDT_SCB_HDL_PKT,
    228     AVDT_SCB_DROP_PKT,
    229     AVDT_SCB_HDL_RECONFIG_CMD,
    230     AVDT_SCB_HDL_RECONFIG_RSP,
    231     AVDT_SCB_HDL_SECURITY_CMD,
    232     AVDT_SCB_HDL_SECURITY_RSP,
    233     AVDT_SCB_HDL_SETCONFIG_CMD,
    234     AVDT_SCB_HDL_SETCONFIG_REJ,
    235     AVDT_SCB_HDL_SETCONFIG_RSP,
    236     AVDT_SCB_HDL_START_CMD,
    237     AVDT_SCB_HDL_START_RSP,
    238     AVDT_SCB_HDL_SUSPEND_CMD,
    239     AVDT_SCB_HDL_SUSPEND_RSP,
    240     AVDT_SCB_HDL_TC_CLOSE,
    241 #if AVDT_REPORTING == TRUE
    242     AVDT_SCB_HDL_TC_CLOSE_STO,
    243 #endif
    244     AVDT_SCB_HDL_TC_OPEN,
    245 #if AVDT_REPORTING == TRUE
    246     AVDT_SCB_HDL_TC_OPEN_STO,
    247 #endif
    248     AVDT_SCB_SND_DELAY_RPT_REQ,
    249     AVDT_SCB_HDL_DELAY_RPT_CMD,
    250     AVDT_SCB_HDL_DELAY_RPT_RSP,
    251     AVDT_SCB_HDL_WRITE_REQ,
    252     AVDT_SCB_SND_ABORT_REQ,
    253     AVDT_SCB_SND_ABORT_RSP,
    254     AVDT_SCB_SND_CLOSE_REQ,
    255     AVDT_SCB_SND_STREAM_CLOSE,
    256     AVDT_SCB_SND_CLOSE_RSP,
    257     AVDT_SCB_SND_GETCONFIG_REQ,
    258     AVDT_SCB_SND_GETCONFIG_RSP,
    259     AVDT_SCB_SND_OPEN_REQ,
    260     AVDT_SCB_SND_OPEN_RSP,
    261     AVDT_SCB_SND_RECONFIG_REQ,
    262     AVDT_SCB_SND_RECONFIG_RSP,
    263     AVDT_SCB_SND_SECURITY_REQ,
    264     AVDT_SCB_SND_SECURITY_RSP,
    265     AVDT_SCB_SND_SETCONFIG_REQ,
    266     AVDT_SCB_SND_SETCONFIG_REJ,
    267     AVDT_SCB_SND_SETCONFIG_RSP,
    268     AVDT_SCB_SND_TC_CLOSE,
    269     AVDT_SCB_CB_ERR,
    270     AVDT_SCB_CONG_STATE,
    271     AVDT_SCB_REJ_STATE,
    272     AVDT_SCB_REJ_IN_USE,
    273     AVDT_SCB_REJ_NOT_IN_USE,
    274     AVDT_SCB_SET_REMOVE,
    275     AVDT_SCB_FREE_PKT,
    276     AVDT_SCB_CLR_PKT,
    277     AVDT_SCB_CHK_SND_PKT,
    278     AVDT_SCB_TC_TIMER,
    279     AVDT_SCB_CLR_VARS,
    280     AVDT_SCB_DEALLOC,
    281     AVDT_SCB_NUM_ACTIONS
    282 };
    283 
    284 #define AVDT_SCB_IGNORE     AVDT_SCB_NUM_ACTIONS
    285 
    286 /* scb state machine events */
    287 enum {
    288     AVDT_SCB_API_REMOVE_EVT,
    289     AVDT_SCB_API_WRITE_REQ_EVT,
    290     AVDT_SCB_API_GETCONFIG_REQ_EVT,
    291     AVDT_SCB_API_DELAY_RPT_REQ_EVT,
    292     AVDT_SCB_API_SETCONFIG_REQ_EVT,
    293     AVDT_SCB_API_OPEN_REQ_EVT,
    294     AVDT_SCB_API_CLOSE_REQ_EVT,
    295     AVDT_SCB_API_RECONFIG_REQ_EVT,
    296     AVDT_SCB_API_SECURITY_REQ_EVT,
    297     AVDT_SCB_API_ABORT_REQ_EVT,
    298     AVDT_SCB_API_GETCONFIG_RSP_EVT,
    299     AVDT_SCB_API_SETCONFIG_RSP_EVT,
    300     AVDT_SCB_API_SETCONFIG_REJ_EVT,
    301     AVDT_SCB_API_OPEN_RSP_EVT,
    302     AVDT_SCB_API_CLOSE_RSP_EVT,
    303     AVDT_SCB_API_RECONFIG_RSP_EVT,
    304     AVDT_SCB_API_SECURITY_RSP_EVT,
    305     AVDT_SCB_API_ABORT_RSP_EVT,
    306     AVDT_SCB_MSG_SETCONFIG_CMD_EVT,
    307     AVDT_SCB_MSG_GETCONFIG_CMD_EVT,
    308     AVDT_SCB_MSG_OPEN_CMD_EVT,
    309     AVDT_SCB_MSG_START_CMD_EVT,
    310     AVDT_SCB_MSG_SUSPEND_CMD_EVT,
    311     AVDT_SCB_MSG_CLOSE_CMD_EVT,
    312     AVDT_SCB_MSG_ABORT_CMD_EVT,
    313     AVDT_SCB_MSG_RECONFIG_CMD_EVT,
    314     AVDT_SCB_MSG_SECURITY_CMD_EVT,
    315     AVDT_SCB_MSG_DELAY_RPT_CMD_EVT,
    316     AVDT_SCB_MSG_DELAY_RPT_RSP_EVT,
    317     AVDT_SCB_MSG_SETCONFIG_RSP_EVT,
    318     AVDT_SCB_MSG_GETCONFIG_RSP_EVT,
    319     AVDT_SCB_MSG_OPEN_RSP_EVT,
    320     AVDT_SCB_MSG_START_RSP_EVT,
    321     AVDT_SCB_MSG_SUSPEND_RSP_EVT,
    322     AVDT_SCB_MSG_CLOSE_RSP_EVT,
    323     AVDT_SCB_MSG_ABORT_RSP_EVT,
    324     AVDT_SCB_MSG_RECONFIG_RSP_EVT,
    325     AVDT_SCB_MSG_SECURITY_RSP_EVT,
    326     AVDT_SCB_MSG_SETCONFIG_REJ_EVT,
    327     AVDT_SCB_MSG_OPEN_REJ_EVT,
    328     AVDT_SCB_MSG_START_REJ_EVT,
    329     AVDT_SCB_MSG_SUSPEND_REJ_EVT,
    330     AVDT_SCB_TC_TOUT_EVT,
    331     AVDT_SCB_TC_OPEN_EVT,
    332     AVDT_SCB_TC_CLOSE_EVT,
    333     AVDT_SCB_TC_CONG_EVT,
    334     AVDT_SCB_TC_DATA_EVT,
    335     AVDT_SCB_CC_CLOSE_EVT
    336 };
    337 
    338 /* adaption layer number of stream routing table entries */
    339 #if AVDT_REPORTING == TRUE
    340 /* 2 channels(1 media, 1 report) for each SEP and one for signalling */
    341 #define AVDT_NUM_RT_TBL     ((AVDT_NUM_SEPS<<1) + 1)
    342 #else
    343 #define AVDT_NUM_RT_TBL     (AVDT_NUM_SEPS + 1)
    344 #endif
    345 
    346 /* adaption layer number of transport channel table entries - moved to target.h
    347 #define AVDT_NUM_TC_TBL     (AVDT_NUM_SEPS + AVDT_NUM_LINKS) */
    348 
    349 /* "states" used in transport channel table */
    350 #define AVDT_AD_ST_UNUSED   0       /* Unused - unallocated */
    351 #define AVDT_AD_ST_IDLE     1       /* No connection */
    352 #define AVDT_AD_ST_ACP      2       /* Waiting to accept a connection */
    353 #define AVDT_AD_ST_INT      3       /* Initiating a connection */
    354 #define AVDT_AD_ST_CONN     4       /* Waiting for connection confirm */
    355 #define AVDT_AD_ST_CFG      5       /* Waiting for configuration complete */
    356 #define AVDT_AD_ST_OPEN     6       /* Channel opened */
    357 #define AVDT_AD_ST_SEC_INT  7       /* Security process as INT */
    358 #define AVDT_AD_ST_SEC_ACP  8       /* Security process as ACP */
    359 
    360 /* Configuration flags. tAVDT_TC_TBL.cfg_flags */
    361 #define AVDT_L2C_CFG_IND_DONE   (1<<0)
    362 #define AVDT_L2C_CFG_CFM_DONE   (1<<1)
    363 #define AVDT_L2C_CFG_CONN_INT   (1<<2)
    364 #define AVDT_L2C_CFG_CONN_ACP   (1<<3)
    365 
    366 
    367 /* result code for avdt_ad_write_req() (L2CA_DataWrite()) */
    368 #define AVDT_AD_FAILED       L2CAP_DW_FAILED        /* FALSE */
    369 #define AVDT_AD_SUCCESS      L2CAP_DW_SUCCESS       /* TRUE */
    370 #define AVDT_AD_CONGESTED    L2CAP_DW_CONGESTED     /* 2 */
    371 
    372 /*****************************************************************************
    373 ** data types
    374 *****************************************************************************/
    375 
    376 /* msg union of all message parameter types */
    377 typedef union {
    378     tAVDT_EVT_HDR           hdr;
    379     tAVDT_EVT_HDR           single;
    380     tAVDT_SETCONFIG         config_cmd;
    381     tAVDT_CONFIG            reconfig_cmd;
    382     tAVDT_MULTI             multi;
    383     tAVDT_SECURITY          security_cmd;
    384     tAVDT_DISCOVER          discover_rsp;
    385     tAVDT_CONFIG            svccap;
    386     tAVDT_SECURITY          security_rsp;
    387     tAVDT_DELAY_RPT         delay_rpt_cmd;
    388 } tAVDT_MSG;
    389 
    390 /* data type for AVDT_CCB_API_DISCOVER_REQ_EVT */
    391 typedef struct {
    392     tAVDT_CTRL_CBACK    *p_cback;
    393     tAVDT_SEP_INFO      *p_sep_info;
    394     UINT8               num_seps;
    395 } tAVDT_CCB_API_DISCOVER;
    396 
    397 /* data type for AVDT_CCB_API_GETCAP_REQ_EVT */
    398 typedef struct {
    399     tAVDT_EVT_HDR       single;
    400     tAVDT_CTRL_CBACK    *p_cback;
    401     tAVDT_CFG           *p_cfg;
    402 } tAVDT_CCB_API_GETCAP;
    403 
    404 /* data type for AVDT_CCB_API_CONNECT_REQ_EVT */
    405 typedef struct {
    406     tAVDT_CTRL_CBACK    *p_cback;
    407     UINT8               sec_mask;
    408 } tAVDT_CCB_API_CONNECT;
    409 
    410 /* data type for AVDT_CCB_API_DISCONNECT_REQ_EVT */
    411 typedef struct {
    412     tAVDT_CTRL_CBACK    *p_cback;
    413 } tAVDT_CCB_API_DISCONNECT;
    414 
    415 /* union associated with ccb state machine events */
    416 typedef union {
    417     tAVDT_CCB_API_DISCOVER      discover;
    418     tAVDT_CCB_API_GETCAP        getcap;
    419     tAVDT_CCB_API_CONNECT       connect;
    420     tAVDT_CCB_API_DISCONNECT    disconnect;
    421     tAVDT_MSG                   msg;
    422     BOOLEAN                     llcong;
    423     UINT8                       err_code;
    424 } tAVDT_CCB_EVT;
    425 
    426 /* channel control block type */
    427 typedef struct {
    428     BD_ADDR             peer_addr;      /* BD address of peer */
    429     TIMER_LIST_ENT      timer_entry;    /* CCB timer list entry */
    430     BUFFER_Q            cmd_q;          /* Queue for outgoing command messages */
    431     BUFFER_Q            rsp_q;          /* Queue for outgoing response and reject messages */
    432     tAVDT_CTRL_CBACK    *proc_cback;    /* Procedure callback function */
    433     tAVDT_CTRL_CBACK    *p_conn_cback;  /* Connection/disconnection callback function */
    434     void                *p_proc_data;   /* Pointer to data storage for procedure */
    435     BT_HDR              *p_curr_cmd;    /* Current command being sent awaiting response */
    436     BT_HDR              *p_curr_msg;    /* Current message being sent */
    437     BT_HDR              *p_rx_msg;      /* Current message being received */
    438     BOOLEAN             allocated;      /* Whether ccb is allocated */
    439     UINT8               state;          /* The CCB state machine state */
    440     BOOLEAN             ll_opened;      /* TRUE if LL is opened */
    441     BOOLEAN             proc_busy;      /* TRUE when a discover or get capabilities procedure in progress */
    442     UINT8               proc_param;     /* Procedure parameter; either SEID for get capabilities or number of SEPS for discover */
    443     BOOLEAN             cong;           /* Whether signaling channel is congested */
    444     UINT8               label;          /* Message header "label" (sequence number) */
    445     BOOLEAN             reconn;         /* If TRUE, reinitiate connection after transitioning from CLOSING to IDLE state */
    446     UINT8               ret_count;      /* Command retransmission count */
    447 } tAVDT_CCB;
    448 
    449 /* type for action functions */
    450 typedef void (*tAVDT_CCB_ACTION)(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    451 
    452 /* type for AVDT_SCB_API_WRITE_REQ_EVT */
    453 typedef struct {
    454     BT_HDR      *p_buf;
    455     UINT32      time_stamp;
    456 #if AVDT_MULTIPLEXING == TRUE
    457     BUFFER_Q    frag_q;          /* Queue for outgoing media fragments. p_buf should be 0 */
    458     UINT8       *p_data;
    459     UINT32      data_len;
    460 #endif
    461     UINT8       m_pt;
    462     tAVDT_DATA_OPT_MASK     opt;
    463 } tAVDT_SCB_APIWRITE;
    464 
    465 /* type for AVDT_SCB_TC_CLOSE_EVT */
    466 typedef struct {
    467     UINT8           old_tc_state;       /* channel state before closed */
    468     UINT8           tcid;               /* TCID  */
    469     UINT8           type;               /* channel type */
    470 } tAVDT_SCB_TC_CLOSE;
    471 
    472 /* type for scb event data */
    473 typedef union {
    474     tAVDT_MSG           msg;
    475     tAVDT_SCB_APIWRITE  apiwrite;
    476     tAVDT_DELAY_RPT     apidelay;
    477     tAVDT_OPEN          open;
    478     tAVDT_SCB_TC_CLOSE  close;
    479     BOOLEAN             llcong;
    480     BT_HDR              *p_pkt;
    481 } tAVDT_SCB_EVT;
    482 
    483 /* stream control block type */
    484 typedef struct {
    485     tAVDT_CS        cs;             /* stream creation struct */
    486     tAVDT_CFG       curr_cfg;       /* current configuration */
    487     tAVDT_CFG       req_cfg;        /* requested configuration */
    488     TIMER_LIST_ENT  timer_entry;    /* timer entry */
    489     BT_HDR          *p_pkt;         /* packet waiting to be sent */
    490     tAVDT_CCB       *p_ccb;         /* ccb associated with this scb */
    491     UINT16          media_seq;      /* media packet sequence number */
    492     BOOLEAN         allocated;      /* whether scb is allocated or unused */
    493     BOOLEAN         in_use;         /* whether stream being used by peer */
    494     BOOLEAN         sink_activated; /* A2DP Sink activated/de-activated from Application */
    495     UINT8           role;           /* initiator/acceptor role in current procedure */
    496     BOOLEAN         remove;         /* whether CB is marked for removal */
    497     UINT8           state;          /* state machine state */
    498     UINT8           peer_seid;      /* SEID of peer stream */
    499     UINT8           curr_evt;       /* current event; set only by state machine */
    500     BOOLEAN         cong;           /* Whether media transport channel is congested */
    501     UINT8           close_code;     /* Error code received in close response */
    502 #if AVDT_MULTIPLEXING == TRUE
    503     BUFFER_Q        frag_q;         /* Queue for outgoing media fragments */
    504     UINT32          frag_off;       /* length of already received media fragments */
    505     UINT32          frag_org_len;   /* original length before fragmentation of receiving media packet */
    506     UINT8           *p_next_frag;   /* next fragment to send */
    507     UINT8           *p_media_buf;   /* buffer for media packet assigned by AVDT_SetMediaBuf */
    508     UINT32          media_buf_len;  /* length of buffer for media packet assigned by AVDT_SetMediaBuf */
    509 #endif
    510 } tAVDT_SCB;
    511 
    512 /* type for action functions */
    513 typedef void (*tAVDT_SCB_ACTION)(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    514 
    515 /* adaption layer type for transport channel table */
    516 typedef struct {
    517     UINT16  peer_mtu;       /* L2CAP mtu of the peer device */
    518     UINT16  my_mtu;         /* Our MTU for this channel */
    519     UINT16  my_flush_to;    /* Our flush timeout for this channel */
    520     UINT16  lcid;
    521     UINT8   tcid;           /* transport channel id */
    522     UINT8   ccb_idx;        /* channel control block associated with this tc */
    523     UINT8   state;          /* transport channel state */
    524     UINT8   cfg_flags;      /* L2CAP configuration flags */
    525     UINT8   id;
    526 } tAVDT_TC_TBL;
    527 
    528 /* adaption layer type for stream routing table */
    529 typedef struct {
    530     UINT16  lcid;           /* L2CAP LCID of the associated transport channel */
    531     UINT8   scb_hdl;        /* stream control block associated with this tc */
    532 } tAVDT_RT_TBL;
    533 
    534 
    535 /* adaption layer control block */
    536 typedef struct {
    537     tAVDT_RT_TBL    rt_tbl[AVDT_NUM_LINKS][AVDT_NUM_RT_TBL];
    538     tAVDT_TC_TBL    tc_tbl[AVDT_NUM_TC_TBL];
    539     UINT8           lcid_tbl[MAX_L2CAP_CHANNELS];   /* map LCID to tc_tbl index */
    540 } tAVDT_AD;
    541 
    542 /* Control block for AVDT */
    543 typedef struct {
    544     tAVDT_REG           rcb;                    /* registration control block */
    545     tAVDT_CCB           ccb[AVDT_NUM_LINKS];    /* channel control blocks */
    546     tAVDT_SCB           scb[AVDT_NUM_SEPS];     /* stream control blocks */
    547     tAVDT_AD            ad;                     /* adaption layer control block */
    548     tAVDTC_CTRL_CBACK   *p_conf_cback;          /* conformance callback function */
    549     tAVDT_CCB_ACTION    *p_ccb_act;             /* pointer to CCB action functions */
    550     tAVDT_SCB_ACTION    *p_scb_act;             /* pointer to SCB action functions */
    551     tAVDT_CTRL_CBACK    *p_conn_cback;          /* connection callback function */
    552     UINT8               trace_level;            /* trace level */
    553 } tAVDT_CB;
    554 
    555 
    556 /*****************************************************************************
    557 ** function declarations
    558 *****************************************************************************/
    559 
    560 /* CCB function declarations */
    561 extern void avdt_ccb_init(void);
    562 extern void avdt_ccb_event(tAVDT_CCB *p_ccb, UINT8 event, tAVDT_CCB_EVT *p_data);
    563 extern tAVDT_CCB *avdt_ccb_by_bd(BD_ADDR bd_addr);
    564 extern tAVDT_CCB *avdt_ccb_alloc(BD_ADDR bd_addr);
    565 extern void avdt_ccb_dealloc(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    566 extern UINT8 avdt_ccb_to_idx(tAVDT_CCB *p_ccb);
    567 extern tAVDT_CCB *avdt_ccb_by_idx(UINT8 idx);
    568 
    569 /* CCB action functions */
    570 extern void avdt_ccb_chan_open(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    571 extern void avdt_ccb_chan_close(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    572 extern void avdt_ccb_chk_close(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    573 extern void avdt_ccb_hdl_discover_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    574 extern void avdt_ccb_hdl_discover_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    575 extern void avdt_ccb_hdl_getcap_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    576 extern void avdt_ccb_hdl_getcap_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    577 extern void avdt_ccb_hdl_start_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    578 extern void avdt_ccb_hdl_start_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    579 extern void avdt_ccb_hdl_suspend_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    580 extern void avdt_ccb_hdl_suspend_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    581 extern void avdt_ccb_snd_discover_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    582 extern void avdt_ccb_snd_discover_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    583 extern void avdt_ccb_snd_getcap_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    584 extern void avdt_ccb_snd_getcap_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    585 extern void avdt_ccb_snd_start_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    586 extern void avdt_ccb_snd_start_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    587 extern void avdt_ccb_snd_suspend_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    588 extern void avdt_ccb_snd_suspend_rsp(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    589 extern void avdt_ccb_clear_cmds(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    590 extern void avdt_ccb_cmd_fail(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    591 extern void avdt_ccb_free_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    592 extern void avdt_ccb_cong_state(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    593 extern void avdt_ccb_ret_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    594 extern void avdt_ccb_snd_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    595 extern void avdt_ccb_snd_msg(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    596 extern void avdt_ccb_set_reconn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    597 extern void avdt_ccb_clr_reconn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    598 extern void avdt_ccb_chk_reconn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    599 extern void avdt_ccb_chk_timer(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    600 extern void avdt_ccb_set_conn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    601 extern void avdt_ccb_set_disconn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    602 extern void avdt_ccb_do_disconn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    603 extern void avdt_ccb_ll_closed(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    604 extern void avdt_ccb_ll_opened(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data);
    605 
    606 /* SCB function prototypes */
    607 extern void avdt_scb_event(tAVDT_SCB *p_scb, UINT8 event, tAVDT_SCB_EVT *p_data);
    608 extern void avdt_scb_init(void);
    609 extern tAVDT_SCB *avdt_scb_alloc(tAVDT_CS *p_cs);
    610 extern void avdt_scb_dealloc(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    611 extern UINT8 avdt_scb_to_hdl(tAVDT_SCB *p_scb);
    612 extern tAVDT_SCB *avdt_scb_by_hdl(UINT8 hdl);
    613 extern UINT8 avdt_scb_verify(tAVDT_CCB *p_ccb, UINT8 state, UINT8 *p_seid, UINT16 num_seid, UINT8 *p_err_code);
    614 extern void avdt_scb_peer_seid_list(tAVDT_MULTI *p_multi);
    615 extern UINT32 avdt_scb_gen_ssrc(tAVDT_SCB *p_scb);
    616 
    617 /* SCB action functions */
    618 extern void avdt_scb_hdl_abort_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    619 extern void avdt_scb_hdl_abort_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    620 extern void avdt_scb_hdl_close_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    621 extern void avdt_scb_hdl_close_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    622 extern void avdt_scb_hdl_getconfig_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    623 extern void avdt_scb_hdl_getconfig_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    624 extern void avdt_scb_hdl_open_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    625 extern void avdt_scb_hdl_open_rej(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    626 extern void avdt_scb_hdl_open_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    627 extern void avdt_scb_hdl_pkt(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    628 extern void avdt_scb_drop_pkt(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    629 extern void avdt_scb_hdl_reconfig_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    630 extern void avdt_scb_hdl_reconfig_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    631 extern void avdt_scb_hdl_security_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    632 extern void avdt_scb_hdl_security_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    633 extern void avdt_scb_hdl_setconfig_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    634 extern void avdt_scb_hdl_setconfig_rej(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    635 extern void avdt_scb_hdl_setconfig_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    636 extern void avdt_scb_hdl_start_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    637 extern void avdt_scb_hdl_start_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    638 extern void avdt_scb_hdl_suspend_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    639 extern void avdt_scb_hdl_suspend_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    640 extern void avdt_scb_snd_delay_rpt_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    641 extern void avdt_scb_hdl_delay_rpt_cmd(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    642 extern void avdt_scb_hdl_delay_rpt_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    643 extern void avdt_scb_hdl_tc_close(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    644 extern void avdt_scb_hdl_tc_open(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    645 extern void avdt_scb_hdl_tc_close_sto(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    646 extern void avdt_scb_hdl_tc_open_sto(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    647 extern void avdt_scb_hdl_write_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    648 extern void avdt_scb_snd_abort_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    649 extern void avdt_scb_snd_abort_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    650 extern void avdt_scb_snd_close_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    651 extern void avdt_scb_snd_stream_close(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    652 extern void avdt_scb_snd_close_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    653 extern void avdt_scb_snd_getconfig_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    654 extern void avdt_scb_snd_getconfig_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    655 extern void avdt_scb_snd_open_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    656 extern void avdt_scb_snd_open_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    657 extern void avdt_scb_snd_reconfig_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    658 extern void avdt_scb_snd_reconfig_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    659 extern void avdt_scb_snd_security_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    660 extern void avdt_scb_snd_security_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    661 extern void avdt_scb_snd_setconfig_req(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    662 extern void avdt_scb_snd_setconfig_rej(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    663 extern void avdt_scb_snd_setconfig_rsp(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    664 extern void avdt_scb_snd_tc_close(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    665 extern void avdt_scb_cb_err(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    666 extern void avdt_scb_cong_state(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    667 extern void avdt_scb_rej_state(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    668 extern void avdt_scb_rej_in_use(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    669 extern void avdt_scb_rej_not_in_use(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    670 extern void avdt_scb_set_remove(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    671 extern void avdt_scb_free_pkt(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    672 extern void avdt_scb_chk_snd_pkt(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    673 extern void avdt_scb_clr_pkt(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    674 extern void avdt_scb_tc_timer(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    675 extern void avdt_scb_clr_vars(tAVDT_SCB *p_scb, tAVDT_SCB_EVT *p_data);
    676 extern void avdt_scb_queue_frags(tAVDT_SCB *p_scb, UINT8 **pp_data, UINT32 *p_data_len, BUFFER_Q *pq);
    677 
    678 /* msg function declarations */
    679 extern BOOLEAN avdt_msg_send(tAVDT_CCB *p_ccb, BT_HDR *p_msg);
    680 extern void avdt_msg_send_cmd(tAVDT_CCB *p_ccb, void *p_scb, UINT8 sig_id, tAVDT_MSG *p_params);
    681 extern void avdt_msg_send_rsp(tAVDT_CCB *p_ccb, UINT8 sig_id, tAVDT_MSG *p_params);
    682 extern void avdt_msg_send_rej(tAVDT_CCB *p_ccb, UINT8 sig_id, tAVDT_MSG *p_params);
    683 extern void avdt_msg_send_grej(tAVDT_CCB *p_ccb, UINT8 sig_id, tAVDT_MSG *p_params);
    684 extern void avdt_msg_ind(tAVDT_CCB *p_ccb, BT_HDR *p_buf);
    685 
    686 /* adaption layer function declarations */
    687 extern void avdt_ad_init(void);
    688 extern UINT8 avdt_ad_type_to_tcid(UINT8 type, tAVDT_SCB *p_scb);
    689 extern tAVDT_TC_TBL *avdt_ad_tc_tbl_by_st(UINT8 type, tAVDT_CCB *p_ccb, UINT8 state);
    690 extern tAVDT_TC_TBL *avdt_ad_tc_tbl_by_lcid(UINT16 lcid);
    691 extern tAVDT_TC_TBL *avdt_ad_tc_tbl_alloc(tAVDT_CCB *p_ccb);
    692 extern UINT8 avdt_ad_tc_tbl_to_idx(tAVDT_TC_TBL *p_tbl);
    693 extern void avdt_ad_tc_close_ind(tAVDT_TC_TBL *p_tbl, UINT16 reason);
    694 extern void avdt_ad_tc_open_ind(tAVDT_TC_TBL *p_tbl);
    695 extern void avdt_ad_tc_cong_ind(tAVDT_TC_TBL *p_tbl, BOOLEAN is_congested);
    696 extern void avdt_ad_tc_data_ind(tAVDT_TC_TBL *p_tbl, BT_HDR *p_buf);
    697 extern tAVDT_TC_TBL *avdt_ad_tc_tbl_by_type(UINT8 type, tAVDT_CCB *p_ccb, tAVDT_SCB *p_scb);
    698 extern UINT8 avdt_ad_write_req(UINT8 type, tAVDT_CCB *p_ccb, tAVDT_SCB *p_scb, BT_HDR *p_buf);
    699 extern void avdt_ad_open_req(UINT8 type, tAVDT_CCB *p_ccb, tAVDT_SCB *p_scb, UINT8 role);
    700 extern void avdt_ad_close_req(UINT8 type, tAVDT_CCB *p_ccb, tAVDT_SCB *p_scb);
    701 
    702 extern void avdt_process_timeout(TIMER_LIST_ENT *p_tle);
    703 
    704 /*****************************************************************************
    705 ** macros
    706 *****************************************************************************/
    707 
    708 /* we store the scb and the label in the layer_specific field of the
    709 ** current cmd
    710 */
    711 #define AVDT_BLD_LAYERSPEC(ls, msg, label) \
    712             ls = (((label) << 4) | (msg))
    713 
    714 #define AVDT_LAYERSPEC_LABEL(ls)    ((UINT8)((ls) >> 4))
    715 
    716 #define AVDT_LAYERSPEC_MSG(ls)      ((UINT8)((ls) & 0x000F))
    717 
    718 /*****************************************************************************
    719 ** global data
    720 *****************************************************************************/
    721 #ifdef __cplusplus
    722 extern "C"
    723 {
    724 #endif
    725 
    726 /******************************************************************************
    727 ** Main Control Block
    728 *******************************************************************************/
    729 #if AVDT_DYNAMIC_MEMORY == FALSE
    730 AVDT_API extern tAVDT_CB  avdt_cb;
    731 #else
    732 AVDT_API extern tAVDT_CB *avdt_cb_ptr;
    733 #define avdt_cb (*avdt_cb_ptr)
    734 #endif
    735 
    736 
    737 /* L2CAP callback registration structure */
    738 extern const tL2CAP_APPL_INFO avdt_l2c_appl;
    739 
    740 /* reject message event lookup table */
    741 extern const UINT8 avdt_msg_rej_2_evt[];
    742 #ifdef __cplusplus
    743 }
    744 #endif
    745 
    746 #endif /* AVDT_INT_H */
    747