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_cmd_failure_status_params.h"
17 
18 #include "btstack.h"
19 #include "platform/include/list.h"
20 
21 #include "hci/evt/hci_evt.h"
22 #include "hci/hci.h"
23 #include "hci/hci_def.h"
24 
25 #include "hci_cmd_failure.h"
26 
HciCmdOnReadFailedContactCounterFailed(uint8_t status,const void * param)27 static void HciCmdOnReadFailedContactCounterFailed(uint8_t status, const void *param)
28 {
29     HciReadFailedContactCounterReturnParam returnParam = {
30         .status = status,
31         .handle = ((HciReadFailedContactCounterReturnParam *)param)->handle,
32     };
33 
34     HciEventCallbacks *callbacks = NULL;
35     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
36     if (callbacks->readFailedContactCounterComplete != NULL) {
37         callbacks->readFailedContactCounterComplete(&returnParam);
38     }
39     HCI_FOREACH_EVT_CALLBACKS_END;
40 }
41 
HciCmdOnResetFailedContactCounterFailed(uint8_t status,const void * param)42 static void HciCmdOnResetFailedContactCounterFailed(uint8_t status, const void *param)
43 {
44     HciResetFailedContactCounterReturnParam returnParam = {
45         .status = status,
46         .handle = ((HciResetFailedContactCounterReturnParam *)param)->handle,
47     };
48 
49     HciEventCallbacks *callbacks = NULL;
50     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
51     if (callbacks->resetFailedContactCounterComplete != NULL) {
52         callbacks->resetFailedContactCounterComplete(&returnParam);
53     }
54     HCI_FOREACH_EVT_CALLBACKS_END;
55 }
56 
HciCmdOnReadLinkQualityFailed(uint8_t status,const void * param)57 static void HciCmdOnReadLinkQualityFailed(uint8_t status, const void *param)
58 {
59     HciReadLinkQualityReturnParam returnParam = {
60         .status = status,
61         .handle = ((HciReadLinkQualityReturnParam *)param)->handle,
62     };
63 
64     HciEventCallbacks *callbacks = NULL;
65     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
66     if (callbacks->readLinkQualityComplete != NULL) {
67         callbacks->readLinkQualityComplete(&returnParam);
68     }
69     HCI_FOREACH_EVT_CALLBACKS_END;
70 }
71 
HciCmdOnReadRssiFailed(uint8_t status,const void * param)72 static void HciCmdOnReadRssiFailed(uint8_t status, const void *param)
73 {
74     HciReadRssiReturnParam returnParam = {
75         .status = status,
76         .handle = ((HciReadRssiParam *)param)->handle,
77     };
78 
79     HciEventCallbacks *callbacks = NULL;
80     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
81     if (callbacks->readRssiComplete != NULL) {
82         callbacks->readRssiComplete(&returnParam);
83     }
84     HCI_FOREACH_EVT_CALLBACKS_END;
85 }
86 
HciCmdOnReadAfhChannelMapFailed(uint8_t status,const void * param)87 static void HciCmdOnReadAfhChannelMapFailed(uint8_t status, const void *param)
88 {
89     HciReadAfhChannelMapReturnParam returnParam = {
90         .status = status,
91         .connectionHandle = ((HciReadAfhChannelMapReturnParam *)param)->connectionHandle,
92     };
93 
94     HciEventCallbacks *callbacks = NULL;
95     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
96     if (callbacks->readAfhChannelMapComplete != NULL) {
97         callbacks->readAfhChannelMapComplete(&returnParam);
98     }
99     HCI_FOREACH_EVT_CALLBACKS_END;
100 }
101 
HciCmdOnReadClockFailed(uint8_t status,const void * param)102 static void HciCmdOnReadClockFailed(uint8_t status, const void *param)
103 {
104     HciReadClockReturnParam returnParam = {
105         .status = status,
106         .connectionHandle = ((HciReadClockReturnParam *)param)->connectionHandle,
107     };
108 
109     HciEventCallbacks *callbacks = NULL;
110     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
111     if (callbacks->readClockComplete != NULL) {
112         callbacks->readClockComplete(&returnParam);
113     }
114     HCI_FOREACH_EVT_CALLBACKS_END;
115 }
116 
HciCmdOnReadEncryptionKeySizeFailed(uint8_t status,const void * param)117 static void HciCmdOnReadEncryptionKeySizeFailed(uint8_t status, const void *param)
118 {
119     HciReadEncryptionKeySizeReturnParam returnParam = {
120         .status = status,
121         .connectionHandle = ((HciReadEncryptionKeySizeReturnParam *)param)->connectionHandle,
122     };
123 
124     HciEventCallbacks *callbacks = NULL;
125     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
126     if (callbacks->readEncryptionKeySizeComplete != NULL) {
127         callbacks->readEncryptionKeySizeComplete(&returnParam);
128     }
129     HCI_FOREACH_EVT_CALLBACKS_END;
130 }
131 
HciCmdOnReadLocalAmpInfoFailed(uint8_t status,const void * param)132 static void HciCmdOnReadLocalAmpInfoFailed(uint8_t status, const void *param)
133 {
134     HciReadLocalAMPInfoReturnParam returnParam = {
135         .status = status,
136     };
137 
138     HciEventCallbacks *callbacks = NULL;
139     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
140     if (callbacks->readLocalAmpInfoComplete != NULL) {
141         callbacks->readLocalAmpInfoComplete(&returnParam);
142     }
143     HCI_FOREACH_EVT_CALLBACKS_END;
144 }
145 
HciCmdOnReadLocalAmpAssocFailed(uint8_t status,const void * param)146 static void HciCmdOnReadLocalAmpAssocFailed(uint8_t status, const void *param)
147 {
148     HciReadLocalAmpAssocReturnParam returnParam = {
149         .status = status,
150     };
151 
152     HciEventCallbacks *callbacks = NULL;
153     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
154     if (callbacks->readLocalAmpAssocComplete != NULL) {
155         callbacks->readLocalAmpAssocComplete(&returnParam);
156     }
157     HCI_FOREACH_EVT_CALLBACKS_END;
158 }
159 
HciCmdOnWriteRemoteAmpAssocFailed(uint8_t status,const void * param)160 static void HciCmdOnWriteRemoteAmpAssocFailed(uint8_t status, const void *param)
161 {
162     HciWriteRemoteAmpAssocReturnParam returnParam = {
163         .status = status,
164     };
165 
166     HciEventCallbacks *callbacks = NULL;
167     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
168     if (callbacks->writeRemoteAmpAssocComplete != NULL) {
169         callbacks->writeRemoteAmpAssocComplete(&returnParam);
170     }
171     HCI_FOREACH_EVT_CALLBACKS_END;
172 }
173 
HciCmdOnSetTriggeredClockCaptureFailed(uint8_t status,const void * param)174 static void HciCmdOnSetTriggeredClockCaptureFailed(uint8_t status, const void *param)
175 {
176     HciSetTriggeredClockCaptureReturnParam returnParam = {
177         .status = status,
178     };
179 
180     HciEventCallbacks *callbacks = NULL;
181     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
182     if (callbacks->setTriggeredClockCaptureComplete != NULL) {
183         callbacks->setTriggeredClockCaptureComplete(&returnParam);
184     }
185     HCI_FOREACH_EVT_CALLBACKS_END;
186 }
187 
188 static HciCmdOnFailedFunc g_funcMap[] = {
189     NULL,                                     // 0x0000
190     HciCmdOnReadFailedContactCounterFailed,   // 0x0001
191     HciCmdOnResetFailedContactCounterFailed,  // 0x0002
192     HciCmdOnReadLinkQualityFailed,            // 0x0003
193     NULL,                                     // 0x0004
194     HciCmdOnReadRssiFailed,                   // 0x0005
195     HciCmdOnReadAfhChannelMapFailed,          // 0x0006
196     HciCmdOnReadClockFailed,                  // 0x0007
197     HciCmdOnReadEncryptionKeySizeFailed,      // 0x0008
198     HciCmdOnReadLocalAmpInfoFailed,           // 0x0009
199     HciCmdOnReadLocalAmpAssocFailed,          // 0x000A
200     HciCmdOnWriteRemoteAmpAssocFailed,        // 0x000B
201     NULL,                                     // 0x000C
202     HciCmdOnSetTriggeredClockCaptureFailed,   // 0x000D
203 };
204 
205 #define STATUSPARAMETERS_OCF_MAX 0x000D
206 
HciOnStatusParametersCmdFailed(uint16_t opCode,uint8_t status,const void * param)207 void HciOnStatusParametersCmdFailed(uint16_t opCode, uint8_t status, const void *param)
208 {
209     uint16_t ocf = GET_OCF(opCode);
210     if (ocf > STATUSPARAMETERS_OCF_MAX) {
211         return;
212     }
213 
214     HciCmdOnFailedFunc func = g_funcMap[ocf];
215     if (func != NULL) {
216         func(status, param);
217     }
218 }