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 */