xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/include/nimble/hci_common.h (revision 042d53a763ad75cb1465103098bb88c245d95138)
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *  http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied.  See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
20 #ifndef H_BLE_HCI_COMMON_
21 #define H_BLE_HCI_COMMON_
22 
23 #include "ble.h"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 /*
30  * HCI Command Header
31  *
32  * Comprises the following fields
33  *  -> Opcode group field & Opcode command field (2)
34  *  -> Parameter Length                          (1)
35  *      Length of all the parameters (does not include any part of the hci
36  *      command header
37  */
38 #define BLE_HCI_CMD_HDR_LEN                 (3)
39 
40 #define BLE_HCI_OPCODE_NOP                  (0)
41 
42 /* Set opcode based on OCF and OGF */
43 #define BLE_HCI_OP(ogf, ocf)            ((ocf) | ((ogf) << 10))
44 
45 /* Get the OGF and OCF from the opcode in the command */
46 #define BLE_HCI_OGF(opcode)                 (((opcode) >> 10) & 0x003F)
47 #define BLE_HCI_OCF(opcode)                 ((opcode) & 0x03FF)
48 
49 /* Opcode Group definitions (note: 0x07 not defined in spec) */
50 #define BLE_HCI_OGF_LINK_CTRL               (0x01)
51 #define BLE_HCI_OGF_LINK_POLICY             (0x02)
52 #define BLE_HCI_OGF_CTLR_BASEBAND           (0x03)
53 #define BLE_HCI_OGF_INFO_PARAMS             (0x04)
54 #define BLE_HCI_OGF_STATUS_PARAMS           (0x05)
55 #define BLE_HCI_OGF_TESTING                 (0x06)
56 #define BLE_HCI_OGF_LE                      (0x08)
57 #define BLE_HCI_OGF_VENDOR                  (0x3F)
58 
59 /*
60  * Number of LE commands. NOTE: this is really just used to size the array
61  * containing the lengths of the LE commands.
62  */
63 #define BLE_HCI_NUM_LE_CMDS                 (79)
64 
65 /* List of OCF for Link Control commands (OGF=0x01) */
66 #define BLE_HCI_OCF_DISCONNECT_CMD          (0x0006)
67 #define BLE_HCI_OCF_RD_REM_VER_INFO         (0x001D)
68 
69 /* List of OCF for Controller and Baseband commands (OGF=0x03) */
70 #define BLE_HCI_OCF_CB_SET_EVENT_MASK       (0x0001)
71 #define BLE_HCI_OCF_CB_RESET                (0x0003)
72 #define BLE_HCI_OCF_CB_READ_TX_PWR          (0x002D)
73 #define BLE_HCI_OCF_CB_SET_CTLR_TO_HOST_FC  (0x0031)
74 #define BLE_HCI_OCF_CB_HOST_BUF_SIZE        (0x0033)
75 #define BLE_HCI_OCF_CB_HOST_NUM_COMP_PKTS   (0x0035)
76 #define BLE_HCI_OCF_CB_SET_EVENT_MASK2      (0x0063)
77 #define BLE_HCI_OCF_CB_RD_AUTH_PYLD_TMO     (0x007B)
78 #define BLE_HCI_OCF_CB_WR_AUTH_PYLD_TMO     (0x007C)
79 
80 /* List of OCF for Info Param commands (OGF=0x04) */
81 #define BLE_HCI_OCF_IP_RD_LOCAL_VER         (0x0001)
82 #define BLE_HCI_OCF_IP_RD_LOC_SUPP_CMD      (0x0002)
83 #define BLE_HCI_OCF_IP_RD_LOC_SUPP_FEAT     (0x0003)
84 #define BLE_HCI_OCF_IP_RD_BUF_SIZE          (0x0005)
85 #define BLE_HCI_OCF_IP_RD_BD_ADDR           (0x0009)
86 
87 /* List of OCF for Status parameters commands (OGF = 0x05) */
88 #define BLE_HCI_OCF_RD_RSSI                 (0x0005)
89 
90 /* List of OCF for LE commands (OGF = 0x08) */
91 #define BLE_HCI_OCF_LE_SET_EVENT_MASK               (0x0001)
92 #define BLE_HCI_OCF_LE_RD_BUF_SIZE                  (0x0002)
93 #define BLE_HCI_OCF_LE_RD_LOC_SUPP_FEAT             (0x0003)
94 /* NOTE: 0x0004 is intentionally left undefined */
95 #define BLE_HCI_OCF_LE_SET_RAND_ADDR                (0x0005)
96 #define BLE_HCI_OCF_LE_SET_ADV_PARAMS               (0x0006)
97 #define BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR            (0x0007)
98 #define BLE_HCI_OCF_LE_SET_ADV_DATA                 (0x0008)
99 #define BLE_HCI_OCF_LE_SET_SCAN_RSP_DATA            (0x0009)
100 #define BLE_HCI_OCF_LE_SET_ADV_ENABLE               (0x000A)
101 #define BLE_HCI_OCF_LE_SET_SCAN_PARAMS              (0x000B)
102 #define BLE_HCI_OCF_LE_SET_SCAN_ENABLE              (0x000C)
103 #define BLE_HCI_OCF_LE_CREATE_CONN                  (0x000D)
104 #define BLE_HCI_OCF_LE_CREATE_CONN_CANCEL           (0x000E)
105 #define BLE_HCI_OCF_LE_RD_WHITE_LIST_SIZE           (0x000F)
106 #define BLE_HCI_OCF_LE_CLEAR_WHITE_LIST             (0x0010)
107 #define BLE_HCI_OCF_LE_ADD_WHITE_LIST               (0x0011)
108 #define BLE_HCI_OCF_LE_RMV_WHITE_LIST               (0x0012)
109 #define BLE_HCI_OCF_LE_CONN_UPDATE                  (0x0013)
110 #define BLE_HCI_OCF_LE_SET_HOST_CHAN_CLASS          (0x0014)
111 #define BLE_HCI_OCF_LE_RD_CHAN_MAP                  (0x0015)
112 #define BLE_HCI_OCF_LE_RD_REM_FEAT                  (0x0016)
113 #define BLE_HCI_OCF_LE_ENCRYPT                      (0x0017)
114 #define BLE_HCI_OCF_LE_RAND                         (0x0018)
115 #define BLE_HCI_OCF_LE_START_ENCRYPT                (0x0019)
116 #define BLE_HCI_OCF_LE_LT_KEY_REQ_REPLY             (0x001A)
117 #define BLE_HCI_OCF_LE_LT_KEY_REQ_NEG_REPLY         (0x001B)
118 #define BLE_HCI_OCF_LE_RD_SUPP_STATES               (0x001C)
119 #define BLE_HCI_OCF_LE_RX_TEST                      (0x001D)
120 #define BLE_HCI_OCF_LE_TX_TEST                      (0x001E)
121 #define BLE_HCI_OCF_LE_TEST_END                     (0x001F)
122 #define BLE_HCI_OCF_LE_REM_CONN_PARAM_RR            (0x0020)
123 #define BLE_HCI_OCF_LE_REM_CONN_PARAM_NRR           (0x0021)
124 #define BLE_HCI_OCF_LE_SET_DATA_LEN                 (0x0022)
125 #define BLE_HCI_OCF_LE_RD_SUGG_DEF_DATA_LEN         (0x0023)
126 #define BLE_HCI_OCF_LE_WR_SUGG_DEF_DATA_LEN         (0x0024)
127 #define BLE_HCI_OCF_LE_RD_P256_PUBKEY               (0x0025)
128 #define BLE_HCI_OCF_LE_GEN_DHKEY                    (0x0026)
129 #define BLE_HCI_OCF_LE_ADD_RESOLV_LIST              (0x0027)
130 #define BLE_HCI_OCF_LE_RMV_RESOLV_LIST              (0x0028)
131 #define BLE_HCI_OCF_LE_CLR_RESOLV_LIST              (0x0029)
132 #define BLE_HCI_OCF_LE_RD_RESOLV_LIST_SIZE          (0x002A)
133 #define BLE_HCI_OCF_LE_RD_PEER_RESOLV_ADDR          (0x002B)
134 #define BLE_HCI_OCF_LE_RD_LOCAL_RESOLV_ADDR         (0x002C)
135 #define BLE_HCI_OCF_LE_SET_ADDR_RES_EN              (0x002D)
136 #define BLE_HCI_OCF_LE_SET_RPA_TMO                  (0x002E)
137 #define BLE_HCI_OCF_LE_RD_MAX_DATA_LEN              (0x002F)
138 #define BLE_HCI_OCF_LE_RD_PHY                       (0x0030)
139 #define BLE_HCI_OCF_LE_SET_DEFAULT_PHY              (0x0031)
140 #define BLE_HCI_OCF_LE_SET_PHY                      (0x0032)
141 #define BLE_HCI_OCF_LE_ENH_RX_TEST                  (0x0033)
142 #define BLE_HCI_OCF_LE_ENH_TX_TEST                  (0x0034)
143 #define BLE_HCI_OCF_LE_SET_ADV_SET_RND_ADDR         (0x0035)
144 #define BLE_HCI_OCF_LE_SET_EXT_ADV_PARAM            (0x0036)
145 #define BLE_HCI_OCF_LE_SET_EXT_ADV_DATA             (0x0037)
146 #define BLE_HCI_OCF_LE_SET_EXT_SCAN_RSP_DATA        (0x0038)
147 #define BLE_HCI_OCF_LE_SET_EXT_ADV_ENABLE           (0x0039)
148 #define BLE_HCI_OCF_LE_RD_MAX_ADV_DATA_LEN          (0x003A)
149 #define BLE_HCI_OCF_LE_RD_NUM_OF_ADV_SETS           (0x003B)
150 #define BLE_HCI_OCF_LE_REMOVE_ADV_SET               (0x003C)
151 #define BLE_HCI_OCF_LE_CLEAR_ADV_SETS               (0x003D)
152 #define BLE_HCI_OCF_LE_SET_PER_ADV_PARAMS           (0x003E)
153 #define BLE_HCI_OCF_LE_SET_PER_ADV_DATA             (0x003F)
154 #define BLE_HCI_OCF_LE_SET_PER_ADV_ENABLE           (0x0040)
155 #define BLE_HCI_OCF_LE_SET_EXT_SCAN_PARAM           (0x0041)
156 #define BLE_HCI_OCF_LE_SET_EXT_SCAN_ENABLE          (0x0042)
157 #define BLE_HCI_OCF_LE_EXT_CREATE_CONN              (0x0043)
158 #define BLE_HCI_OCF_LE_PER_ADV_CREATE_SYNC          (0x0044)
159 #define BLE_HCI_OCF_LE_PER_ADV_CREATE_SYNC_CANCEL   (0x0045)
160 #define BLE_HCI_OCF_LE_PER_ADV_TERM_SYNC            (0x0046)
161 #define BLE_HCI_OCF_LE_ADD_DEV_TO_PER_ADV_LIST      (0x0047)
162 #define BLE_HCI_OCF_LE_REM_DEV_FROM_PER_ADV_LIST    (0x0048)
163 #define BLE_HCI_OCF_LE_CLEAR_PER_ADV_LIST           (0x0049)
164 #define BLE_HCI_OCF_LE_RD_PER_ADV_LIST_SIZE         (0x004A)
165 #define BLE_HCI_OCF_LE_RD_TRANSMIT_POWER            (0x004B)
166 #define BLE_HCI_OCF_LE_RD_RF_PATH_COMPENSATION      (0x004C)
167 #define BLE_HCI_OCF_LE_WR_RF_PATH_COMPENSATION      (0x004D)
168 #define BLE_HCI_OCF_LE_SET_PRIVACY_MODE             (0x004E)
169 
170 /* Command Specific Definitions */
171 #define BLE_HCI_VARIABLE_LEN                (0xFF)
172 
173 /* --- Disconnect command (OGF 0x01, OCF 0x0006) --- */
174 #define BLE_HCI_DISCONNECT_CMD_LEN          (3)
175 
176 /* --- Set event mask (OGF 0x03, OCF 0x0001 --- */
177 #define BLE_HCI_SET_EVENT_MASK_LEN          (8)
178 
179 /* --- Set controller to host flow control (OGF 0x03, OCF 0x0031) --- */
180 #define BLE_HCI_CTLR_TO_HOST_FC_LEN         (1)
181 
182 #define BLE_HCI_CTLR_TO_HOST_FC_OFF         (0)
183 #define BLE_HCI_CTLR_TO_HOST_FC_ACL         (1)
184 #define BLE_HCI_CTLR_TO_HOST_FC_SYNC        (2)
185 #define BLE_HCI_CTLR_TO_HOST_FC_BOTH        (3)
186 
187 /* --- Host buffer size (OGF 0x03, OCF 0x0033) --- */
188 #define BLE_HCI_HOST_BUF_SIZE_LEN           (7)
189 
190 /* --- Host number of completed packets (OGF 0x03, OCF 0x0035) --- */
191 #define BLE_HCI_HOST_NUM_COMP_PKTS_HDR_LEN  (1)
192 #define BLE_HCI_HOST_NUM_COMP_PKTS_ENT_LEN  (4)
193 
194 /* --- Read BD_ADDR (OGF 0x04, OCF 0x0009 --- */
195 #define BLE_HCI_IP_RD_BD_ADDR_ACK_PARAM_LEN (6)
196 
197 /* --- Read buffer size (OGF 0x04, OCF 0x0005) --- */
198 #define BLE_HCI_IP_RD_BUF_SIZE_LEN          (0)
199 #define BLE_HCI_IP_RD_BUF_SIZE_RSPLEN       (7) /* No status byte. */
200 
201 /* --- Read/Write authenticated payload timeout (ocf 0x007B/0x007C) */
202 #define BLE_HCI_RD_AUTH_PYLD_TMO_LEN        (4)
203 #define BLE_HCI_WR_AUTH_PYLD_TMO_LEN        (2)
204 
205 /* --- Read local version information (OGF 0x04, OCF 0x0001) --- */
206 #define BLE_HCI_RD_LOC_VER_INFO_RSPLEN      (8) /* No status byte. */
207 
208 /* --- Read local supported command (OGF 0x04, OCF 0x0002) --- */
209 #define BLE_HCI_RD_LOC_SUPP_CMD_RSPLEN      (64) /* No status byte. */
210 
211 /* --- Read local supported features (OGF 0x04, OCF 0x0003) --- */
212 #define BLE_HCI_RD_LOC_SUPP_FEAT_RSPLEN     (8) /* No status byte. */
213 
214 /* --- Read RSSI (OGF 0x05, OCF 0x0005) --- */
215 #define BLE_HCI_READ_RSSI_LEN               (2)
216 #define BLE_HCI_READ_RSSI_ACK_PARAM_LEN     (3)  /* No status byte. */
217 
218 /* --- LE set event mask (OCF 0x0001) --- */
219 #define BLE_HCI_SET_LE_EVENT_MASK_LEN       (8)
220 
221 /* --- LE read buffer size (OCF 0x0002) --- */
222 #define BLE_HCI_RD_BUF_SIZE_LEN             (0)
223 #define BLE_HCI_RD_BUF_SIZE_RSPLEN          (3) /* No status byte. */
224 
225 /* --- LE read local supported features (OCF 0x0003) --- */
226 #define BLE_HCI_RD_LE_LOC_SUPP_FEAT_RSPLEN  (8) /* No status byte. */
227 
228 /* --- LE set random address (OCF 0x0005) */
229 #define BLE_HCI_SET_RAND_ADDR_LEN           (6)
230 
231 /* --- LE set advertising parameters (OCF 0x0006) */
232 #define BLE_HCI_SET_ADV_PARAM_LEN           (15)
233 
234 /* Advertising types */
235 #define BLE_HCI_ADV_TYPE_ADV_IND            (0)
236 #define BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD  (1)
237 #define BLE_HCI_ADV_TYPE_ADV_SCAN_IND       (2)
238 #define BLE_HCI_ADV_TYPE_ADV_NONCONN_IND    (3)
239 #define BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD  (4)
240 #define BLE_HCI_ADV_TYPE_MAX                (4)
241 
242 #define BLE_HCI_ADV_CONN_MASK               (0x0001)
243 #define BLE_HCI_ADV_SCAN_MASK               (0x0002)
244 #define BLE_HCI_ADV_DIRECT_MASK             (0x0004)
245 #define BLE_HCI_ADV_SCAN_RSP_MASK           (0x0008)
246 #define BLE_HCI_ADV_LEGACY_MASK             (0x0010)
247 
248 #define BLE_HCI_ADV_DATA_STATUS_COMPLETE    (0x0000)
249 #define BLE_HCI_ADV_DATA_STATUS_INCOMPLETE  (0x0020)
250 #define BLE_HCI_ADV_DATA_STATUS_TRUNCATED   (0x0040)
251 #define BLE_HCI_ADV_DATA_STATUS_MASK        (0x0060)
252 
253 /* Own address types */
254 #define BLE_HCI_ADV_OWN_ADDR_PUBLIC         (0)
255 #define BLE_HCI_ADV_OWN_ADDR_RANDOM         (1)
256 #define BLE_HCI_ADV_OWN_ADDR_PRIV_PUB       (2)
257 #define BLE_HCI_ADV_OWN_ADDR_PRIV_RAND      (3)
258 #define BLE_HCI_ADV_OWN_ADDR_MAX            (3)
259 
260 /* Advertisement peer address Type */
261 #define BLE_HCI_ADV_PEER_ADDR_PUBLIC        (0)
262 #define BLE_HCI_ADV_PEER_ADDR_RANDOM        (1)
263 #define BLE_HCI_ADV_PEER_ADDR_MAX           (1)
264 
265 /* --- LE advertising channel tx power (OCF 0x0007) */
266 #define BLE_HCI_ADV_CHAN_TXPWR_ACK_PARAM_LEN   (2)  /* Includes status byte. */
267 #define BLE_HCI_ADV_CHAN_TXPWR_MIN             (-20)
268 #define BLE_HCI_ADV_CHAN_TXPWR_MAX             (10)
269 
270 /* --- LE set advertising data (OCF 0x0008) */
271 #define BLE_HCI_MAX_ADV_DATA_LEN            (31)
272 #define BLE_HCI_SET_ADV_DATA_LEN            (32)
273 
274 /* --- LE set scan response data (OCF 0x0009) */
275 #define BLE_HCI_MAX_SCAN_RSP_DATA_LEN       (31)
276 #define BLE_HCI_SET_SCAN_RSP_DATA_LEN       (32)
277 
278 /* --- LE set advertising enable (OCF 0x000a) */
279 #define BLE_HCI_SET_ADV_ENABLE_LEN          (1)
280 
281 /* --- LE set scan enable (OCF 0x000c) */
282 #define BLE_HCI_SET_SCAN_ENABLE_LEN         (2)
283 
284 /* Connect peer address type */
285 #define BLE_HCI_CONN_PEER_ADDR_PUBLIC        (0)
286 #define BLE_HCI_CONN_PEER_ADDR_RANDOM        (1)
287 #define BLE_HCI_CONN_PEER_ADDR_PUBLIC_IDENT  (2)
288 #define BLE_HCI_CONN_PEER_ADDR_RANDOM_IDENT  (3)
289 #define BLE_HCI_CONN_PEER_ADDR_MAX           (3)
290 
291 /*
292  * Advertising filter policy
293  *
294  * Determines how an advertiser filters scan and connection requests.
295  *
296  *  NONE: no filtering (default value). No whitelist used.
297  *  SCAN: process all connection requests but only scans from white list.
298  *  CONN: process all scan request but only connection requests from white list
299  *  BOTH: ignore all scan and connection requests unless in white list.
300  */
301 #define BLE_HCI_ADV_FILT_NONE               (0)
302 #define BLE_HCI_ADV_FILT_SCAN               (1)
303 #define BLE_HCI_ADV_FILT_CONN               (2)
304 #define BLE_HCI_ADV_FILT_BOTH               (3)
305 #define BLE_HCI_ADV_FILT_MAX                (3)
306 
307 #define BLE_HCI_ADV_FILT_DEF                (BLE_HCI_ADV_FILT_NONE)
308 
309 /* Advertising interval */
310 #define BLE_HCI_ADV_ITVL                    (625)           /* usecs */
311 #define BLE_HCI_ADV_ITVL_MIN                (32)            /* units */
312 #define BLE_HCI_ADV_ITVL_MAX                (16384)         /* units */
313 #define BLE_HCI_ADV_ITVL_NONCONN_MIN        (160)           /* units */
314 
315 #define BLE_HCI_ADV_ITVL_DEF                (0x800)         /* 1.28 seconds */
316 #define BLE_HCI_ADV_CHANMASK_DEF            (0x7)           /* all channels */
317 
318 /* Set scan parameters */
319 #define BLE_HCI_SET_SCAN_PARAM_LEN          (7)
320 #define BLE_HCI_SCAN_TYPE_PASSIVE           (0)
321 #define BLE_HCI_SCAN_TYPE_ACTIVE            (1)
322 
323 /* Scan interval and scan window timing */
324 #define BLE_HCI_SCAN_ITVL                   (625)           /* usecs */
325 #define BLE_HCI_SCAN_ITVL_MIN               (4)             /* units */
326 #define BLE_HCI_SCAN_ITVL_MAX               (16384)         /* units */
327 #define BLE_HCI_SCAN_ITVL_DEF               (16)            /* units */
328 #define BLE_HCI_SCAN_WINDOW_MIN             (4)             /* units */
329 #define BLE_HCI_SCAN_WINDOW_MAX             (16384)         /* units */
330 #define BLE_HCI_SCAN_WINDOW_DEF             (16)            /* units */
331 
332 /*
333  * Scanning filter policy
334  *  NO_WL:
335  *      Scanner processes all advertising packets (white list not used) except
336  *      directed, connectable advertising packets not sent to the scanner.
337  *  USE_WL:
338  *      Scanner processes advertisements from white list only. A connectable,
339  *      directed advertisment is ignored unless it contains scanners address.
340  *  NO_WL_INITA:
341  *      Scanner process all advertising packets (white list not used). A
342  *      connectable, directed advertisement shall not be ignored if the InitA
343  *      is a resolvable private address.
344  *  USE_WL_INITA:
345  *      Scanner process advertisements from white list only. A connectable,
346  *      directed advertisement shall not be ignored if the InitA is a
347  *      resolvable private address.
348  */
349 #define BLE_HCI_SCAN_FILT_NO_WL             (0)
350 #define BLE_HCI_SCAN_FILT_USE_WL            (1)
351 #define BLE_HCI_SCAN_FILT_NO_WL_INITA       (2)
352 #define BLE_HCI_SCAN_FILT_USE_WL_INITA      (3)
353 #define BLE_HCI_SCAN_FILT_MAX               (3)
354 
355 /* Whitelist commands */
356 #define BLE_HCI_ADD_WHITE_LIST_LEN          (7)
357 #define BLE_HCI_RMV_WHITE_LIST_LEN          (7)
358 
359 /* Create Connection */
360 #define BLE_HCI_CREATE_CONN_LEN             (25)
361 #define BLE_HCI_CONN_ITVL                   (1250)  /* usecs */
362 #define BLE_HCI_CONN_FILT_NO_WL             (0)
363 #define BLE_HCI_CONN_FILT_USE_WL            (1)
364 #define BLE_HCI_CONN_FILT_MAX               (1)
365 #define BLE_HCI_CONN_ITVL_MIN               (0x0006)
366 #define BLE_HCI_CONN_ITVL_MAX               (0x0c80)
367 #define BLE_HCI_CONN_LATENCY_MIN            (0x0000)
368 #define BLE_HCI_CONN_LATENCY_MAX            (0x01f3)
369 #define BLE_HCI_CONN_SPVN_TIMEOUT_MIN       (0x000a)
370 #define BLE_HCI_CONN_SPVN_TIMEOUT_MAX       (0x0c80)
371 #define BLE_HCI_CONN_SPVN_TMO_UNITS         (10)    /* msecs */
372 #define BLE_HCI_INITIATOR_FILT_POLICY_MAX   (1)
373 
374 /* Peer Address Type */
375 #define BLE_HCI_CONN_PEER_ADDR_PUBLIC       (0)
376 #define BLE_HCI_CONN_PEER_ADDR_RANDOM       (1)
377 #define BLE_HCI_CONN_PEER_ADDR_PUB_ID       (2)
378 #define BLE_HCI_CONN_PEER_ADDR_RAND_ID      (3)
379 #define BLE_HCI_CONN_PEER_ADDR_MAX          (3)
380 
381 /* --- LE connection update (OCF 0x0013) */
382 #define BLE_HCI_CONN_UPDATE_LEN             (14)
383 
384 /* --- LE set host channel classification command (OCF 0x0014) */
385 #define BLE_HCI_SET_HOST_CHAN_CLASS_LEN     (5)
386 
387 /* --- LE read channel map command (OCF 0x0015) */
388 #define BLE_HCI_RD_CHANMAP_LEN              (2)
389 #define BLE_HCI_RD_CHANMAP_RSP_LEN          (7)
390 
391 /* --- LE read remote features (OCF 0x0016) */
392 #define BLE_HCI_CONN_RD_REM_FEAT_LEN        (2)
393 
394 /* --- LE encrypt (OCF 0x0017) */
395 #define BLE_HCI_LE_ENCRYPT_LEN              (32)
396 
397 /* --- LE rand (OCF 0x0018) */
398 #define BLE_HCI_LE_RAND_LEN                 (8)
399 
400 /* --- LE start encryption (OCF 0x0019) */
401 #define BLE_HCI_LE_START_ENCRYPT_LEN        (28)
402 
403 /* ---  LE long term key request reply command (OCF 0x001a) */
404 #define BLE_HCI_LT_KEY_REQ_REPLY_LEN        (18)
405 #define BLE_HCI_LT_KEY_REQ_REPLY_ACK_PARAM_LEN (2) /* No status byte. */
406 
407 /* ---  LE long term key request negative reply command (OCF 0x001b) */
408 #define BLE_HCI_LT_KEY_REQ_NEG_REPLY_LEN    (2)
409 #define BLE_HCI_LT_KEY_REQ_NEG_REPLY_ACK_PARAM_LEN (2)
410 
411 /* --- LE read supported states (OCF 0x001C) --- */
412 #define BLE_HCI_RD_SUPP_STATES_RSPLEN       (8)
413 
414 /* --- LE receiver test command (OCF 0x001D) --- */
415 #define BLE_HCI_RX_TEST_LEN                 (1)
416 
417 /* --- LE transitter test command (OCF 0x001E) --- */
418 #define BLE_HCI_TX_TEST_LEN                 (3)
419 
420 /* --- LE remote connection parameter request reply (OCF 0x0020) */
421 #define BLE_HCI_CONN_PARAM_REPLY_LEN        (14)
422 
423 /* --- LE remote connection parameter request negative reply (OCF 0x0021) */
424 #define BLE_HCI_CONN_PARAM_NEG_REPLY_LEN    (3)
425 
426 /* --- LE set data length (OCF 0x0022) */
427 #define BLE_HCI_SET_DATALEN_LEN             (6)
428 #define BLE_HCI_SET_DATALEN_ACK_PARAM_LEN   (2)  /* No status byte. */
429 #define BLE_HCI_SET_DATALEN_TX_OCTETS_MIN   (0x001b)
430 #define BLE_HCI_SET_DATALEN_TX_OCTETS_MAX   (0x00fb)
431 #define BLE_HCI_SET_DATALEN_TX_TIME_MIN     (0x0148)
432 #define BLE_HCI_SET_DATALEN_TX_TIME_MAX     (0x4290)
433 
434 /* --- LE read suggested default data length (OCF 0x0023) */
435 #define BLE_HCI_RD_SUGG_DATALEN_RSPLEN      (4)
436 
437 /* --- LE write suggested default data length (OCF 0x0024) */
438 #define BLE_HCI_WR_SUGG_DATALEN_LEN         (4)
439 
440 /* --- LE generate DHKEY command (OCF 0x0026) */
441 #define BLE_HCI_GEN_DHKEY_LEN               (64)
442 
443 /* --- LE add device to resolving list (OCF 0x0027) */
444 #define BLE_HCI_ADD_TO_RESOLV_LIST_LEN      (39)
445 
446 /* --- LE add device to resolving list (OCF 0x0028) */
447 #define BLE_HCI_RMV_FROM_RESOLV_LIST_LEN    (7)
448 
449 /* --- LE read peer resolvable address (OCF 0x002B) */
450 #define BLE_HCI_RD_PEER_RESOLV_ADDR_LEN     (7)
451 
452 /* --- LE read peer resolvable address (OCF 0x002C) */
453 #define BLE_HCI_RD_LOC_RESOLV_ADDR_LEN      (7)
454 
455 /* --- LE set address resolution enable (OCF 0x002D) */
456 #define BLE_HCI_SET_ADDR_RESOL_ENA_LEN      (1)
457 
458 /* --- LE set resolvable private address timeout (OCF 0x002E) */
459 #define BLE_HCI_SET_RESOLV_PRIV_ADDR_TO_LEN (2)
460 
461 /* --- LE read maximum data length (OCF 0x002F) */
462 #define BLE_HCI_RD_MAX_DATALEN_RSPLEN       (8)
463 
464 /* --- LE read maximum default PHY (OCF 0x0030) */
465 #define BLE_HCI_LE_RD_PHY_LEN               (2)
466 #define BLE_HCI_LE_RD_PHY_RSPLEN            (4)
467 #define BLE_HCI_LE_PHY_1M                   (1)
468 #define BLE_HCI_LE_PHY_2M                   (2)
469 #define BLE_HCI_LE_PHY_CODED                (3)
470 
471 /* --- LE set default PHY (OCF 0x0031) */
472 #define BLE_HCI_LE_SET_DEFAULT_PHY_LEN              (3)
473 #define BLE_HCI_LE_PHY_NO_TX_PREF_MASK              (0x01)
474 #define BLE_HCI_LE_PHY_NO_RX_PREF_MASK              (0x02)
475 #define BLE_HCI_LE_PHY_1M_PREF_MASK                 (0x01)
476 #define BLE_HCI_LE_PHY_2M_PREF_MASK                 (0x02)
477 #define BLE_HCI_LE_PHY_CODED_PREF_MASK              (0x04)
478 
479 #define BLE_HCI_LE_PHY_PREF_MASK_ALL                \
480     (BLE_HCI_LE_PHY_1M_PREF_MASK | BLE_HCI_LE_PHY_2M_PREF_MASK |  \
481      BLE_HCI_LE_PHY_CODED_PREF_MASK)
482 
483 /* --- LE set PHY (OCF 0x0032) */
484 #define BLE_HCI_LE_SET_PHY_LEN                      (7)
485 #define BLE_HCI_LE_PHY_CODED_ANY                    (0x0000)
486 #define BLE_HCI_LE_PHY_CODED_S2_PREF                (0x0001)
487 #define BLE_HCI_LE_PHY_CODED_S8_PREF                (0x0002)
488 
489 /* --- LE enhanced receiver test (OCF 0x0033) */
490 #define BLE_HCI_LE_ENH_RX_TEST_LEN                  (3)
491 #define BLE_HCI_LE_PHY_1M                           (1)
492 #define BLE_HCI_LE_PHY_2M                           (2)
493 #define BLE_HCI_LE_PHY_CODED                        (3)
494 
495 /* --- LE enhanced transmitter test (OCF 0x0034) */
496 #define BLE_HCI_LE_ENH_TX_TEST_LEN                  (4)
497 #define BLE_HCI_LE_PHY_CODED_S8                     (3)
498 #define BLE_HCI_LE_PHY_CODED_S2                     (4)
499 
500 /* --- LE set advertising set random address (OCF 0x0035) */
501 #define BLE_HCI_LE_SET_ADV_SET_RND_ADDR_LEN         (7)
502 
503 /* --- LE set extended advertising parameters (OCF 0x0036) */
504 #define BLE_HCI_LE_SET_EXT_ADV_PARAM_LEN            (25)
505 #define BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE     (0x0001)
506 #define BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE       (0x0002)
507 #define BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED        (0x0004)
508 #define BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED     (0x0008)
509 #define BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY          (0x0010)
510 #define BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV        (0x0020)
511 #define BLE_HCI_LE_SET_EXT_ADV_PROP_INC_TX_PWR      (0x0040)
512 #define BLE_HCI_LE_SET_EXT_ADV_PROP_MASK            (0x7F)
513 
514 #define BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_IND      (0x0013)
515 #define BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_LD_DIR   (0x0015)
516 #define BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_HD_DIR   (0x001d)
517 #define BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_SCAN     (0x0012)
518 #define BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_NONCONN  (0x0010)
519 
520 /* --- LE set extended advertising data (OCF 0x0037) */
521 #define BLE_HCI_MAX_EXT_ADV_DATA_LEN                (251)
522 #define BLE_HCI_SET_EXT_ADV_DATA_HDR_LEN            (4)
523 
524 #define BLE_HCI_LE_SET_EXT_ADV_DATA_LEN             BLE_HCI_VARIABLE_LEN
525 #define BLE_HCI_LE_SET_EXT_ADV_DATA_OPER_INT        (0)
526 #define BLE_HCI_LE_SET_EXT_ADV_DATA_OPER_FIRST      (1)
527 #define BLE_HCI_LE_SET_EXT_ADV_DATA_OPER_LAST       (2)
528 #define BLE_HCI_LE_SET_EXT_ADV_DATA_OPER_COMPLETE   (3)
529 #define BLE_HCI_LE_SET_EXT_ADV_DATA_OPER_UNCHANGED  (4)
530 
531 /* --- LE set extended scan response data (OCF 0x0038) */
532 #define BLE_HCI_MAX_EXT_SCAN_RSP_DATA_LEN           (251)
533 #define BLE_HCI_SET_EXT_SCAN_RSP_DATA_HDR_LEN       (4)
534 
535 #define BLE_HCI_LE_SET_EXT_SCAN_RSP_DATA_LEN        BLE_HCI_VARIABLE_LEN
536 #define BLE_HCI_LE_SET_EXT_SCAN_RSP_DATA_OPER_INT        (0)
537 #define BLE_HCI_LE_SET_EXT_SCAN_RSP_DATA_OPER_FIRST      (1)
538 #define BLE_HCI_LE_SET_EXT_SCAN_RSP_DATA_OPER_LAST       (2)
539 #define BLE_HCI_LE_SET_EXT_SCAN_RSP_DATA_OPER_COMPLETE   (3)
540 
541 /* --- LE set extended advertising enable (OCF 0x0039) */
542 #define BLE_HCI_LE_SET_EXT_ADV_ENABLE_LEN           BLE_HCI_VARIABLE_LEN
543 
544 /* --- LE remove advertising set (OCF 0x003C) */
545 #define BLE_HCI_LE_REMOVE_ADV_SET_LEN               (1)
546 
547 /* --- LE read maximum advertising data length (OCF 0x003A) */
548 #define BLE_HCI_RD_MAX_ADV_DATA_LEN                 (2)
549 
550 /* --- LE read number of supported advertising sets (OCF 0x003B) */
551 #define BLE_HCI_RD_NR_SUP_ADV_SETS                  (1)
552 
553 /* --- LE set periodic advertising parameters (OCF 0x003E) */
554 #define BLE_HCI_LE_SET_PER_ADV_PARAMS_LEN           (7)
555 
556 /* --- LE set periodic advertising data (OCF 0x003F) */
557 #define BLE_HCI_LE_SET_PER_ADV_DATA_LEN             BLE_HCI_VARIABLE_LEN
558 
559 /* --- LE periodic advertising enable (OCF 0x0040) */
560 #define BLE_HCI_LE_SET_PER_ADV_ENABLE_LEN           (2)
561 
562 /* --- LE set extended scan parameters (OCF 0x0041) */
563 #define BLE_HCI_LE_SET_EXT_SCAN_PARAM_LEN           BLE_HCI_VARIABLE_LEN
564 #define BLE_HCI_LE_EXT_SCAN_BASE_LEN                (3)
565 #define BLE_HCI_LE_EXT_SCAN_SINGLE_PARAM_LEN        (5)
566 
567 /* --- LE set extended scan enable (OCF 0x0042) */
568 #define BLE_HCI_LE_SET_EXT_SCAN_ENABLE_LEN          (6)
569 
570 /* --- LE extended create connection (OCF 0x0043) */
571 #define BLE_HCI_LE_EXT_CREATE_CONN_LEN              BLE_HCI_VARIABLE_LEN
572 #define BLE_HCI_LE_EXT_CREATE_CONN_BASE_LEN         (10)
573 
574 /* --- LE periodic advertising create sync (OCF 0x0044) */
575 #define BLE_HCI_LE_PER_ADV_CREATE_SYNC_LEN          (14)
576 
577 /* --- LE periodic advertising terminate (OCF 0x0046) */
578 #define BLE_HCI_LE_PER_ADV_TERM_SYNC_LEN            (2)
579 
580 /* --- LE add device to periodic advertising list (OCF 0x0047) */
581 #define BLE_HCI_LE_ADD_DEV_TO_PER_ADV_LIST_LEN      (8)
582 
583 /* --- LE remove device from periodic advertising list (OCF 0x0048) */
584 #define BLE_HCI_LE_REM_DEV_FROM_PER_ADV_LIST_LEN    (8)
585 
586 /* --- LE write RF path (OCF 0x004D) */
587 #define BLE_HCI_LE_WR_RF_PATH_COMPENSATION_LEN      (4)
588 
589 /* --- LE set privacy mode (OCF 0x004E) */
590 #define BLE_HCI_LE_SET_PRIVACY_MODE_LEN             (8)
591 #define BLE_HCI_PRIVACY_NETWORK                     (0)
592 #define BLE_HCI_PRIVACY_DEVICE                      (1)
593 
594 /* Event Codes */
595 #define BLE_HCI_EVCODE_INQUIRY_CMP          (0x01)
596 #define BLE_HCI_EVCODE_INQUIRY_RESULT       (0x02)
597 #define BLE_HCI_EVCODE_CONN_DONE            (0x03)
598 #define BLE_HCI_EVCODE_CONN_REQUEST         (0x04)
599 #define BLE_HCI_EVCODE_DISCONN_CMP          (0x05)
600 #define BLE_HCI_EVCODE_AUTH_CMP             (0x06)
601 #define BLE_HCI_EVCODE_REM_NAME_REQ_CMP     (0x07)
602 #define BLE_HCI_EVCODE_ENCRYPT_CHG          (0x08)
603 #define BLE_HCI_EVCODE_CHG_LINK_KEY_CMP     (0x09)
604 #define BLE_HCI_EVCODE_MASTER_LINK_KEY_CMP  (0x0A)
605 #define BLE_HCI_EVCODE_RD_REM_SUPP_FEAT_CMP (0x0B)
606 #define BLE_HCI_EVCODE_RD_REM_VER_INFO_CMP  (0x0C)
607 #define BLE_HCI_EVCODE_QOS_SETUP_CMP        (0x0D)
608 #define BLE_HCI_EVCODE_COMMAND_COMPLETE     (0x0E)
609 #define BLE_HCI_EVCODE_COMMAND_STATUS       (0x0F)
610 #define BLE_HCI_EVCODE_HW_ERROR             (0x10)
611 #define BLE_HCI_EVCODE_NUM_COMP_PKTS        (0x13)
612 #define BLE_HCI_EVCODE_MODE_CHANGE          (0x14)
613 #define BLE_HCI_EVCODE_RETURN_LINK_KEYS     (0x15)
614 #define BLE_HCI_EVCODE_PIN_CODE_REQ         (0x16)
615 #define BLE_HCI_EVCODE_LINK_KEY_REQ         (0x17)
616 #define BLE_HCI_EVCODE_LINK_KEY_NOTIFY      (0x18)
617 #define BLE_HCI_EVCODE_LOOPBACK_CMD         (0x19)
618 #define BLE_HCI_EVCODE_DATA_BUF_OVERFLOW    (0x1A)
619 #define BLE_HCI_EVCODE_MAX_SLOTS_CHG        (0x1B)
620 #define BLE_HCI_EVCODE_READ_CLK_OFF_COMP    (0x1C)
621 #define BLE_HCI_EVCODE_CONN_PKT_TYPE_CHG    (0x1D)
622 #define BLE_HCI_EVCODE_QOS_VIOLATION        (0x1E)
623 /* NOTE: 0x1F not defined */
624 #define BLE_HCI_EVCODE_PSR_MODE_CHG         (0x20)
625 #define BLE_HCI_EVCODE_FLOW_SPEC_COMP       (0x21)
626 #define BLE_HCI_EVCODE_INQ_RESULT_RSSI      (0x22)
627 #define BLE_HCI_EVCODE_READ_REM_EXT_FEAT    (0x23)
628 /* NOTE: 0x24 - 0x2B not defined */
629 #define BLE_HCI_EVCODE_SYNCH_CONN_COMP      (0x2C)
630 #define BLE_HCI_EVCODE_SYNCH_CONN_CHG       (0x2D)
631 #define BLE_HCI_EVCODE_SNIFF_SUBRATING      (0x2E)
632 #define BLE_HCI_EVCODE_EXT_INQ_RESULT       (0x2F)
633 #define BLE_HCI_EVCODE_ENC_KEY_REFRESH      (0x30)
634 #define BLE_HCI_EVOCDE_IO_CAP_REQ           (0x31)
635 #define BLE_HCI_EVCODE_IO_CAP_RSP           (0x32)
636 #define BLE_HCI_EVCODE_USER_CONFIRM_REQ     (0x33)
637 #define BLE_HCI_EVCODE_PASSKEY_REQ          (0x34)
638 #define BLE_HCI_EVCODE_REM_OOB_DATA_REQ     (0x35)
639 #define BLE_HCI_EVCODE_SIMPLE_PAIR_COMP     (0x36)
640 /* NOTE: 0x37 not defined */
641 #define BLE_HCI_EVCODE_LNK_SPVN_TMO_CHG     (0x38)
642 #define BLE_HCI_EVCODE_ENH_FLUSH_COMP       (0x39)
643 #define BLE_HCI_EVCODE_USER_PASSKEY_NOTIFY  (0x3B)
644 #define BLE_HCI_EVCODE_KEYPRESS_NOTIFY      (0x3C)
645 #define BLE_HCI_EVCODE_REM_HOST_SUPP_FEAT   (0x3D)
646 #define BLE_HCI_EVCODE_LE_META              (0x3E)
647 /* NOTE: 0x3F not defined */
648 #define BLE_HCI_EVCODE_PHYS_LINK_COMP       (0x40)
649 #define BLE_HCI_EVCODE_CHAN_SELECTED        (0x41)
650 #define BLE_HCI_EVCODE_DISCONN_PHYS_LINK    (0x42)
651 #define BLE_HCI_EVCODE_PHYS_LINK_LOSS_EARLY (0x43)
652 #define BLE_HCI_EVCODE_PHYS_LINK_RECOVERY   (0x44)
653 #define BLE_HCI_EVCODE_LOGICAL_LINK_COMP    (0x45)
654 #define BLE_HCI_EVCODE_DISCONN_LOGICAL_LINK (0x46)
655 #define BLE_HCI_EVCODE_FLOW_SPEC_MODE_COMP  (0x47)
656 #define BLE_HCI_EVCODE_NUM_COMP_DATA_BLKS   (0x48)
657 #define BLE_HCI_EVCODE_AMP_START_TEST       (0x49)
658 #define BLE_HCI_EVOCDE_AMP_TEST_END         (0x4A)
659 #define BLE_HCI_EVOCDE_AMP_RCVR_REPORT      (0x4B)
660 #define BLE_HCI_EVCODE_SHORT_RANGE_MODE_CHG (0x4C)
661 #define BLE_HCI_EVCODE_AMP_STATUS_CHG       (0x4D)
662 #define BLE_HCI_EVCODE_TRIG_CLK_CAPTURE     (0x4E)
663 #define BLE_HCI_EVCODE_SYNCH_TRAIN_COMP     (0x4F)
664 #define BLE_HCI_EVCODE_SYNCH_TRAIN_RCVD     (0x50)
665 #define BLE_HCI_EVCODE_SLAVE_BCAST_RX       (0x51)
666 #define BLE_HCI_EVCODE_SLAVE_BCAST_TMO      (0x52)
667 #define BLE_HCI_EVCODE_TRUNC_PAGE_COMP      (0x53)
668 #define BLE_HCI_EVCODE_SLAVE_PAGE_RSP_TMO   (0x54)
669 #define BLE_HCI_EVCODE_SLAVE_BCAST_CHAN_MAP (0x55)
670 #define BLE_HCI_EVCODE_INQ_RSP_NOTIFY       (0x56)
671 #define BLE_HCI_EVCODE_AUTH_PYLD_TMO        (0x57)
672 #define BLE_HCI_EVCODE_VENDOR_DEBUG         (0xFF)
673 
674 /* LE sub-event codes */
675 #define BLE_HCI_LE_SUBEV_CONN_COMPLETE          (0x01)
676 #define BLE_HCI_LE_SUBEV_ADV_RPT                (0x02)
677 #define BLE_HCI_LE_SUBEV_CONN_UPD_COMPLETE      (0x03)
678 #define BLE_HCI_LE_SUBEV_RD_REM_USED_FEAT       (0x04)
679 #define BLE_HCI_LE_SUBEV_LT_KEY_REQ             (0x05)
680 #define BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ      (0x06)
681 #define BLE_HCI_LE_SUBEV_DATA_LEN_CHG           (0x07)
682 #define BLE_HCI_LE_SUBEV_RD_LOC_P256_PUBKEY     (0x08)
683 #define BLE_HCI_LE_SUBEV_GEN_DHKEY_COMPLETE     (0x09)
684 #define BLE_HCI_LE_SUBEV_ENH_CONN_COMPLETE      (0x0A)
685 #define BLE_HCI_LE_SUBEV_DIRECT_ADV_RPT         (0x0B)
686 #define BLE_HCI_LE_SUBEV_PHY_UPDATE_COMPLETE    (0x0C)
687 #define BLE_HCI_LE_SUBEV_EXT_ADV_RPT            (0x0D)
688 #define BLE_HCI_LE_SUBEV_PER_ADV_SYNC_ESTAB     (0x0E)
689 #define BLE_HCI_LE_SUBEV_PER_ADV_RPT            (0x0F)
690 #define BLE_HCI_LE_SUBEV_PER_ADV_SYNC_LOST      (0x10)
691 #define BLE_HCI_LE_SUBEV_SCAN_TIMEOUT           (0x11)
692 #define BLE_HCI_LE_SUBEV_ADV_SET_TERMINATED     (0x12)
693 #define BLE_HCI_LE_SUBEV_SCAN_REQ_RCVD          (0x13)
694 #define BLE_HCI_LE_SUBEV_CHAN_SEL_ALG           (0x14)
695 
696 /* Generic event header */
697 #define BLE_HCI_EVENT_HDR_LEN               (2)
698 
699 /* Event specific definitions */
700 /* Event disconnect complete */
701 #define BLE_HCI_EVENT_DISCONN_COMPLETE_LEN  (4)
702 
703 /* Event encryption change (code=0x08) */
704 #define BLE_HCI_EVENT_ENCRYPT_CHG_LEN       (4)
705 
706 /* Event hardware error (code=0x10) */
707 #define BLE_HCI_EVENT_HW_ERROR_LEN          (1)
708 
709 /* Event key refresh complete (code=0x30) */
710 #define BLE_HCI_EVENT_ENC_KEY_REFRESH_LEN   (3)
711 
712 /* Event command complete */
713 #define BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN  (5)
714 #define BLE_HCI_EVENT_CMD_COMPLETE_MIN_LEN  (6)
715 
716 /* Event command status */
717 #define BLE_HCI_EVENT_CMD_STATUS_LEN        (6)
718 
719 /* Number of completed packets */
720 #define BLE_HCI_EVENT_NUM_COMP_PKTS_HDR_LEN (1)
721 #define BLE_HCI_EVENT_NUM_COMP_PKTS_ENT_LEN (4)
722 
723 /* Read remote version informaton */
724 #define BLE_HCI_EVENT_RD_RM_VER_LEN         (8)
725 
726 /* Data buffer overflow event */
727 #define BLE_HCI_EVENT_DATABUF_OVERFLOW_LEN  (1)
728 #define BLE_HCI_EVENT_ACL_BUF_OVERFLOW      (0x01)
729 
730 /* Advertising report */
731 #define BLE_HCI_ADV_RPT_EVTYPE_ADV_IND      (0)
732 #define BLE_HCI_ADV_RPT_EVTYPE_DIR_IND      (1)
733 #define BLE_HCI_ADV_RPT_EVTYPE_SCAN_IND     (2)
734 #define BLE_HCI_ADV_RPT_EVTYPE_NONCONN_IND  (3)
735 #define BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP     (4)
736 
737 /* Bluetooth 5, Vol 2, Part E, 7.7.65.13 */
738 #define BLE_HCI_LEGACY_ADV_EVTYPE_ADV_IND                 (0x13)
739 #define BLE_HCI_LEGACY_ADV_EVTYPE_ADV_DIRECT_IND          (0x15)
740 #define BLE_HCI_LEGACY_ADV_EVTYPE_ADV_SCAN_IND            (0x12)
741 #define BLE_HCI_LEGACY_ADV_EVTYPE_ADV_NONCON_IND          (0x10)
742 #define BLE_HCI_LEGACY_ADV_EVTYPE_SCAN_RSP_ADV_IND        (0x1b)
743 #define BLE_HCI_LEGACY_ADV_EVTYPE_SCAN_RSP_ADV_SCAN_IND   (0x1a)
744 
745 /* LE sub-event specific definitions */
746 #define BLE_HCI_LE_MIN_LEN                  (1) /* Not including event hdr. */
747 
748 /* LE connection complete event (sub event 0x01) */
749 #define BLE_HCI_LE_CONN_COMPLETE_LEN            (19)
750 #define BLE_HCI_LE_CONN_COMPLETE_ROLE_MASTER    (0x00)
751 #define BLE_HCI_LE_CONN_COMPLETE_ROLE_SLAVE     (0x01)
752 
753 /* Maximum valid connection handle value */
754 #define BLE_HCI_LE_CONN_HANDLE_MAX              (0x0eff)
755 
756 /* LE advertising report event. (sub event 0x02) */
757 #define BLE_HCI_LE_ADV_RPT_MIN_LEN          (12)
758 #define BLE_HCI_LE_ADV_DIRECT_RPT_LEN       (18)
759 #define BLE_HCI_LE_ADV_RPT_NUM_RPTS_MIN     (1)
760 #define BLE_HCI_LE_ADV_RPT_NUM_RPTS_MAX     (0x19)
761 
762 /* Length of each record in an LE direct advertising report event. */
763 #define BLE_HCI_LE_ADV_DIRECT_RPT_SUB_LEN   (16)
764 
765 /* LE connection update complete event (sub event 0x03) */
766 #define BLE_HCI_LE_CONN_UPD_LEN             (10)
767 
768 /* LE long term key request event (sub event 0x05) */
769 #define BLE_HCI_LE_LT_KEY_REQ_LEN           (13)
770 
771 /* LE connection update complete event (sub event 0x03) */
772 #define BLE_HCI_LE_RD_REM_USED_FEAT_LEN     (12)
773 
774 /* LE remote connection parameter request event (sub event 0x06) */
775 #define BLE_HCI_LE_REM_CONN_PARM_REQ_LEN    (11)
776 
777 /* LE data length change event (sub event 0x07) */
778 #define BLE_HCI_LE_DATA_LEN_CHG_LEN         (11)
779 
780 /* LE PHY update complete event (sub event 0x0C) */
781 #define BLE_HCI_LE_PHY_UPD_LEN              (6)
782 
783 /* LE Scan Timeout Event (sub event 0x11) */
784 #define BLE_HCI_LE_SUBEV_SCAN_TIMEOUT_LEN   (1)
785 
786 /*  LE Advertising Set Terminated Event (sub event 0x12) */
787 #define BLE_HCI_LE_SUBEV_ADV_SET_TERMINATED_LEN   (6)
788 
789 /* LE Scan Request Received event (sub event 0x13) */
790 #define BLE_HCI_LE_SUBEV_SCAN_REQ_RCVD_LEN   (9)
791 
792 /* LE Channel Selection Algorithm event (sub event 0x14) */
793 #define BLE_HCI_LE_SUBEV_CHAN_SEL_ALG_LEN   (4)
794 
795 /* Bluetooth Assigned numbers for version information.*/
796 #define BLE_HCI_VER_BCS_1_0b                (0)
797 #define BLE_HCI_VER_BCS_1_1                 (1)
798 #define BLE_HCI_VER_BCS_1_2                 (2)
799 #define BLE_HCI_VER_BCS_2_0_EDR             (3)
800 #define BLE_HCI_VER_BCS_2_1_EDR             (4)
801 #define BLE_HCI_VER_BCS_3_0_HCS             (5)
802 #define BLE_HCI_VER_BCS_4_0                 (6)
803 #define BLE_HCI_VER_BCS_4_1                 (7)
804 #define BLE_HCI_VER_BCS_4_2                 (8)
805 #define BLE_HCI_VER_BCS_5_0                 (9)
806 
807 #define BLE_LMP_VER_BCS_1_0b                (0)
808 #define BLE_LMP_VER_BCS_1_1                 (1)
809 #define BLE_LMP_VER_BCS_1_2                 (2)
810 #define BLE_LMP_VER_BCS_2_0_EDR             (3)
811 #define BLE_LMP_VER_BCS_2_1_EDR             (4)
812 #define BLE_LMP_VER_BCS_3_0_HCS             (5)
813 #define BLE_LMP_VER_BCS_4_0                 (6)
814 #define BLE_LMP_VER_BCS_4_1                 (7)
815 #define BLE_LMP_VER_BCS_4_2                 (8)
816 #define BLE_LMP_VER_BCS_5_0                 (9)
817 
818 /* Sub-event 0x0A: enhanced connection complete */
819 #define BLE_HCI_LE_ENH_CONN_COMPLETE_LEN    (31)
820 
821 /*--- Shared data structures ---*/
822 
823 /* Host buffer size (OGF=0x03, OCF=0x0033) */
824 struct hci_host_buf_size
825 {
826     uint16_t acl_pkt_len;
827     uint8_t sync_pkt_len;
828     uint16_t num_acl_pkts;
829     uint16_t num_sync_pkts;
830 };
831 
832 /* Host number of completed packets (OGF=0x03, OCF=0x0035) */
833 struct hci_host_num_comp_pkts_entry
834 {
835     uint16_t conn_handle;
836     uint16_t num_pkts;
837 };
838 
839 /* Read local version information (OGF=0x0004, OCF=0x0001) */
840 struct hci_loc_ver_info
841 {
842    uint8_t status;
843    uint8_t hci_version;
844    uint16_t hci_revision;
845    uint8_t lmp_pal_version;
846    uint16_t mfrg_name;
847    uint8_t lmp_pal_subversion;
848 };
849 
850 /* set random address command (ocf = 0x0005) */
851 struct hci_rand_addr
852 {
853     uint8_t addr[6];
854 };
855 
856 /* set advertising parameters command (ocf = 0x0006) */
857 struct hci_adv_params
858 {
859     uint8_t adv_type;
860     uint8_t adv_channel_map;
861     uint8_t own_addr_type;
862     uint8_t peer_addr_type;
863     uint8_t adv_filter_policy;
864     uint16_t adv_itvl_min;
865     uint16_t adv_itvl_max;
866     uint8_t peer_addr[BLE_DEV_ADDR_LEN];
867 };
868 
869 /* LE create connection command (ocf=0x000d). */
870 struct hci_create_conn
871 {
872     uint16_t scan_itvl;
873     uint16_t scan_window;
874     uint8_t filter_policy;
875     uint8_t peer_addr_type;
876     uint8_t peer_addr[BLE_DEV_ADDR_LEN];
877     uint8_t own_addr_type;
878     uint16_t conn_itvl_min;
879     uint16_t conn_itvl_max;
880     uint16_t conn_latency;
881     uint16_t supervision_timeout;
882     uint16_t min_ce_len;
883     uint16_t max_ce_len;
884 };
885 
886 /* LE Read Local P-256 Public Key Complete Event */
887 struct hci_le_subev_rd_loc_p256_pubkey {
888     uint8_t status;
889     uint8_t pubkey[64];
890 } __attribute__((packed));
891 
892 /* LE Generate DHKey Complete Event */
893 struct hci_le_subev_gen_dhkey_complete {
894     uint8_t status;
895     uint8_t dhkey[32];
896 } __attribute__((packed));
897 
898 /* LE Directed Advertising Report Event */
899 struct hci_le_subev_direct_adv_rpt_param {
900     uint8_t evt_type;
901     uint8_t addr_type;
902     uint8_t addr[6];
903     uint8_t dir_addr_type;
904     uint8_t dir_addr[6];
905     int8_t rssi;
906 } __attribute__((packed));
907 
908 struct hci_le_subev_direct_adv_rpt {
909     uint8_t num_reports;
910     struct hci_le_subev_direct_adv_rpt_param params[0];
911 } __attribute__((packed));
912 
913 #if MYNEWT_VAL(BLE_EXT_ADV)
914 /* LE create connection command (ocf=0x0043). */
915 struct hci_ext_conn_params
916 {
917     uint16_t scan_itvl;
918     uint16_t scan_window;
919     uint16_t conn_itvl_min;
920     uint16_t conn_itvl_max;
921     uint16_t conn_latency;
922     uint16_t supervision_timeout;
923     uint16_t min_ce_len;
924     uint16_t max_ce_len;
925 };
926 
927 struct hci_ext_create_conn
928 {
929     uint8_t filter_policy;
930     uint8_t own_addr_type;
931     uint8_t peer_addr_type;
932     uint8_t peer_addr[BLE_DEV_ADDR_LEN];
933     uint8_t init_phy_mask;
934     struct hci_ext_conn_params params[3];
935 };
936 
937 struct hci_ext_adv_report_param {
938     uint16_t evt_type;
939     uint8_t addr_type;
940     uint8_t addr[6];
941     uint8_t prim_phy;
942     uint8_t sec_phy;
943     uint8_t sid;
944     uint8_t tx_power;
945     int8_t rssi;
946     uint16_t per_adv_itvl;
947     uint8_t dir_addr_type;
948     uint8_t dir_addr[6];
949     uint8_t adv_data_len;
950     uint8_t adv_data[0];
951 } __attribute__((packed));
952 
953 struct hci_ext_adv_report {
954     /* We support one report per event for now */
955     uint8_t subevt;
956     uint8_t num_reports;
957     struct hci_ext_adv_report_param params[0];
958 } __attribute__((packed));
959 
960 /* Ext Adv Set enable parameters, not in HCI order */
961 struct hci_ext_adv_set
962 {
963     uint8_t handle;
964     uint8_t events;
965     uint16_t duration;
966 };
967 
968 /* Ext Advertising Parameters */
969 struct hci_ext_adv_params
970 {
971     uint16_t properties;
972     uint32_t min_interval;
973     uint32_t max_interval;
974     uint8_t chan_map;
975     uint8_t own_addr_type;
976     uint8_t peer_addr_type;
977     uint8_t peer_addr[6];
978     uint8_t filter_policy;
979     int8_t tx_power;
980     uint8_t primary_phy;
981     uint8_t max_skip;
982     uint8_t secondary_phy;
983     uint8_t sid;
984     uint8_t scan_req_notif;
985 };
986 
987 /* LE Extended Advertising Report Event */
988 struct hci_le_subev_ext_adv_rpt {
989     uint8_t num_reports;
990     struct hci_ext_adv_report_param params[0];
991 } __attribute__((packed));
992 
993 /* LE Periodic Advertising Sync Established Event */
994 struct hci_le_subev_per_adv_sync_estab {
995     uint8_t status;
996     uint16_t sync_handle;
997     uint8_t sid;
998     uint8_t adv_addr_type;
999     uint8_t adv_addr[6];
1000     uint8_t adv_phy;
1001     uint16_t per_adv_ival;
1002     uint8_t adv_clk_accuracy;
1003 } __attribute__((packed));
1004 
1005 /* LE Periodic Advertising Report Event */
1006 struct hci_le_subev_per_adv_rpt {
1007     uint16_t sync_handle;
1008     uint8_t tx_power;
1009     int8_t rssi;
1010     uint8_t _unused;
1011     uint8_t data_status;
1012     uint8_t data_length;
1013     uint8_t data[0];
1014 } __attribute__((packed));
1015 
1016 /* LE Periodic Advertising Sync Lost Event */
1017 struct hci_le_subev_per_adv_sync_lost {
1018     uint16_t sync_handle;
1019 } __attribute__((packed));
1020 
1021 /* LE Advertising Set Terminated Event */
1022 struct hci_le_subev_adv_set_terminated {
1023     uint8_t status;
1024     uint8_t adv_handle;
1025     uint16_t conn_handle;
1026     uint8_t num_compl_ext_adv_ev;
1027 } __attribute__((packed));
1028 
1029 /* LE Scan Request Received Event */
1030 struct hci_le_subev_scan_req_rcvd {
1031     uint8_t adv_handle;
1032     uint8_t scan_addr_type;
1033     uint8_t scan_addr[6];
1034 } __attribute__((packed));
1035 
1036 #endif
1037 
1038 /* LE Channel Selection Algorithm Event */
1039 struct hci_le_subev_chan_sel_alg {
1040     uint16_t conn_handle;
1041     uint8_t chan_sel_alg;
1042 } __attribute__((packed));
1043 
1044 /* LE connection update command (ocf=0x0013). */
1045 struct hci_conn_update
1046 {
1047     uint16_t handle;
1048     uint16_t conn_itvl_min;
1049     uint16_t conn_itvl_max;
1050     uint16_t conn_latency;
1051     uint16_t supervision_timeout;
1052     uint16_t min_ce_len;
1053     uint16_t max_ce_len;
1054 };
1055 
1056 /* LE start encryption command (ocf=0x0019) (note: fields out of order). */
1057 struct hci_start_encrypt
1058 {
1059     uint16_t connection_handle;
1060     uint16_t encrypted_diversifier;
1061     uint64_t random_number;
1062     uint8_t long_term_key[16];
1063 };
1064 
1065 /* LE long term key request reply command (ocf=0x001a). */
1066 struct hci_lt_key_req_reply
1067 {
1068     uint16_t conn_handle;
1069     uint8_t long_term_key[16];
1070 };
1071 
1072 /* LE Remote connection parameter request reply command */
1073 struct hci_conn_param_reply
1074 {
1075     uint16_t handle;
1076     uint16_t conn_itvl_min;
1077     uint16_t conn_itvl_max;
1078     uint16_t conn_latency;
1079     uint16_t supervision_timeout;
1080     uint16_t min_ce_len;
1081     uint16_t max_ce_len;
1082 };
1083 
1084 /* LE Remote connection parameter request negative reply command */
1085 struct hci_conn_param_neg_reply
1086 {
1087     uint16_t handle;
1088     uint8_t reason;
1089 };
1090 
1091 /* Encryption change event (code=0x08) (note: fields out of order) */
1092 struct hci_encrypt_change
1093 {
1094     uint8_t status;
1095     uint8_t encryption_enabled;
1096     uint16_t connection_handle;
1097 };
1098 
1099 /* Encryption key refresh complete event (code=0x30) */
1100 struct hci_encrypt_key_refresh
1101 {
1102     uint8_t status;
1103     uint16_t connection_handle;
1104 };
1105 
1106 /* Connection complete LE meta subevent */
1107 struct hci_le_conn_complete
1108 {
1109     uint8_t subevent_code;
1110     uint8_t status;
1111     uint16_t connection_handle;
1112     uint8_t role;
1113     uint8_t peer_addr_type;
1114     uint8_t peer_addr[BLE_DEV_ADDR_LEN];
1115     uint16_t conn_itvl;
1116     uint16_t conn_latency;
1117     uint16_t supervision_timeout;
1118     uint8_t master_clk_acc;
1119     uint8_t local_rpa[BLE_DEV_ADDR_LEN];
1120     uint8_t peer_rpa[BLE_DEV_ADDR_LEN];
1121 };
1122 
1123 /* Connection update complete LE meta subevent */
1124 struct hci_le_conn_upd_complete
1125 {
1126     uint8_t subevent_code;
1127     uint8_t status;
1128     uint16_t connection_handle;
1129     uint16_t conn_itvl;
1130     uint16_t conn_latency;
1131     uint16_t supervision_timeout;
1132 };
1133 
1134 /* Remote connection parameter request LE meta subevent */
1135 struct hci_le_conn_param_req
1136 {
1137     uint8_t subevent_code;
1138     uint16_t connection_handle;
1139     uint16_t itvl_min;
1140     uint16_t itvl_max;
1141     uint16_t latency;
1142     uint16_t timeout;
1143 };
1144 
1145 /* Read Remote Supported Features complete LE meta subevent */
1146 struct hci_le_rd_rem_supp_feat_complete
1147 {
1148     uint8_t subevent_code;
1149     uint8_t status;
1150     uint16_t connection_handle;
1151     uint8_t features[8];
1152 };
1153 
1154 /* LE long term key request event (note: fields out of order). */
1155 struct hci_le_lt_key_req
1156 {
1157     uint64_t random_number;
1158     uint16_t connection_handle;
1159     uint16_t encrypted_diversifier;
1160     uint8_t subevent_code;
1161 };
1162 
1163 /* Disconnection complete event (note: fields out of order). */
1164 struct hci_disconn_complete
1165 {
1166     uint16_t connection_handle;
1167     uint8_t status;
1168     uint8_t reason;
1169 };
1170 
1171 /* Read RSSI command-complete parameters (note: fields out of order). */
1172 struct hci_read_rssi_ack_params
1173 {
1174     uint16_t connection_handle;
1175     uint8_t status;
1176     int8_t rssi;
1177 };
1178 
1179 /* PHY updated completed LE meta subevent */
1180 struct hci_le_phy_upd_complete
1181 {
1182     uint8_t subevent_code;
1183     uint8_t status;
1184     uint16_t connection_handle;
1185     uint8_t tx_phy;
1186     uint8_t rx_phy;
1187 };
1188 
1189 /* LE Advertising Set Terminated subevent*/
1190 struct hci_le_adv_set_terminated
1191 {
1192     uint8_t subevent_code;
1193     uint8_t status;
1194     uint8_t adv_handle;
1195     uint16_t conn_handle;
1196     uint8_t completed_events;
1197 };
1198 
1199 #define BLE_HCI_DATA_HDR_SZ                 4
1200 #define BLE_HCI_DATA_HANDLE(handle_pb_bc)   (((handle_pb_bc) & 0x0fff) >> 0)
1201 #define BLE_HCI_DATA_PB(handle_pb_bc)       (((handle_pb_bc) & 0x3000) >> 12)
1202 #define BLE_HCI_DATA_BC(handle_pb_bc)       (((handle_pb_bc) & 0xc000) >> 14)
1203 
1204 struct hci_data_hdr
1205 {
1206     uint16_t hdh_handle_pb_bc;
1207     uint16_t hdh_len;
1208 };
1209 
1210 #define BLE_HCI_PB_FIRST_NON_FLUSH          0
1211 #define BLE_HCI_PB_MIDDLE                   1
1212 #define BLE_HCI_PB_FIRST_FLUSH              2
1213 #define BLE_HCI_PB_FULL                     3
1214 
1215 struct hci_add_dev_to_resolving_list {
1216     uint8_t addr_type;
1217     uint8_t addr[6];
1218     uint8_t local_irk[16];
1219     uint8_t peer_irk[16];
1220 };
1221 
1222 /* External data structures */
1223 extern const uint8_t g_ble_hci_le_cmd_len[BLE_HCI_NUM_LE_CMDS];
1224 
1225 #ifdef __cplusplus
1226 }
1227 #endif
1228 
1229 #endif /* H_BLE_HCI_COMMON_ */
1230