• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     Offset++;
1240     PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1241     if (AvdtServiceCapCheck(sigCtrl, AVDT_SIG_DELAY_RPT, data) != AVDT_SUCCESS) {
1242         return;
1243     }
1244     msg.msg.delayRptCmd.delay = AvdtParseDelayValue(maxSB, lowSB);
1245     msg.msg.delayRptCmd.hdr.seid = seid;
1246     msg.msg.delayRptCmd.hdr.label = label;
1247     AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle((uint16_t)seid);
1248     if (streamCtrl != NULL) {
1249         AvdtStreamProcEvent(streamCtrl, event, &msg);
1250     } else {
1251         LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle failed(%hhu)!", __func__, seid);
1252         AvdtMsg avdtMsgData = {0};
1253         avdtMsgData.discoverRsp.hdr.errCode = AVDT_ERR_BAD_ACP_SEID;
1254         AvdtMsgSendRej(sigCtrl, AVDT_SIG_DELAY_RPT, &avdtMsgData);
1255     }
1256     return;
1257 }
1258 
1259 /**
1260  *
1261  * @brief        AvdtGetEventBySigidInd
1262  *
1263  * @details      Get event by signalling ID.
1264  *
1265  * @return       void
1266  *
1267  */
AvdtGetEventBySigidInd(uint8_t sigId)1268 uint8_t AvdtGetEventBySigidInd(uint8_t sigId)
1269 {
1270     uint8_t event = 0;
1271     switch (sigId) {
1272         case AVDT_SIG_DISCOVER:
1273             event = AVDT_DISCOVER_CMD_IND_EVENT;
1274             break;
1275         case AVDT_SIG_GET_ALLCAP:
1276             event = AVDT_GETALLCAP_CMD_IND_EVENT;
1277             break;
1278         case AVDT_SIG_GETCAP:
1279             event = AVDT_GETCAP_CMD_IND_EVENT;
1280             break;
1281         case AVDT_SIG_OPEN:
1282             event = AVDT_OPEN_CMD_IND_EVENT;
1283             break;
1284         case AVDT_SIG_CLOSE:
1285             event = AVDT_CLOSE_CMD_IND_EVENT;
1286             break;
1287         case AVDT_SIG_GETCONFIG:
1288             event = AVDT_GETCONFIGURE_CMD_IND_EVENT;
1289             break;
1290         case AVDT_SIG_ABORT:
1291             event = AVDT_ABORT_CMD_IND_EVENT;
1292             break;
1293         case AVDT_SIG_START:
1294             event = AVDT_START_CMD_IND_EVENT;
1295             break;
1296         case AVDT_SIG_SUSPEND:
1297             event = AVDT_SUSPEND_CMD_IND_EVENT;
1298             break;
1299         case AVDT_SIG_RECONFIG:
1300             event = AVDT_RECONFIGURE_CMD_IND_EVENT;
1301             break;
1302         case AVDT_SIG_SETCONFIG:
1303             event = AVDT_SETCONFIGURE_CMD_IND_EVENT;
1304             break;
1305         case AVDT_SIG_DELAY_RPT:
1306             event = AVDT_DELAY_CMD_IND_EVENT;
1307             break;
1308         default:
1309             break;
1310     }
1311     return event;
1312 }
1313 
1314 /**
1315  *
1316  * @brief        AvdtGetEventBySigidCfm
1317  *
1318  * @details      Get event by signalling ID.
1319  *
1320  * @return       void
1321  *
1322  */
AvdtGetEventBySigidCfm(uint8_t sigId)1323 uint8_t AvdtGetEventBySigidCfm(uint8_t sigId)
1324 {
1325     uint8_t event = 0;
1326     switch (sigId) {
1327         case AVDT_SIG_DISCOVER:
1328             event = AVDT_DISCOVER_CMD_CFM_EVENT;
1329             break;
1330         case AVDT_SIG_GET_ALLCAP:
1331             event = AVDT_GETALLCAP_CMD_CFM_EVENT;
1332             break;
1333         case AVDT_SIG_GETCAP:
1334             event = AVDT_GETCAP_CMD_CFM_EVENT;
1335             break;
1336         case AVDT_SIG_OPEN:
1337             event = AVDT_OPEN_CMD_CFM_EVENT;
1338             break;
1339         case AVDT_SIG_CLOSE:
1340             event = AVDT_CLOSE_CMD_CFM_EVENT;
1341             break;
1342         case AVDT_SIG_GETCONFIG:
1343             event = AVDT_GETCONFIGURE_CMD_CFM_EVENT;
1344             break;
1345         case AVDT_SIG_ABORT:
1346             event = AVDT_ABORT_CMD_CFM_EVENT;
1347             break;
1348         case AVDT_SIG_START:
1349             event = AVDT_START_CMD_CFM_EVENT;
1350             break;
1351         case AVDT_SIG_SUSPEND:
1352             event = AVDT_SUSPEND_CMD_CFM_EVENT;
1353             break;
1354         case AVDT_SIG_RECONFIG:
1355             event = AVDT_RECONFIGURE_CMD_CFM_EVENT;
1356             break;
1357         case AVDT_SIG_SETCONFIG:
1358             event = AVDT_SETCONFIGURE_CMD_CFM_EVENT;
1359             break;
1360         case AVDT_SIG_DELAY_RPT:
1361             event = AVDT_DELAY_CMD_CFM_EVENT;
1362             break;
1363         default:
1364             break;
1365     }
1366     return event;
1367 }
1368 
1369 /**
1370  *
1371  * @brief        AvdtParseSignalRsp
1372  *
1373  * @details      Parse the respond content from the message of remote peer.
1374  *               Trigger the callback matched of A2DP profile.
1375  *
1376  * @return       void
1377  *
1378  ******************************************************************************/
AvdtParseSignalRsp(AvdtSigCtrl * sigCtrl,uint8_t sigId,const Packet * pkt)1379 void AvdtParseSignalRsp(AvdtSigCtrl *sigCtrl, uint8_t sigId, const Packet *pkt)
1380 {
1381     if (sigCtrl == NULL) {
1382         return;
1383     }
1384     LOG_DEBUG("[AVDT]%{public}s:sendLabel(%hhu) ReceiveLabel(%hhu),sigId(%hhu)",
1385         __func__, sigCtrl->label, sigCtrl->rcvLabel, sigId);
1386     bool isSigType = false;
1387     uint8_t stEvent = AvdtGetEventBySigidCfm(sigId);
1388     AvdtEventData data = {0};
1389     switch (sigId) {
1390         case AVDT_SIG_DISCOVER:
1391             AvdtParseDiscoverRsp(sigCtrl, &data.ctrlData, pkt);
1392             isSigType = true;
1393             break;
1394         case AVDT_SIG_GET_ALLCAP:
1395         case AVDT_SIG_GETCAP:
1396             AvdtParseGetCapRsp(&data.ctrlData, pkt);
1397             isSigType = true;
1398             break;
1399         case AVDT_SIG_GETCONFIG:
1400             AvdtParseGetConfigRsp(&data.ctrlData, pkt);
1401             break;
1402         case AVDT_SIG_OPEN:
1403         case AVDT_SIG_CLOSE:
1404         case AVDT_SIG_ABORT:
1405         case AVDT_SIG_START:
1406         case AVDT_SIG_SUSPEND:
1407         case AVDT_SIG_RECONFIG:
1408         case AVDT_SIG_SETCONFIG:
1409         case AVDT_SIG_DELAY_RPT:
1410             break;
1411         default:
1412             LOG_ERROR("[AVDT]%{public}s:The Bad signal id(0x%x)", __func__, sigId);
1413             return;
1414     }
1415     if (isSigType) {
1416         AvdtSigProcEvent(sigCtrl, stEvent, &data);
1417     } else {
1418         AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(sigCtrl->streamHandle);
1419         if (streamCtrl != NULL) {
1420             AvdtStreamProcEvent(streamCtrl, stEvent, &data);
1421         } else {
1422             LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, sigCtrl->streamHandle);
1423         }
1424     }
1425     return;
1426 }
1427 
1428 /**
1429  *
1430  * @brief        AvdtParseSignalRej
1431  *
1432  * @details      Parse and dispatch the reject respond .
1433  *
1434  * @return       void
1435  *
1436  ******************************************************************************/
AvdtParseSignalRej(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t label,Packet * pkt)1437 void AvdtParseSignalRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label, Packet *pkt)
1438 {
1439     uint8_t data = 0;
1440     uint8_t errCode = 0;
1441     uint8_t stEvent = AvdtGetEventBySigidCfm(sigId);
1442     switch (sigId) {
1443         case AVDT_SIG_DISCOVER:
1444         case AVDT_SIG_GET_ALLCAP:
1445         case AVDT_SIG_GETCAP:
1446         case AVDT_SIG_GETCONFIG:
1447         case AVDT_SIG_OPEN:
1448         case AVDT_SIG_CLOSE:
1449             PacketExtractHead(pkt, &errCode, AVDT_1BYTE); /* Read first octet message */
1450             break;
1451         case AVDT_SIG_SUSPEND:
1452         case AVDT_SIG_START:
1453         case AVDT_SIG_RECONFIG:
1454         case AVDT_SIG_SETCONFIG:
1455             PacketExtractHead(pkt, &data, AVDT_1BYTE);    /* Read first octet message */
1456             PacketExtractHead(pkt, &errCode, AVDT_1BYTE); /* Read second octet message */
1457             break;
1458         default:
1459             break;
1460     }
1461     LOG_DEBUG("[AVDT]%{public}s: sigId(%hhu) errCode(0x%x) categoryOrSeid(%hhu)", __func__, sigId, errCode, data);
1462     /* Do nothing, the timer of a2dp will be triggered */
1463     if (stEvent == AVDT_RECONFIGURE_CMD_CFM_EVENT) {
1464         AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(sigCtrl->streamHandle);
1465         if (streamCtrl != NULL) {
1466             AvdtEventData eventData = {0};
1467             eventData.errCode = errCode;
1468             AvdtStreamProcEvent(streamCtrl, stEvent, &eventData);
1469         } else {
1470             LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, sigCtrl->streamHandle);
1471         }
1472     }
1473     return;
1474 }
1475 
1476 /**
1477  *
1478  * @brief        AvdtSignalGeneralRej
1479  *
1480  * @details      ACP check the signalling is out of scope.
1481  *               Then call this @brief to reject the require of remote peer.
1482  *
1483  * @return       void
1484  *
1485  */
AvdtSignalGeneralRej(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t label)1486 void AvdtSignalGeneralRej(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t label)
1487 {
1488     if (sigCtrl == NULL) {
1489         return;
1490     }
1491     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1492     Packet *pkt = PacketMalloc(AVDT_BUFFER_SINGLE, 0, AVDT_BUFFER_CMD_MAX);
1493     Buffer *msgHeader = PacketHead(pkt);
1494     uint8_t *p = BufferPtr(msgHeader);
1495     AvdtBuildSingleHeader(p, sigCtrl->label, AVDT_PKT_TYPE_SINGLE, AVDT_MSG_TYPE_GRJ);
1496     AvdtBuildSignal(p + 1, sigId);
1497     sigCtrl->currentMsg = pkt;
1498     AvdtSigProcEvent(sigCtrl, AVDT_SND_MSG_EVENT, NULL);
1499     return;
1500 }
1501 
1502 /**
1503  *
1504  * @brief        AvdtParseGetCapRsp
1505  *
1506  * @details      Parse the respond of get capability.
1507  *
1508  * @return       void
1509  *
1510  */
AvdtParseGetCapRsp(AvdtCtrlData * data,const Packet * pkt)1511 void AvdtParseGetCapRsp(AvdtCtrlData *data, const Packet *pkt)
1512 {
1513     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1514     AvdtParseCategory(data, pkt);
1515     return;
1516 }
1517 
1518 /**
1519  *
1520  * @brief        AvdtParseGetConfigRsp
1521  *
1522  * @details      Parse the respond of getconfigure.
1523  *
1524  * @return       void
1525  *
1526  */
AvdtParseGetConfigRsp(AvdtCtrlData * data,const Packet * pkt)1527 void AvdtParseGetConfigRsp(AvdtCtrlData *data, const Packet *pkt)
1528 {
1529     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1530     AvdtParseCategory(data, pkt);
1531     return;
1532 }
1533 
1534 /**
1535  *
1536  * @brief        AvdtParseCategory
1537  *
1538  * @details      Parse the category.
1539  *
1540  * @return       void
1541  *
1542  */
AvdtParseCategory(AvdtCtrlData * data,const Packet * pkt)1543 void AvdtParseCategory(AvdtCtrlData *data, const Packet *pkt)
1544 {
1545     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1546     if (data == NULL) {
1547         return;
1548     }
1549     uint16_t TotalSize = PacketSize(pkt);
1550     uint16_t Len = TotalSize;
1551     uint16_t Offset = 0;
1552     uint8_t context = 0;
1553     uint8_t tmp;
1554     uint8_t count;
1555     do {
1556         PacketPayloadRead(pkt, &context, Offset, AVDT_1BYTE);
1557         Offset++;
1558         Len--;
1559         /* parse */
1560         switch (context) {
1561             case AVDT_PSC_TRANS: {
1562                 count = AvdtParseCategoryTrans(&data->getconfigCfm.cfg, pkt, Offset, &tmp);
1563                 break;
1564             }
1565             case AVDT_PSC_CODEC: {
1566                 /* read codec parameter length */
1567                 count = AvdtParseCategoryCodec(&data->getconfigCfm.cfg, pkt, Offset);
1568                 break;
1569             }
1570             case AVDT_PSC_DELAY_RPT: {
1571                 count = AvdtParseCategoryDelay(&data->getconfigCfm.cfg, pkt, Offset, &tmp);
1572                 break;
1573             }
1574             default: {
1575                 LOG_WARN("[AVDT]%{public}s: The category(0x%x) is not surport now!", __func__, context);
1576                 count = AvdtParseCategorySkip(pkt, Offset);
1577                 break;
1578             }
1579         }
1580         Offset += count;
1581         Len -= count;
1582     } while (Len > 0 && TotalSize > Offset);
1583     LOG_DEBUG("[AVDT]%{public}s:data->getconfigCfm.cfg.pscMask is (0x%x)", __func__, data->getconfigCfm.cfg.pscMask);
1584     return;
1585 }
1586 
1587 /**
1588  *
1589  * @brief        AvdtParseDiscoverRsp
1590  *
1591  * @details      Parse the respond of discover.
1592  *
1593  * @return       void
1594  *
1595  */
AvdtParseDiscoverRsp(AvdtSigCtrl * sigCtrl,AvdtCtrlData * data,const Packet * pkt)1596 void AvdtParseDiscoverRsp(AvdtSigCtrl *sigCtrl, AvdtCtrlData *data, const Packet *pkt)
1597 {
1598     if (sigCtrl == NULL || data == NULL) {
1599         return;
1600     }
1601     uint16_t TotalSize = PacketSize(pkt);
1602     uint16_t Len = TotalSize;
1603     uint8_t maxNumSeps = sigCtrl->procParam;
1604     uint16_t Offset = 0;
1605     uint8_t context = 0;
1606     uint8_t index = 0;
1607 
1608     LOG_DEBUG("[AVDT]%{public}s: totalSize(%hu)", __func__, TotalSize);
1609     if (maxNumSeps == 0) {
1610         return;
1611     }
1612     do {
1613         (void)memset_s(&data->discoverCfm.seps[index], sizeof(AvdtSepInfo), 0, sizeof(AvdtSepInfo));
1614         PacketPayloadRead(pkt, &context, Offset, AVDT_1BYTE);
1615         Offset++;
1616         Len--;
1617         data->discoverCfm.seps[index].isUsed = (bool)(context & 0x02);
1618         data->discoverCfm.seps[index].seid = (context >> AVDT_OFFSET_2BIT);
1619         context = 0;
1620         PacketPayloadRead(pkt, &context, Offset, AVDT_1BYTE);
1621         Offset++;
1622         Len--;
1623         data->discoverCfm.seps[index].mediaType = (context >> AVDT_OFFSET_4BIT);
1624         data->discoverCfm.seps[index].sepType = ((context & 0x08) >> AVDT_OFFSET_3BIT);
1625         context = 0;
1626         maxNumSeps--;
1627         LOG_DEBUG("[AVDT]%{public}s: sigCtrl->role(%hhu) seps[index].sepType(%hhu) acpid(%hhu) "
1628             "mediaType(%hhu) index(%hhu) maxNumSeps(%hhu)",
1629             __func__,
1630             sigCtrl->role,
1631             data->discoverCfm.seps[index].sepType,
1632             data->discoverCfm.seps[index].seid,
1633             data->discoverCfm.seps[index].mediaType,
1634             index,
1635             maxNumSeps);
1636         if (sigCtrl->role != data->discoverCfm.seps[index].sepType && (data->discoverCfm.seps[index].seid > 0)) {
1637             index++;
1638         }
1639     } while (Len > 0 && maxNumSeps > 0 && TotalSize > Offset);
1640     data->discoverCfm.numSeps = index;
1641     return;
1642 }
1643 
1644 /**
1645  *
1646  * @brief        AvdtParseGetConfigRsp
1647  *
1648  * @details      Parse the respond of getconfigure.
1649  *
1650  * @return       void
1651  *
1652  */
AvdtParseSeid(uint8_t data)1653 uint8_t AvdtParseSeid(uint8_t data)
1654 {
1655     uint8_t seid = ((data >> AVDT_OFFSET_2BIT) & 0x3F);
1656     if (seid < AVDT_SEID_MIN || seid > AVDT_SEID_MAX) {
1657         seid = AVDT_SEID_INVLID;
1658     }
1659     LOG_DEBUG("[AVDT]%{public}s: seid(0x%x)", __func__, seid);
1660     return seid;
1661 }
1662 
1663 /**
1664  *
1665  * @brief        AvdtParseDelayValue
1666  *
1667  * @details      Parse the delay value from message.
1668  *
1669  * @return       delay value
1670  *
1671  */
AvdtParseDelayValue(uint8_t maxSB,uint8_t lowSB)1672 uint16_t AvdtParseDelayValue(uint8_t maxSB, uint8_t lowSB)
1673 {
1674     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1675     uint16_t Value = (uint16_t)((maxSB << AVDT_OFFSET_8BIT) | lowSB);
1676     return Value;
1677 }
1678 
1679 /**
1680  *
1681  * @brief        AvdtParseSetconfig
1682  *
1683  * @details      Parse the content of setconfig. *
1684  *
1685  * @return       0:sccusse /other errcode
1686  *
1687  */
AvdtParseSetconfig(uint16_t streamHandle,const Packet * pkt,uint16_t off,uint8_t * errCode,uint8_t * errParam)1688 void AvdtParseSetconfig(uint16_t streamHandle, const Packet *pkt, uint16_t off, uint8_t *errCode, uint8_t *errParam)
1689 {
1690     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1691     uint16_t TotalSize = PacketSize(pkt);
1692     uint16_t Len = TotalSize;
1693     uint8_t data = 0;
1694     uint16_t Offset = off;
1695     uint8_t tmp;
1696     uint8_t count;
1697     AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(streamHandle);
1698     if (streamCtrl == NULL) {
1699         LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle Failed", __func__);
1700         return;
1701     }
1702     do {
1703         PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1704         Offset++;
1705         Len--;
1706         switch (data) {
1707             case AVDT_PSC_TRANS: {
1708                 count = AvdtParseCategoryTrans(&streamCtrl->reqCfg, pkt, Offset, &tmp);
1709                 if (tmp != 0) {
1710                     *errCode = AVDT_ERR_BAD_MEDIA_TRANSPORT_FORMAT;
1711                     *errParam = AVDT_PSC_TRANS;
1712                     return;
1713                 }
1714                 break;
1715             }
1716             case AVDT_PSC_CODEC: {
1717                 count = AvdtParseCategoryCodec(&streamCtrl->reqCfg, pkt, Offset);
1718                 break;
1719             }
1720             case AVDT_PSC_DELAY_RPT: {
1721                 count = AvdtParseCategoryDelay(&streamCtrl->reqCfg, pkt, Offset, &tmp);
1722                 break;
1723             }
1724             default:
1725                 LOG_ERROR("[AVDT]%{public}s: The category(0x%x) is not surport now!", __func__, data);
1726                 *errCode = AVDT_ERR_INVALID_CAPABILITIES;
1727                 *errParam = data;
1728                 return;
1729         }
1730         Offset += count;
1731         Len -= count;
1732     } while (Len > 0 && TotalSize > Offset);
1733     return;
1734 }
1735 
1736 /**
1737  *
1738  * @brief        AvdtParseCategoryCodec
1739  *
1740  * @details      Parse the codec content of setconfig.
1741  *
1742  * @return       read data length
1743  *
1744  */
AvdtParseCategoryCodec(AvdtSepConfig * sepConfig,const Packet * pkt,uint16_t offset)1745 uint8_t AvdtParseCategoryCodec(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset)
1746 {
1747     if (sepConfig == NULL) {
1748         return 0;
1749     }
1750     uint8_t data = 0;
1751     uint8_t length = 0;
1752     PacketPayloadRead(pkt, &data, offset, AVDT_1BYTE);
1753 
1754     /* now only surport sbc/aac */
1755     if (data > AVDT_CODEC_SIZE) {
1756         data = AVDT_CODEC_SIZE;
1757     }
1758     offset++;
1759     length++;
1760     sepConfig->codecInfo[0] = data;
1761     PacketPayloadRead(pkt, &(sepConfig->codecInfo[1]), offset, data);
1762     sepConfig->numCodec = data;
1763     offset += data;
1764     length += data;
1765     sepConfig->pscMask = (sepConfig->pscMask | AVDT_PSC_MSK_CODEC);
1766     LOG_DEBUG("[AVDT]%{public}s:offset=%{public}d,length=%{public}d", __func__, offset, length);
1767     return length;
1768 }
1769 /**
1770  *
1771  * @brief        AvdtParseCategoryTrans
1772  *
1773  * @details      Parse the trans media content of setconfig.
1774  *
1775  * @return       read data length
1776  *
1777  */
AvdtParseCategoryTrans(AvdtSepConfig * sepConfig,const Packet * pkt,uint16_t offset,uint8_t * data)1778 uint8_t AvdtParseCategoryTrans(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset, uint8_t *data)
1779 {
1780     if (sepConfig == NULL) {
1781         return 0;
1782     }
1783     uint8_t length = 0;
1784     PacketPayloadRead(pkt, data, offset, AVDT_1BYTE);
1785     length++;
1786     sepConfig->pscMask = (sepConfig->pscMask | AVDT_PSC_MSK_TRANS);
1787     return length;
1788 }
1789 /**
1790  *
1791  * @brief        AvdtParseCategoryDelay
1792  *
1793  * @details      Parse the delay report content of setconfig.
1794  *
1795  * @return       read data length
1796  *
1797  */
AvdtParseCategoryDelay(AvdtSepConfig * sepConfig,const Packet * pkt,uint16_t offset,uint8_t * data)1798 uint8_t AvdtParseCategoryDelay(AvdtSepConfig *sepConfig, const Packet *pkt, uint16_t offset, uint8_t *data)
1799 {
1800     if (sepConfig == NULL) {
1801         return 0;
1802     }
1803     uint8_t length = 0;
1804     PacketPayloadRead(pkt, data, offset, AVDT_1BYTE);
1805     length++;
1806     sepConfig->pscMask = (sepConfig->pscMask | AVDT_PSC_MSK_DELAY_RPT);
1807     return length;
1808 }
1809 /**
1810  *
1811  * @brief        AvdtParseCategorySkip
1812  *
1813  * @details      Skip unsurport type content of setconfig.
1814  *
1815  * @return       read data length
1816  *
1817  */
AvdtParseCategorySkip(const Packet * pkt,uint16_t offset)1818 uint8_t AvdtParseCategorySkip(const Packet *pkt, uint16_t offset)
1819 {
1820     uint8_t data = 0;
1821     PacketPayloadRead(pkt, &data, offset, AVDT_1BYTE);
1822     uint8_t length = data + 1;
1823     return length;
1824 }
1825 /**
1826  *
1827  * @brief        AvdtParseReconfig
1828  *
1829  * @details      Parse the content of reconfig.
1830  *
1831  * @return       void
1832  *
1833  */
AvdtParseReconfig(uint16_t streamHandle,const Packet * pkt,uint16_t off,uint8_t * errCode,uint8_t * errParam)1834 void AvdtParseReconfig(uint16_t streamHandle, const Packet *pkt, uint16_t off, uint8_t *errCode, uint8_t *errParam)
1835 {
1836     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1837     uint16_t TotalSize = PacketSize(pkt);
1838     uint16_t Len = TotalSize;
1839     uint16_t Offset = off;
1840     uint8_t data = 0;
1841     uint8_t tmp;
1842     uint8_t count;
1843     AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(streamHandle);
1844     if (streamCtrl == NULL) {
1845         LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle Failed", __func__);
1846         return;
1847     }
1848     do {
1849         PacketPayloadRead(pkt, &data, Offset, AVDT_1BYTE);
1850         Offset++;
1851         Len--;
1852         switch (data) {
1853             case AVDT_PSC_TRANS: {
1854                 count = AvdtParseCategoryTrans(&streamCtrl->reqCfg, pkt, Offset, &tmp);
1855                 if (tmp != 0) {
1856                     *errCode = AVDT_ERR_BAD_MEDIA_TRANSPORT_FORMAT;
1857                     *errParam = AVDT_PSC_TRANS;
1858                     return;
1859                 }
1860                 break;
1861             }
1862             case AVDT_PSC_CODEC: {
1863                 count = AvdtParseCategoryCodec(&streamCtrl->reqCfg, pkt, Offset);
1864                 break;
1865             }
1866             default:
1867                 LOG_ERROR("[AVDT]%{public}s: The category(0x%x) is not surport now!", __func__, data);
1868                 *errCode = AVDT_ERR_INVALID_CAPABILITIES;
1869                 *errParam = data;
1870                 return;
1871         }
1872         Offset += count;
1873         Len -= count;
1874     } while (Len > 0 && TotalSize > Offset);
1875     LOG_DEBUG("[AVDT]%{public}s:data->getCapCfm.cfg.pscMask is (0x%x)", __func__, streamCtrl->reqCfg.pscMask);
1876     return;
1877 }
1878 
1879 /**
1880  *
1881  * @brief        AvdtIndPktLenCheck
1882  *
1883  * @details      Check packet length is valid for ind command.
1884  *
1885  * @return       valid:0 / invalid: other
1886  *
1887  */
AvdtIndPktLenCheck(AvdtSigCtrl * sigCtrl,uint8_t sigId,const Packet * pkt)1888 uint8_t AvdtIndPktLenCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, const Packet *pkt)
1889 {
1890     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1891     uint8_t Ret = AVDT_SUCCESS;
1892     uint16_t Len = PacketSize(pkt);
1893     switch (sigId) {
1894         case AVDT_SIG_DISCOVER:
1895             break;
1896         case AVDT_SIG_GET_ALLCAP:
1897         case AVDT_SIG_GETCAP:
1898         case AVDT_SIG_GETCONFIG:
1899         case AVDT_SIG_RECONFIG:
1900         case AVDT_SIG_OPEN:
1901         case AVDT_SIG_CLOSE:
1902         case AVDT_SIG_ABORT:
1903         case AVDT_SIG_START:
1904         case AVDT_SIG_SUSPEND:
1905             if (Len < AVDT_SIG_LENGTH_COMM) {
1906                 Ret = AVDT_BAD_PARAMS;
1907             }
1908             break;
1909         case AVDT_SIG_SETCONFIG:
1910             if (Len < AVDT_SIG_LENGTH_SETCONFIG) {
1911                 Ret = AVDT_BAD_PARAMS;
1912             }
1913             break;
1914         case AVDT_SIG_DELAY_RPT:
1915             if (Len < AVDT_SIG_LENGTH_DELAY_RPT) {
1916                 Ret = AVDT_BAD_PARAMS;
1917             }
1918             break;
1919         default:
1920             break;
1921     }
1922     if (Ret != AVDT_SUCCESS) {
1923         LOG_ERROR("[AVDT]%{public}s:BAD LENGTH of the cmd!", __func__);
1924         AvdtIndReject(sigCtrl, sigId, AVDT_ERR_BAD_LENGTH, 0);
1925     }
1926     return Ret;
1927 }
1928 
1929 /**
1930  *
1931  * @brief        AvdtIndSeidCheck
1932  *
1933  * @details      Check se id is valid for ind command.
1934  *
1935  * @return       valid:id / invalid: AVDT_SEID_INVLID
1936  *
1937  */
AvdtIndSeidCheck(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t data)1938 uint8_t AvdtIndSeidCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t data)
1939 {
1940     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1941     uint8_t seid = AVDT_SEID_INVLID;
1942     switch (sigId) {
1943         case AVDT_SIG_DISCOVER:
1944             break;
1945         case AVDT_SIG_GET_ALLCAP:
1946         case AVDT_SIG_GETCAP:
1947         case AVDT_SIG_OPEN:
1948         case AVDT_SIG_CLOSE:
1949         case AVDT_SIG_GETCONFIG:
1950         case AVDT_SIG_ABORT:
1951         case AVDT_SIG_START:
1952         case AVDT_SIG_SUSPEND:
1953         case AVDT_SIG_RECONFIG:
1954         case AVDT_SIG_SETCONFIG:
1955         case AVDT_SIG_DELAY_RPT:
1956             seid = AvdtParseSeid(data);
1957             if (seid == AVDT_SEID_INVLID) {
1958                 LOG_ERROR("[AVDT]%{public}s:BAD SEID of the cmd!", __func__);
1959                 AvdtIndReject(sigCtrl, sigId, AVDT_ERR_BAD_ACP_SEID, 0);
1960             } else {
1961                 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle((uint16_t)seid);
1962                 if (streamCtrl == NULL) {
1963                     LOG_ERROR("[AVDT]%{public}s:AvdtGetStreamCtrlByHandle failed(%hhu)!", __func__, seid);
1964                     AvdtIndReject(sigCtrl, sigId, AVDT_ERR_BAD_ACP_SEID, 0);
1965                     seid = AVDT_SEID_INVLID;
1966                 }
1967             }
1968             break;
1969         default:
1970             break;
1971     }
1972     return seid;
1973 }
1974 
1975 /**
1976  *
1977  * @brief        AvdtMakeRejMsg
1978  *
1979  * @details      Make reject message for received signal.
1980  *
1981  * @return       valid:id / invalid: AVDT_SEID_INVLID
1982  *
1983  */
AvdtMakeRejMsg(uint8_t sigId,uint8_t errCode,uint8_t errParam,AvdtMsg * msg)1984 void AvdtMakeRejMsg(uint8_t sigId, uint8_t errCode, uint8_t errParam, AvdtMsg *msg)
1985 {
1986     LOG_DEBUG("[AVDT]%{public}s:", __func__);
1987     switch (sigId) {
1988         case AVDT_SIG_DISCOVER:
1989             break;
1990         case AVDT_SIG_GETCONFIG:
1991         case AVDT_SIG_OPEN:
1992         case AVDT_SIG_CLOSE:
1993         case AVDT_SIG_ABORT:
1994         case AVDT_SIG_START:
1995         case AVDT_SIG_SUSPEND:
1996             msg->single.errCode = errCode;
1997             msg->single.errParam = errParam;
1998             break;
1999         case AVDT_SIG_GETCAP:
2000         case AVDT_SIG_GET_ALLCAP:
2001             msg->getcap.single.errCode = errCode;
2002             msg->getcap.single.errParam = errParam;
2003             break;
2004         case AVDT_SIG_SETCONFIG:
2005             msg->configureCmd.hdr.errCode = errCode;
2006             msg->configureCmd.hdr.errParam = errParam;
2007             break;
2008         case AVDT_SIG_RECONFIG:
2009             msg->reconfigureCmd.hdr.errCode = errCode;
2010             msg->reconfigureCmd.hdr.errParam = errParam;
2011             break;
2012         case AVDT_SIG_DELAY_RPT:
2013             msg->delayRptCmd.hdr.errCode = errCode;
2014             msg->delayRptCmd.hdr.errParam = errParam;
2015             break;
2016         default:
2017             break;
2018     }
2019     return;
2020 }
2021 
2022 /**
2023  *
2024  * @brief        AvdtServiceCapCheck
2025  *
2026  * @details      Service capabilities valid check.
2027  *
2028  * @return       valid:0 / invalid: other
2029  *
2030  */
AvdtServiceCapCheck(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t data)2031 uint8_t AvdtServiceCapCheck(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t data)
2032 {
2033     LOG_DEBUG("[AVDT]%{public}s:", __func__);
2034     uint8_t Ret = AVDT_SUCCESS;
2035     uint8_t err = 0;
2036     if (data > AVDT_PSC_MAX_CUR) {
2037         err = AVDT_ERR_BAD_SERV_CATEGORY;
2038     } else if (sigId == AVDT_SIG_RECONFIG && data != AVDT_PSC_CODEC) {
2039         err = AVDT_ERR_INVALID_CAPABILITIES;
2040     } else if ((data != AVDT_PSC_TRANS) && (data != AVDT_PSC_CODEC) && (data != AVDT_PSC_DELAY_RPT)
2041         && (data != AVDT_PSC_PROTECT)) {
2042         err = AVDT_ERR_INVALID_CAPABILITIES;
2043     }
2044     if (err != 0) {
2045         LOG_ERROR("[AVDT]%{public}s:BAD Service Category of the cmd(0x%x)!", __func__, sigId);
2046         AvdtIndReject(sigCtrl, sigId, err, data);
2047         Ret = AVDT_BAD_PARAMS;
2048     }
2049     return Ret;
2050 }
2051 
2052 /**
2053  *
2054  * @brief        AvdtIndReject
2055  *
2056  * @details      Send reject message by signal.
2057  *
2058  * @return       void
2059  *
2060  */
AvdtIndReject(AvdtSigCtrl * sigCtrl,uint8_t sigId,uint8_t errCode,uint8_t errParam)2061 void AvdtIndReject(AvdtSigCtrl *sigCtrl, uint8_t sigId, uint8_t errCode, uint8_t errParam)
2062 {
2063     LOG_DEBUG("[AVDT]%{public}s:", __func__);
2064     AvdtMsg avdtMsgData = {0};
2065     AvdtMakeRejMsg(sigId, errCode, errParam, &avdtMsgData);
2066     AvdtMsgSendRej(sigCtrl, sigId, &avdtMsgData);
2067     return;
2068 }
2069