static void adv_le_evtmask_callback(const void *data, uint8_t size, void *user_data) { struct bt_hci_cmd_le_set_resolv_timeout cmd0; struct bt_hci_cmd_le_add_to_resolv_list cmd1; struct bt_hci_cmd_le_set_resolv_enable cmd2; struct bt_hci_cmd_le_set_random_address cmd3; struct bt_hci_cmd_le_set_adv_parameters cmd4; struct bt_hci_cmd_le_set_adv_enable cmd5; cmd0.timeout = cpu_to_le16(0x0384); bt_hci_send(adv_dev, BT_HCI_CMD_LE_SET_RESOLV_TIMEOUT, &cmd0, sizeof(cmd0), NULL, NULL, NULL); cmd1.addr_type = PEER_ADDR_TYPE; memcpy(cmd1.addr, PEER_ADDR, 6); memset(cmd1.peer_irk, 0, 16); memcpy(cmd1.local_irk, ADV_IRK, 16); bt_hci_send(adv_dev, BT_HCI_CMD_LE_ADD_TO_RESOLV_LIST, &cmd1, sizeof(cmd1), NULL, NULL, NULL); cmd2.enable = 0x01; bt_hci_send(adv_dev, BT_HCI_CMD_LE_SET_RESOLV_ENABLE, &cmd2, sizeof(cmd2), NULL, NULL, NULL); bt_crypto_random_bytes(crypto, cmd3.addr + 3, 3); cmd3.addr[5] &= 0x3f; /* Clear two most significant bits */ cmd3.addr[5] |= 0x40; /* Set second most significant bit */ bt_crypto_ah(crypto, cmd1.local_irk, cmd3.addr + 3, cmd3.addr); bt_hci_send(adv_dev, BT_HCI_CMD_LE_SET_RANDOM_ADDRESS, &cmd3, sizeof(cmd3), NULL, NULL, NULL); printf("Setting advertising address\n"); print_rpa(cmd3.addr); cmd4.min_interval = cpu_to_le16(0x0800); cmd4.max_interval = cpu_to_le16(0x0800); cmd4.type = 0x03; /* Non-connectable advertising */ cmd4.own_addr_type = 0x03; /* Local IRK, random address fallback */ cmd4.direct_addr_type = PEER_ADDR_TYPE; memcpy(cmd4.direct_addr, PEER_ADDR, 6); cmd4.channel_map = 0x07; cmd4.filter_policy = 0x00; bt_hci_send(adv_dev, BT_HCI_CMD_LE_SET_ADV_PARAMETERS, &cmd4, sizeof(cmd4), NULL, NULL, NULL); cmd5.enable = 0x01; bt_hci_send(adv_dev, BT_HCI_CMD_LE_SET_ADV_ENABLE, &cmd5, sizeof(cmd5), adv_enable_callback, NULL, NULL); }
static void cmd_le_rand(struct bt_le *hci, const void *data, uint8_t size) { struct bt_hci_rsp_le_rand rsp; if (!bt_crypto_random_bytes(hci->crypto, rsp.number, 8)) { cmd_status(hci, BT_HCI_ERR_COMMAND_DISALLOWED, BT_HCI_CMD_LE_RAND); return; } rsp.status = BT_HCI_ERR_SUCCESS; cmd_complete(hci, BT_HCI_CMD_LE_RAND, &rsp, sizeof(rsp)); }