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

Commit 42c4e53e authored by Andrei Emeltchenko's avatar Andrei Emeltchenko Committed by Gustavo Padovan
Browse files

Bluetooth: AMP: Add handle to hci_chan structure



hci_chan will be identified by handle used in logical link creation
process. This handle is used in AMP ACL-U packet handle field.

Signed-off-by: default avatarAndrei Emeltchenko <andrei.emeltchenko@intel.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
parent 53502d69
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -350,7 +350,7 @@ struct hci_conn {


struct hci_chan {
struct hci_chan {
	struct list_head list;
	struct list_head list;

	__u16 handle;
	struct hci_conn *conn;
	struct hci_conn *conn;
	struct sk_buff_head data_q;
	struct sk_buff_head data_q;
	unsigned int	sent;
	unsigned int	sent;
@@ -567,6 +567,7 @@ void hci_conn_check_pending(struct hci_dev *hdev);
struct hci_chan *hci_chan_create(struct hci_conn *conn);
struct hci_chan *hci_chan_create(struct hci_conn *conn);
void hci_chan_del(struct hci_chan *chan);
void hci_chan_del(struct hci_chan *chan);
void hci_chan_list_flush(struct hci_conn *conn);
void hci_chan_list_flush(struct hci_conn *conn);
struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle);


struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
			     __u8 dst_type, __u8 sec_level, __u8 auth_type);
			     __u8 dst_type, __u8 sec_level, __u8 auth_type);
+32 −0
Original line number Original line Diff line number Diff line
@@ -989,3 +989,35 @@ void hci_chan_list_flush(struct hci_conn *conn)
	list_for_each_entry_safe(chan, n, &conn->chan_list, list)
	list_for_each_entry_safe(chan, n, &conn->chan_list, list)
		hci_chan_del(chan);
		hci_chan_del(chan);
}
}

static struct hci_chan *__hci_chan_lookup_handle(struct hci_conn *hcon,
						 __u16 handle)
{
	struct hci_chan *hchan;

	list_for_each_entry(hchan, &hcon->chan_list, list) {
		if (hchan->handle == handle)
			return hchan;
	}

	return NULL;
}

struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle)
{
	struct hci_conn_hash *h = &hdev->conn_hash;
	struct hci_conn *hcon;
	struct hci_chan *hchan = NULL;

	rcu_read_lock();

	list_for_each_entry_rcu(hcon, &h->list, list) {
		hchan = __hci_chan_lookup_handle(hcon, handle);
		if (hchan)
			break;
	}

	rcu_read_unlock();

	return hchan;
}