xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/controller/src/ble_ll_supp_cmd.c (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 #include <stdint.h>
21 #include <string.h>
22 
23 #include "nimble/ble.h"
24 #include "nimble/nimble_opt.h"
25 #include "nimble/hci_common.h"
26 #include "controller/ble_ll.h"
27 #include "controller/ble_ll_hci.h"
28 
29 /* Octet 0 */
30 #define BLE_SUPP_CMD_DISCONNECT             (1 << 5)
31 #define BLE_LL_SUPP_CMD_OCTET_0             (BLE_SUPP_CMD_DISCONNECT)
32 
33 /* Octet 5 */
34 #define BLE_SUPP_CMD_SET_EVENT_MASK         (1 << 6)
35 #define BLE_LL_SUPP_CMD_OCTET_5             (BLE_SUPP_CMD_SET_EVENT_MASK)
36 
37 /* Octet 10 */
38 #define BLE_SUPP_CMD_RD_TX_PWR              (0 << 2)
39 #define BLE_LL_SUPP_CMD_OCTET_10            (BLE_SUPP_CMD_RD_TX_PWR)
40 
41 /* Octet 14 */
42 #define BLE_SUPP_CMD_RD_LOC_VER             (1 << 3)
43 #define BLE_SUPP_CMD_RD_LOC_SUPP_FEAT       (1 << 5)
44 #define BLE_LL_SUPP_CMD_OCTET_14            \
45 (                                           \
46     BLE_SUPP_CMD_RD_LOC_VER         |       \
47     BLE_SUPP_CMD_RD_LOC_SUPP_FEAT           \
48 )
49 
50 /* Octet 15 */
51 #define BLE_SUPP_CMD_RD_BD_ADDR             (1 << 1)
52 #define BLE_SUPP_CMD_RD_RSSI                (1 << 5)
53 
54 #define BLE_LL_SUPP_CMD_OCTET_15            \
55 (                                           \
56     BLE_SUPP_CMD_RD_BD_ADDR         |       \
57     BLE_SUPP_CMD_RD_RSSI                    \
58 )
59 
60 /* Octet 25 */
61 #define BLE_SUPP_CMD_LE_SET_EV_MASK         (1 << 0)
62 #define BLE_SUPP_CMD_LE_RD_BUF_SIZE         (1 << 1)
63 #define BLE_SUPP_CMD_LE_RD_LOC_FEAT         (1 << 2)
64 #define BLE_SUPP_CMD_LE_SET_RAND_ADDR       (1 << 4)
65 #define BLE_SUPP_CMD_LE_SET_ADV_PARAMS      (1 << 5)
66 #define BLE_SUPP_CMD_LE_SET_ADV_TX_PWR      (1 << 6)
67 #define BLE_SUPP_CMD_LE_SET_ADV_DATA        (1 << 7)
68 
69 #define BLE_LL_SUPP_CMD_OCTET_25            \
70 (                                           \
71     BLE_SUPP_CMD_LE_SET_EV_MASK     |       \
72     BLE_SUPP_CMD_LE_RD_BUF_SIZE     |       \
73     BLE_SUPP_CMD_LE_RD_LOC_FEAT     |       \
74     BLE_SUPP_CMD_LE_SET_RAND_ADDR   |       \
75     BLE_SUPP_CMD_LE_SET_ADV_PARAMS  |       \
76     BLE_SUPP_CMD_LE_SET_ADV_TX_PWR  |       \
77     BLE_SUPP_CMD_LE_SET_ADV_DATA            \
78 )
79 
80 /* Octet 26 */
81 #define BLE_SUPP_CMD_LE_SET_SCAN_RSP_DATA   (1 << 0)
82 #define BLE_SUPP_CMD_LE_SET_ADV_ENABLE      (1 << 1)
83 #define BLE_SUPP_CMD_LE_SET_SCAN_PARAMS     (1 << 2)
84 #define BLE_SUPP_CMD_LE_SET_SCAN_ENABLE     (1 << 3)
85 #define BLE_SUPP_CMD_LE_CREATE_CONN         (1 << 4)
86 #define BLE_SUPP_CMD_LE_CREATE_CONN_CANCEL  (1 << 5)
87 #define BLE_SUPP_CMD_LE_RD_WHITELIST_SIZE   (1 << 6)
88 #define BLE_SUPP_CMD_LE_CLR_WHITELIST       (1 << 7)
89 
90 #define BLE_LL_SUPP_CMD_OCTET_26            \
91 (                                           \
92     BLE_SUPP_CMD_LE_SET_SCAN_RSP_DATA   |   \
93     BLE_SUPP_CMD_LE_SET_ADV_ENABLE      |   \
94     BLE_SUPP_CMD_LE_SET_SCAN_PARAMS     |   \
95     BLE_SUPP_CMD_LE_SET_SCAN_ENABLE     |   \
96     BLE_SUPP_CMD_LE_CREATE_CONN         |   \
97     BLE_SUPP_CMD_LE_CREATE_CONN_CANCEL  |   \
98     BLE_SUPP_CMD_LE_RD_WHITELIST_SIZE   |   \
99     BLE_SUPP_CMD_LE_CLR_WHITELIST           \
100 )
101 
102 /* Octet 27 */
103 #define BLE_SUPP_CMD_LE_ADD_DEV_WHITELIST   (1 << 0)
104 #define BLE_SUPP_CMD_LE_RMV_DEV_WHITELIST   (1 << 1)
105 #define BLE_SUPP_CMD_LE_CONN_UPDATE         (1 << 2)
106 #define BLE_SUPP_CMD_LE_SET_HOST_CHAN_CLASS (1 << 3)
107 #define BLE_SUPP_CMD_LE_RD_CHAN_MAP         (1 << 4)
108 #define BLE_SUPP_CMD_LE_RD_REM_USED_FEAT    (1 << 5)
109 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) == 1)
110 #define BLE_SUPP_CMD_LE_ENCRYPT             (1 << 6)
111 #else
112 #define BLE_SUPP_CMD_LE_ENCRYPT             (0 << 6)
113 #endif
114 #define BLE_SUPP_CMD_LE_RAND                (1 << 7)
115 
116 #define BLE_LL_SUPP_CMD_OCTET_27            \
117 (                                           \
118     BLE_SUPP_CMD_LE_ENCRYPT             |   \
119     BLE_SUPP_CMD_LE_RAND                |   \
120     BLE_SUPP_CMD_LE_ADD_DEV_WHITELIST   |   \
121     BLE_SUPP_CMD_LE_RMV_DEV_WHITELIST   |   \
122     BLE_SUPP_CMD_LE_CONN_UPDATE         |   \
123     BLE_SUPP_CMD_LE_SET_HOST_CHAN_CLASS |   \
124     BLE_SUPP_CMD_LE_RD_CHAN_MAP         |   \
125     BLE_SUPP_CMD_LE_RD_REM_USED_FEAT        \
126 )
127 
128 /* Octet 28 */
129 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) == 1)
130 #define BLE_SUPP_CMD_LE_START_ENCRYPT       (1 << 0)
131 #define BLE_SUPP_CMD_LE_LTK_REQ_REPLY       (1 << 1)
132 #define BLE_SUPP_CMD_LE_LTK_REQ_NEG_REPLY   (1 << 2)
133 #else
134 #define BLE_SUPP_CMD_LE_START_ENCRYPT       (0 << 0)
135 #define BLE_SUPP_CMD_LE_LTK_REQ_REPLY       (0 << 1)
136 #define BLE_SUPP_CMD_LE_LTK_REQ_NEG_REPLY   (0 << 2)
137 #endif
138 #define BLE_SUPP_CMD_LE_READ_SUPP_STATES    (1 << 3)
139 
140 #if MYNEWT_VAL(BLE_LL_DIRECT_TEST_MODE) == 0
141 #define BLE_SUPP_CMD_LE_RX_TEST             (0 << 4)
142 #define BLE_SUPP_CMD_LE_TX_TEST             (0 << 5)
143 #define BLE_SUPP_CMD_LE_TEST_END            (0 << 6)
144 #else
145 #define BLE_SUPP_CMD_LE_RX_TEST             (1 << 4)
146 #define BLE_SUPP_CMD_LE_TX_TEST             (1 << 5)
147 #define BLE_SUPP_CMD_LE_TEST_END            (1 << 6)
148 #endif
149 
150 #define BLE_LL_SUPP_CMD_OCTET_28            \
151 (                                           \
152     BLE_SUPP_CMD_LE_START_ENCRYPT       |   \
153     BLE_SUPP_CMD_LE_LTK_REQ_REPLY       |   \
154     BLE_SUPP_CMD_LE_LTK_REQ_NEG_REPLY   |   \
155     BLE_SUPP_CMD_LE_READ_SUPP_STATES    |   \
156     BLE_SUPP_CMD_LE_RX_TEST             |   \
157     BLE_SUPP_CMD_LE_TX_TEST             |   \
158     BLE_SUPP_CMD_LE_TEST_END                \
159 )
160 
161 /* Octet 33 */
162 #define BLE_SUPP_CMD_LE_REM_CONN_PRR        (1 << 4)
163 #define BLE_SUPP_CMD_LE_REM_CONN_PRNR       (1 << 5)
164 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) == 1)
165 #define BLE_SUPP_CMD_LE_SET_DATALEN         (1 << 6)
166 #define BLE_SUPP_CMD_LE_RD_SUGG_DATALEN     (1 << 7)
167 #else
168 #define BLE_SUPP_CMD_LE_SET_DATALEN         (0 << 6)
169 #define BLE_SUPP_CMD_LE_RD_SUGG_DATALEN     (0 << 7)
170 #endif
171 
172 #define BLE_LL_SUPP_CMD_OCTET_33            \
173 (                                           \
174     BLE_SUPP_CMD_LE_REM_CONN_PRR        |   \
175     BLE_SUPP_CMD_LE_REM_CONN_PRNR       |   \
176     BLE_SUPP_CMD_LE_SET_DATALEN         |   \
177     BLE_SUPP_CMD_LE_RD_SUGG_DATALEN         \
178 )
179 
180 /* Octet 34 */
181 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) == 1)
182 #define BLE_SUPP_CMD_LE_WR_SUGG_DATALEN     (1 << 0)
183 #else
184 #define BLE_SUPP_CMD_LE_WR_SUGG_DATALEN     (0 << 0)
185 #endif
186 #define BLE_SUPP_CMD_LE_READ_LOCAL_P256_PK  (0 << 1)
187 #define BLE_SUPP_CMD_LE_GENERATE_DH_KEY     (0 << 2)
188 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) == 1)
189 #define BLE_SUPP_CMD_LE_ADD_RESOLV_LIST     (1 << 3)
190 #define BLE_SUPP_CMD_LE_REMOVE_RESOLV_LIST  (1 << 4)
191 #define BLE_SUPP_CMD_LE_CLEAR_RESOLV_LIST   (1 << 5)
192 #define BLE_SUPP_CMD_LE_RD_RESOLV_SIZE      (1 << 6)
193 #define BLE_SUPP_CMD_LE_RD_PEER_RESV_ADDR   (1 << 7)
194 #else
195 #define BLE_SUPP_CMD_LE_ADD_RESOLV_LIST     (0 << 3)
196 #define BLE_SUPP_CMD_LE_REMOVE_RESOLV_LIST  (0 << 4)
197 #define BLE_SUPP_CMD_LE_CLEAR_RESOLV_LIST   (0 << 5)
198 #define BLE_SUPP_CMD_LE_RD_RESOLV_SIZE      (0 << 6)
199 #define BLE_SUPP_CMD_LE_RD_PEER_RESV_ADDR   (0 << 7)
200 #endif
201 
202 #define BLE_LL_SUPP_CMD_OCTET_34            \
203 (                                           \
204     BLE_SUPP_CMD_LE_WR_SUGG_DATALEN     |   \
205     BLE_SUPP_CMD_LE_READ_LOCAL_P256_PK  |   \
206     BLE_SUPP_CMD_LE_GENERATE_DH_KEY     |   \
207     BLE_SUPP_CMD_LE_ADD_RESOLV_LIST     |   \
208     BLE_SUPP_CMD_LE_REMOVE_RESOLV_LIST  |   \
209     BLE_SUPP_CMD_LE_CLEAR_RESOLV_LIST   |   \
210     BLE_SUPP_CMD_LE_RD_RESOLV_SIZE      |   \
211     BLE_SUPP_CMD_LE_RD_PEER_RESV_ADDR       \
212 )
213 
214 /* Octet 35 */
215 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) == 1)
216 #define BLE_SUPP_CMD_LE_RD_LOCAL_RESV_ADDR  (1 << 0)
217 #define BLE_SUPP_CMD_LE_SET_ADDR_RES_EN     (1 << 1)
218 #define BLE_SUPP_CMD_LE_SET_RESV_ADDR_TMO   (1 << 2)
219 #else
220 #define BLE_SUPP_CMD_LE_RD_LOCAL_RESV_ADDR  (0 << 0)
221 #define BLE_SUPP_CMD_LE_SET_ADDR_RES_EN     (0 << 1)
222 #define BLE_SUPP_CMD_LE_SET_RESV_ADDR_TMO   (0 << 2)
223 #endif
224 #define BLE_SUPP_CMD_LE_RD_MAX_DATALEN      (1 << 3)
225 #if (BLE_LL_BT5_PHY_SUPPORTED == 1)
226 #define BLE_SUPP_CMD_LE_READ_PHY            (1 << 4)
227 #define BLE_SUPP_CMD_LE_SET_DEFAULT_PHY     (1 << 5)
228 #define BLE_SUPP_CMD_LE_SET_PHY             (1 << 6)
229 #else
230 #define BLE_SUPP_CMD_LE_READ_PHY            (0 << 4)
231 #define BLE_SUPP_CMD_LE_SET_DEFAULT_PHY     (0 << 5)
232 #define BLE_SUPP_CMD_LE_SET_PHY             (0 << 6)
233 #endif
234 
235 #if MYNEWT_VAL(BLE_LL_DIRECT_TEST_MODE) == 0
236 #define BLE_SUPP_CMD_LE_ENHANCED_RX_TEST    (0 << 7)
237 #else
238 #define BLE_SUPP_CMD_LE_ENHANCED_RX_TEST    (1 << 7)
239 #endif
240 
241 #define BLE_LL_SUPP_CMD_OCTET_35            \
242 (                                           \
243     BLE_SUPP_CMD_LE_RD_LOCAL_RESV_ADDR  |   \
244     BLE_SUPP_CMD_LE_SET_ADDR_RES_EN     |   \
245     BLE_SUPP_CMD_LE_SET_RESV_ADDR_TMO   |   \
246     BLE_SUPP_CMD_LE_RD_MAX_DATALEN      |   \
247     BLE_SUPP_CMD_LE_READ_PHY            |   \
248     BLE_SUPP_CMD_LE_SET_DEFAULT_PHY     |   \
249     BLE_SUPP_CMD_LE_SET_PHY             |   \
250     BLE_SUPP_CMD_LE_ENHANCED_RX_TEST        \
251 )
252 
253 /* Octet 36 */
254 #if MYNEWT_VAL(BLE_LL_DIRECT_TEST_MODE) == 0
255 #define BLE_SUPP_CMD_LE_ENHANCED_TX_TEST    (0 << 0)
256 #else
257 #define BLE_SUPP_CMD_LE_ENHANCED_TX_TEST    (1 << 0)
258 #endif
259 
260 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) == 1)
261 #define BLE_SUPP_CMD_LE_SET_ADVS_RAND_ADDR  (1 << 1)
262 #define BLE_SUPP_CMD_LE_SET_EXT_ADV_PARAM   (1 << 2)
263 #define BLE_SUPP_CMD_LE_SET_EXT_ADV_DATA    (1 << 3)
264 #define BLE_SUPP_CMD_LE_SET_EXT_SCAN_RSP    (1 << 4)
265 #define BLE_SUPP_CMD_LE_SET_EXT_ADV_ENABLE  (1 << 5)
266 #define BLE_SUPP_CMD_LE_RD_MAX_ADV_DATA_LEN (1 << 6)
267 #define BLE_SUPP_CMD_LE_RD_NUM_SUPP_ADVS    (1 << 7)
268 #else
269 #define BLE_SUPP_CMD_LE_SET_ADVS_RAND_ADDR  (0 << 1)
270 #define BLE_SUPP_CMD_LE_SET_EXT_ADV_PARAM   (0 << 2)
271 #define BLE_SUPP_CMD_LE_SET_EXT_ADV_DATA    (0 << 3)
272 #define BLE_SUPP_CMD_LE_SET_EXT_SCAN_RSP    (0 << 4)
273 #define BLE_SUPP_CMD_LE_SET_EXT_ADV_ENABLE  (0 << 5)
274 #define BLE_SUPP_CMD_LE_RD_MAX_ADV_DATA_LEN (0 << 6)
275 #define BLE_SUPP_CMD_LE_RD_NUM_SUPP_ADVS    (0 << 7)
276 #endif
277 
278 #define BLE_LL_SUPP_CMD_OCTET_36            \
279 (                                           \
280     BLE_SUPP_CMD_LE_ENHANCED_TX_TEST    |   \
281     BLE_SUPP_CMD_LE_SET_ADVS_RAND_ADDR  |   \
282     BLE_SUPP_CMD_LE_SET_EXT_ADV_PARAM   |   \
283     BLE_SUPP_CMD_LE_SET_EXT_ADV_DATA    |   \
284     BLE_SUPP_CMD_LE_SET_EXT_SCAN_RSP    |   \
285     BLE_SUPP_CMD_LE_SET_EXT_ADV_ENABLE  |   \
286     BLE_SUPP_CMD_LE_RD_MAX_ADV_DATA_LEN |   \
287     BLE_SUPP_CMD_LE_RD_NUM_SUPP_ADVS        \
288 )
289 
290 /* Octet 37 */
291 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) == 1)
292 #define BLE_SUPP_CMD_LE_REMOVE_ADVS         (1 << 0)
293 #define BLE_SUPP_CMD_LE_CLEAR_ADVS          (1 << 1)
294 #else
295 #define BLE_SUPP_CMD_LE_REMOVE_ADVS         (0 << 0)
296 #define BLE_SUPP_CMD_LE_CLEAR_ADVS          (0 << 1)
297 #endif
298 #define BLE_SUPP_CMD_LE_SET_PADV_PARAM      (0 << 2)
299 #define BLE_SUPP_CMD_LE_SET_PADV_DATA       (0 << 3)
300 #define BLE_SUPP_CMD_LE_SET_PADV_ENABLE     (0 << 4)
301 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) == 1)
302 #define BLE_SUPP_CMD_LE_SET_EXT_SCAN_PARAM  (1 << 5)
303 #define BLE_SUPP_CMD_LE_SET_EXT_SCAN_ENABLE (1 << 6)
304 #define BLE_SUPP_CMD_LE_EXT_CREATE_CONN     (1 << 7)
305 #else
306 #define BLE_SUPP_CMD_LE_SET_EXT_SCAN_PARAM  (0 << 5)
307 #define BLE_SUPP_CMD_LE_SET_EXT_SCAN_ENABLE (0 << 6)
308 #define BLE_SUPP_CMD_LE_EXT_CREATE_CONN     (0 << 7)
309 #endif
310 
311 #define BLE_LL_SUPP_CMD_OCTET_37            \
312 (                                           \
313     BLE_SUPP_CMD_LE_REMOVE_ADVS         |   \
314     BLE_SUPP_CMD_LE_CLEAR_ADVS          |   \
315     BLE_SUPP_CMD_LE_SET_PADV_PARAM      |   \
316     BLE_SUPP_CMD_LE_SET_PADV_DATA       |   \
317     BLE_SUPP_CMD_LE_SET_PADV_ENABLE     |   \
318     BLE_SUPP_CMD_LE_SET_EXT_SCAN_PARAM  |   \
319     BLE_SUPP_CMD_LE_SET_EXT_SCAN_ENABLE |   \
320     BLE_SUPP_CMD_LE_EXT_CREATE_CONN         \
321 )
322 
323 /* Octet 38 */
324 #define BLE_SUPP_CMD_LE_PADV_CREATE_SYNC    (0 << 0)
325 #define BLE_SUPP_CMD_LE_PADV_CREATE_SYNC_C  (0 << 1)
326 #define BLE_SUPP_CMD_LE_PADV_TERMINATE_SYNC (0 << 2)
327 #define BLE_SUPP_CMD_LE_ADD_PADV_LIST       (0 << 3)
328 #define BLE_SUPP_CMD_LE_REMOVE_PADV_LIST    (0 << 4)
329 #define BLE_SUPP_CMD_LE_CLEAR_PADV_LIST     (0 << 5)
330 #define BLE_SUPP_CMD_LE_RD_PADV_LIST_SIZE   (0 << 6)
331 #define BLE_SUPP_CMD_LE_RD_TX_POWER         (0 << 7)
332 
333 #define BLE_LL_SUPP_CMD_OCTET_38            \
334 (                                           \
335     BLE_SUPP_CMD_LE_PADV_CREATE_SYNC    |   \
336     BLE_SUPP_CMD_LE_PADV_CREATE_SYNC_C  |   \
337     BLE_SUPP_CMD_LE_PADV_TERMINATE_SYNC |   \
338     BLE_SUPP_CMD_LE_ADD_PADV_LIST       |   \
339     BLE_SUPP_CMD_LE_REMOVE_PADV_LIST    |   \
340     BLE_SUPP_CMD_LE_CLEAR_PADV_LIST     |   \
341     BLE_SUPP_CMD_LE_RD_PADV_LIST_SIZE   |   \
342     BLE_SUPP_CMD_LE_RD_TX_POWER             \
343 )
344 
345 /* Octet 39 */
346 #define BLE_SUPP_CMD_LE_RD_RF_PATH_COMP     (0 << 0)
347 #define BLE_SUPP_CMD_LE_WR_RF_PATH_COMP     (0 << 1)
348 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) == 1)
349 #define BLE_SUPP_CMD_LE_SET_PRIVACY_MODE    (1 << 2)
350 #else
351 #define BLE_SUPP_CMD_LE_SET_PRIVACY_MODE    (0 << 2)
352 #endif
353 
354 #define BLE_LL_SUPP_CMD_OCTET_39            \
355 (                                           \
356     BLE_SUPP_CMD_LE_RD_RF_PATH_COMP     |   \
357     BLE_SUPP_CMD_LE_WR_RF_PATH_COMP     |   \
358     BLE_SUPP_CMD_LE_SET_PRIVACY_MODE        \
359 )
360 
361 /* Defines the array of supported commands */
362 const uint8_t g_ble_ll_supp_cmds[BLE_LL_SUPP_CMD_LEN] =
363 {
364     BLE_LL_SUPP_CMD_OCTET_0,            /* Octet 0 */
365     0,
366     0,
367     0,
368     0,
369     BLE_LL_SUPP_CMD_OCTET_5,
370     0,
371     0,
372     0,                                  /* Octet 8 */
373     0,
374     BLE_LL_SUPP_CMD_OCTET_10,
375     0,
376     0,
377     0,
378     BLE_LL_SUPP_CMD_OCTET_14,
379     BLE_LL_SUPP_CMD_OCTET_15,
380     0,                                  /* Octet 16 */
381     0,
382     0,
383     0,
384     0,
385     0,
386     0,
387     0,
388     0,                                 /* Octet 24 */
389     BLE_LL_SUPP_CMD_OCTET_25,
390     BLE_LL_SUPP_CMD_OCTET_26,
391     BLE_LL_SUPP_CMD_OCTET_27,
392     BLE_LL_SUPP_CMD_OCTET_28,
393     0,
394     0,
395     0,
396     0,                                  /* Octet 32 */
397     BLE_LL_SUPP_CMD_OCTET_33,
398     BLE_LL_SUPP_CMD_OCTET_34,
399     BLE_LL_SUPP_CMD_OCTET_35,
400     BLE_LL_SUPP_CMD_OCTET_36,
401     BLE_LL_SUPP_CMD_OCTET_37,
402     BLE_LL_SUPP_CMD_OCTET_38,
403     BLE_LL_SUPP_CMD_OCTET_39,
404 };
405