• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 /**
17  * @file att_common.c
18  *
19  * @brief implement common function to be called.
20  *
21  */
22 
23 #include "att_common.h"
24 #include "att_connect.h"
25 
26 #include <stdlib.h>
27 
28 #include "alarm.h"
29 #include "log.h"
30 
31 #include "platform/include/allocator.h"
32 
33 #include "../btm/btm_thread.h"
34 
35 static AttConnectInfo g_connectInfo[MAXCONNECT] = {0};
36 static AttConnectingInfo g_connecting[MAXCONNECT] = {0};
37 static AttClientDataCallback g_attClientCallback;
38 static AttServerDataCallback g_attServerCallback;
39 static AttClientSendDataCallback g_attClientSendDataCB;
40 static AttServerSendDataCallback g_attServerSendDataCB;
41 static AttConnectedCallback g_attConnect;
42 #define FUNCTIONLIST 256
43 recvDataFunction g_functionList[FUNCTIONLIST];
44 
45 typedef struct LeRecvSendDataCallbackAsyncContext {
46     uint16_t aclHandle;
47     int result;
48 } LeRecvSendDataCallbackAsyncContext;
49 
50 typedef struct BREDRRecvSendDataCallbackAsyncContext {
51     uint16_t lcid;
52     int result;
53 } BREDRRecvSendDataCallbackAsyncContext;
54 
55 typedef struct TransactionTimeOutContext {
56     uint16_t connectHandle;
57 } TransactionTimeOutContext;
58 
59 typedef struct AttRecvDataAsyncContext {
60     uint16_t lcid;
61     Packet *packet;
62     void *ctx;
63 } AttRecvDataAsyncContext;
64 
65 typedef struct AttRecvLeDataAsyncContext {
66     uint16_t aclHandle;
67     Packet *packet;
68 } AttRecvLeDataAsyncContext;
69 
70 typedef struct AttConnectRegisterContext {
71     AttConnectCallback connectBack;
72     void *context;
73 } AttConnectRegisterContext;
74 
75 static void AttTransactionTimeOut(const void *parameter);
76 
77 static void AttClientDataRegisterAsync(const void *context);
78 static void AttClientDataRegisterAsyncDestroy(const void *context);
79 static void AttClientDataDeregisterAsync(const void *context);
80 static void AttClientDataDeregisterAsyncDestroy(const void *context);
81 
82 static void AttServerDataRegisterAsync(const void *context);
83 static void AttServerDataRegisterAsyncDestroy(const void *context);
84 static void AttServerDataDeregisterAsync(const void *context);
85 static void AttServerDataDeregisterAsyncDestroy(const void *context);
86 
87 static void LeRecvSendDataCallbackAsync(const void *context);
88 static void LeRecvSendDataCallbackAsyncDestroy(const void *context);
89 
90 static void BREDRRecvSendDataCallbackAsync(const void *context);
91 static void BREDRRecvSendDataCallbackAsyncDestroy(const void *context);
92 
93 static void AttTransactionTimeOutAsync(const void *context);
94 static void AttTransactionTimeOutAsyncDestroy(const void *context);
95 
96 static recvDataFunction GetFunction(uint8_t opcode);
97 
98 static void AttRecvDataAsync(const void *context);
99 static void AttRecvDataAsyncDestroy(const void *context);
100 static void AttRecvLeDataAsync(const void *context);
101 static void AttRecvLeDataAsyncDestroy(const void *context);
102 
103 static void AttConnectRegisterAsync(const void *context);
104 static void AttConnectRegisterAsyncDestroy(const void *context);
105 static void AttConnectDeregisterAsync(const void *context);
106 static void AttConnectDeregisterAsyncDestroy(const void *context);
107 
108 static void AttBREDRSendRespCallbackAsync(const void *context);
109 static void AttBREDRSendRespCallbackAsyncDestroy(const void *context);
110 static void AttBREDRSendRespCallback(uint16_t lcid, int result);
111 
112 static void AttLeSendRespCallbackAsync(const void *context);
113 static void AttLeSendRespCallbackAsyncDestroy(const void *context);
114 static void AttLeSendRespCallback(uint16_t aclHandle, int result);
115 
AttTransactionTimeOutAsync(const void * context)116 static void AttTransactionTimeOutAsync(const void *context)
117 {
118     LOG_INFO("%{public}s enter", __FUNCTION__);
119 
120     TransactionTimeOutContext *transTimeOutPtr = (TransactionTimeOutContext *)context;
121     AttConnectInfo *connect = NULL;
122     int listSize;
123     AttClientDataCallback *attClientDataCallback = NULL;
124     AttServerDataCallback *attServerDataCallback = NULL;
125     uint16_t index = 0;
126 
127     AttGetConnectInfoIndexByConnectHandle(transTimeOutPtr->connectHandle, &index, &connect);
128 
129     if (connect == NULL) {
130         LOG_INFO("%{public}s connect == NULL and goto ATTTRANSACTIONTIMEOUT_END", __FUNCTION__);
131         goto ATTTRANSACTIONTIMEOUT_END;
132     }
133 
134     if (!connect->serverSendFlag) {
135         attClientDataCallback = AttGetATTClientCallback();
136         if ((attClientDataCallback == NULL) || (attClientDataCallback->attClientCallback == NULL)) {
137             LOG_WARN("%{public}s attClientDataCallback or attClientDataCallback->attClientCallback is NULL", __FUNCTION__);
138         } else {
139             attClientDataCallback->attClientCallback(
140                 connect->retGattConnectHandle, ATT_TRANSACTION_TIME_OUT_ID, NULL, NULL, attClientDataCallback->context);
141         }
142     } else {
143         connect->serverSendFlag = false;
144         attServerDataCallback = AttGetATTServerCallback();
145         if ((attServerDataCallback == NULL) || (attServerDataCallback->attServerCallback == NULL)) {
146             LOG_WARN("%{public}s attServerDataCallback or attServerDataCallback->attServerCallback is NULL", __FUNCTION__);
147         } else {
148             attServerDataCallback->attServerCallback(
149                 connect->retGattConnectHandle, ATT_TRANSACTION_TIME_OUT_ID, NULL, NULL, attServerDataCallback->context);
150         }
151     }
152 
153     InitiativeDisconnect(transTimeOutPtr->connectHandle);
154     listSize = ListGetSize(connect->instruct);
155     for (; listSize > 0; --listSize) {
156         ListRemoveLast(connect->instruct);
157     }
158 
159 ATTTRANSACTIONTIMEOUT_END:
160     MEM_MALLOC.free(transTimeOutPtr);
161     return;
162 }
163 
AttTransactionTimeOutAsyncDestroy(const void * context)164 static void AttTransactionTimeOutAsyncDestroy(const void *context)
165 {
166     LOG_INFO("%{public}s enter", __FUNCTION__);
167 
168     TransactionTimeOutContext *transTimeOutPtr = (TransactionTimeOutContext *)context;
169 
170     MEM_MALLOC.free(transTimeOutPtr);
171 
172     return;
173 }
174 
175 /**
176  * @brief att transaction timeout.
177  *
178  * @param parameter Indicates the pointer to parameter.
179  */
AttTransactionTimeOut(const void * parameter)180 static void AttTransactionTimeOut(const void *parameter)
181 {
182     LOG_INFO("%{public}s enter", __FUNCTION__);
183 
184     AttConnectInfo *connect = (AttConnectInfo *)parameter;
185     TransactionTimeOutContext *transTimeOutPtr = MEM_MALLOC.alloc(sizeof(TransactionTimeOutContext));
186     if (transTimeOutPtr == NULL) {
187         LOG_ERROR("point to NULL");
188         return;
189     }
190     transTimeOutPtr->connectHandle = connect->retGattConnectHandle;
191 
192     AttAsyncProcess(AttTransactionTimeOutAsync, AttTransactionTimeOutAsyncDestroy, transTimeOutPtr);
193 
194     return;
195 }
196 
197 /**
198  * @brief get AttConnectInfo information.
199  *
200  * @return Returns the pointer to AttConnectInfo.
201  */
AttGetConnectStart()202 AttConnectInfo *AttGetConnectStart()
203 {
204     LOG_INFO("%{public}s enter", __FUNCTION__);
205 
206     return g_connectInfo;
207 }
208 
209 /**
210  * @brief lookup AttConnectInfo info by aclHandle.
211  *
212  * @param1 aclHandle Indicates the aclHandle.
213  * @param2 connect Indicates the second rank pointer to AttConnectInfo.
214  */
AttGetConnectInfoIndexByAclHandle(uint16_t aclHandle,AttConnectInfo ** connect)215 void AttGetConnectInfoIndexByAclHandle(uint16_t aclHandle, AttConnectInfo **connect)
216 {
217     LOG_INFO("%{public}s enter, aclHandle = %hu", __FUNCTION__, aclHandle);
218 
219     uint16_t index = 0;
220 
221     for (; index < MAXCONNECT; ++index) {
222         if (g_connectInfo[index].aclHandle == aclHandle) {
223             break;
224         }
225     }
226 
227     if (index != MAXCONNECT) {
228         *connect = &g_connectInfo[index];
229     } else {
230         *connect = NULL;
231     }
232 
233     LOG_INFO("%{public}s return: index = %hu", __FUNCTION__, index);
234     return;
235 }
236 
237 /**
238  * @brief lookup AttConnectInfo info by cid.
239  *
240  * @param1 cid Indicates the cid.
241  * @param2 connect Indicates the second rank pointer to AttConnectInfo.
242  */
AttGetConnectInfoIndexByCid(uint16_t cid,AttConnectInfo ** connect)243 void AttGetConnectInfoIndexByCid(uint16_t cid, AttConnectInfo **connect)
244 {
245     LOG_INFO("%{public}s enter, cid = %hu", __FUNCTION__, cid);
246 
247     uint16_t index = 0;
248 
249     for (; index < MAXCONNECT; ++index) {
250         if (g_connectInfo[index].transportType == BT_TRANSPORT_BR_EDR) {
251             if (g_connectInfo[index].AttConnectID.bredrcid == cid) {
252                 break;
253             }
254         }
255         if (g_connectInfo[index].transportType == BT_TRANSPORT_LE) {
256             if (g_connectInfo[index].aclHandle == cid) {
257                 break;
258             }
259         }
260     }
261 
262     if (index != MAXCONNECT) {
263         *connect = &g_connectInfo[index];
264     } else {
265         *connect = NULL;
266     }
267 
268     LOG_INFO("%{public}s return: index = %hu", __FUNCTION__, index);
269     return;
270 }
271 
272 /**
273  * @brief lookup AttConnectInfo info by cid and output parameter index.
274  *
275  * @param1 cid Indicates the cid.
276  * @param2 index Indicates the pointer to index.
277  * @param3 connect Indicates second rank pointer to AttConnectInfo.
278  */
AttGetConnectInfoIndexByCidOutIndex(uint16_t cid,uint16_t * index,AttConnectInfo ** connect)279 void AttGetConnectInfoIndexByCidOutIndex(uint16_t cid, uint16_t *index, AttConnectInfo **connect)
280 {
281     LOG_INFO("%{public}s enter,cid = %hu", __FUNCTION__, cid);
282 
283     uint16_t indexNumber = 0;
284 
285     for (; indexNumber < MAXCONNECT; ++indexNumber) {
286         if (g_connectInfo[indexNumber].AttConnectID.bredrcid == cid) {
287             break;
288         }
289     }
290 
291     *index = indexNumber;
292 
293     if (indexNumber != MAXCONNECT) {
294         *connect = &g_connectInfo[indexNumber];
295     } else {
296         *connect = NULL;
297     }
298 
299     LOG_INFO("%{public}s return: *index = %hu", __FUNCTION__, *index);
300     return;
301 }
302 
303 /**
304  * @brief lookup AttConnectInfo info by connectHandle and output parameter index.
305  *
306  * @param1 connectHandle Indicates the connectHandle.
307  * @param2 index Indicates the pointer to index.
308  * @param3 connect Indicates the Secondary pointer to AttConnectInfo.
309  */
AttGetConnectInfoIndexByConnectHandle(uint16_t connectHandle,uint16_t * index,AttConnectInfo ** connect)310 void AttGetConnectInfoIndexByConnectHandle(uint16_t connectHandle, uint16_t *index, AttConnectInfo **connect)
311 {
312     LOG_INFO("%{public}s enter, connectHandle = %hu", __FUNCTION__, connectHandle);
313 
314     uint16_t inindex = 0;
315 
316     for (; inindex < MAXCONNECT; ++inindex) {
317         if (g_connectInfo[inindex].retGattConnectHandle == connectHandle) {
318             break;
319         }
320     }
321 
322     *index = inindex;
323 
324     if (inindex != MAXCONNECT) {
325         *connect = &g_connectInfo[inindex];
326 
327         goto ATTGETCONNECTINFOINDEXBYCONNECTHANDLE_END;
328     } else {
329         *connect = NULL;
330         *index = MAXCONNECT;
331         goto ATTGETCONNECTINFOINDEXBYCONNECTHANDLE_END;
332     }
333 
334 ATTGETCONNECTINFOINDEXBYCONNECTHANDLE_END:
335     LOG_INFO("%{public}s return: *index = %hu", __FUNCTION__, *index);
336     return;
337 }
338 
339 /**
340  * @brief gatt register client data to att in self thread..
341  *
342  * @param context Indicates the pointer to context.
343  */
AttClientDataRegisterAsync(const void * context)344 static void AttClientDataRegisterAsync(const void *context)
345 {
346     LOG_INFO("%{public}s enter", __FUNCTION__);
347 
348     AttClientDataCallback *attClientDataCallbackAsyncPtr = (AttClientDataCallback *)context;
349 
350     g_attClientCallback.attClientCallback = attClientDataCallbackAsyncPtr->attClientCallback;
351     g_attClientCallback.context = attClientDataCallbackAsyncPtr->context;
352 
353     MEM_MALLOC.free(attClientDataCallbackAsyncPtr);
354 
355     return;
356 }
357 
358 /**
359  * @brief destroy gatt register client data to att in self thread..
360  *
361  * @param context Indicates the pointer to context.
362  */
AttClientDataRegisterAsyncDestroy(const void * context)363 static void AttClientDataRegisterAsyncDestroy(const void *context)
364 {
365     LOG_INFO("%{public}s enter", __FUNCTION__);
366 
367     AttClientDataCallback *attClientDataCallbackAsyncPtr = (AttClientDataCallback *)context;
368 
369     MEM_MALLOC.free(attClientDataCallbackAsyncPtr);
370 
371     return;
372 }
373 
374 /**
375  * @brief gatt register client data to att.
376  *
377  * @param1 dataCallback Indicates the pointer to callback.
378  * @param2 context Indicates the pointer to context.
379  */
ATT_ClientDataRegister(attCallback dataCallback,void * context)380 void ATT_ClientDataRegister(attCallback dataCallback, void *context)
381 {
382     LOG_INFO("%{public}s enter", __FUNCTION__);
383 
384     AttClientDataCallback *attClientDataCallbackAsyncPtr = MEM_MALLOC.alloc(sizeof(AttClientDataCallback));
385     if (attClientDataCallbackAsyncPtr == NULL) {
386         LOG_ERROR("point to NULL");
387         return;
388     }
389     attClientDataCallbackAsyncPtr->attClientCallback = dataCallback;
390     attClientDataCallbackAsyncPtr->context = context;
391 
392     AttAsyncProcess(AttClientDataRegisterAsync, AttClientDataRegisterAsyncDestroy, attClientDataCallbackAsyncPtr);
393 
394     return;
395 }
396 
397 /**
398  * @brief gatt deregister client data to att in self thread..
399  *
400  * @param context Indicates the pointer to context.
401  */
AttClientDataDeregisterAsync(const void * context)402 static void AttClientDataDeregisterAsync(const void *context)
403 {
404     LOG_INFO("%{public}s enter", __FUNCTION__);
405 
406     g_attClientCallback.attClientCallback = NULL;
407     g_attClientCallback.context = NULL;
408 
409     return;
410 }
411 
412 /**
413  * @brief destroy gatt deregister client data to att in self thread..
414  *
415  * @param context Indicates the pointer to context.
416  */
AttClientDataDeregisterAsyncDestroy(const void * context)417 static void AttClientDataDeregisterAsyncDestroy(const void *context)
418 {
419     LOG_INFO("%{public}s enter", __FUNCTION__);
420 
421     return;
422 }
423 
424 /**
425  * @brief gatt deregister client data to att.
426  *
427  */
ATT_ClientDataDeregister()428 void ATT_ClientDataDeregister()
429 {
430     LOG_INFO("%{public}s enter", __FUNCTION__);
431 
432     AttAsyncProcess(AttClientDataDeregisterAsync, AttClientDataDeregisterAsyncDestroy, NULL);
433 
434     return;
435 }
436 
437 /**
438  * @brief gatt register server data to att in self thread..
439  *
440  * @param context Indicates the pointer to context.
441  */
AttServerDataRegisterAsync(const void * context)442 static void AttServerDataRegisterAsync(const void *context)
443 {
444     LOG_INFO("%{public}s enter", __FUNCTION__);
445 
446     AttServerDataCallback *attServerDataCallbackAsyncPtr = (AttServerDataCallback *)context;
447 
448     g_attServerCallback.attServerCallback = attServerDataCallbackAsyncPtr->attServerCallback;
449     g_attServerCallback.context = attServerDataCallbackAsyncPtr->context;
450 
451     MEM_MALLOC.free(attServerDataCallbackAsyncPtr);
452 
453     return;
454 }
455 
456 /**
457  * @brief destroy gatt register server data to att in self thread..
458  *
459  * @param context Indicates the pointer to context.
460  */
AttServerDataRegisterAsyncDestroy(const void * context)461 static void AttServerDataRegisterAsyncDestroy(const void *context)
462 {
463     LOG_INFO("%{public}s enter", __FUNCTION__);
464 
465     AttServerDataCallback *attServerDataCallbackAsyncPtr = (AttServerDataCallback *)context;
466 
467     MEM_MALLOC.free(attServerDataCallbackAsyncPtr);
468 
469     return;
470 }
471 
472 /**
473  * @brief gatt register server data to att.
474  *
475  * @param1 dataCallback Indicates the pointer to callback.
476  * @param2 context Indicates the pointer to context.
477  */
ATT_ServerDataRegister(attCallback dataCallback,void * context)478 void ATT_ServerDataRegister(attCallback dataCallback, void *context)
479 {
480     LOG_INFO("%{public}s enter", __FUNCTION__);
481 
482     AttServerDataCallback *attServerDataCallbackAsyncPtr = MEM_MALLOC.alloc(sizeof(AttServerDataCallback));
483     if (attServerDataCallbackAsyncPtr == NULL) {
484         LOG_ERROR("point to NULL");
485         return;
486     }
487     attServerDataCallbackAsyncPtr->attServerCallback = dataCallback;
488     attServerDataCallbackAsyncPtr->context = context;
489 
490     AttAsyncProcess(AttServerDataRegisterAsync, AttServerDataRegisterAsyncDestroy, attServerDataCallbackAsyncPtr);
491 
492     return;
493 }
494 
495 /**
496  * @brief destroy gatt deregister server data to att in self thread..
497  *
498  * @param context Indicates the pointer to context.
499  */
AttServerDataDeregisterAsync(const void * context)500 static void AttServerDataDeregisterAsync(const void *context)
501 {
502     LOG_INFO("%{public}s enter", __FUNCTION__);
503 
504     g_attServerCallback.attServerCallback = NULL;
505     g_attServerCallback.context = NULL;
506 
507     return;
508 }
509 
510 /**
511  * @brief destroy gatt deregister server data to att in self thread..
512  *
513  * @param context Indicates the pointer to context.
514  */
AttServerDataDeregisterAsyncDestroy(const void * context)515 static void AttServerDataDeregisterAsyncDestroy(const void *context)
516 {
517     LOG_INFO("%{public}s enter", __FUNCTION__);
518 
519     return;
520 }
521 
522 /**
523  * @brief gatt deregister server data to att.
524  *
525  */
ATT_ServerDataDeregister()526 void ATT_ServerDataDeregister()
527 {
528     LOG_INFO("%{public}s enter", __FUNCTION__);
529 
530     AttAsyncProcess(AttServerDataDeregisterAsync, AttServerDataDeregisterAsyncDestroy, NULL);
531 
532     return;
533 }
534 
535 /**
536  * @brief get AttClientDataCallback information.
537  *
538  * @return Returns the pointer to AttClientDataCallback.
539  */
AttGetATTClientCallback()540 AttClientDataCallback *AttGetATTClientCallback()
541 {
542     LOG_INFO("%{public}s enter", __FUNCTION__);
543 
544     return &g_attClientCallback;
545 }
546 
547 /**
548  * @brief get AttServerDataCallback information.
549  *
550  * @return Returns the pointer to AttServerDataCallback.
551  */
AttGetATTServerCallback()552 AttServerDataCallback *AttGetATTServerCallback()
553 {
554     LOG_INFO("%{public}s enter", __FUNCTION__);
555 
556     return &g_attServerCallback;
557 }
558 
559 /**
560  * @brief initiative execut instructions by Scheduling.
561  *
562  * @param connect Indicates the pointer to AttConnectInfo.
563  * @return Returns <b>0</b> if the operation is successful; returns <b>!0</b> if the operation fails.
564  */
AttSendSequenceScheduling(const AttConnectInfo * connect)565 int AttSendSequenceScheduling(const AttConnectInfo *connect)
566 {
567     LOG_INFO("%{public}s enter, listsize = %u", __FUNCTION__, ListGetSize(connect->instruct));
568 
569     int ret = BT_NO_ERROR;
570 
571     if (ListGetSize(connect->instruct) == 1) {
572         ListNode *listNodePtr = ListGetFirstNode(connect->instruct);
573         if (listNodePtr == NULL) {
574             LOG_INFO("%{public}s listNodePtr == NULL", __FUNCTION__);
575             ret = BT_OPERATION_FAILED;
576             goto ATTSENDSEQUENCESCHEDULING_END;
577         }
578         Packet *packet = ListGetNodeData(listNodePtr);
579         if (connect->transportType == BT_TRANSPORT_LE) {
580             ret = L2CIF_LeSendFixChannelData(connect->aclHandle, (uint16_t)LE_CID, packet, LeRecvSendDataCallback);
581         }
582         if (connect->transportType == BT_TRANSPORT_BR_EDR) {
583             ret = L2CIF_SendData(connect->AttConnectID.bredrcid, packet, BREDRRecvSendDataCallback);
584         }
585         if (ret != BT_NO_ERROR) {
586             LOG_INFO("%{public}s call l2cap interface return not success", __FUNCTION__);
587         } else {
588             AlarmSet(
589                 connect->alarm, (uint64_t)INSTRUCTIONTIMEOUT, (void (*)(void *))AttTransactionTimeOut, (void *)connect);
590         }
591     }
592 
593 ATTSENDSEQUENCESCHEDULING_END:
594     return ret;
595 }
596 
597 /**
598  * @brief execut instructions by Scheduling after receiving response.
599  *
600  * @param connect Indicates the pointer to AttConnectInfo.
601  */
AttReceiveSequenceScheduling(const AttConnectInfo * connect)602 void AttReceiveSequenceScheduling(const AttConnectInfo *connect)
603 {
604     LOG_INFO("%{public}s enter, listsize = %u, transportType = %hhu",
605         __FUNCTION__,
606         ListGetSize(connect->instruct),
607         connect->transportType);
608 
609     int ret = BT_OPERATION_FAILED;
610 
611     if (ListGetSize(connect->instruct) > 0) {
612         ListNode *listNodePtr = ListGetFirstNode(connect->instruct);
613         if (listNodePtr == NULL) {
614             LOG_INFO("%{public}s listNodePtr == NULL", __FUNCTION__);
615             goto ATTRECEIVESEQUENCESCHEDULING_END;
616         }
617         Packet *PacketPtr = ListGetNodeData(listNodePtr);
618         if (connect->transportType == BT_TRANSPORT_LE) {
619             ret = L2CIF_LeSendFixChannelData(connect->aclHandle, (uint16_t)LE_CID, PacketPtr, LeRecvSendDataCallback);
620         }
621         if (connect->transportType == BT_TRANSPORT_BR_EDR) {
622             ret = L2CIF_SendData(connect->AttConnectID.bredrcid, PacketPtr, BREDRRecvSendDataCallback);
623         }
624 
625         if (ret != BT_NO_ERROR) {
626             LOG_INFO("%{public}s call l2cap interface return not success", __FUNCTION__);
627         } else {
628             AlarmSet(connect->alarm,
629                 (uint64_t)INSTRUCTIONTIMEOUT,
630                 (void (*)(void *))AttTransactionTimeOut,
631                 (AttConnectInfo *)connect);
632         }
633     }
634 
635 ATTRECEIVESEQUENCESCHEDULING_END:
636     return;
637 }
638 
639 /**
640  * @brief get AttConnectingInfo information.
641  *
642  * @return Returns the pointer to AttConnectingInfo.
643  */
AttGetConnectingStart()644 AttConnectingInfo *AttGetConnectingStart()
645 {
646     LOG_INFO("%{public}s enter", __FUNCTION__);
647 
648     return g_connecting;
649 }
650 
651 /**
652  * @brief lookup AttConnectingInfo info by cid.
653  *
654  * @param1 cid Indicates the cid.
655  * @param2 connecting Indicates the Secondary pointer to AttConnectingInfo.
656  */
AttGetConnectingIndexByCid(uint16_t cid,AttConnectingInfo ** connecting)657 void AttGetConnectingIndexByCid(uint16_t cid, AttConnectingInfo **connecting)
658 {
659     LOG_INFO("%{public}s enter, cid = %hu", __FUNCTION__, cid);
660 
661     uint16_t index = 0;
662 
663     for (; index < MAXCONNECT; ++index) {
664         if (g_connecting[index].cid == cid) {
665             break;
666         }
667     }
668 
669     if (index != MAXCONNECT) {
670         *connecting = &g_connecting[index];
671         goto ATTGETCONNECTINGINDEXBYCID_END;
672     } else {
673         *connecting = NULL;
674         goto ATTGETCONNECTINGINDEXBYCID_END;
675     }
676 
677 ATTGETCONNECTINGINDEXBYCID_END:
678     LOG_INFO("%{public}s return: index = %hu", __FUNCTION__, index);
679     return;
680 }
681 
682 /**
683  * @brief lookup AttConnectingInfo info by cid and output parameter index.
684  *
685  * @param1 cid Indicates the cid.
686  * @param2 index Indicates the pointer to index.
687  * @param3 connecting Indicates the Secondary pointer to AttConnectingInfo.
688  */
AttGetConnectingIndexByCidOutIndex(uint16_t cid,uint16_t * index,AttConnectingInfo ** connecting)689 void AttGetConnectingIndexByCidOutIndex(uint16_t cid, uint16_t *index, AttConnectingInfo **connecting)
690 {
691     LOG_INFO("%{public}s enter,cid = %hu", __FUNCTION__, cid);
692 
693     uint16_t indexNumber = 0;
694 
695     for (; indexNumber < MAXCONNECT; ++indexNumber) {
696         if (g_connecting[indexNumber].cid == cid) {
697             break;
698         }
699     }
700 
701     if (indexNumber != MAXCONNECT) {
702         *connecting = &g_connecting[indexNumber];
703         *index = indexNumber;
704         goto ATTGETCONNECTINGINDEXBYCIDOUTINDEX_END;
705     } else {
706         *connecting = NULL;
707         *index = MAXCONNECT;
708         goto ATTGETCONNECTINGINDEXBYCIDOUTINDEX_END;
709     }
710 
711 ATTGETCONNECTINGINDEXBYCIDOUTINDEX_END:
712     LOG_INFO("%{public}s return: *index = %hu", __FUNCTION__, *index);
713     return;
714 }
715 
716 /**
717  * @brief lookup AttConnectingInfo info by connectHandle.
718  *
719  * @param1 connectHandle Indicates the connectHandle.
720  * @param2 connecting Indicates the Secondary pointer to AttConnectingInfo.
721  */
AttGetConnectingIndexByConnectHandle(uint16_t connectHandle,AttConnectingInfo ** connecting)722 void AttGetConnectingIndexByConnectHandle(uint16_t connectHandle, AttConnectingInfo **connecting)
723 {
724     LOG_INFO("%{public}s enter, connectHandle = %hu", __FUNCTION__, connectHandle);
725 
726     uint16_t index = 0;
727 
728     for (; index < MAXCONNECT; ++index) {
729         if (g_connecting[index].connectHandle == connectHandle) {
730             break;
731         }
732     }
733 
734     if (index != MAXCONNECT) {
735         *connecting = &g_connecting[index];
736         goto ATTGETCONNECTINGINDEXBYCONNECTHANDLE_END;
737     } else {
738         *connecting = NULL;
739         goto ATTGETCONNECTINGINDEXBYCONNECTHANDLE_END;
740     }
741 
742 ATTGETCONNECTINGINDEXBYCONNECTHANDLE_END:
743     LOG_INFO("%{public}s return: index = %hu", __FUNCTION__, index);
744     return;
745 }
746 
747 /**
748  * @brief lookup AttConnectingInfo info by cid and connectHandle, result to output parameter index.
749  *
750  * @param1 cid Indicates the cid.
751  * @param2 connectHandle Indicates the connectHandle.
752  * @param3 index Indicates the pointer to index.
753  * @param4 connecting Indicates the Secondary pointer to AttConnectingInfo.
754  */
AttGetConnectingIndexByCidConnectHandle(uint16_t cid,uint16_t connectHandle,uint16_t * index,AttConnectingInfo ** connecting)755 void AttGetConnectingIndexByCidConnectHandle(
756     uint16_t cid, uint16_t connectHandle, uint16_t *index, AttConnectingInfo **connecting)
757 {
758     LOG_INFO("%{public}s enter, cid = %hu,connectHandle = %hu", __FUNCTION__, cid, connectHandle);
759 
760     uint16_t inindex = 0;
761 
762     for (; inindex < MAXCONNECT; ++inindex) {
763         if ((g_connecting[inindex].cid == cid) && (g_connecting[inindex].connectHandle == connectHandle)) {
764             break;
765         }
766     }
767 
768     *index = inindex;
769 
770     if (inindex != MAXCONNECT) {
771         *connecting = &g_connecting[inindex];
772         goto ATTGETCONNECTINGINDEXBYCIDCONNECTHANDLE_END;
773     } else {
774         *connecting = NULL;
775         goto ATTGETCONNECTINGINDEXBYCIDCONNECTHANDLE_END;
776     }
777 
778 ATTGETCONNECTINGINDEXBYCIDCONNECTHANDLE_END:
779     LOG_INFO("%{public}s return: *index = %hu", __FUNCTION__, *index);
780     return;
781 }
782 
783 /**
784  * @brief lookup AttConnectingInfo info by addr.
785  *
786  * @param1 addr Indicates the pointer to const BtAddr.
787  * @param2 connecting Indicates the second rank pointer to AttConnectingInfo.
788  */
AttGetConnectingIndexByAddr(const BtAddr * addr,AttConnectingInfo ** connecting)789 void AttGetConnectingIndexByAddr(const BtAddr *addr, AttConnectingInfo **connecting)
790 {
791     LOG_INFO("%{public}s enter", __FUNCTION__);
792 
793     uint16_t index = 0;
794 
795     for (; index < MAXCONNECT; ++index) {
796         if (!memcmp(g_connecting[index].addr.addr, addr->addr, ADDRESSLEN)) {
797             break;
798         }
799     }
800 
801     if (index != MAXCONNECT) {
802         *connecting = &g_connecting[index];
803         goto ATTGETCONNECTINGINDEXBYADDR_END;
804     } else {
805         *connecting = NULL;
806         goto ATTGETCONNECTINGINDEXBYADDR_END;
807     }
808 
809 ATTGETCONNECTINGINDEXBYADDR_END:
810     LOG_INFO("%{public}s return: index = %hu", __FUNCTION__, index);
811     return;
812 }
813 
814 /**
815  * @brief lookup AttConnectingInfo info by addr cid.
816  *
817  * @param1 addr Indicates the pointer to addr.
818  * @param2 addr Indicates the cid.
819  * @param3 connect Indicates the second rank pointer to AttConnectingInfo.
820  */
AttGetConnectingIndexByAddrUninitializedCid(const BtAddr * addr,AttConnectingInfo ** connecting)821 void AttGetConnectingIndexByAddrUninitializedCid(const BtAddr *addr, AttConnectingInfo **connecting)
822 {
823     LOG_INFO("%{public}s enter", __FUNCTION__);
824 
825     uint16_t index = 0;
826 
827     for (; index < MAXCONNECT; ++index) {
828         if ((!memcmp(g_connecting[index].addr.addr, addr->addr, ADDRESSLEN)) && (g_connecting[index].cid == 0)) {
829             break;
830         }
831     }
832 
833     LOG_INFO("%{public}s,index = %hu", __FUNCTION__, index);
834 
835     if (index != MAXCONNECT) {
836         *connecting = &g_connecting[index];
837         goto ATTGETCONNECTINGINDEXBYADDRUNINITIALIZEDCID_END;
838     } else {
839         *connecting = NULL;
840         goto ATTGETCONNECTINGINDEXBYADDRUNINITIALIZEDCID_END;
841     }
842 
843 ATTGETCONNECTINGINDEXBYADDRUNINITIALIZEDCID_END:
844     LOG_INFO("%{public}s return: index = %hu", __FUNCTION__, index);
845     return;
846 }
847 
848 /**
849  * @brief lookup AttConnectingInfo info by addr aclhandle cid.
850  *
851  * @param1 addr Indicates pointer to addr.
852  * @param2 addr Indicates the aclHandle.
853  * @param3 addr Indicates the cid.
854  * @param2 connect Indicates the second rank pointer to AttConnectingInfo.
855  */
AttGetConnectingIndexByAddrAclhandleCid(const BtAddr * addr,uint16_t aclHandle,uint16_t cid,AttConnectingInfo ** connecting)856 void AttGetConnectingIndexByAddrAclhandleCid(
857     const BtAddr *addr, uint16_t aclHandle, uint16_t cid, AttConnectingInfo **connecting)
858 {
859     LOG_INFO("%{public}s enter, aclHandle = %hu, cid = %hu", __FUNCTION__, aclHandle, cid);
860     uint16_t index = 0;
861 
862     for (; index < MAXCONNECT; ++index) {
863         if ((!memcmp(g_connecting[index].addr.addr, addr->addr, ADDRESSLEN)) &&
864             (g_connecting[index].aclHandle == aclHandle) && (g_connecting[index].cid == cid)) {
865             break;
866         }
867     }
868 
869     if (index != MAXCONNECT) {
870         *connecting = &g_connecting[index];
871         goto ATTGETCONNECTINGINDEXBYADDRACLHANDLECID_END;
872     } else {
873         *connecting = NULL;
874         goto ATTGETCONNECTINGINDEXBYADDRACLHANDLECID_END;
875     }
876 
877 ATTGETCONNECTINGINDEXBYADDRACLHANDLECID_END:
878     LOG_INFO("%{public}s return: index = %hu", __FUNCTION__, index);
879     return;
880 }
881 
882 /**
883  * @brief client call back copy.
884  *
885  * @param1 attSendDataCb Indicates the pointer to attSendDataCallback.
886  * @param2 context Indicates the pointer to context.
887  */
AttClientCallBackCopyToCommon(attSendDataCallback attSendDataCB,const void * context)888 void AttClientCallBackCopyToCommon(attSendDataCallback attSendDataCB, const void *context)
889 {
890     LOG_INFO("%{public}s enter", __FUNCTION__);
891 
892     g_attClientSendDataCB.attSendDataCB = attSendDataCB;
893     g_attClientSendDataCB.context = (void *)context;
894 
895     return;
896 }
897 /**
898  * @brief server call back copy.
899  *
900  * @param1 attSendDataCb Indicates the pointer to attSendDataCallback.
901  * @param2 context Indicates the pointer to context.
902  */
AttServerCallBackCopyToCommon(attSendDataCallback attSendDataCB,const void * context)903 void AttServerCallBackCopyToCommon(attSendDataCallback attSendDataCB, const void *context)
904 {
905     LOG_INFO("%{public}s enter", __FUNCTION__);
906 
907     g_attServerSendDataCB.attSendDataCB = attSendDataCB;
908     g_attServerSendDataCB.context = (void *)context;
909 
910     return;
911 }
912 
913 /**
914  * @brief le receive senddata callback async.
915  *
916  * @param context Indicates the pointer to context.
917  */
LeRecvSendDataCallbackAsync(const void * context)918 static void LeRecvSendDataCallbackAsync(const void *context)
919 {
920     LOG_INFO("%{public}s enter", __FUNCTION__);
921 
922     LeRecvSendDataCallbackAsyncContext *leRecvSendDataCallPtr = (LeRecvSendDataCallbackAsyncContext *)context;
923     AttConnectInfo *connect = NULL;
924 
925     AttGetConnectInfoIndexByCid(leRecvSendDataCallPtr->aclHandle, &connect);
926 
927     if (connect == NULL) {
928         goto RECVSENDDATACALLBACK_END;
929     }
930 
931     if (g_attClientSendDataCB.attSendDataCB != NULL) {
932         g_attClientSendDataCB.attSendDataCB(
933             connect->retGattConnectHandle, leRecvSendDataCallPtr->result, g_attClientSendDataCB.context);
934     }
935     if (leRecvSendDataCallPtr->result == BT_NO_ERROR) {
936         AlarmSet(connect->alarm, (uint64_t)INSTRUCTIONTIMEOUT, (void (*)(void *))AttTransactionTimeOut, connect);
937     } else {
938         LOG_WARN("L2CAP error code = %{public}d", leRecvSendDataCallPtr->result);
939         AlarmCancel(connect->alarm);
940     }
941 
942 RECVSENDDATACALLBACK_END:
943     MEM_MALLOC.free(leRecvSendDataCallPtr);
944     return;
945 }
946 
947 /**
948  * @brief le receive senddata callback async destroy.
949  *
950  * @param context Indicates the pointer to context.
951  */
LeRecvSendDataCallbackAsyncDestroy(const void * context)952 static void LeRecvSendDataCallbackAsyncDestroy(const void *context)
953 {
954     LOG_INFO("%{public}s enter", __FUNCTION__);
955 
956     LeRecvSendDataCallbackAsyncContext *leRecvSendDataCallPtr = (LeRecvSendDataCallbackAsyncContext *)context;
957 
958     MEM_MALLOC.free(leRecvSendDataCallPtr);
959 
960     return;
961 }
962 
963 /**
964  * @brief receive senddata callback.
965  *
966  * @param1 aclHandle Indicates the aclHandle.
967  * @param2 result Indicates the result.
968  */
LeRecvSendDataCallback(uint16_t aclHandle,int result)969 void LeRecvSendDataCallback(uint16_t aclHandle, int result)
970 {
971     LOG_INFO("%{public}s enter", __FUNCTION__);
972 
973     LeRecvSendDataCallbackAsyncContext *leRecvSendDataCallPtr =
974         MEM_MALLOC.alloc(sizeof(LeRecvSendDataCallbackAsyncContext));
975     if (leRecvSendDataCallPtr == NULL) {
976         LOG_ERROR("point to NULL");
977         return;
978     }
979 
980     leRecvSendDataCallPtr->aclHandle = aclHandle;
981     leRecvSendDataCallPtr->result = result;
982 
983     AttAsyncProcess(LeRecvSendDataCallbackAsync, LeRecvSendDataCallbackAsyncDestroy, leRecvSendDataCallPtr);
984 
985     return;
986 }
987 
988 /**
989  * @brief BREDR receive senddata callback async.
990  *
991  * @param context Indicates the pointer to context.
992  */
BREDRRecvSendDataCallbackAsync(const void * context)993 static void BREDRRecvSendDataCallbackAsync(const void *context)
994 {
995     LOG_INFO("%{public}s enter", __FUNCTION__);
996 
997     BREDRRecvSendDataCallbackAsyncContext *bredrRecvSendDataCallPtr = (BREDRRecvSendDataCallbackAsyncContext *)context;
998     AttConnectInfo *connect = NULL;
999 
1000     AttGetConnectInfoIndexByCid(bredrRecvSendDataCallPtr->lcid, &connect);
1001 
1002     if (connect == NULL) {
1003         goto BREDRRECVSENDDATACALLBACK_END;
1004     }
1005 
1006     if (g_attClientSendDataCB.attSendDataCB != NULL) {
1007         g_attClientSendDataCB.attSendDataCB(
1008             connect->retGattConnectHandle, bredrRecvSendDataCallPtr->result, g_attClientSendDataCB.context);
1009     }
1010     if (bredrRecvSendDataCallPtr->result == BT_NO_ERROR) {
1011         AlarmSet(connect->alarm, (uint64_t)INSTRUCTIONTIMEOUT, (void (*)(void *))AttTransactionTimeOut, connect);
1012     } else {
1013         LOG_WARN("L2CAP error code = %{public}d", bredrRecvSendDataCallPtr->result);
1014         AlarmCancel(connect->alarm);
1015     }
1016 
1017 BREDRRECVSENDDATACALLBACK_END:
1018     MEM_MALLOC.free(bredrRecvSendDataCallPtr);
1019     return;
1020 }
1021 
1022 /**
1023  * @brief BREDR receive senddata callback async destroy.
1024  *
1025  * @param context Indicates the pointer to context.
1026  */
BREDRRecvSendDataCallbackAsyncDestroy(const void * context)1027 static void BREDRRecvSendDataCallbackAsyncDestroy(const void *context)
1028 {
1029     LOG_INFO("%{public}s enter", __FUNCTION__);
1030 
1031     BREDRRecvSendDataCallbackAsyncContext *bredrRecvSendDataCallPtr = (BREDRRecvSendDataCallbackAsyncContext *)context;
1032 
1033     MEM_MALLOC.free(bredrRecvSendDataCallPtr);
1034 
1035     return;
1036 }
1037 
1038 /**
1039  * @brief receive senddata callback.
1040  *
1041  * @param1 lcid Indicates the lcid.
1042  * @param2 result Indicates the result.
1043  * @param3 context Indicates the pointer to context.
1044  */
BREDRRecvSendDataCallback(uint16_t lcid,int result)1045 void BREDRRecvSendDataCallback(uint16_t lcid, int result)
1046 {
1047     LOG_INFO("%{public}s enter", __FUNCTION__);
1048 
1049     BREDRRecvSendDataCallbackAsyncContext *bredrSendDataCallPtr =
1050         MEM_MALLOC.alloc(sizeof(BREDRRecvSendDataCallbackAsyncContext));
1051     if (bredrSendDataCallPtr == NULL) {
1052         LOG_ERROR("point to NULL");
1053         return;
1054     }
1055 
1056     bredrSendDataCallPtr->lcid = lcid;
1057     bredrSendDataCallPtr->result = result;
1058 
1059     AttAsyncProcess(BREDRRecvSendDataCallbackAsync, BREDRRecvSendDataCallbackAsyncDestroy, bredrSendDataCallPtr);
1060 
1061     return;
1062 }
1063 
1064 /**
1065  * @brief receive delect callback.
1066  *
1067  */
AttCallBackDelectCopyToCommon()1068 void AttCallBackDelectCopyToCommon()
1069 {
1070     LOG_INFO("%{public}s enter", __FUNCTION__);
1071 
1072     g_attServerSendDataCB.attSendDataCB = NULL;
1073     g_attServerSendDataCB.context = NULL;
1074 
1075     return;
1076 }
1077 
1078 /**
1079  * @brief switch thread.
1080  *
1081  * @param1 callback Indicates the pointer to function pointer.
1082  * @param2 destroyCallback Indicates the pointer to function pointer.
1083  * @param3 context Indicates the pointer to context.
1084  */
AttAsyncProcess(void (* callback)(const void * context),void (* destroyCallback)(const void * context),const void * context)1085 void AttAsyncProcess(
1086     void (*callback)(const void *context), void (*destroyCallback)(const void *context), const void *context)
1087 {
1088     LOG_INFO("%{public}s enter", __FUNCTION__);
1089 
1090     int ret;
1091 
1092     ret = BTM_RunTaskInProcessingQueue(PROCESSING_QUEUE_ID_ATT, (void (*)(void *))callback, (void *)context);
1093     if (ret != BT_NO_ERROR) {
1094         if (destroyCallback != NULL) {
1095             destroyCallback(context);
1096         }
1097     }
1098 
1099     return;
1100 }
1101 
1102 /**
1103  * @brief shut down clear connect information.
1104  *
1105  * @param connectInfo Indicates the pointer to AttConnectInfo.
1106  */
AttShutDownClearConnectInfo(AttConnectInfo * connectInfo)1107 void AttShutDownClearConnectInfo(AttConnectInfo *connectInfo)
1108 {
1109     LOG_INFO("%{public}s enter", __FUNCTION__);
1110 
1111     connectInfo->aclHandle = 0;
1112     (void)memset_s(&connectInfo->AttConnectID, sizeof(connectInfo->AttConnectID), 0, sizeof(connectInfo->AttConnectID));
1113     connectInfo->retGattConnectHandle = 0;
1114     connectInfo->transportType = 0;
1115     (void)memset_s(&connectInfo->addr, sizeof(connectInfo->addr), 0, sizeof(BtAddr));
1116     connectInfo->mtu = 0;
1117     connectInfo->sendMtu = 0;
1118     connectInfo->receiveMtu = 0;
1119     connectInfo->mtuFlag = false;
1120     connectInfo->initPassConnFlag = 0;
1121     connectInfo->serverSendFlag = false;
1122 
1123     g_attClientCallback.attClientCallback = NULL;
1124     g_attServerCallback.attServerCallback = NULL;
1125     g_attClientSendDataCB.attSendDataCB = NULL;
1126     g_attServerSendDataCB.attSendDataCB = NULL;
1127     g_attConnect.attConnect.attBREDRConnectCompleted = NULL;
1128     g_attConnect.attConnect.attBREDRConnectInd = NULL;
1129     g_attConnect.attConnect.attBREDRDisconnectCompleted = NULL;
1130     g_attConnect.attConnect.attLEConnectCompleted = NULL;
1131     g_attConnect.attConnect.attLEDisconnectCompleted = NULL;
1132 
1133     return;
1134 }
1135 
1136 /**
1137  * @brief client callback btbadparam.
1138  *
1139  */
ClientCallbackBTBADPARAM(const AttConnectInfo * connect)1140 void ClientCallbackBTBADPARAM(const AttConnectInfo *connect)
1141 {
1142     LOG_INFO("%{public}s enter", __FUNCTION__);
1143 
1144     if (connect == NULL) {
1145         return;
1146     }
1147 
1148     if (g_attClientSendDataCB.attSendDataCB != NULL) {
1149         g_attClientSendDataCB.attSendDataCB(connect->retGattConnectHandle, BT_BAD_PARAM, g_attClientSendDataCB.context);
1150     }
1151 
1152     return;
1153 }
1154 
1155 /**
1156  * @brief server callback btbadparam.
1157  *
1158  */
ServerCallbackBTBADPARAM(const AttConnectInfo * connect)1159 void ServerCallbackBTBADPARAM(const AttConnectInfo *connect)
1160 {
1161     LOG_INFO("%{public}s enter", __FUNCTION__);
1162 
1163     if (g_attServerSendDataCB.attSendDataCB != NULL) {
1164         g_attServerSendDataCB.attSendDataCB(connect->retGattConnectHandle, BT_BAD_PARAM, g_attServerSendDataCB.context);
1165     }
1166 
1167     return;
1168 }
1169 
1170 /**
1171  * @brief client callback return value.
1172  *
1173  * @param1 ret Indicates the ret.
1174  * @param2 connect Indicates the pointer of AttConnectInfo.
1175  */
ClientCallbackReturnValue(int ret,const AttConnectInfo * connect)1176 void ClientCallbackReturnValue(int ret, const AttConnectInfo *connect)
1177 {
1178     LOG_INFO("%{public}s enter", __FUNCTION__);
1179 
1180     if (ret != BT_NO_ERROR) {
1181         if (g_attClientSendDataCB.attSendDataCB != NULL) {
1182             g_attClientSendDataCB.attSendDataCB(connect->retGattConnectHandle, ret, g_attClientSendDataCB.context);
1183         }
1184     }
1185 
1186     return;
1187 }
1188 
1189 /**
1190  * @brief server callback return value.
1191  *
1192  * @param1 ret Indicates the ret.
1193  * @param2 connect Indicates the pointer of AttConnectInfo.
1194  */
ServerCallbackReturnValue(int ret,const AttConnectInfo * connect)1195 void ServerCallbackReturnValue(int ret, const AttConnectInfo *connect)
1196 {
1197     LOG_INFO("%{public}s enter", __FUNCTION__);
1198 
1199     if (ret != BT_NO_ERROR) {
1200         if (g_attServerSendDataCB.attSendDataCB != NULL) {
1201             g_attServerSendDataCB.attSendDataCB(connect->retGattConnectHandle, ret, g_attServerSendDataCB.context);
1202         }
1203     }
1204 
1205     return;
1206 }
1207 
1208 /**
1209  * @brief receive  bredr connect instructions data in self thread.
1210  *
1211  * @param context Indicates the pointer to context.
1212  */
AttRecvDataAsync(const void * context)1213 static void AttRecvDataAsync(const void *context)
1214 {
1215     LOG_INFO("%{public}s enter", __FUNCTION__);
1216 
1217     uint8_t opcode = 0;
1218     AttConnectInfo *connect = NULL;
1219     AttRecvDataAsyncContext *attRecvDataAsyncPtr = (AttRecvDataAsyncContext *)context;
1220     AttGetConnectInfoIndexByCid(attRecvDataAsyncPtr->lcid, &connect);
1221     if (connect != NULL) {
1222         PacketExtractHead(attRecvDataAsyncPtr->packet, &opcode, sizeof(uint8_t));
1223         Buffer *buffer = PacketContinuousPayload(attRecvDataAsyncPtr->packet);
1224         recvDataFunction functionPtr = GetFunction(opcode);
1225         if (functionPtr != NULL) {
1226             functionPtr(connect, buffer);
1227         } else {
1228             LOG_WARN("%{public}s UnKnow OpCode : %hhu", __FUNCTION__, opcode);
1229             if ((opcode & 0b01000000) == 0) {
1230                 AttErrorCode(connect, opcode);
1231             }
1232         }
1233     }
1234 
1235     PacketFree(attRecvDataAsyncPtr->packet);
1236     MEM_MALLOC.free(attRecvDataAsyncPtr);
1237 
1238     return;
1239 }
1240 
1241 /**
1242  * @brief destroy receive bredr connect instructions data in self thread.
1243  *
1244  * @param context Indicates the pointer to context.
1245  */
AttRecvDataAsyncDestroy(const void * context)1246 static void AttRecvDataAsyncDestroy(const void *context)
1247 {
1248     LOG_INFO("%{public}s enter", __FUNCTION__);
1249 
1250     AttRecvDataAsyncContext *attRecvDataAsyncPtr = (AttRecvDataAsyncContext *)context;
1251 
1252     PacketFree(attRecvDataAsyncPtr->packet);
1253     MEM_MALLOC.free(attRecvDataAsyncPtr);
1254 
1255     return;
1256 }
1257 
1258 /**
1259  * @brief receive  bredr connect instructions data.
1260  *
1261  * @param1 lcid Indicates the lcid.
1262  * @param2 packet Indicates the pointer to Packet.
1263  * @param3 ctx Indicates the pointer to  context.
1264  */
AttRecvData(uint16_t lcid,const Packet * packet,const void * ctx)1265 void AttRecvData(uint16_t lcid, const Packet *packet, const void *ctx)
1266 {
1267     LOG_INFO("%{public}s enter,lcid = %hu", __FUNCTION__, lcid);
1268 
1269     Packet *packetPtr = PacketRefMalloc((Packet *)packet);
1270     AttRecvDataAsyncContext *attRecvDataAsyncPtr = MEM_MALLOC.alloc(sizeof(AttRecvDataAsyncContext));
1271     if (attRecvDataAsyncPtr == NULL) {
1272         LOG_ERROR("point to NULL");
1273         return;
1274     }
1275     attRecvDataAsyncPtr->lcid = lcid;
1276     attRecvDataAsyncPtr->packet = packetPtr;
1277     attRecvDataAsyncPtr->ctx = (void *)ctx;
1278 
1279     AttAsyncProcess(AttRecvDataAsync, AttRecvDataAsyncDestroy, attRecvDataAsyncPtr);
1280 
1281     return;
1282 }
1283 
1284 /**
1285  * @brief receive le connect instructions data in self thread.
1286  *
1287  * @param context Indicates the pointer to context.
1288  */
AttRecvLeDataAsync(const void * context)1289 static void AttRecvLeDataAsync(const void *context)
1290 {
1291     LOG_INFO("%{public}s enter", __FUNCTION__);
1292 
1293     uint8_t opcode = 0;
1294     AttConnectInfo *connect = NULL;
1295     AttRecvLeDataAsyncContext *attRecvLeDataAsyncPtr = (AttRecvLeDataAsyncContext *)context;
1296     AttGetConnectInfoIndexByAclHandle(attRecvLeDataAsyncPtr->aclHandle, &connect);
1297     if (connect != NULL) {
1298         PacketExtractHead(attRecvLeDataAsyncPtr->packet, &opcode, sizeof(uint8_t));
1299         Buffer *buffer = PacketContinuousPayload(attRecvLeDataAsyncPtr->packet);
1300         recvDataFunction functionPtr = GetFunction(opcode);
1301         if (functionPtr != NULL) {
1302             functionPtr(connect, buffer);
1303         } else {
1304             LOG_WARN("UnKnow OpCode : %hhu", opcode);
1305             if ((opcode & 0b01000000) == 0) {
1306                 AttErrorCode(connect, opcode);
1307             }
1308         }
1309     }
1310 
1311     PacketFree(attRecvLeDataAsyncPtr->packet);
1312     MEM_MALLOC.free(attRecvLeDataAsyncPtr);
1313 
1314     return;
1315 }
1316 
1317 /**
1318  * @brief destroy le bredr connect instructions data in self thread.
1319  *
1320  * @param context Indicates the pointer to context.
1321  */
AttRecvLeDataAsyncDestroy(const void * context)1322 static void AttRecvLeDataAsyncDestroy(const void *context)
1323 {
1324     LOG_INFO("%{public}s enter", __FUNCTION__);
1325 
1326     AttRecvLeDataAsyncContext *attRecvLeDataAsyncPtr = (AttRecvLeDataAsyncContext *)context;
1327 
1328     PacketFree(attRecvLeDataAsyncPtr->packet);
1329     MEM_MALLOC.free(attRecvLeDataAsyncPtr);
1330 
1331     return;
1332 }
1333 
1334 /**
1335  * @brief receive  le connect instructions data.
1336  *
1337  * @param1 aclHandle Indicates the aclHandle.
1338  * @param2 packet Indicates the pointer to Packet.
1339  */
AttRecvLeData(uint16_t aclHandle,const Packet * packet)1340 void AttRecvLeData(uint16_t aclHandle, const Packet *packet)
1341 {
1342     LOG_INFO("%{public}s enter, aclHandle = %hu", __FUNCTION__, aclHandle);
1343 
1344     Packet *packetPtr = PacketRefMalloc((Packet *)packet);
1345     AttRecvLeDataAsyncContext *attRecvLeDataAsyncPtr = MEM_MALLOC.alloc(sizeof(AttRecvLeDataAsyncContext));
1346     if (attRecvLeDataAsyncPtr == NULL) {
1347         LOG_ERROR("point to NULL");
1348         return;
1349     }
1350     attRecvLeDataAsyncPtr->aclHandle = aclHandle;
1351     attRecvLeDataAsyncPtr->packet = packetPtr;
1352 
1353     AttAsyncProcess(AttRecvLeDataAsync, AttRecvLeDataAsyncDestroy, attRecvLeDataAsyncPtr);
1354 
1355     return;
1356 }
1357 
1358 /**
1359  * @brief get function.
1360  *
1361  * @param1 opcode Indicates the opcode.
1362  * @return Returns the recvDataFunction.
1363  */
GetFunction(uint8_t opcode)1364 static recvDataFunction GetFunction(uint8_t opcode)
1365 {
1366     return g_functionList[opcode];
1367 }
1368 
1369 /**
1370  * @brief get function array dress.
1371  *
1372  * @return Returns the pointer to recvDataFunction.
1373  */
GetFunctionArrayDress()1374 recvDataFunction *GetFunctionArrayDress()
1375 {
1376     return g_functionList;
1377 }
1378 
1379 /**
1380  * @brief get att connect callback.
1381  *
1382  * @return Returns the pointer to AttConnectedCallback.
1383  */
AttGetATTConnectCallback()1384 AttConnectedCallback *AttGetATTConnectCallback()
1385 {
1386     LOG_INFO("%{public}s enter", __FUNCTION__);
1387 
1388     return &g_attConnect;
1389 }
1390 
AttConnectRegisterAsync(const void * context)1391 static void AttConnectRegisterAsync(const void *context)
1392 {
1393     LOG_INFO("%{public}s enter", __FUNCTION__);
1394 
1395     AttConnectRegisterContext *attConnRegPtr = (AttConnectRegisterContext *)context;
1396     AttConnectedCallback *attConnectCallback = AttGetATTConnectCallback();
1397 
1398     attConnectCallback->attConnect = attConnRegPtr->connectBack;
1399     attConnectCallback->context = attConnRegPtr->context;
1400 
1401     MEM_MALLOC.free(attConnRegPtr);
1402 
1403     return;
1404 }
1405 
AttConnectRegisterAsyncDestroy(const void * context)1406 static void AttConnectRegisterAsyncDestroy(const void *context)
1407 {
1408     LOG_INFO("%{public}s enter", __FUNCTION__);
1409 
1410     AttConnectRegisterContext *attConnRegPtr = (AttConnectRegisterContext *)context;
1411 
1412     MEM_MALLOC.free(attConnRegPtr);
1413 
1414     return;
1415 }
1416 
1417 /**
1418  * @brief gatt register connect to att.
1419  *
1420  * @param1 connectBack Indicates the struct to callback.
1421  * @param2 context Indicates the pointer to context.
1422  */
ATT_ConnectRegister(AttConnectCallback connectBack,void * context)1423 void ATT_ConnectRegister(AttConnectCallback connectBack, void *context)
1424 {
1425     LOG_INFO("%{public}s enter", __FUNCTION__);
1426 
1427     AttConnectRegisterContext *attConnRegPtr = MEM_MALLOC.alloc(sizeof(AttConnectRegisterContext));
1428     if (attConnRegPtr == NULL) {
1429         LOG_ERROR("point to NULL");
1430         return;
1431     }
1432 
1433     (void)memcpy_s(
1434         &(attConnRegPtr->connectBack), sizeof(attConnRegPtr->connectBack), &connectBack, sizeof(AttConnectCallback));
1435     attConnRegPtr->context = context;
1436 
1437     AttAsyncProcess(AttConnectRegisterAsync, AttConnectRegisterAsyncDestroy, attConnRegPtr);
1438 
1439     return;
1440 }
1441 
AttConnectDeregisterAsync(const void * context)1442 static void AttConnectDeregisterAsync(const void *context)
1443 {
1444     LOG_INFO("%{public}s enter", __FUNCTION__);
1445 
1446     AttConnectedCallback *attConnectCallback = AttGetATTConnectCallback();
1447 
1448     attConnectCallback->attConnect.attLEConnectCompleted = NULL;
1449     attConnectCallback->attConnect.attLEDisconnectCompleted = NULL;
1450     attConnectCallback->attConnect.attBREDRConnectCompleted = NULL;
1451     attConnectCallback->attConnect.attBREDRDisconnectCompleted = NULL;
1452     attConnectCallback->attConnect.attBREDRConnectInd = NULL;
1453     attConnectCallback->context = NULL;
1454 
1455     return;
1456 }
1457 
AttConnectDeregisterAsyncDestroy(const void * context)1458 static void AttConnectDeregisterAsyncDestroy(const void *context)
1459 {
1460     LOG_INFO("%{public}s enter", __FUNCTION__);
1461 
1462     return;
1463 }
1464 
1465 /**
1466  * @brief gatt deregister connect to att.
1467  *
1468  */
ATT_ConnectDeregister()1469 void ATT_ConnectDeregister()
1470 {
1471     LOG_INFO("%{public}s enter", __FUNCTION__);
1472 
1473     AttAsyncProcess(AttConnectDeregisterAsync, AttConnectDeregisterAsyncDestroy, NULL);
1474 
1475     return;
1476 }
1477 
AttBREDRSendRespCallbackAsync(const void * context)1478 static void AttBREDRSendRespCallbackAsync(const void *context)
1479 {
1480     LOG_INFO("%{public}s enter", __FUNCTION__);
1481 
1482     BREDRRecvSendDataCallbackAsyncContext *attBredrSendRspPtr = (BREDRRecvSendDataCallbackAsyncContext *)context;
1483     AttConnectInfo *connect = NULL;
1484 
1485     AttGetConnectInfoIndexByCid(attBredrSendRspPtr->lcid, &connect);
1486 
1487     if (connect == NULL) {
1488         LOG_INFO("%{public}s connect == NULL", __FUNCTION__);
1489         goto ATTBREDRSENDRESPCALLBACK_END;
1490     }
1491 
1492     if (attBredrSendRspPtr->result != BT_NO_ERROR) {
1493         LOG_WARN("L2CAP Send Resp error ,error code = %{public}d", attBredrSendRspPtr->result);
1494     }
1495 
1496     if (g_attServerSendDataCB.attSendDataCB != NULL) {
1497         g_attServerSendDataCB.attSendDataCB(
1498             connect->retGattConnectHandle, attBredrSendRspPtr->result, g_attServerSendDataCB.context);
1499     }
1500 
1501 ATTBREDRSENDRESPCALLBACK_END:
1502     MEM_MALLOC.free(attBredrSendRspPtr);
1503     return;
1504 }
1505 
AttBREDRSendRespCallbackAsyncDestroy(const void * context)1506 static void AttBREDRSendRespCallbackAsyncDestroy(const void *context)
1507 {
1508     LOG_INFO("%{public}s enter", __FUNCTION__);
1509 
1510     BREDRRecvSendDataCallbackAsyncContext *attBredrSendRspPtr = (BREDRRecvSendDataCallbackAsyncContext *)context;
1511 
1512     MEM_MALLOC.free(attBredrSendRspPtr);
1513 
1514     return;
1515 }
1516 
1517 /**
1518  * @brief callback of send response.
1519  *
1520  * @param1 lcid Indicates the lcid.
1521  * @param2 result Indicates the result.
1522  */
AttBREDRSendRespCallback(uint16_t lcid,int result)1523 static void AttBREDRSendRespCallback(uint16_t lcid, int result)
1524 {
1525     LOG_INFO("%{public}s enter", __FUNCTION__);
1526 
1527     BREDRRecvSendDataCallbackAsyncContext *attBredrSendRspPtr =
1528         MEM_MALLOC.alloc(sizeof(BREDRRecvSendDataCallbackAsyncContext));
1529     if (attBredrSendRspPtr == NULL) {
1530         LOG_ERROR("point to NULL");
1531         return;
1532     }
1533 
1534     attBredrSendRspPtr->lcid = lcid;
1535     attBredrSendRspPtr->result = result;
1536 
1537     AttAsyncProcess(AttBREDRSendRespCallbackAsync, AttBREDRSendRespCallbackAsyncDestroy, attBredrSendRspPtr);
1538 
1539     return;
1540 }
1541 
AttLeSendRespCallbackAsync(const void * context)1542 static void AttLeSendRespCallbackAsync(const void *context)
1543 {
1544     LOG_INFO("%{public}s enter", __FUNCTION__);
1545 
1546     LeRecvSendDataCallbackAsyncContext *attLeSendRspPtr = (LeRecvSendDataCallbackAsyncContext *)context;
1547     AttConnectInfo *connect = NULL;
1548 
1549     AttGetConnectInfoIndexByCid(attLeSendRspPtr->aclHandle, &connect);
1550 
1551     if (connect == NULL) {
1552         LOG_INFO("%{public}s connect == NULL", __FUNCTION__);
1553         goto ATTLESENDRESPCALLBACK_END;
1554     }
1555 
1556     if (attLeSendRspPtr->result != BT_NO_ERROR) {
1557         LOG_WARN("L2CAP Send Resp error ,error code = %{public}d", attLeSendRspPtr->result);
1558     }
1559 
1560     if (g_attServerSendDataCB.attSendDataCB != NULL) {
1561         g_attServerSendDataCB.attSendDataCB(
1562             connect->retGattConnectHandle, attLeSendRspPtr->result, g_attServerSendDataCB.context);
1563     }
1564 
1565 ATTLESENDRESPCALLBACK_END:
1566     MEM_MALLOC.free(attLeSendRspPtr);
1567     return;
1568 }
1569 
AttLeSendRespCallbackAsyncDestroy(const void * context)1570 static void AttLeSendRespCallbackAsyncDestroy(const void *context)
1571 {
1572     LOG_INFO("%{public}s enter", __FUNCTION__);
1573 
1574     LeRecvSendDataCallbackAsyncContext *attLeSendRspPtr = (LeRecvSendDataCallbackAsyncContext *)context;
1575 
1576     MEM_MALLOC.free(attLeSendRspPtr);
1577 
1578     return;
1579 }
1580 
AttLeSendRespCallback(uint16_t aclHandle,int result)1581 static void AttLeSendRespCallback(uint16_t aclHandle, int result)
1582 {
1583     LOG_INFO("%{public}s enter", __FUNCTION__);
1584 
1585     LeRecvSendDataCallbackAsyncContext *attLeSendRspPtr = MEM_MALLOC.alloc(sizeof(LeRecvSendDataCallbackAsyncContext));
1586     if (attLeSendRspPtr == NULL) {
1587         LOG_ERROR("point to NULL");
1588         return;
1589     }
1590 
1591     attLeSendRspPtr->aclHandle = aclHandle;
1592     attLeSendRspPtr->result = result;
1593 
1594     AttAsyncProcess(AttLeSendRespCallbackAsync, AttLeSendRespCallbackAsyncDestroy, attLeSendRspPtr);
1595 
1596     return;
1597 }
1598 
1599 /**
1600  * @brief call l2cap interface to send data.
1601  *
1602  * @param1 connect Indicates the pointer to const AttConnectInfo.
1603  * @param2 packet Indicates the pointer to Packet.
1604  * @return Returns <b>0</b> if the operation is successful; returns <b>!0</b> if the operation fails.
1605  */
AttResponseSendData(const AttConnectInfo * connect,const Packet * packet)1606 int AttResponseSendData(const AttConnectInfo *connect, const Packet *packet)
1607 {
1608     LOG_INFO("%{public}s enter", __FUNCTION__);
1609 
1610     int ret = BT_OPERATION_FAILED;
1611 
1612     if (connect == NULL) {
1613         LOG_INFO("%{public}s connect == NULL", __FUNCTION__);
1614         ret = BT_BAD_PARAM;
1615         return ret;
1616     }
1617 
1618     if (connect->transportType == BT_TRANSPORT_BR_EDR) {
1619         ret = L2CIF_SendData(connect->AttConnectID.bredrcid, (Packet *)packet, AttBREDRSendRespCallback);
1620     }
1621     if (connect->transportType == BT_TRANSPORT_LE) {
1622         ret = L2CIF_LeSendFixChannelData(connect->aclHandle, (uint16_t)LE_CID, (Packet *)packet, AttLeSendRespCallback);
1623     }
1624 
1625     return ret;
1626 }
1627 
1628 /**
1629  * @brief callback error code.
1630  *
1631  * @param1 connect Indicates the pointer to const AttConnectInfo.
1632  * @param2 opcode Indicates the opcode.
1633  */
AttErrorCode(const AttConnectInfo * connect,uint8_t opcode)1634 void AttErrorCode(const AttConnectInfo *connect, uint8_t opcode)
1635 {
1636     LOG_INFO("%{public}s enter", __FUNCTION__);
1637 
1638     if (connect == NULL) {
1639         LOG_INFO("%{public}s connect == NULL", __FUNCTION__);
1640         goto ATTERRORCODE_END;
1641     }
1642 
1643     AttServerDataCallback *attServerDataCallback = NULL;
1644     uint8_t errorCode = opcode;
1645     attServerDataCallback = AttGetATTServerCallback();
1646     attServerDataCallback->attServerCallback(
1647         connect->retGattConnectHandle, ATT_UNKNOW_OPCODE_ID, &errorCode, NULL, attServerDataCallback->context);
1648 
1649 ATTERRORCODE_END:
1650     return;
1651 }
1652 
Min(uint16_t param1,uint16_t param2)1653 uint16_t Min(uint16_t param1, uint16_t param2)
1654 {
1655     if (param1 < param2) {
1656         return param1;
1657     } else {
1658         return param2;
1659     }
1660 }
1661