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