Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14c0b608 authored by Johan Hedberg's avatar Johan Hedberg Committed by Gustavo Padovan
Browse files

Bluetooth: Remove mgmt_set_service_cache



Instead of having an explicit service cache command we can make the mgmt
API simpler by implicitly enabling the cache when mgmt_read_info is
called for the first time and disabling it when mgmt_set_dev_class is
called.

Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent f7c6869c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -943,12 +943,16 @@ int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr);
/* HCI info for socket */
#define hci_pi(sk) ((struct hci_pinfo *) sk)

/* HCI socket flags */
#define HCI_PI_MGMT_INIT	0

struct hci_pinfo {
	struct bt_sock    bt;
	struct hci_dev    *hdev;
	struct hci_filter filter;
	__u32             cmsg_mask;
	unsigned short   channel;
	unsigned long     flags;
};

/* HCI security filter */
+0 −5
Original line number Diff line number Diff line
@@ -121,11 +121,6 @@ struct mgmt_cp_set_dev_class {
	__u8 minor;
} __packed;

#define MGMT_OP_SET_SERVICE_CACHE	0x000C
struct mgmt_cp_set_service_cache {
	__u8 enable;
} __packed;

struct mgmt_link_key_info {
	bdaddr_t bdaddr;
	u8 type;
+5 −2
Original line number Diff line number Diff line
@@ -343,8 +343,11 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_le
	if (haddr.hci_channel > HCI_CHANNEL_CONTROL)
		return -EINVAL;

	if (haddr.hci_channel == HCI_CHANNEL_CONTROL && !enable_mgmt)
	if (haddr.hci_channel == HCI_CHANNEL_CONTROL) {
		if (!enable_mgmt)
			return -EINVAL;
		set_bit(HCI_PI_MGMT_INIT, &hci_pi(sk)->flags);
	}

	lock_sock(sk);

+7 −49
Original line number Diff line number Diff line
@@ -316,7 +316,10 @@ static int read_controller_info(struct sock *sk, u16 index)

	hci_dev_lock(hdev);

	if (test_and_clear_bit(HCI_PI_MGMT_INIT, &hci_pi(sk)->flags)) {
		set_bit(HCI_MGMT, &hdev->flags);
		set_bit(HCI_SERVICE_CACHE, &hdev->flags);
	}

	memset(&rp, 0, sizeof(rp));

@@ -989,55 +992,13 @@ static int set_dev_class(struct sock *sk, u16 index, unsigned char *data,
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

	err = update_class(hdev);

	if (err == 0)
		err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0);

	hci_dev_unlock(hdev);
	hci_dev_put(hdev);

	return err;
}

static int set_service_cache(struct sock *sk, u16 index,  unsigned char *data,
									u16 len)
{
	struct hci_dev *hdev;
	struct mgmt_cp_set_service_cache *cp;
	int err;

	cp = (void *) data;

	if (len != sizeof(*cp))
		return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE,
						MGMT_STATUS_INVALID_PARAMS);

	hdev = hci_dev_get(index);
	if (!hdev)
		return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE,
						MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

	BT_DBG("hci%u enable %d", index, cp->enable);
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->flags))
		update_eir(hdev);

	if (cp->enable) {
		set_bit(HCI_SERVICE_CACHE, &hdev->flags);
		err = 0;
	} else {
		clear_bit(HCI_SERVICE_CACHE, &hdev->flags);
	err = update_class(hdev);
		if (err == 0)
			err = update_eir(hdev);
	}

	if (err == 0)
		err = cmd_complete(sk, index, MGMT_OP_SET_SERVICE_CACHE, NULL,
									0);
	else
		cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE, -err);

		err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0);

	hci_dev_unlock(hdev);
	hci_dev_put(hdev);
@@ -2170,9 +2131,6 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
	case MGMT_OP_SET_DEV_CLASS:
		err = set_dev_class(sk, index, buf + sizeof(*hdr), len);
		break;
	case MGMT_OP_SET_SERVICE_CACHE:
		err = set_service_cache(sk, index, buf + sizeof(*hdr), len);
		break;
	case MGMT_OP_LOAD_LINK_KEYS:
		err = load_link_keys(sk, index, buf + sizeof(*hdr), len);
		break;