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 #include "hci_evt_link_policy_cmd_complete.h"
17
18 #include <securec.h>
19
20 #include "platform/include/allocator.h"
21 #include "platform/include/list.h"
22 #include "platform/include/mutex.h"
23
24 #include "hci/cmd/hci_cmd.h"
25 #include "hci/hci.h"
26 #include "hci/hci_def.h"
27
28 #include "hci_evt.h"
29 #include "hci_evt_cmd_complete.h"
30
HciEventOnWriteLinkPolicySettingsComplete(const void * param,uint8_t length)31 static void HciEventOnWriteLinkPolicySettingsComplete(const void *param, uint8_t length)
32 {
33 HciWriteLinkPolicySettingsReturnParam returnParam = {0};
34 (void)memcpy_s(
35 &returnParam, sizeof(returnParam), param, (length > sizeof(returnParam)) ? sizeof(returnParam) : length);
36
37 HciEventCallbacks *callbacks = NULL;
38 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
39 if (callbacks->writeLinkPolicySettingsComplete != NULL) {
40 callbacks->writeLinkPolicySettingsComplete(&returnParam);
41 }
42 HCI_FOREACH_EVT_CALLBACKS_END;
43 }
44
HciEventOnSniffSubratingComplete(const void * param,uint8_t length)45 static void HciEventOnSniffSubratingComplete(const void *param, uint8_t length)
46 {
47 HciSniffSubratingReturnParam returnParam = {0};
48 (void)memcpy_s(
49 &returnParam, sizeof(returnParam), param, (length > sizeof(returnParam)) ? sizeof(returnParam) : length);
50
51 HciEventCallbacks *callbacks = NULL;
52 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
53 if (callbacks->sniffSubratingComplete != NULL) {
54 callbacks->sniffSubratingComplete(&returnParam);
55 }
56 HCI_FOREACH_EVT_CALLBACKS_END;
57 }
58
HciEventOnRoleDiscoveryComplete(const void * param,uint8_t length)59 static void HciEventOnRoleDiscoveryComplete(const void *param, uint8_t length)
60 {
61 HciRoleDiscoveryReturnParam returnParam = {0};
62 (void)memcpy_s(
63 &returnParam, sizeof(returnParam), param, (length > sizeof(returnParam)) ? sizeof(returnParam) : length);
64
65 HciEventCallbacks *callbacks = NULL;
66 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
67 if (callbacks->roleDiscoveryComplete != NULL) {
68 callbacks->roleDiscoveryComplete(&returnParam);
69 }
70 HCI_FOREACH_EVT_CALLBACKS_END;
71 }
72
HciEventOnReadLinkPolicySettingsComplete(const void * param,uint8_t length)73 static void HciEventOnReadLinkPolicySettingsComplete(const void *param, uint8_t length)
74 {
75 HciReadLinkPolicySettingsReturnParam returnParam = {0};
76 (void)memcpy_s(
77 &returnParam, sizeof(returnParam), param, (length > sizeof(returnParam)) ? sizeof(returnParam) : length);
78
79 HciEventCallbacks *callbacks = NULL;
80 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
81 if (callbacks->readLinkPolicySettingsComplete != NULL) {
82 callbacks->readLinkPolicySettingsComplete(&returnParam);
83 }
84 HCI_FOREACH_EVT_CALLBACKS_END;
85 }
86
HciEventOnWriteDefaultLinkPolicySettingsComplete(const void * param,uint8_t length)87 static void HciEventOnWriteDefaultLinkPolicySettingsComplete(const void *param, uint8_t length)
88 {
89 HciWriteDefaultLinkPolicySettingsReturnParam returnParam = {0};
90 (void)memcpy_s(
91 &returnParam, sizeof(returnParam), param, (length > sizeof(returnParam)) ? sizeof(returnParam) : length);
92
93 HciEventCallbacks *callbacks = NULL;
94 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
95 if (callbacks->writeDefaultLinkPolicySettingsComplete != NULL) {
96 callbacks->writeDefaultLinkPolicySettingsComplete(&returnParam);
97 }
98 HCI_FOREACH_EVT_CALLBACKS_END;
99 }
100
HciEventOnReadDefaultLinkPolicySettingsComplete(const void * param,uint8_t length)101 static void HciEventOnReadDefaultLinkPolicySettingsComplete(const void *param, uint8_t length)
102 {
103 HciReadDefaultLinkPolicySettingsReturnParam returnParam = {0};
104 (void)memcpy_s(
105 &returnParam, sizeof(returnParam), param, (length > sizeof(returnParam)) ? sizeof(returnParam) : length);
106
107 HciEventCallbacks *callbacks = NULL;
108 HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
109 if (callbacks->readDefaultLinkPolicySettingsComplete != NULL) {
110 callbacks->readDefaultLinkPolicySettingsComplete(&returnParam);
111 }
112 HCI_FOREACH_EVT_CALLBACKS_END;
113 }
114
115 static HciEventCommandCompleteFunc g_linkPolicyCommandCompleteMap[] = {
116 NULL, // 0x0000
117 NULL, // 0x0001
118 NULL, // 0x0002
119 NULL, // 0x0003
120 NULL, // 0x0004
121 NULL, // 0x0005
122 NULL, // 0x0006
123 NULL, // 0x0007
124 NULL, // 0x0008
125 HciEventOnRoleDiscoveryComplete, // 0x0009
126 NULL, // 0x000A
127 NULL, // 0x000B
128 HciEventOnReadLinkPolicySettingsComplete, // 0x000C
129 HciEventOnWriteLinkPolicySettingsComplete, // 0x000D
130 HciEventOnReadDefaultLinkPolicySettingsComplete, // 0x000E
131 HciEventOnWriteDefaultLinkPolicySettingsComplete, // 0x000F
132 NULL, // 0x0010
133 HciEventOnSniffSubratingComplete, // 0x0011
134 };
135
136 #define LINKPOLICY_OCF_MAX 0x0011
137
HciEventOnLinkPolicyCommandComplete(uint16_t opCode,const void * param,uint8_t length)138 void HciEventOnLinkPolicyCommandComplete(uint16_t opCode, const void *param, uint8_t length)
139 {
140 uint16_t ocf = GET_OCF(opCode);
141 if (ocf > LINKPOLICY_OCF_MAX) {
142 return;
143 }
144
145 HciEventCommandCompleteFunc func = g_linkPolicyCommandCompleteMap[ocf];
146 if (func != NULL) {
147 func(param, length);
148 }
149 }