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 }