static void test_pre_setup(const void *test_data) { struct test_data *data = tester_get_data(); data->crypto = bt_crypto_new(); if (!data->crypto) { tester_warn("Failed to setup crypto"); tester_pre_setup_failed(); return; } data->mgmt = mgmt_new_default(); if (!data->mgmt) { tester_warn("Failed to setup management interface"); bt_crypto_unref(data->crypto); tester_pre_setup_failed(); return; } if (tester_use_debug()) mgmt_set_debug(data->mgmt, mgmt_debug, "mgmt: ", NULL); mgmt_send(data->mgmt, MGMT_OP_READ_INDEX_LIST, MGMT_INDEX_NONE, 0, NULL, read_index_list_callback, NULL, NULL); }
struct bt_le *bt_le_new(void) { unsigned char setup_cmd[2]; struct bt_le *hci; hci = calloc(1, sizeof(*hci)); if (!hci) return NULL; reset_defaults(hci); hci->vhci_fd = open("/dev/vhci", O_RDWR); if (hci->vhci_fd < 0) { free(hci); return NULL; } setup_cmd[0] = HCI_VENDOR_PKT; setup_cmd[1] = HCI_BREDR; if (write(hci->vhci_fd, setup_cmd, sizeof(setup_cmd)) < 0) { close(hci->vhci_fd); free(hci); return NULL; } mainloop_add_fd(hci->vhci_fd, EPOLLIN, vhci_read_callback, hci, NULL); hci->crypto = bt_crypto_new(); return bt_le_ref(hci); }
void *smp_start(struct bthost *bthost) { struct smp *smp; smp = malloc(sizeof(struct smp)); if (!smp) return NULL; memset(smp, 0, sizeof(*smp)); smp->crypto = bt_crypto_new(); if (!smp->crypto) { free(smp); return NULL; } smp->bthost = bthost; return smp; }
struct bt_att *bt_att_new(int fd, bool ext_signed) { struct bt_att *att; if (fd < 0) return NULL; att = new0(struct bt_att, 1); if (!att) return NULL; att->fd = fd; att->mtu = BT_ATT_DEFAULT_LE_MTU; att->buf = malloc(att->mtu); if (!att->buf) goto fail; att->io = io_new(fd); if (!att->io) goto fail; /* crypto is optional, if not available leave it NULL */ if (!ext_signed) att->crypto = bt_crypto_new(); att->req_queue = queue_new(); if (!att->req_queue) goto fail; att->ind_queue = queue_new(); if (!att->ind_queue) goto fail; att->write_queue = queue_new(); if (!att->write_queue) goto fail; att->notify_list = queue_new(); if (!att->notify_list) goto fail; att->disconn_list = queue_new(); if (!att->disconn_list) goto fail; if (!io_set_read_handler(att->io, can_read_data, att, NULL)) goto fail; if (!io_set_disconnect_handler(att->io, disconnect_cb, att, NULL)) goto fail; att->io_on_l2cap = is_io_l2cap_based(att->fd); if (!att->io_on_l2cap) att->io_sec_level = BT_SECURITY_LOW; return bt_att_ref(att); fail: bt_att_free(att); return NULL; }
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); }