1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef AVDTP_INT_H
17 #define AVDTP_INT_H
18 
19 #include "avdtp.h"
20 
21 /**
22  * Transport channel state
23  **/
24 #define AVDT_TRANS_ST_IDLE 0         /* Init status,no connection */
25 #define AVDT_TRANS_ST_ACP 1          /* Acceptor: waiting for connection */
26 #define AVDT_TRANS_ST_INT 2          /* Init connection */
27 #define AVDT_TRANS_ST_CONNECTION 3   /* Initator: waiting for connection confirm */
28 #define AVDT_TRANS_ST_CFG 4          /* Waiting for configure confirm */
29 #define AVDT_TRANS_ST_COMPLETE 5     /* L2cap channel opened ok */
30 #define AVDT_TRANS_ST_SECURITY_INT 6 /* Initator: waiting for security confirm */
31 #define AVDT_TRANS_ST_SECURITY_ACP 7 /* Acceptor:waiting for security confirm */
32 
33 /**
34  * AVDTP service capabilities
35  */
36 #define AVDT_PSC_MSK (AVDT_PSC_MSK_TRANS | AVDT_PSC_MSK_DELAY_RPT | AVDT_PSC_MSK_CODEC)
37 
38 /**
39  * Media packet header
40  */
41 #define AVDT_MEDIA_OCTET1 0x80      /* First octect */
42 #define AVDT_BUFFER_MEDIA_HEADER 12 /* Header size */
43 
44 /**
45  * Transport table max size
46  */
47 #define AVDT_CH_TABLE_SIZE (AVDT_NUM_LINKS * 2)
48 
49 /**
50  * L2cap config state
51  */
52 #define AVDT_CFG_IND 1 << 0
53 #define AVDT_CFG_CFM 1 << 1
54 #define AVDT_CFG_END 3
55 
56 /**
57  * Stream link number. It's only surport audio stream now.
58  */
59 #define AVDT_NUM_STREAM_LINKS 6
60 
61 /**
62  * Max numbers of stream endpoints
63  */
64 #define AVDT_MAX_NUM_SEP (AVDT_NUM_STREAM_LINKS * AVDT_NUM_SEPS)
65 
66 #define AVDT_1BYTE 1
67 #define AVDT_2BYTE 2
68 #define AVDT_4BYTE 4
69 #define AVDT_32BYTE 32
70 #define AVDT_OFFSET_1BIT 1
71 #define AVDT_OFFSET_2BIT 2
72 #define AVDT_OFFSET_3BIT 3
73 #define AVDT_OFFSET_4BIT 4
74 #define AVDT_OFFSET_8BIT 8
75 #define AVDT_OFFSET_16BIT 16
76 #define AVDT_OFFSET_24BIT 24
77 
78 #define AVDT_TRANS_LENGTH 2
79 #define AVDT_DELAY_LENGTH 2
80 
81 #define AVDT_SIG_LENGTH_COMM 1
82 #define AVDT_SIG_LENGTH_SETCONFIG 2
83 #define AVDT_SIG_LENGTH_DELAY_RPT 3
84 
85 #define WAIT_TIME (-1)
86 
87 #define AVDT_LABEL_MAX 128
88 #define AVDT_MEDIA_SEQ_MAX 65536
89 
90 #define BT_ADDR_FMT_ASC(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]
91 #define BT_ADDR_FMT_DSC(addr) addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]
92 #define BT_ADDR_LENGTH 6
93 
94 #define AVDT_CODEC_OFFSET_LENGHT 0
95 #define AVDT_CODEC_OFFSET_MEDIA_TYPE 1
96 #define AVDT_CODEC_OFFSET_CODEC_TYPE 2
97 
98 #define AVDT_MAKE_SEQUENCE_NO(p, sequence) \
99     do {                                   \
100         *(p)++ = ((sequence) >> 8);        \
101         *(p)++ = (uint8_t)(sequence);      \
102     } while (0)
103 
104 #define AVDT_MAKE_TIME_STAMP(p, timeStamp)     \
105     do {                                       \
106         *(p)++ = (uint8_t)((timeStamp) >> 24); \
107         *(p)++ = (uint8_t)((timeStamp) >> 16); \
108         *(p)++ = (uint8_t)((timeStamp) >> 8);  \
109         *(p)++ = (uint8_t)(timeStamp);         \
110     } while (0)
111 
112 #define AVDT_MAKE_SSRC(p, ssrc)           \
113     do {                                  \
114         *(p)++ = (uint8_t)((ssrc) >> 24); \
115         *(p)++ = (uint8_t)((ssrc) >> 16); \
116         *(p)++ = (uint8_t)((ssrc) >> 8);  \
117         *(p)++ = (uint8_t)(ssrc);         \
118     } while (0)
119 
120 /**
121  * Stream state machine states
122  */
123 enum {
124     AVDT_IDLE_ST,
125     AVDT_CONFIGURE_ST,
126     AVDT_OPENING_ST,
127     AVDT_OPEN_ST,
128     AVDT_STREAMING_ST,
129     AVDT_CLOSING_ST,
130 };
131 
132 /**
133  * Signal state machine states
134  */
135 enum {
136     AVDT_SIG_IDLE_ST,
137     AVDT_SIG_CONFIGURE_ST,
138     AVDT_SIG_OPEN_ST,
139     AVDT_SIG_CLOSING_ST,
140 };
141 
142 /**
143  * Stream State machine action enumeration list
144  */
145 enum {
146     AVDT_SETCONFIGURE_REQ, /* 0 */
147     AVDT_SETCONFIGURE_RSP, /* 1 */
148     AVDT_SETCONFIGURE_IND, /* 2 */
149     AVDT_SETCONFIGURE_CFM, /* 3 */
150     AVDT_GETCONFIGURE_REQ, /* 4 */
151     AVDT_GETCONFIGURE_RSP, /* 5 */
152     AVDT_GETCONFIGURE_IND, /* 6 */
153     AVDT_GETCONFIGURE_CFM, /* 7 */
154     AVDT_OPEN_REQ,         /* 8 */
155     AVDT_OPEN_RSP,         /* 9 */
156     AVDT_OPEN_IND,         /* 10 */
157     AVDT_OPEN_CFM,         /* 11 */
158     AVDT_RECONFIGURE_REQ,  /* 12 */
159     AVDT_RECONFIGURE_RSP,  /* 13 */
160     AVDT_RECONFIGURE_IND,  /* 14 */
161     AVDT_RECONFIGURE_CFM,  /* 15 */
162     AVDT_START_REQ,        /* 16 */
163     AVDT_START_RSP,        /* 17 */
164     AVDT_START_IND,        /* 18 */
165     AVDT_START_CFM,        /* 19 */
166     AVDT_SUSPEND_REQ,      /* 20 */
167     AVDT_SUSPEND_RSP,      /* 21 */
168     AVDT_SUSPEND_IND,      /* 22 */
169     AVDT_SUSPEND_CFM,      /* 23 */
170     AVDT_CLOSE_REQ,        /* 24 */
171     AVDT_CLOSE_RSP,        /* 25 */
172     AVDT_CLOSE_IND,        /* 26 */
173     AVDT_CLOSE_CFM,        /* 27 */
174     AVDT_ABORT_REQ,        /* 28 */
175     AVDT_ABORT_RSP,        /* 29 */
176     AVDT_ABORT_IND,        /* 30 */
177     AVDT_ABORT_CFM,        /* 31 */
178     AVDT_DELAY_REQ,        /* 32 */
179     AVDT_DELAY_RSP,        /* 33 */
180     AVDT_DELAY_IND,        /* 34 */
181     AVDT_DELAY_CFM,        /* 35 */
182     AVDT_WRITE_REQ,        /* 36 */
183     AVDT_WRITE_CFM,        /* unuse */
184     AVDT_READ_IND,         /* unuse */
185     AVDT_STREAM_OPEN_REQ,  /* 39 */
186     AVDT_STREAM_OPEN_RSP,  /* 40 */
187     AVDT_STREAM_OPEN_IND,  /* 41 */
188     AVDT_STREAM_OPEN_CFM,  /* 42 */
189     AVDT_STREAM_CLOSE_REQ, /* unuse */
190     AVDT_STREAM_CLOSE_RSP, /* unuse */
191     AVDT_STREAM_CLOSE_IND, /* 45 */
192     AVDT_STREAM_CLOSE_CFM, /* 46 */
193     AVDT_BAD_STATE_REJ,    /* 47 */
194     AVDT_STREAM_ACTION_NUM /* 48 */
195 };
196 /**
197  * Signal State machine action enumeration list
198  */
199 enum {
200     AVDT_DISCOVER_REQ,   /* 0 */
201     AVDT_DISCOVER_RSP,   /* 1 */
202     AVDT_DISCOVER_IND,   /* 2 */
203     AVDT_DISCOVER_CFM,   /* 3 */
204     AVDT_GETCAP_REQ,     /* 4 */
205     AVDT_GETCAP_RSP,     /* 5 */
206     AVDT_GETCAP_IND,     /* 6 */
207     AVDT_GETCAP_CFM,     /* 7 */
208     AVDT_GETALLCAP_REQ,  /* 8 */
209     AVDT_GETALLCAP_RSP,  /* 9 */
210     AVDT_GETALLCAP_IND,  /* 10 */
211     AVDT_GETALLCAP_CFM,  /* 11 */
212     AVDT_CONNECT_REQ,    /* 12 */
213     AVDT_CONNECT_RSP,    /* 13 */
214     AVDT_CONNECT_IND,    /* 14 */
215     AVDT_CONNECT_CFM,    /* 15 */
216     AVDT_DISCONNECT_REQ, /* 16 */
217     AVDT_DISCONNECT_RSP, /* 17 */
218     AVDT_DISCONNECT_IND, /* 18 */
219     AVDT_DISCONNECT_CFM, /* 19 */
220     AVDT_SND_MSG,        /* 20 */
221     AVDT_SIG_ACTION_NUM
222 };
223 
224 #define AVDT_SSM_IGNORE (AVDT_STREAM_ACTION_NUM + 10)
225 
226 /**
227  * Stream State machine events
228  */
229 enum {
230     AVDT_SETCONFIGURE_CMD_REQ_EVENT, /* 0 */
231     AVDT_SETCONFIGURE_CMD_RSP_EVENT, /* 1 */
232     AVDT_SETCONFIGURE_CMD_IND_EVENT, /* 2 */
233     AVDT_SETCONFIGURE_CMD_CFM_EVENT, /* 3 */
234     AVDT_GETCONFIGURE_CMD_REQ_EVENT, /* 4 */
235     AVDT_GETCONFIGURE_CMD_RSP_EVENT, /* 5 */
236     AVDT_GETCONFIGURE_CMD_IND_EVENT, /* 6 */
237     AVDT_GETCONFIGURE_CMD_CFM_EVENT, /* 7 */
238     AVDT_OPEN_CMD_REQ_EVENT,         /* 8 */
239     AVDT_OPEN_CMD_RSP_EVENT,         /* 9 */
240     AVDT_OPEN_CMD_IND_EVENT,         /* 10 */
241     AVDT_OPEN_CMD_CFM_EVENT,         /* 11 */
242     AVDT_RECONFIGURE_CMD_REQ_EVENT,  /* 12 */
243     AVDT_RECONFIGURE_CMD_RSP_EVENT,  /* 13 */
244     AVDT_RECONFIGURE_CMD_IND_EVENT,  /* 14 */
245     AVDT_RECONFIGURE_CMD_CFM_EVENT,  /* 15 */
246     AVDT_START_CMD_REQ_EVENT,        /* 16 */
247     AVDT_START_CMD_RSP_EVENT,        /* 17 */
248     AVDT_START_CMD_IND_EVENT,        /* 18 */
249     AVDT_START_CMD_CFM_EVENT,        /* 19 */
250     AVDT_SUSPEND_CMD_REQ_EVENT,      /* 20 */
251     AVDT_SUSPEND_CMD_RSP_EVENT,      /* 21 */
252     AVDT_SUSPEND_CMD_IND_EVENT,      /* 22 */
253     AVDT_SUSPEND_CMD_CFM_EVENT,      /* 23 */
254     AVDT_CLOSE_CMD_REQ_EVENT,        /* 24 */
255     AVDT_CLOSE_CMD_RSP_EVENT,        /* 25 */
256     AVDT_CLOSE_CMD_IND_EVENT,        /* 26 */
257     AVDT_CLOSE_CMD_CFM_EVENT,        /* 27 */
258     AVDT_ABORT_CMD_REQ_EVENT,        /* 28 */
259     AVDT_ABORT_CMD_RSP_EVENT,        /* 29 */
260     AVDT_ABORT_CMD_IND_EVENT,        /* 30 */
261     AVDT_ABORT_CMD_CFM_EVENT,        /* 31 */
262     AVDT_DELAY_CMD_REQ_EVENT,        /* 32 */
263     AVDT_DELAY_CMD_RSP_EVENT,        /* 33 */
264     AVDT_DELAY_CMD_IND_EVENT,        /* 34 */
265     AVDT_DELAY_CMD_CFM_EVENT,        /* 35 */
266     AVDT_WRITE_CMD_REQ_EVENT,        /* 36 */
267     AVDT_WRITE_CMD_CFM_EVENT,        /* 37 */
268     AVDT_READ_CMD_IND_EVENT,         /* 38 */
269     AVDT_STREAM_OPEN_CMD_REQ_EVENT,  /* 39 */
270     AVDT_STREAM_OPEN_CMD_RSP_EVENT,  /* 40 */
271     AVDT_STREAM_OPEN_CMD_IND_EVENT,  /* 41 */
272     AVDT_STREAM_OPEN_CMD_CFM_EVENT,  /* 42 */
273     AVDT_STREAM_CLOSE_CMD_REQ_EVENT, /* 43 */
274     AVDT_STREAM_CLOSE_CMD_RSP_EVENT, /* 44 */
275     AVDT_STREAM_CLOSE_CMD_IND_EVENT, /* 45 */
276     AVDT_STREAM_CLOSE_CMD_CFM_EVENT, /* 46 */
277     AVDT_BAD_STATE_REJ_EVENT,        /* 47 */
278     AVDT_STREAM_ACTIONS_NUM_EVENT    /* 48 */
279 };
280 /**
281  * Signal State machine events
282  */
283 enum {
284     AVDT_DISCOVER_CMD_REQ_EVENT,   /* 0 */
285     AVDT_DISCOVER_CMD_RSP_EVENT,   /* 1 */
286     AVDT_DISCOVER_CMD_IND_EVENT,   /* 2 */
287     AVDT_DISCOVER_CMD_CFM_EVENT,   /* 3 */
288     AVDT_GETCAP_CMD_REQ_EVENT,     /* 4 */
289     AVDT_GETCAP_CMD_RSP_EVENT,     /* 5 */
290     AVDT_GETCAP_CMD_IND_EVENT,     /* 6 */
291     AVDT_GETCAP_CMD_CFM_EVENT,     /* 7 */
292     AVDT_GETALLCAP_CMD_REQ_EVENT,  /* 8 */
293     AVDT_GETALLCAP_CMD_RSP_EVENT,  /* 9 */
294     AVDT_GETALLCAP_CMD_IND_EVENT,  /* 10 */
295     AVDT_GETALLCAP_CMD_CFM_EVENT,  /* 11 */
296     AVDT_CONNECT_CMD_REQ_EVENT,    /* 12 */
297     AVDT_CONNECT_CMD_RSP_EVENT,    /* 13 */
298     AVDT_CONNECT_CMD_IND_EVENT,    /* 14 */
299     AVDT_CONNECT_CMD_CFM_EVENT,    /* 15 */
300     AVDT_DISCONNECT_CMD_REQ_EVENT, /* 16 */
301     AVDT_DISCONNECT_CMD_RSP_EVENT, /* 17 */
302     AVDT_DISCONNECT_CMD_IND_EVENT, /* 18 */
303     AVDT_DISCONNECT_CMD_CFM_EVENT, /* 19 */
304     AVDT_SND_MSG_EVENT,            /* 20 */
305     AVDT_SIG_ACTIONS_NUM_EVENT     /* 21 */
306 };
307 /**
308  * Define the header of each buffer used in the Avdt.
309  */
310 typedef struct {
311     Packet *data;
312     uint16_t event;
313     uint16_t len;
314     uint8_t transLabel;
315 } AvdtHeader;
316 
317 /**
318  * Data type for AVDT_DISCOVER_REQ_EVENT
319  */
320 typedef struct {
321     AvdtSepInfo *sepInformation;
322     uint8_t numSeps;
323 } AvdtDiscoverData;
324 
325 /**
326  * Data type for AVDT_GETCAP_REQ_EVENT
327  */
328 typedef struct {
329     AvdtEvtHeader single;
330     AvdtSepConfig *cfg;
331 } AvdtGetCapData;
332 
333 /**
334  * Type for AVDT_SCB_API_WRITE_REQ_EVENT
335  */
336 typedef struct {
337     Packet *pkt;
338     uint32_t timeStamp;
339     uint8_t payloadType;
340     uint8_t marker;
341 } AvdtStreamData;
342 
343 /**
344  * Msg union of all message parameter types
345  */
346 typedef union {
347     AvdtEvtHeader single;
348     AvdtSetConfig configureCmd;
349     AvdtConfig reconfigureCmd;
350     AvdtDiscover discoverRsp;
351     AvdtDelayRpt delayRptCmd;
352     AvdtGetCapData getcap;
353 } AvdtMsg;
354 /**
355  * Union associated with sigCtrl state machine events
356  */
357 typedef union {
358     AvdtDiscoverData discover;
359     AvdtGetCapData getcap;
360     AvdtMsg msg;
361     AvdtStreamData apiWrite;
362     AvdtDelayRpt apiDelay;
363     Packet *pkt;
364     AvdtCtrlData ctrlData;
365     uint8_t errCode;
366 } AvdtEventData;
367 
368 /**
369  * AVDTP Stream Control Block.
370  */
371 typedef struct {
372     BtAddr peerAddress;
373     AvdtSetConfig currCfg; /* Current configuration */
374     AvdtSepConfig reqCfg;  /* Requested configuration */
375     Packet *pkt;           /* Packet waiting to be sent */
376     uint16_t codecIndex;   /* index of local sep */
377     uint16_t mediaSeq;     /* Media packet sequence number */
378     uint8_t role;          /* Initiator/acceptor role in current procedure */
379     uint8_t state;         /* State machine state */
380     uint8_t peerSeid;      /* SEID of peer stream */
381     uint8_t currEvt;       /* current event; set only by the state machine */
382     uint8_t sigHandle;     /* Avdtpccb entry */
383     uint16_t handle;       /* Unique handle for this AvdtpScb entry */
384     bool isAllocated;      /* True if the SCB is isAllocated */
385     bool isUsed;           /* True if used by peer */
386 } AvdtStreamCtrl;
387 
388 /**
389  * AVDTP Channel Control Block.
390  */
391 typedef struct {
392     BtAddr peerAddress;
393     AvdtCtrlCallback procCback; /* Procedure callback function */
394     Packet *currentMsg;         /* Current message being sent */
395     Packet *rxMsg;              /* Current message being received */
396     uint8_t state;              /* The channel state machine state */
397     uint8_t procParam;          /* Either SEID for get capabilities or number of SEPS for discover */
398     uint8_t rcvLabel;           /* Message header "label" (sequence number) */
399     uint8_t label;
400     uint8_t numbPakcket;
401     uint8_t role;
402     uint8_t ia; /* AVDT_INT or AVDT_ACP */
403     uint8_t rcvSignal;
404     uint8_t msgType;
405     uint16_t handle;
406     uint16_t streamHandle;
407     uint16_t lcid;
408     bool isProcBusy; /* True when a discover or get capabilities procedure in progress */
409     bool isFailReport;
410     AvdtStreamCtrl streamCtrl[AVDT_NUM_SEPS];
411     uint8_t edr;
412 } AvdtSigCtrl;
413 
414 typedef struct {
415     uint16_t handle;
416     bool isUsed;
417 } AvdtChannelHandle;
418 
419 /**
420  * AVDTP transport channel
421  */
422 typedef struct {
423     BtAddr addr;
424     uint16_t peerMtu;     /* L2CAP MTU of the peer device */
425     uint16_t peerFlushTo; /* Our flush timeout for this channel */
426     uint16_t lcid;
427     uint16_t sigHandle;    /* Channel control handle related with this channel */
428     uint16_t streamHandle; /* Stream control handle related with the channel */
429     uint8_t type;          /* Transport type: signaling channel, media channel */
430     uint8_t state;         /* Transport channel state */
431     uint8_t cfgFlags;      /* L2CAP configuration flags */
432     uint8_t id;
433 } AvdtTransChannel;
434 
435 typedef struct {
436     AvdtStreamConfig localConfigure;
437     bool isExited;
438 } AvdtStreamEndpoint;
439 
440 /**
441  * Types for action functions.
442  */
443 typedef uint16_t (*AvdtStreamAction)(AvdtStreamCtrl *streamCtrl, AvdtEventData *data);
444 typedef uint16_t (*AvdtSigAction)(AvdtSigCtrl *sigCtrl, const AvdtEventData *data);
445 
446 /**
447  * Control block for AVDTP.
448  */
449 typedef struct {
450     AvdtRegisterParam regInfo;                         /* Registration control block */
451     AvdtSigCtrl *sigCtrl[AVDT_NUM_LINKS];              /* Channel control blocks */
452     AvdtTransChannel *transTable[AVDT_CH_TABLE_SIZE];  /* Record the lcid of Signaling and  media */
453     const AvdtStreamAction *streamAction;              /* Pointer to stream action functions */
454     const AvdtSigAction *sigAction;                    /* Pointer to signal action functions */
455     AvdtChannelHandle streamHandles[AVDT_MAX_NUM_SEP]; /* SEP handles */
456     AvdtChannelHandle sigHandles[AVDT_NUM_LINKS];      /* Channel ctrl handles */
457     AvdtStreamEndpoint localSEP[AVDT_NUM_SEPS];        /* Local stream endpoint */
458     bool avdtRegisted;
459     bool sepRegisted;
460 } AvdtCB;
461 
462 /**
463  * Global data
464  */
465 
466 /**
467  * L2CAP callback registration structure
468  */
469 
470 extern void AvdtPktDataPrint(const Packet *pkt);
471 #endif /* AVDTP_INT_H */