示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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");
}
示例#4
0
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);
}
示例#5
0
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);
}
示例#6
0
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);
}
示例#7
0
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;
}
示例#8
0
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));
}
示例#9
0
文件: advtest.c 项目: ghent360/bluez
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);
}