Bluetooth: Use lower timeout for LE auto-connections
authorJohan Hedberg <johan.hedberg@intel.com>
Sun, 6 Jul 2014 10:41:15 +0000 (13:41 +0300)
committerJohan Hedberg <johan.hedberg@intel.com>
Sun, 6 Jul 2014 11:46:15 +0000 (14:46 +0300)
When we establish connections as a consequence of receiving an
advertising report it makes no sense to wait the normal 20 second LE
connection timeout. This patch modifies the hci_connect_le function to
take an extra timeout value and uses a lower 2 second timeout for the
auto-connection case. This timeout is intentionally chosen to be just a
bit higher than the 1.28 second timeout that High Duty Cycle Advertising
uses.

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

index 46f2458e4bc92a171371e2f63d9a0405f8e60da3..5481d1c8badbd1e0c3de4b0647de9f026b76d9a9 100644 (file)
@@ -238,6 +238,7 @@ enum {
 #define HCI_AUTO_OFF_TIMEOUT   msecs_to_jiffies(2000)  /* 2 seconds */
 #define HCI_POWER_OFF_TIMEOUT  msecs_to_jiffies(5000)  /* 5 seconds */
 #define HCI_LE_CONN_TIMEOUT    msecs_to_jiffies(20000) /* 20 seconds */
+#define HCI_LE_AUTOCONN_TIMEOUT        msecs_to_jiffies(2000)  /* 2 seconds */
 
 /* HCI data types */
 #define HCI_COMMAND_PKT                0x01
index 9d838a072db4a23913934086aeca92a17401925f..06039aae301068b117d01bc8098cd44f0db5e6c6 100644 (file)
@@ -385,6 +385,7 @@ struct hci_conn {
        __u32           passkey_notify;
        __u8            passkey_entered;
        __u16           disc_timeout;
+       __u16           conn_timeout;
        __u16           setting;
        __u16           le_conn_min_interval;
        __u16           le_conn_max_interval;
@@ -703,7 +704,8 @@ 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_le(struct hci_dev *hdev, bdaddr_t *dst,
-                               u8 dst_type, u8 sec_level, u8 auth_type);
+                               u8 dst_type, u8 sec_level, u8 auth_type,
+                               u16 conn_timeout);
 struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
                                 u8 sec_level, u8 auth_type);
 struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,
index 0d579d0368334647b3752a315d53ca37c74696f3..faa032fcdaeeddecd525aada3bc044e8ba33a75b 100644 (file)
@@ -700,7 +700,8 @@ static void hci_req_directed_advertising(struct hci_request *req,
 }
 
 struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
-                               u8 dst_type, u8 sec_level, u8 auth_type)
+                               u8 dst_type, u8 sec_level, u8 auth_type,
+                               u16 conn_timeout)
 {
        struct hci_conn_params *params;
        struct hci_conn *conn;
@@ -758,6 +759,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
        conn->sec_level = BT_SECURITY_LOW;
        conn->pending_sec_level = sec_level;
        conn->auth_type = auth_type;
+       conn->conn_timeout = conn_timeout;
 
        hci_req_init(&req, hdev);
 
index c2ba79c8fe51c6be49a0202b0f6c3594b879e332..f452e44eff3cbe026ddf32e3994ba4473d527cb0 100644 (file)
@@ -1073,7 +1073,7 @@ static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
                if (conn)
                        queue_delayed_work(hdev->workqueue,
                                           &conn->le_conn_timeout,
-                                          HCI_LE_CONN_TIMEOUT);
+                                          conn->conn_timeout);
        }
 
        mgmt_advertising(hdev, *sent);
@@ -1913,7 +1913,7 @@ static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
        if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
                queue_delayed_work(conn->hdev->workqueue,
                                   &conn->le_conn_timeout,
-                                  HCI_LE_CONN_TIMEOUT);
+                                  conn->conn_timeout);
 
 unlock:
        hci_dev_unlock(hdev);
@@ -4238,7 +4238,7 @@ static bool check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
                return false;
 
        conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
-                             HCI_AT_NO_BONDING);
+                             HCI_AT_NO_BONDING, HCI_LE_AUTOCONN_TIMEOUT);
        if (!IS_ERR(conn))
                return true;
 
index f1f544a12c3cb2aedaf18bd895eb3ce4a0d664fd..a219276d9f92ef1bdf19d608b4facd6af26cdc1d 100644 (file)
@@ -7135,7 +7135,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
                        dst_type = ADDR_LE_DEV_RANDOM;
 
                hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
-                                     auth_type);
+                                     auth_type, HCI_LE_CONN_TIMEOUT);
        } else {
                hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
        }
index e253f8e1fa47955ead2c6d1acea711e325a8ea02..be91d55c258ba3d6d9bc5998e19c47a7026593bd 100644 (file)
@@ -3116,7 +3116,8 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
                hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type);
 
                conn = hci_connect_le(hdev, &cp->addr.bdaddr, addr_type,
-                                     sec_level, auth_type);
+                                     sec_level, auth_type,
+                                     HCI_LE_CONN_TIMEOUT);
        }
 
        if (IS_ERR(conn)) {