1 /*
2 * Copyright (C) 2021-2022 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 #include "avdtp_message.h"
17 #include "avdtp_ctrl.h"
18 #include "l2cap_if.h"
19 #include "log.h"
20 #include "securec.h"
21
22 /**
23 *
24 * @brief AvdtSendSig
25 *
26 * @details Signaling message fragmented and built.
27 * Call L2CAP API to send the message to peer.
28 *
29 * @return void
30 *
31 */
AvdtSendSig(AvdtSigCtrl * sigCtrl)32 void AvdtSendSig(AvdtSigCtrl *sigCtrl)
33 {
34 if (sigCtrl == NULL) {
35 return;
36 }
37 uint16_t Len = PacketSize(sigCtrl->currentMsg);
38 LOG_DEBUG("[AVDT]%{public}s:len(%hu)", __func__, Len);
39 /* pkt data debug print */
40 AvdtPktDataPrint(sigCtrl->currentMsg);
41 AvdtTransChannel *transTbl = AvdtGetTransChTabByHandle(AVDT_CH_TYPE_SIG, sigCtrl->handle);
42 if (transTbl == NULL) {
43 /* Trace no resources parameter */
44 LOG_ERROR("[AVDT]%{public}s: AvdtGetTransChTabByHandle(%hu) Failedl", __func__, sigCtrl->handle);
45 return;
46 }
47 LOG_DEBUG("[AVDT]%{public}s: packetLen(%hu) peermtu(%hu) lcid (%hu)",
48 __func__, Len, transTbl->peerMtu, transTbl->lcid);
49 if (Len <= transTbl->peerMtu) {
50 if (L2CIF_SendData(transTbl->lcid, sigCtrl->currentMsg, NULL)) {
51 LOG_WARN("[AVDT]%{public}s: L2CIF_SendData() failed", __func__);
52 }
53 } else {
54 /* fragment */
55 AvdtSendFragPacket(transTbl->lcid, sigCtrl->currentMsg, transTbl->peerMtu);
56 }
57 PacketFree(sigCtrl->currentMsg);
58 sigCtrl->currentMsg = NULL;
59 return;
60 }
61
62 /**
63 *
64 * @brief AvdtSendFragPacket
65 *
66 * @details send fragment message
67 *
68 * @return void
69 *
70 */
AvdtSendFragPacket(uint16_t lcid,Packet * pkt,uint16_t peerMtu)71 void AvdtSendFragPacket(uint16_t lcid, Packet *pkt, uint16_t peerMtu)
72 {
73 LOG_DEBUG("[AVDT]%{public}s: lcid(0x%x) peerMtu(%hu)", __func__, lcid, peerMtu);
74 uint8_t pktType = AVDT_PKT_TYPE_START;
75 uint16_t PacketLen = PacketSize(pkt);
76 uint16_t Ret;
77 Packet *fragmentPacket = PacketMalloc(0, 0, 0);
78 Buffer *fragmentData = PacketContinuousPayload(pkt);
79 PacketPayloadAddLast(fragmentPacket, fragmentData);
80 uint8_t *p = (uint8_t *)BufferPtr(PacketHead(pkt));
81 uint8_t label = AvdtParseTransLabel(*p);
82 uint8_t msgType = AvdtParseMessageType(*p);
83 uint8_t signal = *(p + 1);
84 if (peerMtu <= AVDT_BUFFER_END) {
85 LOG_ERROR("[AVDT]%{public}s: The MTU is too small ", __func__);
86 PacketFree(fragmentPacket);
87 return;
88 }
89 uint8_t number = (PacketLen - (peerMtu - AVDT_BUFFER_START)) / (peerMtu - AVDT_BUFFER_END) + 1;
90 if ((PacketLen - (peerMtu - AVDT_BUFFER_START)) % (peerMtu - AVDT_BUFFER_END) != 0) {
91 number++;
92 }
93 do {
94 if (pktType == AVDT_PKT_TYPE_START) {
95 Ret = AvdtSendFragStart(lcid, fragmentPacket, signal, number, msgType, label, peerMtu);
96 PacketLen -= (peerMtu - AVDT_BUFFER_START);
97 LOG_DEBUG("[AVDT]%{public}s: The length of start fragment sent(%hu) ", __func__, PacketLen);
98 } else {
99 Ret = AvdtSendFragContinueEnd(lcid, fragmentPacket, pktType, msgType, label, peerMtu);
100 if (PacketLen > (peerMtu - AVDT_BUFFER_END)) {
101 PacketLen -= (peerMtu - AVDT_BUFFER_END);
102 } else {
103 PacketLen = 0;
104 }
105 LOG_DEBUG("[AVDT]%{public}s: The length of fragment sent(%hu) ", __func__, PacketLen);
106 }
107 if (PacketLen > (peerMtu - AVDT_BUFFER_END)) {
108 pktType = AVDT_PKT_TYPE_CONTINUE;
109 } else {
110 pktType = AVDT_PKT_TYPE_END;
111 }
112 } while ((PacketLen > 0) && (Ret == AVDT_SUCCESS));
113 return;
114 }
115
116 /**
117 *
118 * @brief AvdtSendFragStart
119 *
120 * @details send fragment start type message
121 *
122 * @return void
123 *
124 */
AvdtSendFragStart(uint16_t lcid,Packet * fragmentPacket,uint8_t signal,uint8_t number,uint8_t msgType,uint8_t label,uint16_t peerMtu)125 uint16_t AvdtSendFragStart(uint16_t lcid, Packet *fragmentPacket, uint8_t signal, uint8_t number, uint8_t msgType,
126 uint8_t label, uint16_t peerMtu)
127 {
128 LOG_DEBUG("[AVDT]%{public}s: number(%hhu) signal(0x%x) msgType(0x%x) label(0x%x)",
129 __func__, number, signal, msgType, label);
130 Packet *sendMsg = PacketMalloc(AVDT_BUFFER_START, 0, 0);
131 Buffer *packetHeader = PacketHead(sendMsg);
132 uint8_t *p = BufferPtr(packetHeader);
133 AvdtBuildSingleHeader(p, label, AVDT_PKT_TYPE_START, msgType);
134 p++;
135 *p++ = number;
136 *p = signal;
137 PacketFragment(fragmentPacket, sendMsg, (peerMtu - AVDT_BUFFER_START));
138 uint16_t Ret = L2CIF_SendData(lcid, sendMsg, NULL);
139 PacketFree(sendMsg);
140 return Ret;
141 }
142
143 /**
144 *
145 * @brief AvdtSendFragContinueEnd
146 *
147 * @details send fragment contitune/end type message
148 *
149 * @return void
150 *
151 */
AvdtSendFragContinueEnd(uint16_t lcid,Packet * fragmentPacket,uint8_t pktType,uint8_t msgType,uint8_t label,uint16_t peerMtu)152 uint16_t AvdtSendFragContinueEnd(
153 uint16_t lcid, Packet *fragmentPacket, uint8_t pktType, uint8_t msgType, uint8_t label, uint16_t peerMtu)
154 {
155 LOG_DEBUG("[AVDT]%{public}s: pktType(0x%x) msgType(0x%x) label(0x%x)", __func__, pktType, msgType, label);
156 Packet *sendMsg = PacketMalloc(AVDT_BUFFER_END, 0, 0);
157 Buffer *packetHeader = PacketHead(sendMsg);
158 uint8_t *p = BufferPtr(packetHeader);
159 AvdtBuildSingleHeader(p, label, pktType, msgType);
160 PacketFragment(fragmentPacket, sendMsg, (peerMtu - AVDT_BUFFER_END));
161 int16_t Ret = L2CIF_SendData(lcid, sendMsg, NULL);
162 PacketFree(sendMsg);
163 return Ret;
164 }
165
166 /**
167 *
168 * @brief AvdtMsgSendCmd
169 *
170 * @details Int send signaling command.
171 *
172 * @return void
173 *
174 */
AvdtMsgSendCmd(AvdtSigCtrl * sigCtrl,AvdtStreamCtrl * streamCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)175 void AvdtMsgSendCmd(AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
176 {
177 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
178 switch (sigId) {
179 case AVDT_SIG_DISCOVER:
180 AvdtBuildDiscoverCmd(sigCtrl, sigId, avdtMsgData);
181 break;
182 case AVDT_SIG_GET_ALLCAP:
183 case AVDT_SIG_GETCAP:
184 case AVDT_SIG_OPEN:
185 case AVDT_SIG_CLOSE:
186 case AVDT_SIG_GETCONFIG:
187 case AVDT_SIG_ABORT:
188 case AVDT_SIG_START:
189 case AVDT_SIG_SUSPEND:
190 AvdtBuildSingleCmd(sigCtrl, sigId, avdtMsgData);
191 break;
192 case AVDT_SIG_RECONFIG:
193 AvdtBuildReconfigureCmd(sigCtrl, streamCtrl, sigId, avdtMsgData);
194 break;
195 case AVDT_SIG_SETCONFIG:
196 AvdtBuildSetConfigureCmd(sigCtrl, streamCtrl, sigId, avdtMsgData);
197 break;
198 case AVDT_SIG_DELAY_RPT:
199 AvdtBuildDelayCmd(sigCtrl, sigId, avdtMsgData);
200 break;
201 default:
202 break;
203 }
204 AvdtSigProcEvent(sigCtrl, AVDT_SND_MSG_EVENT, NULL);
205 return;
206 }
207 /**
208 *
209 * @brief AvdtMsgSendRsp
210 *
211 * @details Acp send respond.
212 *
213 * @return void
214 *
215 */
AvdtMsgSendRsp(AvdtSigCtrl * sigCtrl,AvdtStreamCtrl * streamCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)216 void AvdtMsgSendRsp(AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
217 {
218 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
219 switch (sigId) {
220 case AVDT_SIG_DISCOVER:
221 AvdtBuildDiscoverRsp(sigCtrl, sigId, avdtMsgData);
222 break;
223 case AVDT_SIG_GET_ALLCAP:
224 case AVDT_SIG_GETCAP:
225 AvdtBuildGetCapRsp(sigCtrl, sigId, avdtMsgData);
226 break;
227 case AVDT_SIG_GETCONFIG:
228 AvdtBuildGetConfigureRsp(sigCtrl, streamCtrl, sigId, avdtMsgData);
229 break;
230 case AVDT_SIG_OPEN:
231 case AVDT_SIG_CLOSE:
232 case AVDT_SIG_ABORT:
233 case AVDT_SIG_START:
234 case AVDT_SIG_SUSPEND:
235 case AVDT_SIG_RECONFIG:
236 case AVDT_SIG_SETCONFIG:
237 case AVDT_SIG_DELAY_RPT:
238 AvdtBuildSingleRsp(sigCtrl, sigId, avdtMsgData);
239 break;
240 default:
241 break;
242 }
243 AvdtSigProcEvent(sigCtrl, AVDT_SND_MSG_EVENT, NULL);
244 return;
245 }
246
247 /**
248 *
249 * @brief AvdtMsgSendRej
250 *
251 * @details Acp reject the signaling.
252 *
253 * @return void
254 *
255 */
AvdtMsgSendRej(AvdtSigCtrl * sigCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)256 void AvdtMsgSendRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
257 {
258 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
259 switch (sigId) {
260 case AVDT_SIG_DISCOVER:
261 case AVDT_SIG_GET_ALLCAP:
262 case AVDT_SIG_GETCAP:
263 case AVDT_SIG_GETCONFIG:
264 case AVDT_SIG_OPEN:
265 case AVDT_SIG_CLOSE:
266 case AVDT_SIG_DELAY_RPT:
267 AvdtBuildCommonRej(sigCtrl, sigId, avdtMsgData->single.errCode);
268 break;
269 case AVDT_SIG_SUSPEND:
270 case AVDT_SIG_START:
271 AvdtBuildConfigureRej(sigCtrl, sigId, avdtMsgData->single.errParam, avdtMsgData->single.errCode);
272 break;
273 case AVDT_SIG_SETCONFIG:
274 AvdtBuildConfigureRej(
275 sigCtrl, sigId, avdtMsgData->configureCmd.hdr.errParam, avdtMsgData->configureCmd.hdr.errCode);
276 break;
277 case AVDT_SIG_RECONFIG:
278 AvdtBuildConfigureRej(
279 sigCtrl, sigId, avdtMsgData->reconfigureCmd.hdr.errParam, avdtMsgData->reconfigureCmd.hdr.errCode);
280 break;
281 default:
282 break;
283 }
284 AvdtSigProcEvent(sigCtrl, AVDT_SND_MSG_EVENT, NULL);
285 return;
286 }
287
288 /**
289 *
290 * @brief AvdtMsgSendGeneralRej
291 *
292 * @details Acp send the general rejection.
293 *
294 * @return void
295 *
296 */
AvdtMsgSendGeneralRej(AvdtSigCtrl * sigCtrl,uint8_t sigId)297 void AvdtMsgSendGeneralRej(AvdtSigCtrl *sigCtrl, uint8_t sigId)
298 {
299 if (sigCtrl == NULL) {
300 return;
301 }
302 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
303 Packet *pkt = PacketMalloc(AVDT_BUFFER_GENERAL_REJ, 0, 0);
304 Buffer *msgHeader = PacketHead(pkt);
305 uint8_t *p = BufferPtr(msgHeader);
306 AvdtBuildSingleHeader(p, sigCtrl->rcvLabel, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_GRJ);
307 AvdtBuildSignal(p + 1, sigId);
308 sigCtrl->currentMsg = pkt;
309 AvdtSigProcEvent(sigCtrl, AVDT_SND_MSG_EVENT, NULL);
310 return;
311 }
312
313 /**
314 *
315 * @brief AvdtBuildDelayCmd
316 *
317 * @details build delay command to message
318 *
319 * @return void
320 *
321 */
AvdtBuildDelayCmd(AvdtSigCtrl * sigCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)322 void AvdtBuildDelayCmd(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
323 {
324 if (sigCtrl == NULL || avdtMsgData == NULL) {
325 return;
326 }
327 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
328 uint8_t data = 0;
329 uint8_t offset = 0;
330 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, (AVDT_BUFFER_SEID + AVDT_BUFFER_SINGLE));
331 Buffer *msgHeader = PacketHead(pkt);
332 uint8_t *p = BufferPtr(msgHeader);
333 AvdtBuildSingleHeader(p, sigCtrl->label, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_CMD);
334 AvdtBuildSignal(p + 1, sigId);
335 AvdtBuildSignalSeid(&data, avdtMsgData->delayRptCmd.hdr.seid);
336 PacketPayloadWrite(pkt, &data, offset, AVDT_1BYTE);
337 offset++;
338 /* delay value */
339 data = (uint8_t)(avdtMsgData->delayRptCmd.delay >> AVDT_OFFSET_8BIT);
340 PacketPayloadWrite(pkt, &data, offset, AVDT_1BYTE);
341 offset++;
342 data = (uint8_t)(avdtMsgData->delayRptCmd.delay);
343 PacketPayloadWrite(pkt, &data, offset, AVDT_1BYTE);
344 sigCtrl->currentMsg = pkt;
345 return;
346 }
347
348 /**
349 *
350 * @brief AvdtBuildDiscoverCmd
351 *
352 * @details Build discover command to message.
353 *
354 * @return void
355 *
356 */
AvdtBuildDiscoverCmd(AvdtSigCtrl * sigCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)357 void AvdtBuildDiscoverCmd(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
358 {
359 if (sigCtrl == NULL) {
360 return;
361 }
362 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
363 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, 0);
364 Buffer *msgHeader = PacketHead(pkt);
365 uint8_t *p = (uint8_t *)BufferPtr(msgHeader);
366 AvdtBuildSingleHeader(p, sigCtrl->label, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_CMD);
367 AvdtBuildSignal(p + 1, sigId);
368 sigCtrl->currentMsg = pkt;
369 return;
370 }
371
372 /**
373 *
374 * @brief AvdtBuildDiscoverRsp
375 *
376 * @details Build discover respond to message.
377 *
378 * @return void
379 *
380 */
AvdtBuildDiscoverRsp(AvdtSigCtrl * sigCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)381 void AvdtBuildDiscoverRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
382 {
383 if (sigCtrl == NULL || avdtMsgData == NULL) {
384 return;
385 }
386 LOG_DEBUG("[AVDT]%{public}s: signal(0x%x),sepnumber(%hhu)", __func__, sigId, avdtMsgData->discoverRsp.numSeps);
387 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, AVDT_BUFFER_SINGLE * avdtMsgData->discoverRsp.numSeps);
388 Buffer *msgHeader = PacketHead(pkt);
389 uint8_t *p = BufferPtr(msgHeader);
390 AvdtBuildSingleHeader(p, sigCtrl->rcvLabel, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_RSP);
391 AvdtBuildSignal(p + 1, sigId);
392 /* build seps */
393 AvdtBuildSeps(pkt, avdtMsgData);
394 sigCtrl->currentMsg = pkt;
395 return;
396 }
397
398 /**
399 *
400 * @brief AvdtBuildSeps
401 *
402 * @details Build seps content to message.
403 *
404 * @return void
405 *
406 */
AvdtBuildSeps(const Packet * pkt,const AvdtMsg * avdtMsgData)407 void AvdtBuildSeps(const Packet *pkt, const AvdtMsg *avdtMsgData)
408 {
409 if (avdtMsgData == NULL) {
410 return;
411 }
412 LOG_DEBUG("[AVDT]%{public}s:", __func__);
413 uint8_t count = avdtMsgData->discoverRsp.numSeps;
414 uint8_t data;
415 uint8_t offset = 0;
416 for (int i = 0; i < count; i++) {
417 LOG_DEBUG("[AVDT]%{public}s: discoverRsp acid(%hhu)", __func__, avdtMsgData->discoverRsp.seps[i].seid);
418 data = ((avdtMsgData->discoverRsp.seps[i].seid << AVDT_OFFSET_2BIT) |
419 (avdtMsgData->discoverRsp.seps[i].isUsed << AVDT_OFFSET_1BIT));
420 PacketPayloadWrite(pkt, &data, offset, AVDT_1BYTE);
421 LOG_DEBUG("[AVDT]%{public}s: discoverRsp write acid(%hhu) offset(%hhu)", __func__, data, offset);
422 offset++;
423 data = ((avdtMsgData->discoverRsp.seps[i].mediaType << AVDT_OFFSET_4BIT) |
424 (avdtMsgData->discoverRsp.seps[i].sepType << AVDT_OFFSET_3BIT));
425 PacketPayloadWrite(pkt, &data, offset, AVDT_1BYTE);
426 offset++;
427 }
428 return;
429 }
430
431 /**
432 *
433 * @brief AvdtBuildSingleCmd
434 *
435 * @details Only header(include ACPSeid) of cmd built to message.
436 *
437 * @return void
438 *
439 */
AvdtBuildSingleCmd(AvdtSigCtrl * sigCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)440 void AvdtBuildSingleCmd(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
441 {
442 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
443 if (sigCtrl == NULL || avdtMsgData == NULL) {
444 return;
445 }
446 uint8_t data = 0;
447 uint8_t transLabel;
448 if (sigId == AVDT_SIG_CLOSE) {
449 transLabel = AvdtCreateTransLabel(sigCtrl);
450 } else {
451 transLabel = sigCtrl->label;
452 }
453 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, AVDT_BUFFER_SEID);
454 Buffer *msgHeader = PacketHead(pkt);
455 uint8_t *p = BufferPtr(msgHeader);
456 AvdtBuildSingleHeader(p, transLabel, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_CMD);
457 AvdtBuildSignal(p + 1, sigId);
458 AvdtBuildSignalSeid(&data, avdtMsgData->single.seid);
459 PacketPayloadWrite(pkt, &data, 0, AVDT_1BYTE);
460 sigCtrl->currentMsg = pkt;
461 return;
462 }
463
464 /**
465 *
466 * @brief AvdtBuildSingleRsp
467 *
468 * @details Only header of respond built to message.
469 *
470 * @return void
471 *
472 */
AvdtBuildSingleRsp(AvdtSigCtrl * sigCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)473 void AvdtBuildSingleRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
474 {
475 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
476 if (sigCtrl == NULL) {
477 return;
478 }
479 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, 0);
480 Buffer *msgHeader = PacketHead(pkt);
481 uint8_t *p = BufferPtr(msgHeader);
482 AvdtBuildSingleHeader(p, sigCtrl->rcvLabel, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_RSP);
483 AvdtBuildSignal(p + 1, sigId);
484 sigCtrl->currentMsg = pkt;
485 return;
486 }
487
488 /**
489 *
490 * @brief AvdtBuildCommonRej
491 *
492 * @details Only header of reject built to message.
493 *
494 * @return void
495 *
496 */
AvdtBuildCommonRej(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t errCode)497 void AvdtBuildCommonRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t errCode)
498 {
499 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
500 if (sigCtrl == NULL) {
501 return;
502 }
503 Packet *pkt = PacketMalloc(AVDT_BUFFER_REJECT, 0, 0);
504 Buffer *msgHeader = PacketHead(pkt);
505 uint8_t *p = BufferPtr(msgHeader);
506 AvdtBuildSingleHeader(p, sigCtrl->rcvLabel, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_REJ);
507 p++;
508 AvdtBuildSignal(p, sigId);
509 p++;
510 *p = errCode;
511 sigCtrl->currentMsg = pkt;
512 return;
513 }
514
515 /**
516 *
517 * @brief AvdtBuildConfigureRej
518 *
519 * @details Only header of reject built to message.
520 *
521 * @return void
522 *
523 */
AvdtBuildConfigureRej(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t category,uint8_t errCode)524 void AvdtBuildConfigureRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t category, uint8_t errCode)
525 {
526 LOG_DEBUG("[AVDT]%{public}s:signal(0x%x)", __func__, sigId);
527 if (sigCtrl == NULL) {
528 return;
529 }
530 Packet *pkt = PacketMalloc(AVDT_BUFFER_REJECT_4, 0, 0);
531 Buffer *msgHeader = PacketHead(pkt);
532 uint8_t *p = BufferPtr(msgHeader);
533 AvdtBuildSingleHeader(p, sigCtrl->rcvLabel, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_REJ);
534 p++;
535 AvdtBuildSignal(p, sigId);
536 p++;
537 *p = category;
538 p++;
539 *p = errCode;
540 sigCtrl->currentMsg = pkt;
541 return;
542 }
543
544 /**
545 *
546 * @brief AvdtBuildSetConfigureCmd
547 *
548 * @details Build setconfigure cmd to message.
549 *
550 * @return void
551 *
552 */
AvdtBuildSetConfigureCmd(AvdtSigCtrl * sigCtrl,AvdtStreamCtrl * streamCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)553 void AvdtBuildSetConfigureCmd(
554 AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
555 {
556 LOG_DEBUG("[AVDT]%{public}s:", __func__);
557 if (sigCtrl == NULL || streamCtrl == NULL || avdtMsgData == NULL) {
558 return;
559 }
560 uint8_t data = 0;
561 uint8_t offset = 0;
562 uint8_t payloadLen = 2;
563 if (streamCtrl->reqCfg.pscMask & AVDT_PSC_MSK_TRANS) {
564 payloadLen += AVDT_TRANS_LENGTH;
565 }
566 if (streamCtrl->reqCfg.pscMask & AVDT_PSC_MSK_DELAY_RPT) {
567 payloadLen += AVDT_DELAY_LENGTH;
568 }
569 payloadLen += streamCtrl->reqCfg.numCodec + AVDT_2BYTE;
570 LOG_DEBUG("[AVDT]%{public}s: payloadLen(%hhu), numcodec(%hhu)", __func__, payloadLen, streamCtrl->reqCfg.numCodec);
571 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, payloadLen);
572 Buffer *msgHeader = PacketHead(pkt);
573 uint8_t *p = (uint8_t *)BufferPtr(msgHeader);
574 AvdtBuildSingleHeader(p, sigCtrl->label, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_CMD);
575 AvdtBuildSignal(p + 1, sigId);
576 AvdtBuildSignalSeid(&data, avdtMsgData->configureCmd.acpSeid);
577 PacketPayloadWrite(pkt, &data, offset, AVDT_BUFFER_SEID);
578 offset++;
579 AvdtBuildSignalSeid(&data, avdtMsgData->configureCmd.intSeid);
580 PacketPayloadWrite(pkt, &data, offset, AVDT_BUFFER_SEID);
581 offset++;
582 AvdtBuildCapability(pkt, &(streamCtrl->reqCfg), offset, sigId);
583 sigCtrl->currentMsg = pkt;
584 return;
585 }
586
587 /**
588 *
589 * @brief AvdtBuildGetCapRsp
590 *
591 * @details Build getcapability respond to message.
592 *
593 * @return void
594 *
595 */
AvdtBuildGetCapRsp(AvdtSigCtrl * sigCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)596 void AvdtBuildGetCapRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
597 {
598 LOG_DEBUG("[AVDT]%{public}s:", __func__);
599 if (sigCtrl == NULL || avdtMsgData == NULL) {
600 return;
601 }
602 uint8_t payloadLen = 0;
603 if (avdtMsgData->getcap.cfg->pscMask & AVDT_PSC_MSK_TRANS) {
604 payloadLen += AVDT_TRANS_LENGTH;
605 }
606 if ((avdtMsgData->getcap.cfg->pscMask & AVDT_PSC_MSK_DELAY_RPT) && (sigId != AVDT_SIG_GETCAP)) {
607 payloadLen += AVDT_DELAY_LENGTH;
608 }
609 payloadLen += avdtMsgData->getcap.cfg->numCodec + AVDT_2BYTE;
610 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, payloadLen);
611 Buffer *msgHeader = PacketHead(pkt);
612 uint8_t *p = BufferPtr(msgHeader);
613 AvdtBuildSingleHeader(p, sigCtrl->rcvLabel, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_RSP);
614 AvdtBuildSignal(p + 1, sigId);
615 /* buld seps */
616 AvdtBuildCapability(pkt, avdtMsgData->getcap.cfg, 0, sigId);
617 sigCtrl->currentMsg = pkt;
618 return;
619 }
620
621 /**
622 *
623 * @brief AvdtBuildGetConfigureRsp
624 *
625 * @details Build getconfigure respond to message.
626 *
627 * @return void
628 *
629 */
AvdtBuildGetConfigureRsp(AvdtSigCtrl * sigCtrl,AvdtStreamCtrl * streamCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)630 void AvdtBuildGetConfigureRsp(
631 AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
632 {
633 LOG_DEBUG("[AVDT]%{public}s:", __func__);
634 if (sigCtrl == NULL || streamCtrl == NULL) {
635 return;
636 }
637 uint8_t payloadLen = 0;
638 if (streamCtrl->currCfg.cfg.pscMask & AVDT_PSC_MSK_TRANS) {
639 payloadLen += AVDT_TRANS_LENGTH;
640 }
641 if (streamCtrl->currCfg.cfg.pscMask & AVDT_PSC_MSK_DELAY_RPT) {
642 payloadLen += AVDT_DELAY_LENGTH;
643 }
644 payloadLen += streamCtrl->currCfg.cfg.numCodec + AVDT_2BYTE;
645 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, payloadLen);
646 Buffer *msgHeader = PacketHead(pkt);
647 uint8_t *p = BufferPtr(msgHeader);
648 AvdtBuildSingleHeader(p, sigCtrl->rcvLabel, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_RSP);
649 AvdtBuildSignal(p + 1, sigId);
650 /* buld seps */
651 AvdtBuildCapability(pkt, &streamCtrl->currCfg.cfg, 0, sigId);
652 sigCtrl->currentMsg = pkt;
653 return;
654 }
655
656 /**
657 *
658 * @brief AvdtBuildReconfigureCmd
659 *
660 * @details Build reconfigure cmd to message.
661 *
662 * @return void
663 *
664 */
AvdtBuildReconfigureCmd(AvdtSigCtrl * sigCtrl,AvdtStreamCtrl * streamCtrl,uint8_t sigId,const AvdtMsg * avdtMsgData)665 void AvdtBuildReconfigureCmd(
666 AvdtSigCtrl *sigCtrl, AvdtStreamCtrl *streamCtrl, uint8_t sigId, const AvdtMsg *avdtMsgData)
667 {
668 LOG_DEBUG("[AVDT]%{public}s:", __func__);
669 if (sigCtrl == NULL || streamCtrl == NULL || avdtMsgData == NULL) {
670 return;
671 }
672 uint8_t data = 0;
673 uint8_t offset = 0;
674 uint8_t payloadLen = 1;
675 if (avdtMsgData->reconfigureCmd.cfg.pscMask & AVDT_PSC_MSK_TRANS) {
676 payloadLen += AVDT_TRANS_LENGTH;
677 }
678 if (avdtMsgData->reconfigureCmd.cfg.pscMask & AVDT_PSC_MSK_DELAY_RPT) {
679 payloadLen += AVDT_DELAY_LENGTH;
680 }
681 payloadLen += avdtMsgData->reconfigureCmd.cfg.numCodec + AVDT_2BYTE;
682 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, payloadLen);
683 Buffer *msgHeader = PacketHead(pkt);
684 uint8_t *p = BufferPtr(msgHeader);
685 AvdtBuildSingleHeader(p, sigCtrl->label, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_CMD);
686 AvdtBuildSignal(p + 1, sigId);
687 AvdtBuildSignalSeid(&data, avdtMsgData->reconfigureCmd.hdr.seid);
688 PacketPayloadWrite(pkt, &data, offset, AVDT_BUFFER_SEID);
689 offset++;
690 streamCtrl->reqCfg.pscMask = AVDT_PSC_MSK_CODEC; /* reconfigure is modify codec only */
691 AvdtBuildCapability(pkt, &avdtMsgData->reconfigureCmd.cfg, offset, sigId);
692 sigCtrl->currentMsg = pkt;
693 return;
694 }
695
696 /**
697 *
698 * @brief AvdtBuildSingleHeader
699 *
700 * @details Build the first octet of message.
701 *
702 * @return void
703 *
704 */
AvdtBuildSingleHeader(uint8_t * data,uint8_t label,uint8_t pktType,uint8_t msgType)705 void AvdtBuildSingleHeader(uint8_t *data, uint8_t label, uint8_t pktType, uint8_t msgType)
706 {
707 LOG_DEBUG("[AVDT]%{public}s:", __func__);
708 *(data) = (label << MOVE_4BIT) | (pktType << MOVE_2BIT) | (msgType);
709 return;
710 }
711
712 /**
713 *
714 * @brief AvdtBuildSignal
715 *
716 * @details Build the signalling of message.
717 *
718 * @return void
719 *
720 */
AvdtBuildSignal(uint8_t * data,uint8_t signal)721 void AvdtBuildSignal(uint8_t *data, uint8_t signal)
722 {
723 LOG_DEBUG("[AVDT]%{public}s: signal(0x%x)", __func__, signal);
724 *data = signal;
725 return;
726 }
727
728 /**
729 *
730 * @brief AvdtBuildSignalSeid
731 *
732 * @details Build the seid of message.
733 *
734 * @return void
735 *
736 */
AvdtBuildSignalSeid(uint8_t * data,uint8_t seid)737 void AvdtBuildSignalSeid(uint8_t *data, uint8_t seid)
738 {
739 LOG_DEBUG("[AVDT]%{public}s:", __func__);
740 *data = seid << MOVE_2BIT;
741 return;
742 }
743
744 /**
745 *
746 * @brief AvdtBuildCapability
747 *
748 * @details Build the service capability to message.
749 *
750 * @return The length of data.
751 *
752 */
AvdtBuildCapability(const Packet * pkt,const AvdtSepConfig * cfg,uint8_t off,uint8_t sigId)753 uint16_t AvdtBuildCapability(const Packet *pkt, const AvdtSepConfig *cfg, uint8_t off, uint8_t sigId)
754 {
755 LOG_DEBUG("[AVDT]%{public}s:", __func__);
756 uint16_t Offset = off;
757 uint8_t data;
758 if (cfg == NULL) {
759 return 0;
760 }
761 /* for now, just build media transport, codec and delayreport */
762 /* media transport */
763 if (cfg->pscMask & AVDT_PSC_MSK_TRANS) {
764 data = AVDT_PSC_TRANS;
765 PacketPayloadWrite(pkt, &data, Offset, AVDT_1BYTE);
766 Offset++;
767 data = 0;
768 PacketPayloadWrite(pkt, &data, Offset, AVDT_1BYTE); /* media transport length */
769 Offset++;
770 }
771 /* codec */
772 if (cfg->numCodec != 0) {
773 data = AVDT_PSC_CODEC;
774 PacketPayloadWrite(pkt, &data, Offset, AVDT_1BYTE);
775 Offset++;
776 PacketPayloadWrite(pkt, cfg->codecInfo, Offset, (cfg->numCodec + 1));
777 Offset += (cfg->numCodec + 1);
778 }
779 if (sigId != AVDT_SIG_GETCAP) {
780 /* delay report */
781 if (cfg->pscMask & AVDT_PSC_MSK_DELAY_RPT) {
782 data = AVDT_PSC_DELAY_RPT;
783 PacketPayloadWrite(pkt, &data, Offset, AVDT_1BYTE);
784 Offset++;
785 data = 0;
786 PacketPayloadWrite(pkt, &data, Offset, AVDT_1BYTE);
787 Offset++;
788 }
789 }
790 return Offset;
791 }
792
793 /**
794 *
795 * @brief AvdtParseMsg
796 *
797 * @details Parse the signalling data from L2CAP data read indication.
798 *
799 *
800 * @return void
801 *
802 */
AvdtParseMsg(AvdtSigCtrl * sigCtrl,Packet * pkt)803 void AvdtParseMsg(AvdtSigCtrl *sigCtrl, Packet *pkt)
804 {
805 if (sigCtrl == NULL) {
806 return;
807 }
808 uint8_t data = 0;
809 PacketExtractHead(pkt, &data, AVDT_1BYTE); /* Read first octet message */
810 uint8_t transLabel = AvdtParseTransLabel(data);
811 uint8_t pktType = AvdtParsePacketType(data);
812 uint8_t messageType = AvdtParseMessageType(data);
813 LOG_DEBUG("[AVDT]%{public}s: messageType(%hhu) transLabel(%hhu) pktType(%hhu)",
814 __func__, messageType, transLabel, pktType);
815 if (pktType == AVDT_PKT_TYPE_SINGLE) {
816 AvdtParseSingleMsg(sigCtrl, pkt, transLabel, messageType);
817 } else {
818 if (pktType == AVDT_PKT_TYPE_START) {
819 sigCtrl->rcvLabel = transLabel;
820 AvdtAssembleMsg(sigCtrl, messageType, pktType, pkt);
821 } else {
822 if (transLabel == sigCtrl->rcvLabel) {
823 AvdtAssembleMsg(sigCtrl, messageType, pktType, pkt);
824 } else {
825 /* Trace Error */
826 PacketFree(sigCtrl->rxMsg);
827 sigCtrl->rxMsg = NULL;
828 sigCtrl->rcvLabel = 0;
829 sigCtrl->numbPakcket = 0;
830 }
831 if (pktType == AVDT_PKT_TYPE_END && sigCtrl->numbPakcket == 0) {
832 AvdtParseMsgAssembled(sigCtrl, sigCtrl->rxMsg);
833 }
834 }
835 }
836 return;
837 }
838
839 /**
840 *
841 * @brief AvdtParseSingleMsg
842 *
843 * @details Parse the single type signalling data from L2CAP data read indication.
844 *
845 *
846 * @return void
847 *
848 */
AvdtParseSingleMsg(AvdtSigCtrl * sigCtrl,Packet * pkt,uint8_t transLabel,uint8_t messageType)849 void AvdtParseSingleMsg(AvdtSigCtrl *sigCtrl, Packet *pkt, uint8_t transLabel, uint8_t messageType)
850 {
851 if (sigCtrl == NULL) {
852 return;
853 }
854 uint8_t data = 0;
855 sigCtrl->rcvLabel = transLabel;
856 PacketExtractHead(pkt, &data, AVDT_1BYTE);
857 sigCtrl->rcvSignal = AvdtParseSignal(data);
858 switch (messageType) {
859 case AVDT_MSG_TYPE_CMD:
860 AvdtParseSignalInd(sigCtrl, sigCtrl->rcvSignal, transLabel, pkt);
861 break;
862 case AVDT_MSG_TYPE_RSP:
863 if (sigCtrl->label != sigCtrl->rcvLabel) {
864 LOG_ERROR("[AVDT]%{public}s: Response label not pair: sendLabel(%hhu)/ReceiveLabel(%hhu) ",
865 __func__,
866 sigCtrl->label,
867 sigCtrl->rcvLabel);
868 }
869 AvdtParseSignalRsp(sigCtrl, sigCtrl->rcvSignal, pkt);
870 break;
871 case AVDT_MSG_TYPE_REJ:
872 AvdtParseSignalRej(sigCtrl, sigCtrl->rcvSignal, transLabel, pkt);
873 break;
874 case AVDT_MSG_TYPE_GRJ:
875 LOG_ERROR("[AVDT]%{public}s: Invalid signaling(%hhu) sendLabel(%hhu), receiveLabel(%hhu)",
876 __func__,
877 sigCtrl->rcvSignal,
878 sigCtrl->label,
879 sigCtrl->rcvLabel);
880 break;
881 default:
882 LOG_ERROR("[AVDT]%{public}s: unsupported messageType(%hhu) ", __func__, messageType);
883 break;
884 }
885 return;
886 }
887 /**
888 *
889 * @brief AvdtAssembleMsg
890 *
891 * @details Assemble the fragment message.
892 *
893 *
894 * @return void
895 *
896 */
AvdtAssembleMsg(AvdtSigCtrl * sigCtrl,uint8_t msgType,uint8_t pktType,Packet * pkt)897 void AvdtAssembleMsg(AvdtSigCtrl *sigCtrl, uint8_t msgType, uint8_t pktType, Packet *pkt)
898 {
899 if (sigCtrl == NULL) {
900 return;
901 }
902 LOG_DEBUG("[AVDT]%{public}s:sendLabel(%hhu) ReceiveLabel(%hhu),msgType(%hhu),pktType(%hhu)",
903 __func__,
904 sigCtrl->label,
905 sigCtrl->rcvLabel,
906 msgType,
907 pktType);
908 uint8_t data = 0;
909 if (pktType == AVDT_PKT_TYPE_START) {
910 uint8_t sigId;
911 LOG_DEBUG("[AVDT]%{public}s: pktType(%hhu) msgType(%hhu)", __func__, pktType, msgType);
912 PacketExtractHead(pkt, &data, 1);
913 sigCtrl->numbPakcket = data;
914 sigCtrl->msgType = msgType;
915 PacketExtractHead(pkt, &data, 1);
916 sigId = AvdtParseSignal(data);
917 LOG_DEBUG("[AVDT]%{public}s: sigId(%hhu)", __func__, sigId);
918 if (sigCtrl->rxMsg != NULL) {
919 PacketFree(sigCtrl->rxMsg);
920 sigCtrl->rxMsg = NULL;
921 }
922 sigCtrl->rxMsg = PacketMalloc(AVDT_BUFFER_SINGLE, 0, 0);
923 if (sigCtrl->rxMsg != NULL) {
924 Buffer *packetHeader = PacketHead(sigCtrl->rxMsg);
925 uint8_t *p = BufferPtr(packetHeader);
926 AvdtBuildSingleHeader(p, sigCtrl->rcvLabel, AVDT_PKT_TYPE_SINGLE, msgType);
927 AvdtBuildSignal(p + 1, sigId);
928 sigCtrl->rcvSignal = sigId;
929 PacketAssemble(sigCtrl->rxMsg, pkt);
930 sigCtrl->numbPakcket--;
931 } else {
932 LOG_ERROR("[AVDT]%{public}s: Memory alloc for rxMsg failed", __func__);
933 }
934 } else {
935 PacketExtractHead(pkt, &data, 1);
936 PacketAssemble(sigCtrl->rxMsg, pkt);
937 sigCtrl->numbPakcket--;
938 }
939 LOG_DEBUG("[AVDT]%{public}s: sigCtrl->numbPakcket(%hhu)", __func__, sigCtrl->numbPakcket);
940 return;
941 }
942
943 /**
944 *
945 * @brief AvdtParseMsgAssembled
946 *
947 * @details Parse the message assembled.
948 *
949 *
950 * @return void
951 *
952 */
AvdtParseMsgAssembled(AvdtSigCtrl * sigCtrl,Packet * pkt)953 void AvdtParseMsgAssembled(AvdtSigCtrl *sigCtrl, Packet *pkt)
954 {
955 if (sigCtrl == NULL || pkt == NULL) {
956 return;
957 }
958 LOG_DEBUG("[AVDT]%{public}s: sigCtrl->rcvSignal(0x%x) sigCtrl->rcvLabel(0x%x) sigCtrl->msgType(0x%x)",
959 __func__,
960 sigCtrl->rcvSignal,
961 sigCtrl->rcvLabel,
962 sigCtrl->msgType);
963 uint8_t header[2] = {0};
964 PacketExtractHead(pkt, &header[0], AVDT_2BYTE);
965 switch (sigCtrl->msgType) {
966 case AVDT_MSG_TYPE_CMD:
967 if (AvdtCheckSignal(sigCtrl->rcvSignal) != AVDT_SUCCESS) {
968 /* Trace: invalid signal */
969 AvdtSignalGeneralRej(sigCtrl, sigCtrl->rcvSignal, sigCtrl->rcvLabel);
970 return;
971 }
972 AvdtParseSignalInd(sigCtrl, sigCtrl->rcvSignal, sigCtrl->rcvLabel, pkt);
973 break;
974 case AVDT_MSG_TYPE_RSP:
975 AvdtParseSignalRsp(sigCtrl, sigCtrl->rcvSignal, pkt);
976 break;
977 case AVDT_MSG_TYPE_REJ:
978 break;
979 case AVDT_MSG_TYPE_GRJ:
980 break;
981 default:
982 LOG_ERROR("[AVDT]%{public}s: unsupported messageType(%hhu) ", __func__, sigCtrl->msgType);
983 break;
984 }
985 return;
986 }
987
988 /**
989 *
990 * @brief AvdtParseTransLabel
991 *
992 * @details Parse the transport label from the first octet of message.
993 *
994 *
995 * @return Transport label
996 *
997 */
AvdtParseTransLabel(uint8_t header)998 uint8_t AvdtParseTransLabel(uint8_t header)
999 {
1000 return (uint8_t)(header >> AVDT_OFFSET_4BIT);
1001 }
1002
1003 /**
1004 *
1005 * @brief AvdtParsePacketType
1006 *
1007 * @details Parse the packet type from the first octet of message.
1008 *
1009 *
1010 * @return packet type
1011 *
1012 */
AvdtParsePacketType(uint8_t header)1013 uint8_t AvdtParsePacketType(uint8_t header)
1014 {
1015 return (header & 0x0D) >> AVDT_OFFSET_2BIT;
1016 }
1017
1018 /**
1019 *
1020 * @brief AvdtParseMessageType
1021 *
1022 * @details Parse the message type from the first octet of message.
1023 *
1024 *
1025 * @return message type
1026 *
1027 */
AvdtParseMessageType(uint8_t header)1028 uint8_t AvdtParseMessageType(uint8_t header)
1029 {
1030 return (uint8_t)(header & 0x03);
1031 }
1032
1033 /**
1034 *
1035 * @brief AvdtParseSignal
1036 *
1037 * @details Parse the signalling from message.
1038 *
1039 * @return Signalling id
1040 *
1041 */
AvdtParseSignal(uint8_t header)1042 uint8_t AvdtParseSignal(uint8_t header)
1043 {
1044 return (header & 0x3F);
1045 }
1046
1047 /**
1048 *
1049 * @brief AvdtCheckSignal
1050 *
1051 * @details Checkt the signalling is valid.
1052 *
1053 * @return valid:0 / invalid:1
1054 *
1055 */
AvdtCheckSignal(uint8_t sigId)1056 uint8_t AvdtCheckSignal(uint8_t sigId)
1057 {
1058 uint8_t Ret = AVDT_SUCCESS;
1059 if ((sigId > AVDT_SIG_MAX) || (sigId < AVDT_SIG_DISCOVER)) {
1060 Ret = AVDT_BAD_PARAMS;
1061 }
1062 return Ret;
1063 }
1064
1065 /**
1066 *
1067 * @brief AvdtParseSignalInd
1068 *
1069 * @details Parse and dispatch the command from remote peer.
1070 *
1071 * @return void
1072 *
1073 */
AvdtParseSignalInd(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t label,const Packet * pkt)1074 void AvdtParseSignalInd(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label, const Packet *pkt)
1075 {
1076 if (sigCtrl == NULL) {
1077 return;
1078 }
1079 LOG_DEBUG("[AVDT]%{public}s:sendLabel(%hhu) ReceiveLabel(%hhu),sigId(0x%x),PaketSize(%u)",
1080 __func__,
1081 sigCtrl->label,
1082 sigCtrl->rcvLabel,
1083 sigId,
1084 PacketSize(pkt));
1085 uint8_t event = AvdtGetEventBySigidInd(sigId);
1086 if (AvdtIndPktLenCheck(sigCtrl, sigId, pkt) != AVDT_SUCCESS) {
1087 return;
1088 }
1089 switch (sigId) {
1090 case AVDT_SIG_DISCOVER:
1091 AvdtSigProcEvent(sigCtrl, event, NULL);
1092 break;
1093 case AVDT_SIG_GET_ALLCAP:
1094 case AVDT_SIG_GETCAP:
1095 case AVDT_SIG_OPEN:
1096 case AVDT_SIG_CLOSE:
1097 case AVDT_SIG_GETCONFIG:
1098 case AVDT_SIG_ABORT:
1099 case AVDT_SIG_START:
1100 case AVDT_SIG_SUSPEND:
1101 AvdtParseCommonInd(sigCtrl, sigId, label, pkt, event);
1102 break;
1103 case AVDT_SIG_RECONFIG:
1104 AvdtParseReconfigInd(sigCtrl, label, pkt, event);
1105 break;
1106 case AVDT_SIG_SETCONFIG:
1107 AvdtParseSetconfigInd(sigCtrl, label, pkt, event);
1108 break;
1109 case AVDT_SIG_DELAY_RPT:
1110 AvdtParseDelayRptInd(sigCtrl, label, pkt, event);
1111 break;
1112 default:
1113 AvdtMsgSendGeneralRej(sigCtrl, sigId);
1114 break;
1115 }
1116 return;
1117 }
AvdtParseCommonInd(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t label,const Packet * pkt,uint8_t event)1118 void AvdtParseCommonInd(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label, const Packet *pkt, uint8_t event)
1119 {
1120 if (sigCtrl == NULL) {
1121 return;
1122 }
1123 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1124 uint8_t data = 0;
1125 AvdtEventData msg = {0};
1126 PacketPayloadRead(pkt, &data, 0, AVDT_1BYTE);
1127 uint8_t seid = AvdtIndSeidCheck(sigCtrl, sigId, data);
1128 if (seid == AVDT_SEID_INVLID) {
1129 return;
1130 }
1131 msg.msg.single.seid = seid;
1132 msg.msg.single.label = label;
1133 if (sigId == AVDT_SIG_GET_ALLCAP || sigId == AVDT_SIG_GETCAP) {
1134 AvdtSigProcEvent(sigCtrl, event, &msg);
1135 } else {
1136 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle((uint16_t)seid);
1137 if (streamCtrl != NULL) {
1138 AvdtStreamProcEvent(streamCtrl, event, &msg);
1139 } else {
1140 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle failed(%hhu)!", __func__, seid);
1141 AvdtMsg avdtMsgData = {0};
1142 avdtMsgData.single.errCode = AVDT_ERR_BAD_ACP_SEID;
1143 AvdtMsgSendRej(sigCtrl, sigId, &avdtMsgData);
1144 }
1145 }
1146 return;
1147 }
AvdtParseReconfigInd(AvdtSigCtrl * sigCtrl,uint8_t label,const Packet * pkt,uint8_t event)1148 void AvdtParseReconfigInd(AvdtSigCtrl *sigCtrl, uint8_t label, const Packet *pkt, uint8_t event)
1149 {
1150 uint8_t data = 0;
1151 uint16_t Offset = 0;
1152 AvdtEventData msg = {0};
1153 PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1154 uint8_t seid = AvdtIndSeidCheck(sigCtrl, AVDT_SIG_RECONFIG, data);
1155 if (seid == AVDT_SEID_INVLID) {
1156 return;
1157 }
1158 Offset++;
1159 PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1160 if (AvdtServiceCapCheck(sigCtrl, AVDT_SIG_RECONFIG, data) != AVDT_SUCCESS) {
1161 return;
1162 }
1163 AvdtParseReconfig(
1164 (uint16_t)seid, pkt, Offset, &msg.msg.reconfigureCmd.hdr.errCode, &msg.msg.reconfigureCmd.hdr.errParam);
1165
1166 if (msg.msg.reconfigureCmd.hdr.errCode != AVDT_SUCCESS) {
1167 AvdtIndReject(
1168 sigCtrl, AVDT_SIG_RECONFIG, msg.msg.reconfigureCmd.hdr.errCode, msg.msg.reconfigureCmd.hdr.errParam);
1169 return;
1170 }
1171 msg.msg.reconfigureCmd.hdr.seid = seid;
1172 msg.msg.reconfigureCmd.hdr.label = label;
1173 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle((uint16_t)seid);
1174 if (streamCtrl != NULL) {
1175 AvdtStreamProcEvent(streamCtrl, event, &msg);
1176 } else {
1177 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle failed(%hhu)!", __func__, seid);
1178 AvdtMsg avdtMsgData = {0};
1179 avdtMsgData.reconfigureCmd.hdr.errCode = AVDT_ERR_BAD_ACP_SEID;
1180 AvdtMsgSendRej(sigCtrl, AVDT_SIG_RECONFIG, &avdtMsgData);
1181 }
1182 return;
1183 }
1184
AvdtParseSetconfigInd(AvdtSigCtrl * sigCtrl,uint8_t label,const Packet * pkt,uint8_t event)1185 void AvdtParseSetconfigInd(AvdtSigCtrl *sigCtrl, uint8_t label, const Packet *pkt, uint8_t event)
1186 {
1187 uint8_t data = 0;
1188 uint16_t Offset = 0;
1189 AvdtEventData msg = {0};
1190 PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1191 uint8_t seid = AvdtIndSeidCheck(sigCtrl, AVDT_SIG_SETCONFIG, data);
1192 if (seid == AVDT_SEID_INVLID) {
1193 return;
1194 }
1195 Offset++;
1196 PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1197 uint8_t intSeid = AvdtParseSeid(data);
1198 Offset++;
1199 PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1200 if (AvdtServiceCapCheck(sigCtrl, AVDT_SIG_SETCONFIG, data) != AVDT_SUCCESS) {
1201 return;
1202 }
1203 AvdtParseSetconfig(
1204 (uint16_t)seid, pkt, Offset, &msg.msg.configureCmd.hdr.errCode, &msg.msg.configureCmd.hdr.errParam);
1205 if (msg.msg.configureCmd.hdr.errCode != AVDT_SUCCESS) {
1206 AvdtIndReject(sigCtrl, AVDT_SIG_SETCONFIG, msg.msg.configureCmd.hdr.errCode, msg.msg.configureCmd.hdr.errParam);
1207 return;
1208 }
1209 msg.msg.configureCmd.acpSeid = seid;
1210 msg.msg.configureCmd.intSeid = intSeid;
1211 msg.msg.configureCmd.hdr.label = label;
1212 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle((uint16_t)seid);
1213 if (streamCtrl != NULL) {
1214 AvdtStreamProcEvent(streamCtrl, event, &msg);
1215 } else {
1216 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle failed(%hhu)!", __func__, seid);
1217 AvdtMsg avdtMsgData = {0};
1218 avdtMsgData.configureCmd.hdr.errCode = AVDT_ERR_BAD_ACP_SEID;
1219 AvdtMsgSendRej(sigCtrl, AVDT_SIG_SETCONFIG, &avdtMsgData);
1220 }
1221 return;
1222 }
AvdtParseDelayRptInd(AvdtSigCtrl * sigCtrl,uint8_t label,const Packet * pkt,uint8_t event)1223 void AvdtParseDelayRptInd(AvdtSigCtrl *sigCtrl, uint8_t label, const Packet *pkt, uint8_t event)
1224 {
1225 uint8_t data = 0;
1226 uint16_t Offset = 0;
1227 uint8_t maxSB = 0;
1228 uint8_t lowSB = 0;
1229 AvdtEventData msg = {0};
1230 PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1231 Offset++;
1232 uint8_t seid = AvdtIndSeidCheck(sigCtrl, AVDT_SIG_DELAY_RPT, data);
1233 if (seid == AVDT_SEID_INVLID) {
1234 return;
1235 }
1236 PacketPayloadRead(pkt, &maxSB, Offset, AVDT_1BYTE);
1237 Offset++;
1238 PacketPayloadRead(pkt, &lowSB, Offset, AVDT_1BYTE);
1239 msg.msg.delayRptCmd.delay = AvdtParseDelayValue(maxSB, lowSB);
1240 msg.msg.delayRptCmd.hdr.seid = seid;
1241 msg.msg.delayRptCmd.hdr.label = label;
1242 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle((uint16_t)seid);
1243 if (streamCtrl != NULL) {
1244 AvdtStreamProcEvent(streamCtrl, event, &msg);
1245 } else {
1246 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle failed(%hhu)!", __func__, seid);
1247 AvdtMsg avdtMsgData = {0};
1248 avdtMsgData.discoverRsp.hdr.errCode = AVDT_ERR_BAD_ACP_SEID;
1249 AvdtMsgSendRej(sigCtrl, AVDT_SIG_DELAY_RPT, &avdtMsgData);
1250 }
1251 return;
1252 }
1253
1254 /**
1255 *
1256 * @brief AvdtGetEventBySigidInd
1257 *
1258 * @details Get event by signalling ID.
1259 *
1260 * @return void
1261 *
1262 */
AvdtGetEventBySigidInd(uint8_t sigId)1263 uint8_t AvdtGetEventBySigidInd(uint8_t sigId)
1264 {
1265 uint8_t event = 0;
1266 switch (sigId) {
1267 case AVDT_SIG_DISCOVER:
1268 event = AVDT_DISCOVER_CMD_IND_EVENT;
1269 break;
1270 case AVDT_SIG_GET_ALLCAP:
1271 event = AVDT_GETALLCAP_CMD_IND_EVENT;
1272 break;
1273 case AVDT_SIG_GETCAP:
1274 event = AVDT_GETCAP_CMD_IND_EVENT;
1275 break;
1276 case AVDT_SIG_OPEN:
1277 event = AVDT_OPEN_CMD_IND_EVENT;
1278 break;
1279 case AVDT_SIG_CLOSE:
1280 event = AVDT_CLOSE_CMD_IND_EVENT;
1281 break;
1282 case AVDT_SIG_GETCONFIG:
1283 event = AVDT_GETCONFIGURE_CMD_IND_EVENT;
1284 break;
1285 case AVDT_SIG_ABORT:
1286 event = AVDT_ABORT_CMD_IND_EVENT;
1287 break;
1288 case AVDT_SIG_START:
1289 event = AVDT_START_CMD_IND_EVENT;
1290 break;
1291 case AVDT_SIG_SUSPEND:
1292 event = AVDT_SUSPEND_CMD_IND_EVENT;
1293 break;
1294 case AVDT_SIG_RECONFIG:
1295 event = AVDT_RECONFIGURE_CMD_IND_EVENT;
1296 break;
1297 case AVDT_SIG_SETCONFIG:
1298 event = AVDT_SETCONFIGURE_CMD_IND_EVENT;
1299 break;
1300 case AVDT_SIG_DELAY_RPT:
1301 event = AVDT_DELAY_CMD_IND_EVENT;
1302 break;
1303 default:
1304 break;
1305 }
1306 return event;
1307 }
1308
1309 /**
1310 *
1311 * @brief AvdtGetEventBySigidCfm
1312 *
1313 * @details Get event by signalling ID.
1314 *
1315 * @return void
1316 *
1317 */
AvdtGetEventBySigidCfm(uint8_t sigId)1318 uint8_t AvdtGetEventBySigidCfm(uint8_t sigId)
1319 {
1320 uint8_t event = 0;
1321 switch (sigId) {
1322 case AVDT_SIG_DISCOVER:
1323 event = AVDT_DISCOVER_CMD_CFM_EVENT;
1324 break;
1325 case AVDT_SIG_GET_ALLCAP:
1326 event = AVDT_GETALLCAP_CMD_CFM_EVENT;
1327 break;
1328 case AVDT_SIG_GETCAP:
1329 event = AVDT_GETCAP_CMD_CFM_EVENT;
1330 break;
1331 case AVDT_SIG_OPEN:
1332 event = AVDT_OPEN_CMD_CFM_EVENT;
1333 break;
1334 case AVDT_SIG_CLOSE:
1335 event = AVDT_CLOSE_CMD_CFM_EVENT;
1336 break;
1337 case AVDT_SIG_GETCONFIG:
1338 event = AVDT_GETCONFIGURE_CMD_CFM_EVENT;
1339 break;
1340 case AVDT_SIG_ABORT:
1341 event = AVDT_ABORT_CMD_CFM_EVENT;
1342 break;
1343 case AVDT_SIG_START:
1344 event = AVDT_START_CMD_CFM_EVENT;
1345 break;
1346 case AVDT_SIG_SUSPEND:
1347 event = AVDT_SUSPEND_CMD_CFM_EVENT;
1348 break;
1349 case AVDT_SIG_RECONFIG:
1350 event = AVDT_RECONFIGURE_CMD_CFM_EVENT;
1351 break;
1352 case AVDT_SIG_SETCONFIG:
1353 event = AVDT_SETCONFIGURE_CMD_CFM_EVENT;
1354 break;
1355 case AVDT_SIG_DELAY_RPT:
1356 event = AVDT_DELAY_CMD_CFM_EVENT;
1357 break;
1358 default:
1359 break;
1360 }
1361 return event;
1362 }
1363
1364 /**
1365 *
1366 * @brief AvdtParseSignalRsp
1367 *
1368 * @details Parse the respond content from the message of remote peer.
1369 * Trigger the callback matched of A2DP profile.
1370 *
1371 * @return void
1372 *
1373 ******************************************************************************/
AvdtParseSignalRsp(AvdtSigCtrl * sigCtrl,uint8_t sigId,const Packet * pkt)1374 void AvdtParseSignalRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const Packet *pkt)
1375 {
1376 if (sigCtrl == NULL) {
1377 return;
1378 }
1379 LOG_DEBUG("[AVDT]%{public}s:sendLabel(%hhu) ReceiveLabel(%hhu),sigId(%hhu)",
1380 __func__, sigCtrl->label, sigCtrl->rcvLabel, sigId);
1381 bool isSigType = false;
1382 uint8_t stEvent = AvdtGetEventBySigidCfm(sigId);
1383 AvdtEventData data = {0};
1384 switch (sigId) {
1385 case AVDT_SIG_DISCOVER:
1386 AvdtParseDiscoverRsp(sigCtrl, &data.ctrlData, pkt);
1387 isSigType = true;
1388 break;
1389 case AVDT_SIG_GET_ALLCAP:
1390 case AVDT_SIG_GETCAP:
1391 AvdtParseGetCapRsp(&data.ctrlData, pkt);
1392 isSigType = true;
1393 break;
1394 case AVDT_SIG_GETCONFIG:
1395 AvdtParseGetConfigRsp(&data.ctrlData, pkt);
1396 break;
1397 case AVDT_SIG_OPEN:
1398 case AVDT_SIG_CLOSE:
1399 case AVDT_SIG_ABORT:
1400 case AVDT_SIG_START:
1401 case AVDT_SIG_SUSPEND:
1402 case AVDT_SIG_RECONFIG:
1403 case AVDT_SIG_SETCONFIG:
1404 case AVDT_SIG_DELAY_RPT:
1405 break;
1406 default:
1407 LOG_ERROR("[AVDT]%{public}s:The Bad signal id(0x%x)", __func__, sigId);
1408 return;
1409 }
1410 if (isSigType) {
1411 AvdtSigProcEvent(sigCtrl, stEvent, &data);
1412 } else {
1413 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(sigCtrl->streamHandle);
1414 if (streamCtrl != NULL) {
1415 AvdtStreamProcEvent(streamCtrl, stEvent, &data);
1416 } else {
1417 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, sigCtrl->streamHandle);
1418 }
1419 }
1420 return;
1421 }
1422
1423 /**
1424 *
1425 * @brief AvdtParseSignalRej
1426 *
1427 * @details Parse and dispatch the reject respond .
1428 *
1429 * @return void
1430 *
1431 ******************************************************************************/
AvdtParseSignalRej(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t label,Packet * pkt)1432 void AvdtParseSignalRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label, Packet *pkt)
1433 {
1434 uint8_t data = 0;
1435 uint8_t errCode = 0;
1436 uint8_t stEvent = AvdtGetEventBySigidCfm(sigId);
1437 switch (sigId) {
1438 case AVDT_SIG_DISCOVER:
1439 case AVDT_SIG_GET_ALLCAP:
1440 case AVDT_SIG_GETCAP:
1441 case AVDT_SIG_GETCONFIG:
1442 case AVDT_SIG_OPEN:
1443 case AVDT_SIG_CLOSE:
1444 PacketExtractHead(pkt, &errCode, AVDT_1BYTE); /* Read first octet message */
1445 break;
1446 case AVDT_SIG_SUSPEND:
1447 case AVDT_SIG_START:
1448 case AVDT_SIG_RECONFIG:
1449 case AVDT_SIG_SETCONFIG:
1450 PacketExtractHead(pkt, &data, AVDT_1BYTE); /* Read first octet message */
1451 PacketExtractHead(pkt, &errCode, AVDT_1BYTE); /* Read second octet message */
1452 break;
1453 default:
1454 break;
1455 }
1456 LOG_DEBUG("[AVDT]%{public}s: sigId(%hhu) errCode(0x%x) categoryOrSeid(%hhu)", __func__, sigId, errCode, data);
1457 /* Do nothing, the timer of a2dp will be triggered */
1458 if (stEvent == AVDT_RECONFIGURE_CMD_CFM_EVENT) {
1459 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(sigCtrl->streamHandle);
1460 if (streamCtrl != NULL) {
1461 AvdtEventData eventData = {0};
1462 eventData.errCode = errCode;
1463 AvdtStreamProcEvent(streamCtrl, stEvent, &eventData);
1464 } else {
1465 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, sigCtrl->streamHandle);
1466 }
1467 }
1468 return;
1469 }
1470
1471 /**
1472 *
1473 * @brief AvdtSignalGeneralRej
1474 *
1475 * @details ACP check the signalling is out of scope.
1476 * Then call this @brief to reject the require of remote peer.
1477 *
1478 * @return void
1479 *
1480 */
AvdtSignalGeneralRej(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t label)1481 void AvdtSignalGeneralRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label)
1482 {
1483 if (sigCtrl == NULL) {
1484 return;
1485 }
1486 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1487 Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, AVDT_BUFFER_CMD_MAX);
1488 Buffer *msgHeader = PacketHead(pkt);
1489 uint8_t *p = BufferPtr(msgHeader);
1490 AvdtBuildSingleHeader(p, sigCtrl->label, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_GRJ);
1491 AvdtBuildSignal(p + 1, sigId);
1492 sigCtrl->currentMsg = pkt;
1493 AvdtSigProcEvent(sigCtrl, AVDT_SND_MSG_EVENT, NULL);
1494 return;
1495 }
1496
1497 /**
1498 *
1499 * @brief AvdtParseGetCapRsp
1500 *
1501 * @details Parse the respond of get capability.
1502 *
1503 * @return void
1504 *
1505 */
AvdtParseGetCapRsp(AvdtCtrlData * data,const Packet * pkt)1506 void AvdtParseGetCapRsp(AvdtCtrlData *data, const Packet *pkt)
1507 {
1508 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1509 AvdtParseCategory(data, pkt);
1510 return;
1511 }
1512
1513 /**
1514 *
1515 * @brief AvdtParseGetConfigRsp
1516 *
1517 * @details Parse the respond of getconfigure.
1518 *
1519 * @return void
1520 *
1521 */
AvdtParseGetConfigRsp(AvdtCtrlData * data,const Packet * pkt)1522 void AvdtParseGetConfigRsp(AvdtCtrlData *data, const Packet *pkt)
1523 {
1524 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1525 AvdtParseCategory(data, pkt);
1526 return;
1527 }
1528
1529 /**
1530 *
1531 * @brief AvdtParseCategory
1532 *
1533 * @details Parse the category.
1534 *
1535 * @return void
1536 *
1537 */
AvdtParseCategory(AvdtCtrlData * data,const Packet * pkt)1538 void AvdtParseCategory(AvdtCtrlData *data, const Packet *pkt)
1539 {
1540 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1541 if (data == NULL) {
1542 return;
1543 }
1544 uint16_t TotalSize = PacketSize(pkt);
1545 uint16_t Len = TotalSize;
1546 uint16_t Offset = 0;
1547 uint8_t context = 0;
1548 uint8_t tmp;
1549 uint8_t count;
1550 do {
1551 PacketPayloadRead(pkt, &context, Offset, AVDT_1BYTE);
1552 Offset++;
1553 Len--;
1554 /* parse */
1555 switch (context) {
1556 case AVDT_PSC_TRANS: {
1557 count = AvdtParseCategoryTrans(&data->getconfigCfm.cfg, pkt, Offset, &tmp);
1558 break;
1559 }
1560 case AVDT_PSC_CODEC: {
1561 /* read codec parameter length */
1562 count = AvdtParseCategoryCodec(&data->getconfigCfm.cfg, pkt, Offset);
1563 break;
1564 }
1565 case AVDT_PSC_DELAY_RPT: {
1566 count = AvdtParseCategoryDelay(&data->getconfigCfm.cfg, pkt, Offset, &tmp);
1567 break;
1568 }
1569 default: {
1570 LOG_WARN("[AVDT]%{public}s: The category(0x%x) is not surport now!", __func__, context);
1571 count = AvdtParseCategorySkip(pkt, Offset);
1572 break;
1573 }
1574 }
1575 Offset += count;
1576 Len -= count;
1577 } while (Len > 0 && TotalSize > Offset);
1578 LOG_DEBUG("[AVDT]%{public}s:data->getconfigCfm.cfg.pscMask is (0x%x)", __func__, data->getconfigCfm.cfg.pscMask);
1579 return;
1580 }
1581
1582 /**
1583 *
1584 * @brief AvdtParseDiscoverRsp
1585 *
1586 * @details Parse the respond of discover.
1587 *
1588 * @return void
1589 *
1590 */
AvdtParseDiscoverRsp(AvdtSigCtrl * sigCtrl,AvdtCtrlData * data,const Packet * pkt)1591 void AvdtParseDiscoverRsp(AvdtSigCtrl *sigCtrl, AvdtCtrlData *data, const Packet *pkt)
1592 {
1593 if (sigCtrl == NULL || data == NULL) {
1594 return;
1595 }
1596 uint16_t TotalSize = PacketSize(pkt);
1597 uint16_t Len = TotalSize;
1598 uint8_t maxNumSeps = sigCtrl->procParam;
1599 uint16_t Offset = 0;
1600 uint8_t context = 0;
1601 uint8_t index = 0;
1602
1603 LOG_DEBUG("[AVDT]%{public}s: totalSize(%hu)", __func__, TotalSize);
1604 if (maxNumSeps == 0) {
1605 return;
1606 }
1607 do {
1608 (void)memset_s(&data->discoverCfm.seps[index], sizeof(AvdtSepInfo), 0, sizeof(AvdtSepInfo));
1609 PacketPayloadRead(pkt, &context, Offset, AVDT_1BYTE);
1610 Offset++;
1611 Len--;
1612 data->discoverCfm.seps[index].isUsed = (bool)(context & 0x02);
1613 data->discoverCfm.seps[index].seid = (context >> AVDT_OFFSET_2BIT);
1614 context = 0;
1615 PacketPayloadRead(pkt, &context, Offset, AVDT_1BYTE);
1616 Offset++;
1617 Len--;
1618 data->discoverCfm.seps[index].mediaType = (context >> AVDT_OFFSET_4BIT);
1619 data->discoverCfm.seps[index].sepType = ((context & 0x08) >> AVDT_OFFSET_3BIT);
1620 context = 0;
1621 maxNumSeps--;
1622 LOG_DEBUG("[AVDT]%{public}s: sigCtrl->role(%hhu) seps[index].sepType(%hhu) acpid(%hhu) "
1623 "mediaType(%hhu) index(%hhu) maxNumSeps(%hhu)",
1624 __func__,
1625 sigCtrl->role,
1626 data->discoverCfm.seps[index].sepType,
1627 data->discoverCfm.seps[index].seid,
1628 data->discoverCfm.seps[index].mediaType,
1629 index,
1630 maxNumSeps);
1631 if (sigCtrl->role != data->discoverCfm.seps[index].sepType && (data->discoverCfm.seps[index].seid > 0)) {
1632 index++;
1633 }
1634 } while (Len > 0 && maxNumSeps > 0 && TotalSize > Offset);
1635 data->discoverCfm.numSeps = index;
1636 return;
1637 }
1638
1639 /**
1640 *
1641 * @brief AvdtParseGetConfigRsp
1642 *
1643 * @details Parse the respond of getconfigure.
1644 *
1645 * @return void
1646 *
1647 */
AvdtParseSeid(uint8_t data)1648 uint8_t AvdtParseSeid(uint8_t data)
1649 {
1650 uint8_t seid = ((data >> AVDT_OFFSET_2BIT) & 0x3F);
1651 if (seid < AVDT_SEID_MIN || seid > AVDT_SEID_MAX) {
1652 seid = AVDT_SEID_INVLID;
1653 }
1654 LOG_DEBUG("[AVDT]%{public}s: seid(0x%x)", __func__, seid);
1655 return seid;
1656 }
1657
1658 /**
1659 *
1660 * @brief AvdtParseDelayValue
1661 *
1662 * @details Parse the delay value from message.
1663 *
1664 * @return delay value
1665 *
1666 */
AvdtParseDelayValue(uint8_t maxSB,uint8_t lowSB)1667 uint16_t AvdtParseDelayValue(uint8_t maxSB, uint8_t lowSB)
1668 {
1669 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1670 uint16_t Value = (uint16_t)((maxSB << AVDT_OFFSET_8BIT) | lowSB);
1671 return Value;
1672 }
1673
1674 /**
1675 *
1676 * @brief AvdtParseSetconfig
1677 *
1678 * @details Parse the content of setconfig. *
1679 *
1680 * @return 0:sccusse /other errcode
1681 *
1682 */
AvdtParseSetconfig(uint16_t streamHandle,const Packet * pkt,uint16_t off,uint8_t * errCode,uint8_t * errParam)1683 void AvdtParseSetconfig(uint16_t streamHandle, const Packet *pkt, uint16_t off, uint8_t *errCode, uint8_t *errParam)
1684 {
1685 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1686 uint16_t TotalSize = PacketSize(pkt);
1687 uint16_t Len = TotalSize;
1688 uint8_t data = 0;
1689 uint16_t Offset = off;
1690 uint8_t tmp;
1691 uint8_t count;
1692 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(streamHandle);
1693 if (streamCtrl == NULL) {
1694 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle Failed", __func__);
1695 return;
1696 }
1697 do {
1698 PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1699 Offset++;
1700 Len--;
1701 switch (data) {
1702 case AVDT_PSC_TRANS: {
1703 count = AvdtParseCategoryTrans(&streamCtrl->reqCfg, pkt, Offset, &tmp);
1704 if (tmp != 0) {
1705 *errCode = AVDT_ERR_BAD_MEDIA_TRANSPORT_FORMAT;
1706 *errParam = AVDT_PSC_TRANS;
1707 return;
1708 }
1709 break;
1710 }
1711 case AVDT_PSC_CODEC: {
1712 count = AvdtParseCategoryCodec(&streamCtrl->reqCfg, pkt, Offset);
1713 break;
1714 }
1715 case AVDT_PSC_DELAY_RPT: {
1716 count = AvdtParseCategoryDelay(&streamCtrl->reqCfg, pkt, Offset, &tmp);
1717 break;
1718 }
1719 default:
1720 LOG_ERROR("[AVDT]%{public}s: The category(0x%x) is not surport now!", __func__, data);
1721 *errCode = AVDT_ERR_INVALID_CAPABILITIES;
1722 *errParam = data;
1723 return;
1724 }
1725 Offset += count;
1726 Len -= count;
1727 } while (Len > 0 && TotalSize > Offset);
1728 return;
1729 }
1730
1731 /**
1732 *
1733 * @brief AvdtParseCategoryCodec
1734 *
1735 * @details Parse the codec content of setconfig.
1736 *
1737 * @return read data length
1738 *
1739 */
AvdtParseCategoryCodec(AvdtSepConfig * sepConfig,const Packet * pkt,uint16_t offset)1740 uint8_t AvdtParseCategoryCodec(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset)
1741 {
1742 if (sepConfig == NULL) {
1743 return 0;
1744 }
1745 uint8_t data = 0;
1746 uint8_t length = 0;
1747 PacketPayloadRead(pkt, &data, offset, AVDT_1BYTE);
1748
1749 /* now only surport sbc/aac */
1750 if (data > AVDT_CODEC_SIZE) {
1751 data = AVDT_CODEC_SIZE;
1752 }
1753 offset++;
1754 length++;
1755 sepConfig->codecInfo[0] = data;
1756 PacketPayloadRead(pkt, &(sepConfig->codecInfo[1]), offset, data);
1757 sepConfig->numCodec = data;
1758 offset += data;
1759 length += data;
1760 sepConfig->pscMask = (sepConfig->pscMask | AVDT_PSC_MSK_CODEC);
1761 LOG_DEBUG("[AVDT]%{public}s:offset=%{public}d,length=%{public}d", __func__, offset, length);
1762 return length;
1763 }
1764 /**
1765 *
1766 * @brief AvdtParseCategoryTrans
1767 *
1768 * @details Parse the trans media content of setconfig.
1769 *
1770 * @return read data length
1771 *
1772 */
AvdtParseCategoryTrans(AvdtSepConfig * sepConfig,const Packet * pkt,uint16_t offset,uint8_t * data)1773 uint8_t AvdtParseCategoryTrans(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset, uint8_t *data)
1774 {
1775 if (sepConfig == NULL) {
1776 return 0;
1777 }
1778 uint8_t length = 0;
1779 PacketPayloadRead(pkt, data, offset, AVDT_1BYTE);
1780 length++;
1781 sepConfig->pscMask = (sepConfig->pscMask | AVDT_PSC_MSK_TRANS);
1782 return length;
1783 }
1784 /**
1785 *
1786 * @brief AvdtParseCategoryDelay
1787 *
1788 * @details Parse the delay report content of setconfig.
1789 *
1790 * @return read data length
1791 *
1792 */
AvdtParseCategoryDelay(AvdtSepConfig * sepConfig,const Packet * pkt,uint16_t offset,uint8_t * data)1793 uint8_t AvdtParseCategoryDelay(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset, uint8_t *data)
1794 {
1795 if (sepConfig == NULL) {
1796 return 0;
1797 }
1798 uint8_t length = 0;
1799 PacketPayloadRead(pkt, data, offset, AVDT_1BYTE);
1800 length++;
1801 sepConfig->pscMask = (sepConfig->pscMask | AVDT_PSC_MSK_DELAY_RPT);
1802 return length;
1803 }
1804 /**
1805 *
1806 * @brief AvdtParseCategorySkip
1807 *
1808 * @details Skip unsurport type content of setconfig.
1809 *
1810 * @return read data length
1811 *
1812 */
AvdtParseCategorySkip(const Packet * pkt,uint16_t offset)1813 uint8_t AvdtParseCategorySkip(const Packet *pkt, uint16_t offset)
1814 {
1815 uint8_t data = 0;
1816 PacketPayloadRead(pkt, &data, offset, AVDT_1BYTE);
1817 uint8_t length = data + 1;
1818 return length;
1819 }
1820 /**
1821 *
1822 * @brief AvdtParseReconfig
1823 *
1824 * @details Parse the content of reconfig.
1825 *
1826 * @return void
1827 *
1828 */
AvdtParseReconfig(uint16_t streamHandle,const Packet * pkt,uint16_t off,uint8_t * errCode,uint8_t * errParam)1829 void AvdtParseReconfig(uint16_t streamHandle, const Packet *pkt, uint16_t off, uint8_t *errCode, uint8_t *errParam)
1830 {
1831 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1832 uint16_t TotalSize = PacketSize(pkt);
1833 uint16_t Len = TotalSize;
1834 uint16_t Offset = off;
1835 uint8_t data = 0;
1836 uint8_t tmp;
1837 uint8_t count;
1838 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(streamHandle);
1839 if (streamCtrl == NULL) {
1840 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle Failed", __func__);
1841 return;
1842 }
1843 do {
1844 PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1845 Offset++;
1846 Len--;
1847 switch (data) {
1848 case AVDT_PSC_TRANS: {
1849 count = AvdtParseCategoryTrans(&streamCtrl->reqCfg, pkt, Offset, &tmp);
1850 if (tmp != 0) {
1851 *errCode = AVDT_ERR_BAD_MEDIA_TRANSPORT_FORMAT;
1852 *errParam = AVDT_PSC_TRANS;
1853 return;
1854 }
1855 break;
1856 }
1857 case AVDT_PSC_CODEC: {
1858 count = AvdtParseCategoryCodec(&streamCtrl->reqCfg, pkt, Offset);
1859 break;
1860 }
1861 default:
1862 LOG_ERROR("[AVDT]%{public}s: The category(0x%x) is not surport now!", __func__, data);
1863 *errCode = AVDT_ERR_INVALID_CAPABILITIES;
1864 *errParam = data;
1865 return;
1866 }
1867 Offset += count;
1868 Len -= count;
1869 } while (Len > 0 && TotalSize > Offset);
1870 LOG_DEBUG("[AVDT]%{public}s:data->getCapCfm.cfg.pscMask is (0x%x)", __func__, streamCtrl->reqCfg.pscMask);
1871 return;
1872 }
1873
1874 /**
1875 *
1876 * @brief AvdtIndPktLenCheck
1877 *
1878 * @details Check packet length is valid for ind command.
1879 *
1880 * @return valid:0 / invalid: other
1881 *
1882 */
AvdtIndPktLenCheck(AvdtSigCtrl * sigCtrl,uint8_t sigId,const Packet * pkt)1883 uint8_t AvdtIndPktLenCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, const Packet *pkt)
1884 {
1885 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1886 uint8_t Ret = AVDT_SUCCESS;
1887 uint16_t Len = PacketSize(pkt);
1888 switch (sigId) {
1889 case AVDT_SIG_DISCOVER:
1890 break;
1891 case AVDT_SIG_GET_ALLCAP:
1892 case AVDT_SIG_GETCAP:
1893 case AVDT_SIG_GETCONFIG:
1894 case AVDT_SIG_RECONFIG:
1895 case AVDT_SIG_OPEN:
1896 case AVDT_SIG_CLOSE:
1897 case AVDT_SIG_ABORT:
1898 case AVDT_SIG_START:
1899 case AVDT_SIG_SUSPEND:
1900 if (Len < AVDT_SIG_LENGTH_COMM) {
1901 Ret = AVDT_BAD_PARAMS;
1902 }
1903 break;
1904 case AVDT_SIG_SETCONFIG:
1905 if (Len < AVDT_SIG_LENGTH_SETCONFIG) {
1906 Ret = AVDT_BAD_PARAMS;
1907 }
1908 break;
1909 case AVDT_SIG_DELAY_RPT:
1910 if (Len < AVDT_SIG_LENGTH_DELAY_RPT) {
1911 Ret = AVDT_BAD_PARAMS;
1912 }
1913 break;
1914 default:
1915 break;
1916 }
1917 if (Ret != AVDT_SUCCESS) {
1918 LOG_ERROR("[AVDT]%{public}s:BAD LENGTH of the cmd!", __func__);
1919 AvdtIndReject(sigCtrl, sigId, AVDT_ERR_BAD_LENGTH, 0);
1920 }
1921 return Ret;
1922 }
1923
1924 /**
1925 *
1926 * @brief AvdtIndSeidCheck
1927 *
1928 * @details Check se id is valid for ind command.
1929 *
1930 * @return valid:id / invalid: AVDT_SEID_INVLID
1931 *
1932 */
AvdtIndSeidCheck(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t data)1933 uint8_t AvdtIndSeidCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t data)
1934 {
1935 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1936 uint8_t seid = AVDT_SEID_INVLID;
1937 switch (sigId) {
1938 case AVDT_SIG_DISCOVER:
1939 break;
1940 case AVDT_SIG_GET_ALLCAP:
1941 case AVDT_SIG_GETCAP:
1942 case AVDT_SIG_OPEN:
1943 case AVDT_SIG_CLOSE:
1944 case AVDT_SIG_GETCONFIG:
1945 case AVDT_SIG_ABORT:
1946 case AVDT_SIG_START:
1947 case AVDT_SIG_SUSPEND:
1948 case AVDT_SIG_RECONFIG:
1949 case AVDT_SIG_SETCONFIG:
1950 case AVDT_SIG_DELAY_RPT:
1951 seid = AvdtParseSeid(data);
1952 if (seid == AVDT_SEID_INVLID) {
1953 LOG_ERROR("[AVDT]%{public}s:BAD SEID of the cmd!", __func__);
1954 AvdtIndReject(sigCtrl, sigId, AVDT_ERR_BAD_ACP_SEID, 0);
1955 } else {
1956 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle((uint16_t)seid);
1957 if (streamCtrl == NULL) {
1958 LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle failed(%hhu)!", __func__, seid);
1959 AvdtIndReject(sigCtrl, sigId, AVDT_ERR_BAD_ACP_SEID, 0);
1960 seid = AVDT_SEID_INVLID;
1961 }
1962 }
1963 break;
1964 default:
1965 break;
1966 }
1967 return seid;
1968 }
1969
1970 /**
1971 *
1972 * @brief AvdtMakeRejMsg
1973 *
1974 * @details Make reject message for received signal.
1975 *
1976 * @return valid:id / invalid: AVDT_SEID_INVLID
1977 *
1978 */
AvdtMakeRejMsg(uint8_t sigId,uint8_t errCode,uint8_t errParam,AvdtMsg * msg)1979 void AvdtMakeRejMsg(uint8_t sigId, uint8_t errCode, uint8_t errParam, AvdtMsg *msg)
1980 {
1981 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1982 switch (sigId) {
1983 case AVDT_SIG_DISCOVER:
1984 break;
1985 case AVDT_SIG_GETCONFIG:
1986 case AVDT_SIG_OPEN:
1987 case AVDT_SIG_CLOSE:
1988 case AVDT_SIG_ABORT:
1989 case AVDT_SIG_START:
1990 case AVDT_SIG_SUSPEND:
1991 msg->single.errCode = errCode;
1992 msg->single.errParam = errParam;
1993 break;
1994 case AVDT_SIG_GETCAP:
1995 case AVDT_SIG_GET_ALLCAP:
1996 msg->getcap.single.errCode = errCode;
1997 msg->getcap.single.errParam = errParam;
1998 break;
1999 case AVDT_SIG_SETCONFIG:
2000 msg->configureCmd.hdr.errCode = errCode;
2001 msg->configureCmd.hdr.errParam = errParam;
2002 break;
2003 case AVDT_SIG_RECONFIG:
2004 msg->reconfigureCmd.hdr.errCode = errCode;
2005 msg->reconfigureCmd.hdr.errParam = errParam;
2006 break;
2007 case AVDT_SIG_DELAY_RPT:
2008 msg->delayRptCmd.hdr.errCode = errCode;
2009 msg->delayRptCmd.hdr.errParam = errParam;
2010 break;
2011 default:
2012 break;
2013 }
2014 return;
2015 }
2016
2017 /**
2018 *
2019 * @brief AvdtServiceCapCheck
2020 *
2021 * @details Service capabilities valid check.
2022 *
2023 * @return valid:0 / invalid: other
2024 *
2025 */
AvdtServiceCapCheck(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t data)2026 uint8_t AvdtServiceCapCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t data)
2027 {
2028 LOG_DEBUG("[AVDT]%{public}s:", __func__);
2029 uint8_t Ret = AVDT_SUCCESS;
2030 uint8_t err = 0;
2031 if (data > AVDT_PSC_MAX_CUR) {
2032 err = AVDT_ERR_BAD_SERV_CATEGORY;
2033 } else if (sigId == AVDT_SIG_RECONFIG && data != AVDT_PSC_CODEC) {
2034 err = AVDT_ERR_INVALID_CAPABILITIES;
2035 } else if ((data != AVDT_PSC_TRANS) && (data != AVDT_PSC_CODEC) && (data != AVDT_PSC_DELAY_RPT)
2036 && (data != AVDT_PSC_PROTECT)) {
2037 err = AVDT_ERR_INVALID_CAPABILITIES;
2038 }
2039 if (err != 0) {
2040 LOG_ERROR("[AVDT]%{public}s:BAD Service Category of the cmd(0x%x)!", __func__, sigId);
2041 AvdtIndReject(sigCtrl, sigId, err, data);
2042 Ret = AVDT_BAD_PARAMS;
2043 }
2044 return Ret;
2045 }
2046
2047 /**
2048 *
2049 * @brief AvdtIndReject
2050 *
2051 * @details Send reject message by signal.
2052 *
2053 * @return void
2054 *
2055 */
AvdtIndReject(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t errCode,uint8_t errParam)2056 void AvdtIndReject(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t errCode, uint8_t errParam)
2057 {
2058 LOG_DEBUG("[AVDT]%{public}s:", __func__);
2059 AvdtMsg avdtMsgData = {0};
2060 AvdtMakeRejMsg(sigId, errCode, errParam, &avdtMsgData);
2061 AvdtMsgSendRej(sigCtrl, sigId, &avdtMsgData);
2062 return;
2063 }
2064