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 }