Bluetooth: add hci_lookup_le_connect
authorJakub Pawlowski <jpawlowski@google.com>
Fri, 7 Aug 2015 18:22:52 +0000 (20:22 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 10 Aug 2015 19:36:13 +0000 (21:36 +0200)
This patch adds hci_lookup_le_connect method, that will be used to check
wether outgoing le connection attempt is in progress.

Signed-off-by: Jakub Pawlowski <jpawlowski@google.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_conn.c
net/bluetooth/hci_event.c
net/bluetooth/hci_request.c
net/bluetooth/mgmt.c

index c8d2b5a89d08169da30730acbfd34c2dc4fc42fc..f0a9fc1d06e094598f9ddbb44ea5c6fa98539d19 100644 (file)
@@ -811,6 +811,26 @@ static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
        return NULL;
 }
 
+static inline struct hci_conn *hci_lookup_le_connect(struct hci_dev *hdev)
+{
+       struct hci_conn_hash *h = &hdev->conn_hash;
+       struct hci_conn  *c;
+
+       rcu_read_lock();
+
+       list_for_each_entry_rcu(c, &h->list, list) {
+               if (c->type == LE_LINK && c->state == BT_CONNECT &&
+                   !test_bit(HCI_CONN_SCANNING, &c->flags)) {
+                       rcu_read_unlock();
+                       return c;
+               }
+       }
+
+       rcu_read_unlock();
+
+       return NULL;
+}
+
 int hci_disconnect(struct hci_conn *conn, __u8 reason);
 bool hci_setup_sync(struct hci_conn *conn, __u16 handle);
 void hci_sco_setup(struct hci_conn *conn, __u8 status);
index 2c48bf0b5afbd00d4b0308e8bb74a92fc9b72a7a..0b4d919c8d96c2328c7556ea040ece05a90456c8 100644 (file)
@@ -645,7 +645,7 @@ static void create_le_conn_complete(struct hci_dev *hdev, u8 status, u16 opcode)
 
        hci_dev_lock(hdev);
 
-       conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
+       conn = hci_lookup_le_connect(hdev);
        if (!conn)
                goto done;
 
@@ -759,8 +759,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
        /* Since the controller supports only one LE connection attempt at a
         * time, we return -EBUSY if there is any connection attempt running.
         */
-       conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
-       if (conn)
+       if (hci_lookup_le_connect(hdev))
                return ERR_PTR(-EBUSY);
 
        /* When given an identity address with existing identity
index 218d7dfc342f484b0b9b18c4208a2ccc5efc0cb8..128c5b70ee5e48483841d34d9baae9c6790e8f4a 100644 (file)
@@ -1059,7 +1059,7 @@ static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
 
                hci_dev_set_flag(hdev, HCI_LE_ADV);
 
-               conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
+               conn = hci_lookup_le_connect(hdev);
                if (conn)
                        queue_delayed_work(hdev->workqueue,
                                           &conn->le_conn_timeout,
@@ -4447,7 +4447,7 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
         */
        hci_dev_clear_flag(hdev, HCI_LE_ADV);
 
-       conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
+       conn = hci_lookup_le_connect(hdev);
        if (!conn) {
                conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr, ev->role);
                if (!conn) {
index d6025d6e6d59f957c612a1e7ff455f770734eb6a..b7369220c9efff616d13f3ad3aeec44c809bd4e0 100644 (file)
@@ -317,7 +317,7 @@ static void set_random_addr(struct hci_request *req, bdaddr_t *rpa)
         * address be updated at the next cycle.
         */
        if (hci_dev_test_flag(hdev, HCI_LE_ADV) ||
-           hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT)) {
+           hci_lookup_le_connect(hdev)) {
                BT_DBG("Deferring random address update");
                hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
                return;
@@ -479,7 +479,6 @@ void hci_update_page_scan(struct hci_dev *hdev)
 void __hci_update_background_scan(struct hci_request *req)
 {
        struct hci_dev *hdev = req->hdev;
-       struct hci_conn *conn;
 
        if (!test_bit(HCI_UP, &hdev->flags) ||
            test_bit(HCI_INIT, &hdev->flags) ||
@@ -529,8 +528,7 @@ void __hci_update_background_scan(struct hci_request *req)
                 * since some controllers are not able to scan and connect at
                 * the same time.
                 */
-               conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
-               if (conn)
+               if (hci_lookup_le_connect(hdev))
                        return;
 
                /* If controller is currently scanning, we stop it to ensure we
index 7ab191589541c8fab56d47ab9f0e21f050751de9..35418bbe6b1579b4b3101bbdd21d4238b829f539 100644 (file)
@@ -4210,7 +4210,7 @@ static bool trigger_le_scan(struct hci_request *req, u16 interval, u8 *status)
                /* Don't let discovery abort an outgoing connection attempt
                 * that's using directed advertising.
                 */
-               if (hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT)) {
+               if (hci_lookup_le_connect(hdev)) {
                        *status = MGMT_STATUS_REJECTED;
                        return false;
                }