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/hci.h"
17
18 #include <securec.h>
19
20 #include "btstack.h"
21 #include "platform/include/allocator.h"
22
23 #include "hci_cmd.h"
24
25 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
26 // 7.3.1 Set Event Mask Command
HCI_SetEventMask(const HciSetEventMaskParam * param)27 int HCI_SetEventMask(const HciSetEventMaskParam *param)
28 {
29 HciCmd *cmd = HciAllocCmd(HCI_SET_EVENT_MASK, (void *)param, sizeof(HciSetEventMaskParam));
30 return HciSendCmd(cmd);
31 }
32
33 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
34 // 7.3.2 Reset Command
HCI_Reset()35 int HCI_Reset()
36 {
37 HciCmd *cmd = HciAllocCmd(HCI_RESET, NULL, 0);
38 return HciSendCmd(cmd);
39 }
40
41 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
42 // 7.3.4 Flush Command
HCI_Flush(const HciFlushParam * param)43 int HCI_Flush(const HciFlushParam *param)
44 {
45 HciCmd *cmd = HciAllocCmd(HCI_FLUSH, (void *)param, sizeof(HciFlushParam));
46 return HciSendCmd(cmd);
47 }
48
49 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
50 // 7.3.11 Write Local Name Command
HCI_WriteLocalName(const HciWriteLocalNameParam * param)51 int HCI_WriteLocalName(const HciWriteLocalNameParam *param)
52 {
53 HciCmd *cmd = HciAllocCmd(HCI_WRITE_LOCAL_NAME, (void *)param, sizeof(HciWriteLocalNameParam));
54 return HciSendCmd(cmd);
55 }
56
57 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
58 // 7.3.18 Write Scan Enable Command
HCI_WriteScanEnable(const HciWriteScanEnableParam * param)59 int HCI_WriteScanEnable(const HciWriteScanEnableParam *param)
60 {
61 if (param == NULL) {
62 return BT_BAD_PARAM;
63 }
64
65 HciCmd *cmd = HciAllocCmd(HCI_WRITE_SCAN_ENABLE, (void *)param, sizeof(HciWriteScanEnableParam));
66 return HciSendCmd(cmd);
67 }
68
69 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
70 // 7.3.20 Write Page Scan Activity Command
HCI_WritePageScanActivity(const HciWritePageScanActivityParam * param)71 int HCI_WritePageScanActivity(const HciWritePageScanActivityParam *param)
72 {
73 if (param == NULL) {
74 return BT_BAD_PARAM;
75 }
76 HciCmd *cmd = HciAllocCmd(HCI_WRITE_PAGE_SCAN_ACTIVITY, (void *)param, sizeof(HciWritePageScanActivityParam));
77 return HciSendCmd(cmd);
78 }
79
80 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
81 // 7.3.22 Write Inquiry Scan Activity Command
HCI_WriteInquiryScanActivity(const HciWriteInquiryScanActivityParam * param)82 int HCI_WriteInquiryScanActivity(const HciWriteInquiryScanActivityParam *param)
83 {
84 if (param == NULL) {
85 return BT_BAD_PARAM;
86 }
87 HciCmd *cmd = HciAllocCmd(HCI_WRITE_INQUIRY_SCAN_ACTIVITY, (void *)param, sizeof(HciWriteInquiryScanActivityParam));
88 return HciSendCmd(cmd);
89 }
90
91 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
92 // 7.3.26 Write Class of Device Command
HCI_WriteClassofDevice(const HciWriteClassofDeviceParam * param)93 int HCI_WriteClassofDevice(const HciWriteClassofDeviceParam *param)
94 {
95 if (param == NULL) {
96 return BT_BAD_PARAM;
97 }
98 HciCmd *cmd = HciAllocCmd(HCI_WRITE_CLASS_OF_DEVICE, (void *)param, sizeof(HciWriteClassofDeviceParam));
99 return HciSendCmd(cmd);
100 }
101
102 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
103 // 7.3.28 Write Voice Setting Command
HCI_WriteVoiceSetting(const HciWriteVoiceSettingParam * param)104 int HCI_WriteVoiceSetting(const HciWriteVoiceSettingParam *param)
105 {
106 if (param == NULL) {
107 return BT_BAD_PARAM;
108 }
109 HciCmd *cmd = HciAllocCmd(HCI_WRITE_VOICE_SETTING, (void *)param, sizeof(HciWriteVoiceSettingParam));
110 return HciSendCmd(cmd);
111 }
112
113 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
114 // 7.3.39 Host Buffer Size Command
HCI_HostBufferSize(const HciHostBufferSizeCmdParam * param)115 int HCI_HostBufferSize(const HciHostBufferSizeCmdParam *param)
116 {
117 if (param == NULL) {
118 return BT_BAD_PARAM;
119 }
120 HciCmd *cmd = HciAllocCmd(HCI_HOST_BURRER_SIZE, (void *)param, sizeof(HciHostBufferSizeCmdParam));
121 return HciSendCmd(cmd);
122 }
123
124 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
125 // 7.3.45 Write Current IAC LAP Command
HCI_WriteCurrentIacLap(const HciWriteCurrentIacLapParam * param)126 int HCI_WriteCurrentIacLap(const HciWriteCurrentIacLapParam *param)
127 {
128 if (param == NULL) {
129 return BT_BAD_PARAM;
130 }
131
132 int result;
133
134 const size_t length = 1 + param->numCurrentIAC * IACLAP_SIZE;
135 uint8_t *data = MEM_MALLOC.alloc(length);
136 if (data != NULL) {
137 int offset = 0;
138 data[offset] = param->numCurrentIAC;
139 offset += 1;
140
141 for (size_t i = 0; i < param->numCurrentIAC; i++) {
142 (void)memcpy_s(data + offset, length - offset, ¶m->iacLAP[i], IACLAP_SIZE);
143 offset += IACLAP_SIZE;
144 }
145
146 HciCmd *cmd = HciAllocCmd(HCI_WRITE_CURRENT_IAC_LAP, (void *)data, length);
147
148 result = HciSendCmd(cmd);
149
150 MEM_MALLOC.free(data);
151 } else {
152 result = BT_NO_MEMORY;
153 }
154
155 return result;
156 }
157
158 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
159 // 7.3.48 Write Inquiry Scan Type Command
HCI_WriteInquiryScanType(const HciWriteInquiryScanTypeParam * param)160 int HCI_WriteInquiryScanType(const HciWriteInquiryScanTypeParam *param)
161 {
162 if (param == NULL) {
163 return BT_BAD_PARAM;
164 }
165 HciCmd *cmd = HciAllocCmd(HCI_WRITE_INQUIRY_SCAN_TYPE, (void *)param, sizeof(HciWriteInquiryScanTypeParam));
166 return HciSendCmd(cmd);
167 }
168
169 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
170 // 7.3.50 Write Inquiry Mode Command
HCI_WriteInquiryMode(const HciWriteInquiryModeParam * param)171 int HCI_WriteInquiryMode(const HciWriteInquiryModeParam *param)
172 {
173 if (param == NULL) {
174 return BT_BAD_PARAM;
175 }
176 HciCmd *cmd = HciAllocCmd(HCI_WRITE_INQUIRY_MODE, (void *)param, sizeof(HciWriteInquiryModeParam));
177 return HciSendCmd(cmd);
178 }
179
180 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
181 // 7.3.52 Write Page Scan Type Command
HCI_WritePageScanType(const HciWritePageScanTypeParam * param)182 int HCI_WritePageScanType(const HciWritePageScanTypeParam *param)
183 {
184 if (param == NULL) {
185 return BT_BAD_PARAM;
186 }
187 HciCmd *cmd = HciAllocCmd(HCI_WRITE_PAGE_SCAN_TYPE, (void *)param, sizeof(HciWritePageScanTypeParam));
188 return HciSendCmd(cmd);
189 }
190
191 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
192 // 7.3.56 Write Extended Inquiry Response Command
HCI_WriteExtendedInquiryResponse(const HciWriteExtendedInquiryResponseParam * param)193 int HCI_WriteExtendedInquiryResponse(const HciWriteExtendedInquiryResponseParam *param)
194 {
195 if (param == NULL) {
196 return BT_BAD_PARAM;
197 }
198 HciCmd *cmd =
199 HciAllocCmd(HCI_WRITE_EXTENDED_INQUIRY_RESPONSE, (void *)param, sizeof(HciWriteExtendedInquiryResponseParam));
200 return HciSendCmd(cmd);
201 }
202
203 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
204 // 7.3.59 Write Simple Pairing Mode Command
HCI_WriteSimplePairingMode(const HciWriteSimplePairingModeParam * param)205 int HCI_WriteSimplePairingMode(const HciWriteSimplePairingModeParam *param)
206 {
207 if (param == NULL) {
208 return BT_BAD_PARAM;
209 }
210 HciCmd *cmd = HciAllocCmd(HCI_WRITE_SIMPLE_PAIRING_MODE, (void *)param, sizeof(HciWriteSimplePairingModeParam));
211 return HciSendCmd(cmd);
212 }
213
214 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
215 // 7.3.60 Read Local OOB Data Command
HCI_ReadLocalOOBData()216 int HCI_ReadLocalOOBData()
217 {
218 HciCmd *cmd = HciAllocCmd(HCI_READ_LOCAL_OOB_DATA, NULL, 0);
219 return HciSendCmd(cmd);
220 }
221
222 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
223 // 7.3.79 Write LE Host Support Command
HCI_WriteLeHostSupport(const HciWriteLeHostSupportParam * param)224 int HCI_WriteLeHostSupport(const HciWriteLeHostSupportParam *param)
225 {
226 if (param == NULL) {
227 return BT_BAD_PARAM;
228 }
229 HciCmd *cmd = HciAllocCmd(HCI_WRITE_LE_HOST_SUPPORT, (void *)param, sizeof(HciWriteLeHostSupportParam));
230 return HciSendCmd(cmd);
231 }
232
233 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
234 // 7.3.92 Write Secure Connections Host Support Command
HCI_WriteSecureConnectionsHostSupport(const HciWriteSecureConnectionsHostSupportParam * param)235 int HCI_WriteSecureConnectionsHostSupport(const HciWriteSecureConnectionsHostSupportParam *param)
236 {
237 HciCmd *cmd = HciAllocCmd(
238 HCI_WRITE_SECURE_CONNECTIONS_HOST_SUPPORT, (void *)param, sizeof(HciWriteSecureConnectionsHostSupportParam));
239 return HciSendCmd(cmd);
240 }
241
242 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
243 // 7.3.94 Write Authenticated Payload Timeout Command
HCI_WriteAuthenticatedPayloadTimeout(const HciWriteAuthenticatedPayloadTimeoutParam * param)244 int HCI_WriteAuthenticatedPayloadTimeout(const HciWriteAuthenticatedPayloadTimeoutParam *param)
245 {
246 HciCmd *cmd = HciAllocCmd(
247 HCI_WRITE_AUTHENTICATED_PAYLOAD_TIMEOUT, (void *)param, sizeof(HciWriteAuthenticatedPayloadTimeoutParam));
248 return HciSendCmd(cmd);
249 }
250
251 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
252 // 7.3.95 Read Local OOB Extended Data Command
HCI_ReadLocalOOBExtendedData()253 int HCI_ReadLocalOOBExtendedData()
254 {
255 HciCmd *cmd = HciAllocCmd(HCI_READ_LOCAL_OOB_EXTENDED_DATA, NULL, 0);
256 return HciSendCmd(cmd);
257 }
258