1 
2 /*
3  * Copyright (C) 2021 Huawei Device Co., Ltd.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "hci_cmd_failure_info_params.h"
18 
19 #include "btstack.h"
20 #include "platform/include/list.h"
21 
22 #include "hci/evt/hci_evt.h"
23 #include "hci/hci.h"
24 #include "hci/hci_def.h"
25 
26 #include "hci_cmd_failure.h"
27 
HciCmdOnReadLocalVersionInformationFailed(uint8_t status,const void * param)28 static void HciCmdOnReadLocalVersionInformationFailed(uint8_t status, const void *param)
29 {
30     HciReadLocalVersionInformationReturnParam returnParam = {
31         .status = status,
32     };
33 
34     HciEventCallbacks *callbacks = NULL;
35     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
36     if (callbacks->readLocalVersionInformationComplete != NULL) {
37         callbacks->readLocalVersionInformationComplete(&returnParam);
38     }
39     HCI_FOREACH_EVT_CALLBACKS_END;
40 }
41 
HciCmdOnReadLocalSupportedCommandsFailed(uint8_t status,const void * param)42 static void HciCmdOnReadLocalSupportedCommandsFailed(uint8_t status, const void *param)
43 {
44     HciReadLocalSupportedCommandsReturnParam returnParam = {
45         .status = status,
46     };
47 
48     HciEventCallbacks *callbacks = NULL;
49     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
50     if (callbacks->readLocalSupportedCommandsComplete != NULL) {
51         callbacks->readLocalSupportedCommandsComplete(&returnParam);
52     }
53     HCI_FOREACH_EVT_CALLBACKS_END;
54 }
55 
HciCmdOnReadLocalSupportedFeaturesFailed(uint8_t status,const void * param)56 static void HciCmdOnReadLocalSupportedFeaturesFailed(uint8_t status, const void *param)
57 {
58     HciReadLocalSupportedFeaturesReturnParam returnParam = {
59         .status = status,
60     };
61 
62     HciEventCallbacks *callbacks = NULL;
63     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
64     if (callbacks->readLocalSupportedFeaturesComplete != NULL) {
65         callbacks->readLocalSupportedFeaturesComplete(&returnParam);
66     }
67     HCI_FOREACH_EVT_CALLBACKS_END;
68 }
69 
HciCmdOnReadLocalExtendedFeaturesFailed(uint8_t status,const void * param)70 static void HciCmdOnReadLocalExtendedFeaturesFailed(uint8_t status, const void *param)
71 {
72     HciReadLocalExtendedFeaturesReturnParam returnParam = {
73         .status = status,
74         .pageNumber = ((HciReadLocalExtendedFeaturesParam *)param)->pageNumber,
75     };
76 
77     HciEventCallbacks *callbacks = NULL;
78     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
79     if (callbacks->readLocalExtendedFeaturesComplete != NULL) {
80         callbacks->readLocalExtendedFeaturesComplete(&returnParam);
81     }
82     HCI_FOREACH_EVT_CALLBACKS_END;
83 }
84 
HciCmdOnReadBufferSizeFailed(uint8_t status,const void * param)85 static void HciCmdOnReadBufferSizeFailed(uint8_t status, const void *param)
86 {
87     HciReadBufferSizeReturnParam returnParam = {
88         .status = status,
89     };
90 
91     HciEventCallbacks *callbacks = NULL;
92     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
93     if (callbacks->readBufferSizeComplete != NULL) {
94         callbacks->readBufferSizeComplete(&returnParam);
95     }
96     HCI_FOREACH_EVT_CALLBACKS_END;
97 }
98 
HciCmdOnReadBdAddrFailed(uint8_t status,const void * param)99 static void HciCmdOnReadBdAddrFailed(uint8_t status, const void *param)
100 {
101     HciReadBdAddrReturnParam returnParam = {
102         .status = status,
103     };
104 
105     HciEventCallbacks *callbacks = NULL;
106     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
107     if (callbacks->readBdAddrComplete != NULL) {
108         callbacks->readBdAddrComplete(&returnParam);
109     }
110     HCI_FOREACH_EVT_CALLBACKS_END;
111 }
112 
HciCmdOnReadDataBlockSizeFailed(uint8_t status,const void * param)113 static void HciCmdOnReadDataBlockSizeFailed(uint8_t status, const void *param)
114 {
115     HciReadDataBlockSizeReturnParam returnParam = {
116         .status = status,
117     };
118 
119     HciEventCallbacks *callbacks = NULL;
120     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
121     if (callbacks->readDataBlockSizeComplete != NULL) {
122         callbacks->readDataBlockSizeComplete(&returnParam);
123     }
124     HCI_FOREACH_EVT_CALLBACKS_END;
125 }
126 
HciCmdOnReadLocalSupportedCodecsFailed(uint8_t status,const void * param)127 static void HciCmdOnReadLocalSupportedCodecsFailed(uint8_t status, const void *param)
128 {
129     HciReadLocalSupportedCodecsReturnParam returnParam = {
130         .status = status,
131     };
132 
133     HciEventCallbacks *callbacks = NULL;
134     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
135     if (callbacks->readLocalSupportedCodecsComplete != NULL) {
136         callbacks->readLocalSupportedCodecsComplete(&returnParam);
137     }
138     HCI_FOREACH_EVT_CALLBACKS_END;
139 }
140 
141 static HciCmdOnFailedFunc g_funcMap[] = {
142     NULL,                                       // 0x0000
143     HciCmdOnReadLocalVersionInformationFailed,  // 0x0001
144     HciCmdOnReadLocalSupportedCommandsFailed,   // 0x0002
145     HciCmdOnReadLocalSupportedFeaturesFailed,   // 0x0003
146     HciCmdOnReadLocalExtendedFeaturesFailed,    // 0x0004
147     HciCmdOnReadBufferSizeFailed,               // 0x0005
148     NULL,                                       // 0x0006
149     NULL,                                       // 0x0007
150     NULL,                                       // 0x0008
151     HciCmdOnReadBdAddrFailed,                   // 0x0009
152     HciCmdOnReadDataBlockSizeFailed,            // 0x000A
153     HciCmdOnReadLocalSupportedCodecsFailed,     // 0x000B
154 };
155 
156 #define INNFORMATIONALPARAMETERS_OCF_MAX 0x000B
157 
HciOnInformationalParametersCmdFailed(uint16_t opCode,uint8_t status,const void * param)158 void HciOnInformationalParametersCmdFailed(uint16_t opCode, uint8_t status, const void *param)
159 {
160     uint16_t ocf = GET_OCF(opCode);
161     if (ocf > INNFORMATIONALPARAMETERS_OCF_MAX) {
162         return;
163     }
164 
165     HciCmdOnFailedFunc func = g_funcMap[ocf];
166     if (func != NULL) {
167         func(status, param);
168     }
169 }