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