static void start_glasses(void) { uint8_t evtmask1[] = { 0x03, 0xe0, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00 }; uint8_t evtmask2[] = { 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t inqmode = 0x02; if (reset_on_init) { bt_hci_send(hci_dev, BT_HCI_CMD_RESET, NULL, 0, NULL, NULL, NULL); bt_hci_send(hci_dev, BT_HCI_CMD_SET_EVENT_MASK, evtmask1, 8, NULL, NULL, NULL); } bt_hci_send(hci_dev, BT_HCI_CMD_READ_LOCAL_VERSION, NULL, 0, read_local_version, NULL, NULL); bt_hci_send(hci_dev, BT_HCI_CMD_SET_EVENT_MASK_PAGE2, evtmask2, 8, NULL, NULL, NULL); bt_hci_send(hci_dev, BT_HCI_CMD_WRITE_INQUIRY_MODE, &inqmode, 1, NULL, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_INQUIRY_COMPLETE, inquiry_complete, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_EXT_INQUIRY_RESULT, ext_inquiry_result, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_TRUNCATED_PAGE_COMPLETE, truncated_page_complete, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_SLAVE_BROADCAST_TIMEOUT, slave_broadcast_timeout, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_SLAVE_BROADCAST_RECEIVE, slave_broadcast_receive, NULL, NULL); start_inquiry(); }
static void start_display(void) { struct bt_hci_cmd_set_slave_broadcast cmd; uint8_t evtmask1[] = { 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t evtmask2[] = { 0x00, 0xc0, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t sspmode = 0x01; uint8_t ltaddr = LT_ADDR; if (reset_on_init) { bt_hci_send(hci_dev, BT_HCI_CMD_RESET, NULL, 0, NULL, NULL, NULL); bt_hci_send(hci_dev, BT_HCI_CMD_SET_EVENT_MASK, evtmask1, 8, NULL, NULL, NULL); } bt_hci_send(hci_dev, BT_HCI_CMD_SET_EVENT_MASK_PAGE2, evtmask2, 8, NULL, NULL, NULL); bt_hci_send(hci_dev, BT_HCI_CMD_WRITE_SIMPLE_PAIRING_MODE, &sspmode, 1, NULL, NULL, NULL); bt_hci_send(hci_dev, BT_HCI_CMD_SET_RESERVED_LT_ADDR, <addr, 1, NULL, NULL, NULL); bt_hci_send(hci_dev, BT_HCI_CMD_READ_SYNC_TRAIN_PARAMS, NULL, 0, NULL, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_CONN_REQUEST, conn_request, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_SLAVE_PAGE_RESPONSE_TIMEOUT, slave_page_response_timeout, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_SLAVE_BROADCAST_CHANNEL_MAP_CHANGE, slave_broadcast_channel_map_change, NULL, NULL); bt_hci_register(hci_dev, BT_HCI_EVT_SYNC_TRAIN_COMPLETE, sync_train_complete, NULL, NULL); bt_hci_send(hci_dev, BT_HCI_CMD_READ_INQUIRY_RESP_TX_POWER, NULL, 0, inquiry_resp_tx_power, NULL, NULL); cmd.enable = 0x01; cmd.lt_addr = LT_ADDR; cmd.lpo_allowed = 0x01; cmd.pkt_type = cpu_to_le16(PKT_TYPE); cmd.min_interval = cpu_to_le16(0x0050); /* 50 ms */ cmd.max_interval = cpu_to_le16(0x00a0); /* 100 ms */ cmd.timeout = cpu_to_le16(0xfffe); bt_hci_send(hci_dev, BT_HCI_CMD_SET_SLAVE_BROADCAST, &cmd, sizeof(cmd), set_slave_broadcast, NULL, NULL); }
static void setup_le_generate_dhkey(const void *test_data) { struct user_data *user = tester_get_data(); struct bt_hci_cmd_set_event_mask sem; struct bt_hci_cmd_le_set_event_mask lsem; bt_hci_register(user->hci_ut, BT_HCI_EVT_LE_META_EVENT, setup_le_read_local_pk_complete, (void *)test_data, NULL); memset(sem.mask, 0, 8); sem.mask[1] |= 0x20; /* Command Complete */ sem.mask[1] |= 0x40; /* Command Status */ sem.mask[7] |= 0x20; /* LE Meta */ bt_hci_send(user->hci_ut, BT_HCI_CMD_SET_EVENT_MASK, &sem, sizeof(sem), NULL, NULL, NULL); memset(lsem.mask, 0, 8); lsem.mask[0] |= 0x80; /* LE Read Local P-256 Public Key Complete */ lsem.mask[1] |= 0x01; /* LE Generate DHKey Complete */ bt_hci_send(user->hci_ut, BT_HCI_CMD_LE_SET_EVENT_MASK, &lsem, sizeof(lsem), NULL, NULL, NULL); if (!bt_hci_send(user->hci_ut, BT_HCI_CMD_LE_READ_LOCAL_PK256, NULL, 0, setup_le_read_local_pk_status, NULL, NULL)) { tester_warn("Failed to send HCI LE Read Local PK256 command"); tester_setup_failed(); return; } }
static void read_local_version(const void *data, uint8_t size, void *user_data) { const struct bt_hci_rsp_read_local_version *rsp = data; if (rsp->status) { printf("Failed to read local version information\n"); shutdown_device(); return; } if (rsp->manufacturer == 15) { printf("Enabling receiver workaround for Broadcom\n"); bt_hci_register(hci_dev, BT_HCI_EVT_SYNC_TRAIN_RECEIVED, brcm_sync_train_received, NULL, NULL); } else { bt_hci_register(hci_dev, BT_HCI_EVT_SYNC_TRAIN_RECEIVED, sync_train_received, NULL, NULL); } }
static void setup_advertising_initiated(const void *test_data) { struct user_data *user = tester_get_data(); struct bt_hci_cmd_set_event_mask sem; struct bt_hci_cmd_le_set_event_mask lsem; struct bt_hci_cmd_le_set_scan_enable lsse; struct bt_hci_cmd_le_set_adv_parameters lsap; struct bt_hci_cmd_le_set_adv_enable lsae; bt_hci_register(user->hci_lt, BT_HCI_EVT_LE_META_EVENT, test_adv_report, NULL, NULL); memset(sem.mask, 0, 8); sem.mask[1] |= 0x20; /* Command Complete */ sem.mask[1] |= 0x40; /* Command Status */ sem.mask[7] |= 0x20; /* LE Meta */ bt_hci_send(user->hci_lt, BT_HCI_CMD_SET_EVENT_MASK, &sem, sizeof(sem), NULL, NULL, NULL); memset(lsem.mask, 0, 8); lsem.mask[0] |= 0x02; /* LE Advertising Report */ bt_hci_send(user->hci_lt, BT_HCI_CMD_LE_SET_EVENT_MASK, &lsem, sizeof(lsem), NULL, NULL, NULL); lsse.enable = 0x01; lsse.filter_dup = 0x00; bt_hci_send(user->hci_lt, BT_HCI_CMD_LE_SET_SCAN_ENABLE, &lsse, sizeof(lsse), NULL, NULL, NULL); lsap.min_interval = cpu_to_le16(0x0800); lsap.max_interval = cpu_to_le16(0x0800); lsap.type = 0x03; lsap.own_addr_type = 0x00; lsap.direct_addr_type = 0x00; memset(lsap.direct_addr, 0, 6); lsap.channel_map = 0x07; lsap.filter_policy = 0x00; bt_hci_send(user->hci_ut, BT_HCI_CMD_LE_SET_ADV_PARAMETERS, &lsap, sizeof(lsap), NULL, NULL, NULL); lsae.enable = 0x01; bt_hci_send(user->hci_ut, BT_HCI_CMD_LE_SET_ADV_ENABLE, &lsae, sizeof(lsae), NULL, NULL, NULL); }
static void setup_le_generate_dhkey(const void *test_data) { struct user_data *user = tester_get_data(); bt_hci_register(user->hci_ut, BT_HCI_EVT_LE_META_EVENT, setup_le_read_local_pk_complete, (void *)test_data, NULL); if (!bt_hci_send(user->hci_ut, BT_HCI_CMD_LE_READ_LOCAL_PK256, NULL, 0, setup_le_read_local_pk_status, NULL, NULL)) { tester_warn("Failed to send HCI LE Read Local PK256 command"); tester_setup_failed(); return; } }
static void setup_lt_connectable(const void *test_data) { struct user_data *user = tester_get_data(); struct bt_hci_cmd_write_scan_enable cmd; bt_hci_register(user->hci_lt, BT_HCI_EVT_CONN_REQUEST, setup_lt_connect_request_accept, NULL, NULL); cmd.enable = 0x02; if (!bt_hci_send(user->hci_lt, BT_HCI_CMD_WRITE_SCAN_ENABLE, &cmd, sizeof(cmd), setup_lt_connectable_complete, NULL, NULL)) { tester_warn("Failed to send HCI scan enable command"); tester_setup_failed(); return; } }
static void test_inquiry_liac(const void *test_data) { struct user_data *user = tester_get_data(); struct bt_hci_cmd_inquiry cmd; bt_hci_register(user->hci_ut, BT_HCI_EVT_INQUIRY_COMPLETE, test_inquiry_complete, NULL, NULL); cmd.lap[0] = 0x00; cmd.lap[1] = 0x8b; cmd.lap[2] = 0x9e; cmd.length = 0x08; cmd.num_resp = 0x00; if (!bt_hci_send(user->hci_ut, BT_HCI_CMD_INQUIRY, &cmd, sizeof(cmd), test_inquiry_status, NULL, NULL)) { tester_warn("Failed to send HCI inquiry command"); tester_test_failed(); return; } }
static void test_create_connection(const void *test_data) { struct user_data *user = tester_get_data(); struct bt_hci_cmd_create_conn cmd; bt_hci_register(user->hci_ut, BT_HCI_EVT_CONN_COMPLETE, test_create_connection_complete, NULL, NULL); memcpy(cmd.bdaddr, user->bdaddr_lt, 6); cmd.pkt_type = cpu_to_le16(0x0008); cmd.pscan_rep_mode = 0x02; cmd.pscan_mode = 0x00; cmd.clock_offset = cpu_to_le16(0x0000); cmd.role_switch = 0x01; if (!bt_hci_send(user->hci_ut, BT_HCI_CMD_CREATE_CONN, &cmd, sizeof(cmd), test_create_connection_status, NULL, NULL)) { tester_warn("Failed to send HCI create connection command"); tester_test_failed(); return; } }
static void test_le_generate_dhkey(const void *test_data) { struct user_data *user = tester_get_data(); struct bt_hci_cmd_le_generate_dhkey cmd; struct le_keys *keys = (void *)test_data; ecc_make_key(cmd.remote_pk256, keys->remote_sk); /* Unregister handler for META event */ bt_hci_unregister(user->hci_ut, 1); bt_hci_register(user->hci_ut, BT_HCI_EVT_LE_META_EVENT, test_le_generate_dhkey_complete, keys, NULL); if (!bt_hci_send(user->hci_ut, BT_HCI_CMD_LE_GENERATE_DHKEY, &cmd, sizeof(cmd), test_le_generate_dhkey_status, NULL, NULL)) { tester_warn("Failed to send HCI LE Encrypt command"); tester_test_failed(); return; } }
static void read_index_list(uint8_t status, uint16_t len, const void *param, void *user_data) { const struct mgmt_rp_read_index_list *rp = param; uint16_t count; int i; if (status) { fprintf(stderr, "Reading index list failed: %s\n", mgmt_errstr(status)); mainloop_exit_failure(); return; } count = le16_to_cpu(rp->num_controllers); if (count < 2) { fprintf(stderr, "At least 2 controllers are required\n"); mainloop_exit_failure(); return; } for (i = 0; i < count; i++) { uint16_t index = cpu_to_le16(rp->index[i]); if (index < index1) index1 = index; } for (i = 0; i < count; i++) { uint16_t index = cpu_to_le16(rp->index[i]); if (index < index2 && index > index1) index2 = index; } printf("Selecting index %u for advertiser\n", index1); printf("Selecting index %u for scanner\n", index2); crypto = bt_crypto_new(); if (!crypto) { fprintf(stderr, "Failed to open crypto interface\n"); mainloop_exit_failure(); return; } adv_dev = bt_hci_new_user_channel(index1); if (!adv_dev) { fprintf(stderr, "Failed to open HCI for advertiser\n"); mainloop_exit_failure(); return; } scan_dev = bt_hci_new_user_channel(index2); if (!scan_dev) { fprintf(stderr, "Failed to open HCI for scanner\n"); mainloop_exit_failure(); return; } bt_hci_register(scan_dev, BT_HCI_EVT_LE_META_EVENT, scan_le_meta_event, NULL, NULL); bt_hci_send(scan_dev, BT_HCI_CMD_RESET, NULL, 0, NULL, NULL, NULL); bt_hci_send(scan_dev, BT_HCI_CMD_READ_LOCAL_FEATURES, NULL, 0, scan_features_callback, NULL, NULL); }