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_link_policy.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 
HciCmdOnSniffModeFailed(uint8_t status,const void * param)27 static void HciCmdOnSniffModeFailed(uint8_t status, const void *param)
28 {
29     HciModeChangeEventParam eventParam = {
30         .status = status,
31         .connectionHandle = ((HciSniffModeParam *)param)->connectionHandle,
32     };
33 
34     HciEventCallbacks *callbacks = NULL;
35     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
36     if (callbacks->modeChange != NULL) {
37         callbacks->modeChange(&eventParam);
38     }
39     HCI_FOREACH_EVT_CALLBACKS_END;
40 }
41 
HciCmdOnExitSnifModeFailed(uint8_t status,const void * param)42 static void HciCmdOnExitSnifModeFailed(uint8_t status, const void *param)
43 {
44     HciModeChangeEventParam eventParam = {
45         .status = status,
46         .connectionHandle = ((HciExitSniffModeParam *)param)->connectionHandle,
47     };
48 
49     HciEventCallbacks *callbacks = NULL;
50     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
51     if (callbacks->modeChange != NULL) {
52         callbacks->modeChange(&eventParam);
53     }
54     HCI_FOREACH_EVT_CALLBACKS_END;
55 }
56 
HciCmdOnSniffSubratingFailed(uint8_t status,const void * param)57 static void HciCmdOnSniffSubratingFailed(uint8_t status, const void *param)
58 {
59     HciSniffSubratingReturnParam returnParam = {
60         .status = status,
61         .connectionHandle = ((HciSniffSubratingParam *)param)->connectionHandle,
62     };
63 
64     HciEventCallbacks *callbacks = NULL;
65     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
66     if (callbacks->sniffSubratingComplete != NULL) {
67         callbacks->sniffSubratingComplete(&returnParam);
68     }
69     HCI_FOREACH_EVT_CALLBACKS_END;
70 }
71 
HciCmdOnWriteLinkPolicySettingsFailed(uint8_t status,const void * param)72 static void HciCmdOnWriteLinkPolicySettingsFailed(uint8_t status, const void *param)
73 {
74     HciWriteLinkPolicySettingsReturnParam returnParam = {
75         .status = status,
76         .connectionHandle = ((HciWriteLinkPolicySettingsReturnParam *)param)->connectionHandle,
77     };
78 
79     HciEventCallbacks *callbacks = NULL;
80     HCI_FOREACH_EVT_CALLBACKS_START(callbacks);
81     if (callbacks->writeLinkPolicySettingsComplete != NULL) {
82         callbacks->writeLinkPolicySettingsComplete(&returnParam);
83     }
84     HCI_FOREACH_EVT_CALLBACKS_END;
85 }
86 
HciCmdOnWriteDefaultLinkPolicySettingsFailed(uint8_t status,const void * param)87 static void HciCmdOnWriteDefaultLinkPolicySettingsFailed(uint8_t status, const void *param)
88 {
89     HciWriteDefaultLinkPolicySettingsReturnParam returnParam = {
90         .status = status,
91     };
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 
101 static HciCmdOnFailedFunc g_funcMap[] = {
102     NULL,                                          // 0x0000
103     NULL,                                          // 0x0001
104     NULL,                                          // 0x0002
105     HciCmdOnSniffModeFailed,                       // 0x0003
106     HciCmdOnExitSnifModeFailed,                    // 0x0004
107     NULL,                                          // 0x0005
108     NULL,                                          // 0x0006
109     NULL,                                          // 0x0007
110     NULL,                                          // 0x0008
111     NULL,                                          // 0x0009
112     NULL,                                          // 0x000A
113     NULL,                                          // 0x000B
114     NULL,                                          // 0x000C
115     HciCmdOnWriteLinkPolicySettingsFailed,         // 0x000D
116     NULL,                                          // 0x000E
117     HciCmdOnWriteDefaultLinkPolicySettingsFailed,  // 0x000F
118     NULL,                                          // 0x0010
119     HciCmdOnSniffSubratingFailed,                  // 0x0011
120 };
121 
122 #define LINKPOLICY_OCF_MAX 0x0011
123 
HciOnLinkPolicyCmdFailed(uint16_t opCode,uint8_t status,const void * param)124 void HciOnLinkPolicyCmdFailed(uint16_t opCode, uint8_t status, const void *param)
125 {
126     uint16_t ocf = GET_OCF(opCode);
127     if (ocf > LINKPOLICY_OCF_MAX) {
128         return;
129     }
130 
131     HciCmdOnFailedFunc func = g_funcMap[ocf];
132     if (func != NULL) {
133         func(status, param);
134     }
135 }