static void read_adv_features_callback(uint8_t status, uint16_t length, const void *param, void *user_data) { struct btd_advertising *manager = user_data; const struct mgmt_rp_read_adv_features *feat = param; if (status || !param) { error("Failed to read advertising features: %s (0x%02x)", mgmt_errstr(status), status); return; } if (length < sizeof(*feat)) { error("Wrong size of read adv features response"); return; } manager->max_adv_len = feat->max_adv_data_len; manager->max_ads = feat->max_instances; if (manager->max_ads == 0) return; if (!g_dbus_register_interface(btd_get_dbus_connection(), adapter_get_path(manager->adapter), LE_ADVERTISING_MGR_IFACE, methods, NULL, NULL, manager, NULL)) error("Failed to register " LE_ADVERTISING_MGR_IFACE); }
static void read_info_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { const struct mgmt_rp_read_info *rp = param; if (status != MGMT_STATUS_SUCCESS) { DBG("Failed to read device information: %s (0x%02x)", mgmt_errstr(status), status); resp_mgmt(err_PROTO_ERR); return; } if (length < sizeof(*rp)) { DBG("Wrong size of read info response"); resp_mgmt(err_PROTO_ERR); return; } /* Save a copy of the device info response */ dev_info = *rp; show_device_info(); resp_mgmt_with_data(dev_info.current_settings); }
static void pair_device_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { if (status != MGMT_STATUS_SUCCESS) { tester_warn("Pairing failed: %s", mgmt_errstr(status)); return; } tester_print("Pairing succeedded"); }
static void scan_cb(uint8_t status, uint16_t length, const void *param, void *user_data) { if (status != MGMT_STATUS_SUCCESS) { DBG("Scan error: %s (0x%02x)", mgmt_errstr(status), status); resp_mgmt(status == MGMT_STATUS_BUSY? err_BUSY : err_PROTO_ERR); return; } resp_mgmt(err_SUCCESS); }
static void unpair_device_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { if (status != MGMT_STATUS_SUCCESS) { DBG("status returned error : %s (0x%02x)", mgmt_errstr(status), status); resp_mgmt(err_PROTO_ERR); return; } resp_mgmt(err_SUCCESS); }
static void set_advertising_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { if (status != MGMT_STATUS_SUCCESS) { DBG("status returned error : %s (0x%02x)", mgmt_errstr(status), status); resp_mgmt(err_PROTO_ERR); return; } resp_mgmt(err_SUCCESS); if (user_data) set_state(STATE_ADVERTISING); else set_state(STATE_DISCONNECTED); }
static void add_adverting_complete(struct advertisement *ad, uint8_t status) { DBusMessage *reply; if (status) { error("Failed to add advertisement: %s (0x%02x)", mgmt_errstr(status), status); reply = btd_error_failed(ad->reg, "Failed to register advertisement"); queue_remove(ad->manager->ads, ad); g_idle_add(advertisement_free_idle_cb, ad); } else reply = dbus_message_new_method_return(ad->reg); g_dbus_send_message(btd_get_dbus_connection(), reply); dbus_message_unref(ad->reg); ad->reg = NULL; }
static void read_version_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { const struct mgmt_rp_read_version *rp = param; if (status != MGMT_STATUS_SUCCESS) { DBG("Failed to read version information: %s (0x%02x)", mgmt_errstr(status), status); return; } if (length < sizeof(*rp)) { DBG("Wrong size of read version response"); return; } DBG("Bluetooth management interface %u.%u initialized", rp->version, btohs(rp->revision)); }
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); }