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 }