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.1.1 Inquiry Command
HCI_Inquiry(const HciInquiryeParam * param)27 int HCI_Inquiry(const HciInquiryeParam *param)
28 {
29 if (param == NULL) {
30 return BT_BAD_PARAM;
31 }
32 HciCmd *cmd = HciAllocCmd(HCI_INQUIRY, (void *)param, sizeof(HciInquiryeParam));
33 return HciSendCmd(cmd);
34 }
35
36 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
37 // 7.1.2 Inquiry Cancel Command
HCI_InquiryCancel()38 int HCI_InquiryCancel()
39 {
40 HciCmd *cmd = HciAllocCmd(HCI_INQUIRY_CANCEL, NULL, 0);
41 return HciSendCmd(cmd);
42 }
43
44 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
45 // 7.1.5 Create Connection Command
HCI_CreateConnection(const HciCreateConnectionParam * param)46 int HCI_CreateConnection(const HciCreateConnectionParam *param)
47 {
48 if (param == NULL) {
49 return BT_BAD_PARAM;
50 }
51
52 HciCmd *cmd = HciAllocCmd(HCI_CREATE_CONNECTION, (void *)param, sizeof(HciCreateConnectionParam));
53 return HciSendCmd(cmd);
54 }
55
56 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
57 // 7.1.6 Disconnect Command
HCI_Disconnect(const HciDisconnectParam * param)58 int HCI_Disconnect(const HciDisconnectParam *param)
59 {
60 if (param == NULL) {
61 return BT_BAD_PARAM;
62 }
63
64 HciCmd *cmd = HciAllocCmd(HCI_DISCONNECT, (void *)param, sizeof(HciDisconnectParam));
65 return HciSendCmd(cmd);
66 }
67
68 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
69 // 7.1.7 Create Connection Cancel Command
HCI_CreateConnectionCancel(const HciCreateConnectionCancelParam * param)70 int HCI_CreateConnectionCancel(const HciCreateConnectionCancelParam *param)
71 {
72 if (param == NULL) {
73 return BT_BAD_PARAM;
74 }
75
76 HciCmd *cmd = HciAllocCmd(HCI_CREATE_CONNECTION_CANCEL, (void *)param, sizeof(HciCreateConnectionCancelParam));
77 return HciSendCmd(cmd);
78 }
79
80 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
81 // 7.1.8 Accept Connection Request Command
HCI_AcceptConnectionRequest(const HciAcceptConnectionReqestParam * param)82 int HCI_AcceptConnectionRequest(const HciAcceptConnectionReqestParam *param)
83 {
84 if (param == NULL) {
85 return BT_BAD_PARAM;
86 }
87
88 HciCmd *cmd = HciAllocCmd(HCI_ACCEPT_CONNECTION_REQUEST, (void *)param, sizeof(HciAcceptConnectionReqestParam));
89 return HciSendCmd(cmd);
90 }
91
92 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
93 // 7.1.9 Reject Connection Request Command
HCI_RejectConnectionRequest(const HciRejectConnectionRequestParam * param)94 int HCI_RejectConnectionRequest(const HciRejectConnectionRequestParam *param)
95 {
96 if (param == NULL) {
97 return BT_BAD_PARAM;
98 }
99
100 HciCmd *cmd = HciAllocCmd(HCI_REJECT_CONNECTION_REQUEST, (void *)param, sizeof(HciRejectConnectionRequestParam));
101 return HciSendCmd(cmd);
102 }
103
104 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
105 // 7.1.10 Link Key Request Reply Command
HCI_LinkKeyRequestReply(const HciLinkKeyRequestReplyParam * param)106 int HCI_LinkKeyRequestReply(const HciLinkKeyRequestReplyParam *param)
107 {
108 if (param == NULL) {
109 return BT_BAD_PARAM;
110 }
111
112 HciCmd *cmd = HciAllocCmd(HCI_LINK_KEY_REQUEST_REPLY, (void *)param, sizeof(HciLinkKeyRequestReplyParam));
113 return HciSendCmd(cmd);
114 }
115
116 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
117 // 7.1.11 Link Key Request Negative Reply Command
HCI_LinkKeyRequestNegativeReply(const HciLinkKeyRequestNegativeReplyParam * param)118 int HCI_LinkKeyRequestNegativeReply(const HciLinkKeyRequestNegativeReplyParam *param)
119 {
120 if (param == NULL) {
121 return BT_BAD_PARAM;
122 }
123
124 HciCmd *cmd =
125 HciAllocCmd(HCI_LINK_KEY_REQUEST_NEGATIVE_REPLY, (void *)param, sizeof(HciLinkKeyRequestNegativeReplyParam));
126 return HciSendCmd(cmd);
127 }
128
129 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
130 // 7.1.12 PIN Code Request Reply Command
HCI_PINCodeRequestReply(const HciPinCodeRequestReplyParam * param)131 int HCI_PINCodeRequestReply(const HciPinCodeRequestReplyParam *param)
132 {
133 if (param == NULL) {
134 return BT_BAD_PARAM;
135 }
136
137 HciCmd *cmd = HciAllocCmd(HCI_PIN_CODE_REQUEST_REPLY, (void *)param, sizeof(HciPinCodeRequestReplyParam));
138 return HciSendCmd(cmd);
139 }
140
141 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
142 // 7.1.13 PIN Code Request Negative Reply Command
HCI_PINCodeRequestNegativeReply(const HciPinCodeRequestNegativeReplyParam * param)143 int HCI_PINCodeRequestNegativeReply(const HciPinCodeRequestNegativeReplyParam *param)
144 {
145 if (param == NULL) {
146 return BT_BAD_PARAM;
147 }
148
149 HciCmd *cmd =
150 HciAllocCmd(HCI_PIN_CODE_REQUEST_NEGATIVE_REPLY, (void *)param, sizeof(HciPinCodeRequestNegativeReplyParam));
151 return HciSendCmd(cmd);
152 }
153
154 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
155 // 7.1.14 Change Connection Packet Type Command
HCI_ChangeConnectionPacketType(const HciChangeConnectionPacketTypeParam * param)156 int HCI_ChangeConnectionPacketType(const HciChangeConnectionPacketTypeParam *param)
157 {
158 if (param == NULL) {
159 return BT_BAD_PARAM;
160 }
161
162 HciCmd *cmd =
163 HciAllocCmd(HCI_CHANGE_CONNECTION_PACKET_TYPE, (void *)param, sizeof(HciChangeConnectionPacketTypeParam));
164 return HciSendCmd(cmd);
165 }
166
167 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
168 // 7.1.15 Authentication Requested Command
HCI_AuthenticationRequested(const HciAuthenticationRequestedParam * param)169 int HCI_AuthenticationRequested(const HciAuthenticationRequestedParam *param)
170 {
171 if (param == NULL) {
172 return BT_BAD_PARAM;
173 }
174
175 HciCmd *cmd = HciAllocCmd(HCI_AUTHENTICATION_REQUESTED, (void *)param, sizeof(HciAuthenticationRequestedParam));
176 return HciSendCmd(cmd);
177 }
178
179 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
180 // 7.1.16 Set Connection Encryption Command
HCI_SetConnectionEncryption(const HciSetConnectionEncryptionParam * param)181 int HCI_SetConnectionEncryption(const HciSetConnectionEncryptionParam *param)
182 {
183 if (param == NULL) {
184 return BT_BAD_PARAM;
185 }
186
187 HciCmd *cmd = HciAllocCmd(HCI_SET_CONNECTION_ENCRYPTION, (void *)param, sizeof(HciSetConnectionEncryptionParam));
188 return HciSendCmd(cmd);
189 }
190
191 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
192 // 7.1.19 Remote Name Request Command
HCI_RemoteNameRequest(const HciRemoteNameRequestParam * param)193 int HCI_RemoteNameRequest(const HciRemoteNameRequestParam *param)
194 {
195 if (param == NULL) {
196 return BT_BAD_PARAM;
197 }
198 HciCmd *cmd = HciAllocCmd(HCI_REMOTE_NAME_REQUEST, (void *)param, sizeof(HciRemoteNameRequestParam));
199 return HciSendCmd(cmd);
200 }
201
202 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
203 // 7.1.20 Remote Name Request Cancel Command
HCI_RemoteNameRequestCancel(const HciRemoteNameRequestCancelParam * param)204 int HCI_RemoteNameRequestCancel(const HciRemoteNameRequestCancelParam *param)
205 {
206 if (param == NULL) {
207 return BT_BAD_PARAM;
208 }
209 HciCmd *cmd = HciAllocCmd(HCI_REMOTE_NAME_REQUEST_CANCEL, (void *)param, sizeof(HciRemoteNameRequestCancelParam));
210 return HciSendCmd(cmd);
211 }
212
213 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
214 // 7.1.21 Read Remote Supported Features Command
HCI_ReadRemoteSupportedFeatures(const HciReadRemoteSupportedFeaturesParam * param)215 int HCI_ReadRemoteSupportedFeatures(const HciReadRemoteSupportedFeaturesParam *param)
216 {
217 if (param == NULL) {
218 return BT_BAD_PARAM;
219 }
220 HciCmd *cmd =
221 HciAllocCmd(HCI_READ_REMOTE_SUPPORTED_FEATURES, (void *)param, sizeof(HciReadRemoteSupportedFeaturesParam));
222 return HciSendCmd(cmd);
223 }
224
225 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
226 // 7.1.22 Read Remote Extended Features Command
HCI_ReadRemoteExtendedFeatures(const HciReadRemoteExtendedFeaturesParam * param)227 int HCI_ReadRemoteExtendedFeatures(const HciReadRemoteExtendedFeaturesParam *param)
228 {
229 if (param == NULL) {
230 return BT_BAD_PARAM;
231 }
232 HciCmd *cmd =
233 HciAllocCmd(HCI_READ_REMOTE_EXTENDED_FEATURES, (void *)param, sizeof(HciReadRemoteExtendedFeaturesParam));
234 return HciSendCmd(cmd);
235 }
236
237 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
238 // 7.1.23 Read Remote Version Information Command
HCI_ReadRemoteVersionInformation(const HciReadRemoteVersionInformationParam * param)239 int HCI_ReadRemoteVersionInformation(const HciReadRemoteVersionInformationParam *param)
240 {
241 if (param == NULL) {
242 return BT_BAD_PARAM;
243 }
244 HciCmd *cmd =
245 HciAllocCmd(HCI_READ_REMOTE_VERSION_INFORMATION, (void *)param, sizeof(HciReadRemoteVersionInformationParam));
246 return HciSendCmd(cmd);
247 }
248
249 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
250 // 7.1.26 Setup Synchronous Connection Command
HCI_SetupSynchronousConnection(const HciSetupSynchronousConnectionParam * param)251 int HCI_SetupSynchronousConnection(const HciSetupSynchronousConnectionParam *param)
252 {
253 if (param == NULL) {
254 return BT_BAD_PARAM;
255 }
256 HciCmd *cmd =
257 HciAllocCmd(HCI_SETUP_SYNCHRONOUS_CONNECTION, (void *)param, sizeof(HciSetupSynchronousConnectionParam));
258 return HciSendCmd(cmd);
259 }
260
261 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
262 // 7.1.27 Accept Synchronous Connection Request Command
HCI_AcceptSynchronousConnectionRequest(const HciAcceptSynchronousConnectionRequestParam * param)263 int HCI_AcceptSynchronousConnectionRequest(const HciAcceptSynchronousConnectionRequestParam *param)
264 {
265 if (param == NULL) {
266 return BT_BAD_PARAM;
267 }
268 HciCmd *cmd = HciAllocCmd(
269 HCI_ACCEPT_SYNCHRONOUS_CONNECTION_REQUEST, (void *)param, sizeof(HciAcceptSynchronousConnectionRequestParam));
270 return HciSendCmd(cmd);
271 }
272
273 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
274 // 7.1.28 Reject Synchronous Connection Request Command
HCI_RejectSynchronousConnectionRequest(const HciRejectSynchronousConnectionRequestParam * param)275 int HCI_RejectSynchronousConnectionRequest(const HciRejectSynchronousConnectionRequestParam *param)
276 {
277 if (param == NULL) {
278 return BT_BAD_PARAM;
279 }
280 HciCmd *cmd = HciAllocCmd(
281 HCI_REJECT_SYNCHRONOUS_CONNECTION_REQUEST, (void *)param, sizeof(HciRejectSynchronousConnectionRequestParam));
282 return HciSendCmd(cmd);
283 }
284
285 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
286 // 7.1.29 IO Capability Request Reply Command
HCI_IOCapabilityRequestReply(const HciIOCapabilityRequestReplyParam * param)287 int HCI_IOCapabilityRequestReply(const HciIOCapabilityRequestReplyParam *param)
288 {
289 if (param == NULL) {
290 return BT_BAD_PARAM;
291 }
292
293 HciCmd *cmd = HciAllocCmd(HCI_IO_CAPABILITY_REQUEST_REPLY, (void *)param, sizeof(HciIOCapabilityRequestReplyParam));
294 return HciSendCmd(cmd);
295 }
296
297 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
298 // 7.1.30 User Confirmation Request Reply Command
HCI_UserConfirmationRequestReply(const HciUserConfirmationRequestReplyParam * param)299 int HCI_UserConfirmationRequestReply(const HciUserConfirmationRequestReplyParam *param)
300 {
301 if (param == NULL) {
302 return BT_BAD_PARAM;
303 }
304
305 HciCmd *cmd =
306 HciAllocCmd(HCI_USER_CONFIRMATION_REQUEST_REPLY, (void *)param, sizeof(HciUserConfirmationRequestReplyParam));
307 return HciSendCmd(cmd);
308 }
309
310 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
311 // 7.1.31 User Confirmation Request Negative Reply Command
HCI_UserConfirmationRequestNegativeReply(const HciUserConfirmationRequestNegativeReplyParam * param)312 int HCI_UserConfirmationRequestNegativeReply(const HciUserConfirmationRequestNegativeReplyParam *param)
313 {
314 if (param == NULL) {
315 return BT_BAD_PARAM;
316 }
317
318 HciCmd *cmd = HciAllocCmd(HCI_USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY,
319 (void *)param,
320 sizeof(HciUserConfirmationRequestNegativeReplyParam));
321 return HciSendCmd(cmd);
322 }
323
324 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
325 // 7.1.32 User Passkey Request Reply Command
HCI_UserPasskeyRequestReply(const HciUserPasskeyRequestReplyParam * param)326 int HCI_UserPasskeyRequestReply(const HciUserPasskeyRequestReplyParam *param)
327 {
328 if (param == NULL) {
329 return BT_BAD_PARAM;
330 }
331
332 HciCmd *cmd = HciAllocCmd(HCI_USER_PASSKEY_REQUEST_REPLY, (void *)param, sizeof(HciUserPasskeyRequestReplyParam));
333 return HciSendCmd(cmd);
334 }
335
336 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
337 // 7.1.33 User Passkey Request Negative Reply Command
HCI_UserPasskeyRequestNegativeReply(const HciUserPasskeyRequestNegativeReplyParam * param)338 int HCI_UserPasskeyRequestNegativeReply(const HciUserPasskeyRequestNegativeReplyParam *param)
339 {
340 if (param == NULL) {
341 return BT_BAD_PARAM;
342 }
343
344 HciCmd *cmd = HciAllocCmd(
345 HCI_USER_PASSKEY_REQUEST_NEGATIVE_REPLY, (void *)param, sizeof(HciUserPasskeyRequestNegativeReplyParam));
346 return HciSendCmd(cmd);
347 }
348
349 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
350 // 7.1.34 Remote OOB Data Request Reply Command
HCI_RemoteOOBDataRequestReply(const HciRemoteOobDataRequestReplyParam * param)351 int HCI_RemoteOOBDataRequestReply(const HciRemoteOobDataRequestReplyParam *param)
352 {
353 if (param == NULL) {
354 return BT_BAD_PARAM;
355 }
356
357 HciCmd *cmd =
358 HciAllocCmd(HCI_REMOTE_OOB_DATA_REQUEST_REPLY, (void *)param, sizeof(HciRemoteOobDataRequestReplyParam));
359 return HciSendCmd(cmd);
360 }
361
362 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
363 // 7.1.35 Remote OOB Data Request Negative Reply Command
HCI_RemoteOOBDataRequestNegativeReply(const HciRemoteOobDataRequestNegativeReplyParam * param)364 int HCI_RemoteOOBDataRequestNegativeReply(const HciRemoteOobDataRequestNegativeReplyParam *param)
365 {
366 if (param == NULL) {
367 return BT_BAD_PARAM;
368 }
369
370 HciCmd *cmd = HciAllocCmd(
371 HCI_REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY, (void *)param, sizeof(HciRemoteOobDataRequestNegativeReplyParam));
372 return HciSendCmd(cmd);
373 }
374
375 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
376 // 7.1.36 IO Capability Request Negative Reply Command
HCI_IOCapabilityRequestNegativeReply(const HciIoCapabilityRequestNegativeReplyParam * param)377 int HCI_IOCapabilityRequestNegativeReply(const HciIoCapabilityRequestNegativeReplyParam *param)
378 {
379 if (param == NULL) {
380 return BT_BAD_PARAM;
381 }
382
383 HciCmd *cmd = HciAllocCmd(
384 HCI_IO_CAPABILITY_REQUEST_NEGATIVE_REPLY, (void *)param, sizeof(HciIoCapabilityRequestNegativeReplyParam));
385 return HciSendCmd(cmd);
386 }
387
388 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
389 // 7.1.45 Enhanced Setup Synchronous Connection Command
HCI_EnhancedSetupSynchronousConnection(const HciEnhancedSetupSynchronousConnectionParam * param)390 int HCI_EnhancedSetupSynchronousConnection(const HciEnhancedSetupSynchronousConnectionParam *param)
391 {
392 if (param == NULL) {
393 return BT_BAD_PARAM;
394 }
395 HciCmd *cmd = HciAllocCmd(
396 HCI_ENHANCED_SETUP_SYNCHRONOUS_CONNECTION, (void *)param, sizeof(HciEnhancedSetupSynchronousConnectionParam));
397 return HciSendCmd(cmd);
398 }
399
400 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
401 // 7.1.46 Enhanced Accept Synchronous Connection Request Command
HCI_EnhancedAcceptSynchronousConnectionRequest(const HciEnhancedAcceptSynchronousConnectionRequestParam * param)402 int HCI_EnhancedAcceptSynchronousConnectionRequest(const HciEnhancedAcceptSynchronousConnectionRequestParam *param)
403 {
404 if (param == NULL) {
405 return BT_BAD_PARAM;
406 }
407 HciCmd *cmd = HciAllocCmd(HCI_ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION_REQUEST,
408 (void *)param,
409 sizeof(HciEnhancedAcceptSynchronousConnectionRequestParam));
410 return HciSendCmd(cmd);
411 }
412
413 // BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E
414 // 7.1.53 Remote OOB Extended Data Request Reply Command
HCI_RemoteOOBExtendedDataRequestReply(const HciRemoteOobExtendedDataRequestReplyParam * param)415 int HCI_RemoteOOBExtendedDataRequestReply(const HciRemoteOobExtendedDataRequestReplyParam *param)
416 {
417 if (param == NULL) {
418 return BT_BAD_PARAM;
419 }
420 HciCmd *cmd = HciAllocCmd(
421 HCI_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY, (void *)param, sizeof(HciRemoteOobExtendedDataRequestReplyParam));
422 return HciSendCmd(cmd);
423 }