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