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, &param->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