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