Home | History | Annotate | Download | only in hcic
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains function of the HCIC unit to format and send HCI
     22  *  commands.
     23  *
     24  ******************************************************************************/
     25 
     26 #include "bt_target.h"
     27 #include "gki.h"
     28 #include "hcidefs.h"
     29 #include "hcimsgs.h"
     30 #include "hcidefs.h"
     31 #include "btu.h"
     32 
     33 #include <stddef.h>
     34 #include <string.h>
     35 
     36 #if (defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
     37 
     38 BOOLEAN btsnd_hcic_ble_set_local_used_feat (UINT8 feat_set[8])
     39 {
     40     BT_HDR *p;
     41     UINT8 *pp;
     42 
     43     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_USED_FEAT_CMD)) == NULL)
     44         return (FALSE);
     45 
     46     pp = (UINT8 *)(p + 1);
     47 
     48     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_USED_FEAT_CMD;
     49     p->offset = 0;
     50 
     51     UINT16_TO_STREAM (pp, HCI_BLE_WRITE_LOCAL_SPT_FEAT);
     52     ARRAY_TO_STREAM (pp, feat_set, HCIC_PARAM_SIZE_SET_USED_FEAT_CMD);
     53 
     54     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
     55     return (TRUE);
     56 }
     57 
     58 BOOLEAN btsnd_hcic_ble_set_random_addr (BD_ADDR random_bda)
     59 {
     60     BT_HDR *p;
     61     UINT8 *pp;
     62 
     63     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD)) == NULL)
     64         return (FALSE);
     65 
     66     pp = (UINT8 *)(p + 1);
     67 
     68     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD;
     69     p->offset = 0;
     70 
     71     UINT16_TO_STREAM (pp, HCI_BLE_WRITE_RANDOM_ADDR);
     72     UINT8_TO_STREAM  (pp,  HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD);
     73 
     74     BDADDR_TO_STREAM (pp, random_bda);
     75 
     76     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
     77     return (TRUE);
     78 }
     79 
     80 BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max,
     81                                        UINT8 adv_type, UINT8 addr_type_own,
     82                                        UINT8 addr_type_dir, BD_ADDR direct_bda,
     83                                        UINT8 channel_map, UINT8 adv_filter_policy)
     84 {
     85     BT_HDR *p;
     86     UINT8 *pp;
     87 
     88     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS)) == NULL)
     89         return (FALSE);
     90 
     91     pp = (UINT8 *)(p + 1);
     92 
     93     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS ;
     94     p->offset = 0;
     95 
     96     UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_PARAMS);
     97     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS );
     98 
     99     UINT16_TO_STREAM (pp, adv_int_min);
    100     UINT16_TO_STREAM (pp, adv_int_max);
    101     UINT8_TO_STREAM (pp, adv_type);
    102     UINT8_TO_STREAM (pp, addr_type_own);
    103     UINT8_TO_STREAM (pp, addr_type_dir);
    104     BDADDR_TO_STREAM (pp, direct_bda);
    105     UINT8_TO_STREAM (pp, channel_map);
    106     UINT8_TO_STREAM (pp, adv_filter_policy);
    107 
    108     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    109     return (TRUE);
    110 }
    111 BOOLEAN btsnd_hcic_ble_read_adv_chnl_tx_power (void)
    112 {
    113     BT_HDR *p;
    114     UINT8 *pp;
    115 
    116     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
    117         return (FALSE);
    118 
    119     pp = (UINT8 *)(p + 1);
    120 
    121     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
    122     p->offset = 0;
    123 
    124     UINT16_TO_STREAM (pp, HCI_BLE_READ_ADV_CHNL_TX_POWER);
    125     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_READ_CMD);
    126 
    127     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    128     return (TRUE);
    129 
    130 }
    131 
    132 BOOLEAN btsnd_hcic_ble_set_adv_data (UINT8 data_len, UINT8 *p_data)
    133 {
    134     BT_HDR *p;
    135     UINT8 *pp;
    136 
    137     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1)) == NULL)
    138         return (FALSE);
    139 
    140     pp = (UINT8 *)(p + 1);
    141 
    142     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1;
    143     p->offset = 0;
    144 
    145     UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_DATA);
    146     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1);
    147 
    148     memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA);
    149 
    150     if (p_data != NULL && data_len > 0)
    151     {
    152         if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA)
    153             data_len = HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA;
    154 
    155         UINT8_TO_STREAM (pp, data_len);
    156 
    157         ARRAY_TO_STREAM (pp, p_data, data_len);
    158     }
    159     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    160 
    161     return (TRUE);
    162 }
    163 BOOLEAN btsnd_hcic_ble_set_scan_rsp_data (UINT8 data_len, UINT8 *p_scan_rsp)
    164 {
    165     BT_HDR *p;
    166     UINT8 *pp;
    167 
    168     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1)) == NULL)
    169         return (FALSE);
    170 
    171     pp = (UINT8 *)(p + 1);
    172 
    173     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1;
    174     p->offset = 0;
    175 
    176     UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_RSP_DATA);
    177     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1);
    178 
    179     memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP);
    180 
    181     if (p_scan_rsp != NULL && data_len > 0)
    182     {
    183 
    184         if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP )
    185             data_len = HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP;
    186 
    187         UINT8_TO_STREAM (pp, data_len);
    188 
    189         ARRAY_TO_STREAM (pp, p_scan_rsp, data_len);
    190     }
    191 
    192     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    193 
    194     return (TRUE);
    195 }
    196 
    197 BOOLEAN btsnd_hcic_ble_set_adv_enable (UINT8 adv_enable)
    198 {
    199     BT_HDR *p;
    200     UINT8 *pp;
    201 
    202     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_ADV_ENABLE)) == NULL)
    203         return (FALSE);
    204 
    205     pp = (UINT8 *)(p + 1);
    206 
    207     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_ADV_ENABLE;
    208     p->offset = 0;
    209 
    210     UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_ENABLE);
    211     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_ADV_ENABLE);
    212 
    213     UINT8_TO_STREAM (pp, adv_enable);
    214 
    215     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    216     return (TRUE);
    217 }
    218 BOOLEAN btsnd_hcic_ble_set_scan_params (UINT8 scan_type,
    219                                           UINT16 scan_int, UINT16 scan_win,
    220                                           UINT8 addr_type_own, UINT8 scan_filter_policy)
    221 {
    222     BT_HDR *p;
    223     UINT8 *pp;
    224 
    225     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM)) == NULL)
    226         return (FALSE);
    227 
    228     pp = (UINT8 *)(p + 1);
    229 
    230     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM;
    231     p->offset = 0;
    232 
    233     UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_PARAMS);
    234     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM);
    235 
    236     UINT8_TO_STREAM (pp, scan_type);
    237     UINT16_TO_STREAM (pp, scan_int);
    238     UINT16_TO_STREAM (pp, scan_win);
    239     UINT8_TO_STREAM (pp, addr_type_own);
    240     UINT8_TO_STREAM (pp, scan_filter_policy);
    241 
    242     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    243     return (TRUE);
    244 }
    245 
    246 BOOLEAN btsnd_hcic_ble_set_scan_enable (UINT8 scan_enable, UINT8 duplicate)
    247 {
    248     BT_HDR *p;
    249     UINT8 *pp;
    250 
    251     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE)) == NULL)
    252         return (FALSE);
    253 
    254     pp = (UINT8 *)(p + 1);
    255 
    256     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE;
    257     p->offset = 0;
    258 
    259     UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_ENABLE);
    260     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE);
    261 
    262     UINT8_TO_STREAM (pp, scan_enable);
    263     UINT8_TO_STREAM (pp, duplicate);
    264 
    265     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    266     return (TRUE);
    267 }
    268 
    269 /* link layer connection management commands */
    270 BOOLEAN btsnd_hcic_ble_create_ll_conn (UINT16 scan_int, UINT16 scan_win,
    271                                        UINT8 init_filter_policy,
    272                                        UINT8 addr_type_peer, BD_ADDR bda_peer,
    273                                        UINT8 addr_type_own,
    274                                        UINT16 conn_int_min, UINT16 conn_int_max,
    275                                        UINT16 conn_latency, UINT16 conn_timeout,
    276                                        UINT16 min_ce_len, UINT16 max_ce_len)
    277 {
    278     BT_HDR *p;
    279     UINT8 *pp;
    280 
    281     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN)) == NULL)
    282         return (FALSE);
    283 
    284     pp = (UINT8 *)(p + 1);
    285 
    286     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN;
    287     p->offset = 0;
    288 
    289     UINT16_TO_STREAM (pp, HCI_BLE_CREATE_LL_CONN);
    290     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN);
    291 
    292     UINT16_TO_STREAM (pp, scan_int);
    293     UINT16_TO_STREAM (pp, scan_win);
    294     UINT8_TO_STREAM (pp, init_filter_policy);
    295 
    296     UINT8_TO_STREAM (pp, addr_type_peer);
    297     BDADDR_TO_STREAM (pp, bda_peer);
    298     UINT8_TO_STREAM (pp, addr_type_own);
    299 
    300     UINT16_TO_STREAM (pp, conn_int_min);
    301     UINT16_TO_STREAM (pp, conn_int_max);
    302     UINT16_TO_STREAM (pp, conn_latency);
    303     UINT16_TO_STREAM (pp, conn_timeout);
    304 
    305     UINT16_TO_STREAM (pp, min_ce_len);
    306     UINT16_TO_STREAM (pp, max_ce_len);
    307 
    308     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    309     return (TRUE);
    310 }
    311 
    312 BOOLEAN btsnd_hcic_ble_create_conn_cancel (void)
    313 {
    314     BT_HDR *p;
    315     UINT8 *pp;
    316 
    317     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL)) == NULL)
    318         return (FALSE);
    319 
    320     pp = (UINT8 *)(p + 1);
    321 
    322     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL;
    323     p->offset = 0;
    324 
    325     UINT16_TO_STREAM (pp, HCI_BLE_CREATE_CONN_CANCEL);
    326     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL);
    327 
    328     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    329     return (TRUE);
    330 }
    331 
    332 BOOLEAN btsnd_hcic_ble_clear_white_list (void)
    333 {
    334     BT_HDR *p;
    335     UINT8 *pp;
    336 
    337     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CLEAR_WHITE_LIST)) == NULL)
    338         return (FALSE);
    339 
    340     pp = (UINT8 *)(p + 1);
    341 
    342     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CLEAR_WHITE_LIST;
    343     p->offset = 0;
    344 
    345     UINT16_TO_STREAM (pp, HCI_BLE_CLEAR_WHITE_LIST);
    346     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CLEAR_WHITE_LIST);
    347 
    348     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    349     return (TRUE);
    350 }
    351 
    352 BOOLEAN btsnd_hcic_ble_add_white_list (UINT8 addr_type, BD_ADDR bda)
    353 {
    354     BT_HDR *p;
    355     UINT8 *pp;
    356 
    357     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_WHITE_LIST)) == NULL)
    358         return (FALSE);
    359 
    360     pp = (UINT8 *)(p + 1);
    361 
    362     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_WHITE_LIST;
    363     p->offset = 0;
    364 
    365     UINT16_TO_STREAM (pp, HCI_BLE_ADD_WHITE_LIST);
    366     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ADD_WHITE_LIST);
    367 
    368     UINT8_TO_STREAM (pp, addr_type);
    369     BDADDR_TO_STREAM (pp, bda);
    370 
    371     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    372     return (TRUE);
    373 }
    374 
    375 BOOLEAN btsnd_hcic_ble_remove_from_white_list (UINT8 addr_type, BD_ADDR bda)
    376 {
    377     BT_HDR *p;
    378     UINT8 *pp;
    379 
    380     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REMOVE_WHITE_LIST)) == NULL)
    381         return (FALSE);
    382 
    383     pp = (UINT8 *)(p + 1);
    384 
    385     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REMOVE_WHITE_LIST;
    386     p->offset = 0;
    387 
    388     UINT16_TO_STREAM (pp, HCI_BLE_REMOVE_WHITE_LIST);
    389     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REMOVE_WHITE_LIST);
    390 
    391     UINT8_TO_STREAM (pp, addr_type);
    392     BDADDR_TO_STREAM (pp, bda);
    393 
    394     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    395     return (TRUE);
    396 }
    397 
    398 BOOLEAN btsnd_hcic_ble_upd_ll_conn_params (UINT16 handle,
    399                                            UINT16 conn_int_min, UINT16 conn_int_max,
    400                                            UINT16 conn_latency, UINT16 conn_timeout,
    401                                            UINT16 min_ce_len, UINT16 max_ce_len)
    402 {
    403     BT_HDR *p;
    404     UINT8 *pp;
    405 
    406     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS)) == NULL)
    407         return (FALSE);
    408 
    409     pp = (UINT8 *)(p + 1);
    410 
    411     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS;
    412     p->offset = 0;
    413 
    414     UINT16_TO_STREAM (pp, HCI_BLE_UPD_LL_CONN_PARAMS);
    415     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS);
    416 
    417     UINT16_TO_STREAM (pp, handle);
    418 
    419     UINT16_TO_STREAM (pp, conn_int_min);
    420     UINT16_TO_STREAM (pp, conn_int_max);
    421     UINT16_TO_STREAM (pp, conn_latency);
    422     UINT16_TO_STREAM (pp, conn_timeout);
    423     UINT16_TO_STREAM (pp, min_ce_len);
    424     UINT16_TO_STREAM (pp, max_ce_len);
    425 
    426     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    427     return (TRUE);
    428 }
    429 
    430 BOOLEAN btsnd_hcic_ble_set_host_chnl_class (UINT8  chnl_map[HCIC_BLE_CHNL_MAP_SIZE])
    431 {
    432     BT_HDR *p;
    433     UINT8 *pp;
    434 
    435     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS)) == NULL)
    436         return (FALSE);
    437 
    438     pp = (UINT8 *)(p + 1);
    439 
    440     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS;
    441     p->offset = 0;
    442 
    443     UINT16_TO_STREAM (pp, HCI_BLE_SET_HOST_CHNL_CLASS);
    444     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS);
    445 
    446     ARRAY_TO_STREAM (pp, chnl_map, HCIC_BLE_CHNL_MAP_SIZE);
    447 
    448     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    449     return (TRUE);
    450 }
    451 
    452 BOOLEAN btsnd_hcic_ble_read_chnl_map (UINT16 handle)
    453 {
    454     BT_HDR *p;
    455     UINT8 *pp;
    456 
    457     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CHNL_MAP)) == NULL)
    458         return (FALSE);
    459 
    460     pp = (UINT8 *)(p + 1);
    461 
    462     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CHNL_MAP;
    463     p->offset = 0;
    464 
    465     UINT16_TO_STREAM (pp, HCI_BLE_READ_CHNL_MAP);
    466     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_READ_CHNL_MAP);
    467 
    468     UINT16_TO_STREAM (pp, handle);
    469 
    470     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    471     return (TRUE);
    472 }
    473 
    474 BOOLEAN btsnd_hcic_ble_read_remote_feat (UINT16 handle)
    475 {
    476     BT_HDR *p;
    477     UINT8 *pp;
    478 
    479     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT)) == NULL)
    480         return (FALSE);
    481 
    482     pp = (UINT8 *)(p + 1);
    483 
    484     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT;
    485     p->offset = 0;
    486 
    487     UINT16_TO_STREAM (pp, HCI_BLE_READ_REMOTE_FEAT);
    488     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT);
    489 
    490     UINT16_TO_STREAM (pp, handle);
    491 
    492     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    493     return (TRUE);
    494 }
    495 
    496 /* security management commands */
    497 BOOLEAN btsnd_hcic_ble_encrypt (UINT8 *key, UINT8 key_len,
    498                                 UINT8 *plain_text, UINT8 pt_len,
    499                                 void *p_cmd_cplt_cback)
    500 {
    501     BT_HDR *p;
    502     UINT8 *pp;
    503 
    504     if ((p = HCI_GET_CMD_BUF(sizeof(BT_HDR) + sizeof (void *) +
    505                             HCIC_PARAM_SIZE_BLE_ENCRYPT)) == NULL)
    506         return (FALSE);
    507 
    508     pp = (UINT8 *)(p + 1);
    509 
    510     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENCRYPT;
    511     p->offset = sizeof(void *);
    512 
    513     *((void **)pp) = p_cmd_cplt_cback;  /* Store command complete callback in buffer */
    514     pp += sizeof(void *);               /* Skip over callback pointer */
    515 
    516 
    517     UINT16_TO_STREAM (pp, HCI_BLE_ENCRYPT);
    518     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_ENCRYPT);
    519 
    520     memset(pp, 0, HCIC_PARAM_SIZE_BLE_ENCRYPT);
    521 
    522     if (key_len > HCIC_BLE_ENCRYT_KEY_SIZE) key_len = HCIC_BLE_ENCRYT_KEY_SIZE;
    523     if (pt_len > HCIC_BLE_ENCRYT_KEY_SIZE) pt_len = HCIC_BLE_ENCRYT_KEY_SIZE;
    524 
    525     ARRAY_TO_STREAM (pp, key, key_len);
    526     pp += (HCIC_BLE_ENCRYT_KEY_SIZE - key_len);
    527     ARRAY_TO_STREAM (pp, plain_text, pt_len);
    528 
    529     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    530     return (TRUE);
    531 }
    532 
    533 BOOLEAN btsnd_hcic_ble_rand (void *p_cmd_cplt_cback)
    534 {
    535     BT_HDR *p;
    536     UINT8 *pp;
    537 
    538     if ((p = HCI_GET_CMD_BUF(sizeof(BT_HDR) + sizeof (void *) +
    539                         HCIC_PARAM_SIZE_BLE_RAND)) == NULL)
    540         return (FALSE);
    541 
    542     pp = (UINT8 *)(p + 1);
    543 
    544     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RAND;
    545     p->offset = sizeof(void *);
    546 
    547     *((void **)pp) = p_cmd_cplt_cback;  /* Store command complete callback in buffer */
    548     pp += sizeof(void *);               /* Skip over callback pointer */
    549 
    550     UINT16_TO_STREAM (pp, HCI_BLE_RAND);
    551     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_RAND);
    552 
    553     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    554     return (TRUE);
    555 }
    556 
    557 BOOLEAN btsnd_hcic_ble_start_enc (UINT16 handle, UINT8 rand[HCIC_BLE_RAND_DI_SIZE],
    558                                 UINT16 ediv, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE])
    559 {
    560     BT_HDR *p;
    561     UINT8 *pp;
    562 
    563     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_START_ENC)) == NULL)
    564         return (FALSE);
    565 
    566     pp = (UINT8 *)(p + 1);
    567 
    568     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_START_ENC;
    569     p->offset = 0;
    570 
    571     UINT16_TO_STREAM (pp, HCI_BLE_START_ENC);
    572     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_START_ENC);
    573 
    574     UINT16_TO_STREAM (pp, handle);
    575     ARRAY_TO_STREAM (pp, rand, HCIC_BLE_RAND_DI_SIZE);
    576     UINT16_TO_STREAM (pp, ediv);
    577     ARRAY_TO_STREAM (pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
    578 
    579     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    580     return (TRUE);
    581 }
    582 
    583 BOOLEAN btsnd_hcic_ble_ltk_req_reply (UINT16 handle, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE])
    584 {
    585     BT_HDR *p;
    586     UINT8 *pp;
    587 
    588     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_REPLY)) == NULL)
    589         return (FALSE);
    590 
    591     pp = (UINT8 *)(p + 1);
    592 
    593     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_REPLY;
    594     p->offset = 0;
    595 
    596     UINT16_TO_STREAM (pp, HCI_BLE_LTK_REQ_REPLY);
    597     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_LTK_REQ_REPLY);
    598 
    599     UINT16_TO_STREAM (pp, handle);
    600     ARRAY_TO_STREAM (pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
    601 
    602     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    603     return (TRUE);
    604 }
    605 
    606 BOOLEAN btsnd_hcic_ble_ltk_req_neg_reply (UINT16 handle)
    607 {
    608     BT_HDR *p;
    609     UINT8 *pp;
    610 
    611     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY)) == NULL)
    612         return (FALSE);
    613 
    614     pp = (UINT8 *)(p + 1);
    615 
    616     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY;
    617     p->offset = 0;
    618 
    619     UINT16_TO_STREAM (pp, HCI_BLE_LTK_REQ_NEG_REPLY);
    620     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY);
    621 
    622     UINT16_TO_STREAM (pp, handle);
    623 
    624     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    625     return (TRUE);
    626 }
    627 
    628 BOOLEAN btsnd_hcic_ble_receiver_test(UINT8 rx_freq)
    629 {
    630     BT_HDR *p;
    631     UINT8 *pp;
    632 
    633     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
    634         return (FALSE);
    635 
    636     pp = (UINT8 *)(p + 1);
    637 
    638     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
    639     p->offset = 0;
    640 
    641     UINT16_TO_STREAM (pp, HCI_BLE_RECEIVER_TEST);
    642     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
    643 
    644     UINT8_TO_STREAM (pp, rx_freq);
    645 
    646     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    647     return (TRUE);
    648 }
    649 
    650 BOOLEAN btsnd_hcic_ble_transmitter_test(UINT8 tx_freq, UINT8 test_data_len, UINT8 payload)
    651 {
    652     BT_HDR *p;
    653     UINT8 *pp;
    654 
    655     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL)
    656         return (FALSE);
    657 
    658     pp = (UINT8 *)(p + 1);
    659 
    660     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
    661     p->offset = 0;
    662 
    663     UINT16_TO_STREAM (pp, HCI_BLE_TRANSMITTER_TEST);
    664     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
    665 
    666     UINT8_TO_STREAM (pp, tx_freq);
    667     UINT8_TO_STREAM (pp, test_data_len);
    668     UINT8_TO_STREAM (pp, payload);
    669 
    670     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    671     return (TRUE);
    672 }
    673 
    674 BOOLEAN btsnd_hcic_ble_test_end(void)
    675 {
    676     BT_HDR *p;
    677     UINT8 *pp;
    678 
    679     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
    680         return (FALSE);
    681 
    682     pp = (UINT8 *)(p + 1);
    683 
    684     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
    685     p->offset = 0;
    686 
    687     UINT16_TO_STREAM (pp, HCI_BLE_TEST_END);
    688     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_READ_CMD);
    689 
    690     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    691     return (TRUE);
    692 }
    693 
    694 BOOLEAN btsnd_hcic_ble_read_host_supported (void)
    695 {
    696     BT_HDR *p;
    697     UINT8 *pp;
    698 
    699     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
    700         return (FALSE);
    701 
    702     pp = (UINT8 *)(p + 1);
    703 
    704     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
    705     p->offset = 0;
    706 
    707     UINT16_TO_STREAM (pp, HCI_READ_LE_HOST_SUPPORT);
    708     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_READ_CMD);
    709 
    710     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    711     return (TRUE);
    712 }
    713 
    714 #if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
    715 
    716 BOOLEAN btsnd_hcic_ble_rc_param_req_reply(  UINT16 handle,
    717                                             UINT16 conn_int_min, UINT16 conn_int_max,
    718                                             UINT16 conn_latency, UINT16 conn_timeout,
    719                                             UINT16 min_ce_len, UINT16 max_ce_len  )
    720 {
    721     BT_HDR *p;
    722     UINT8 *pp;
    723 
    724     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY)) == NULL)
    725         return (FALSE);
    726 
    727     pp = (UINT8 *)(p + 1);
    728 
    729     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY;
    730     p->offset = 0;
    731 
    732     UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_REPLY);
    733     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY);
    734 
    735     UINT16_TO_STREAM (pp, handle);
    736     UINT16_TO_STREAM (pp, conn_int_min);
    737     UINT16_TO_STREAM (pp, conn_int_max);
    738     UINT16_TO_STREAM (pp, conn_latency);
    739     UINT16_TO_STREAM (pp, conn_timeout);
    740     UINT16_TO_STREAM (pp, min_ce_len);
    741     UINT16_TO_STREAM (pp, max_ce_len);
    742 
    743     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    744     return (TRUE);
    745 }
    746 
    747 BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason)
    748 {
    749     BT_HDR *p;
    750     UINT8 *pp;
    751 
    752     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY)) == NULL)
    753         return (FALSE);
    754 
    755     pp = (UINT8 *)(p + 1);
    756 
    757     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY;
    758     p->offset = 0;
    759 
    760     UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_NEG_REPLY);
    761     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY);
    762 
    763     UINT16_TO_STREAM (pp, handle);
    764     UINT8_TO_STREAM (pp, reason);
    765 
    766     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    767     return (TRUE);
    768 }
    769 #endif
    770 
    771 BOOLEAN btsnd_hcic_ble_add_device_resolving_list (UINT8 addr_type_peer, BD_ADDR bda_peer,
    772     UINT8 irk_peer[HCIC_BLE_IRK_SIZE],
    773     UINT8 irk_local[HCIC_BLE_IRK_SIZE])
    774 {
    775     BT_HDR *p;
    776     UINT8 *pp;
    777 
    778     if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST)) == NULL)
    779         return (FALSE);
    780 
    781     pp = (UINT8 *)(p + 1);
    782 
    783     p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST;
    784     p->offset = 0;
    785 
    786     UINT16_TO_STREAM (pp, HCI_BLE_ADD_DEV_RESOLVING_LIST);
    787     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST);
    788     UINT8_TO_STREAM (pp, addr_type_peer);
    789     BDADDR_TO_STREAM (pp, bda_peer);
    790     ARRAY_TO_STREAM (pp, irk_peer, HCIC_BLE_ENCRYT_KEY_SIZE);
    791     ARRAY_TO_STREAM (pp, irk_local, HCIC_BLE_ENCRYT_KEY_SIZE);
    792 
    793     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    794 
    795     return (TRUE);
    796 }
    797 
    798 BOOLEAN btsnd_hcic_ble_rm_device_resolving_list (UINT8 addr_type_peer, BD_ADDR bda_peer)
    799 {
    800     BT_HDR *p;
    801     UINT8 *pp;
    802 
    803     if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST)) == NULL)
    804         return (FALSE);
    805 
    806     pp = (UINT8 *)(p + 1);
    807 
    808     p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST;
    809     p->offset = 0;
    810 
    811     UINT16_TO_STREAM (pp, HCI_BLE_RM_DEV_RESOLVING_LIST);
    812     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST);
    813     UINT8_TO_STREAM (pp, addr_type_peer);
    814     BDADDR_TO_STREAM (pp, bda_peer);
    815 
    816     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    817 
    818     return (TRUE);
    819 }
    820 
    821 BOOLEAN btsnd_hcic_ble_clear_resolving_list (void)
    822 {
    823     BT_HDR *p;
    824     UINT8 *pp;
    825 
    826     if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST)) == NULL)
    827         return (FALSE);
    828 
    829     pp = (UINT8 *)(p + 1);
    830 
    831     p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST;
    832     p->offset = 0;
    833 
    834     UINT16_TO_STREAM (pp, HCI_BLE_CLEAR_RESOLVING_LIST);
    835     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST);
    836 
    837     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    838 
    839     return (TRUE);
    840 }
    841 
    842 BOOLEAN btsnd_hcic_ble_read_resolvable_addr_peer (UINT8 addr_type_peer, BD_ADDR bda_peer)
    843 {
    844     BT_HDR *p;
    845     UINT8 *pp;
    846 
    847     if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER)) == NULL)
    848         return (FALSE);
    849 
    850     pp = (UINT8 *)(p + 1);
    851 
    852     p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER;
    853     p->offset = 0;
    854 
    855     UINT16_TO_STREAM (pp, HCI_BLE_READ_RESOLVABLE_ADDR_PEER);
    856     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER);
    857     UINT8_TO_STREAM (pp, addr_type_peer);
    858     BDADDR_TO_STREAM (pp, bda_peer);
    859 
    860     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    861 
    862     return (TRUE);
    863 }
    864 
    865 BOOLEAN btsnd_hcic_ble_read_resolvable_addr_local (UINT8 addr_type_peer, BD_ADDR bda_peer)
    866 {
    867     BT_HDR *p;
    868     UINT8 *pp;
    869 
    870     if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL)) == NULL)
    871         return (FALSE);
    872 
    873     pp = (UINT8 *)(p + 1);
    874 
    875     p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL;
    876     p->offset = 0;
    877 
    878     UINT16_TO_STREAM (pp, HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL);
    879     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL);
    880     UINT8_TO_STREAM (pp, addr_type_peer);
    881     BDADDR_TO_STREAM (pp, bda_peer);
    882 
    883     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    884 
    885     return (TRUE);
    886 }
    887 
    888 BOOLEAN btsnd_hcic_ble_set_addr_resolution_enable (UINT8 addr_resolution_enable)
    889 {
    890     BT_HDR *p;
    891     UINT8 *pp;
    892 
    893     if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE)) == NULL)
    894         return (FALSE);
    895 
    896     pp = (UINT8 *)(p + 1);
    897 
    898     p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE;
    899     p->offset = 0;
    900 
    901     UINT16_TO_STREAM (pp, HCI_BLE_SET_ADDR_RESOLUTION_ENABLE);
    902     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE);
    903     UINT8_TO_STREAM (pp, addr_resolution_enable);
    904 
    905     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    906 
    907     return (TRUE);
    908 }
    909 
    910 BOOLEAN btsnd_hcic_ble_set_rand_priv_addr_timeout (UINT16 rpa_timout)
    911 {
    912     BT_HDR *p;
    913     UINT8 *pp;
    914 
    915     if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT)) == NULL)
    916         return (FALSE);
    917 
    918     pp = (UINT8 *)(p + 1);
    919 
    920     p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT;
    921     p->offset = 0;
    922 
    923     UINT16_TO_STREAM (pp, HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
    924     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
    925     UINT16_TO_STREAM (pp, rpa_timout);
    926 
    927     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    928 
    929     return (TRUE);
    930 }
    931 
    932 BOOLEAN btsnd_hcic_ble_set_data_length(UINT16 conn_handle, UINT16 tx_octets, UINT16 tx_time)
    933 {
    934     BT_HDR *p;
    935     UINT8 *pp;
    936 
    937     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH)) == NULL)
    938         return FALSE;
    939 
    940     pp = p->data;
    941 
    942     p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH;
    943     p->offset = 0;
    944 
    945     UINT16_TO_STREAM(pp, HCI_BLE_SET_DATA_LENGTH);
    946     UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH);
    947 
    948     UINT16_TO_STREAM(pp, conn_handle);
    949     UINT16_TO_STREAM(pp, tx_octets);
    950     UINT16_TO_STREAM(pp, tx_time);
    951 
    952     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    953     return TRUE;
    954 }
    955 
    956 #endif
    957 
    958