Bluetooth: Add hci_conn_lookup_type() helper function
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 3 Nov 2014 04:16:08 +0000 (05:16 +0100)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 3 Nov 2014 08:13:43 +0000 (10:13 +0200)
Some drivers require knowledge of what connection handle is assigned
to what connection link type (ACL or SCO/eSCO). Instead of having each
driver implement connection tracking, provide a simple helper function
for lookup of the link type.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
include/net/bluetooth/hci.h
include/net/bluetooth/hci_core.h

index 2e08f5a..d5f85d7 100644 (file)
@@ -274,6 +274,7 @@ enum {
 /* Low Energy links do not have defined link type. Use invented one */
 #define LE_LINK                0x80
 #define AMP_LINK       0x81
+#define INVALID_LINK   0xff
 
 /* LMP features */
 #define LMP_3SLOT      0x01
index 27ddb90..4e39a5a 100644 (file)
@@ -646,6 +646,26 @@ static inline unsigned int hci_conn_count(struct hci_dev *hdev)
        return c->acl_num + c->amp_num + c->sco_num + c->le_num;
 }
 
+static inline __u8 hci_conn_lookup_type(struct hci_dev *hdev, __u16 handle)
+{
+       struct hci_conn_hash *h = &hdev->conn_hash;
+       struct hci_conn *c;
+       __u8 type = INVALID_LINK;
+
+       rcu_read_lock();
+
+       list_for_each_entry_rcu(c, &h->list, list) {
+               if (c->handle == handle) {
+                       type = c->type;
+                       break;
+               }
+       }
+
+       rcu_read_unlock();
+
+       return type;
+}
+
 static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
                                                                __u16 handle)
 {