Bluetooth: Add a convenience function to check for SSP enabled
authorJohan Hedberg <johan.hedberg@intel.com>
Wed, 18 Jan 2012 19:33:12 +0000 (21:33 +0200)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 13 Feb 2012 15:01:29 +0000 (17:01 +0200)
It's a very common test to see if both the local and the remote device
have SSP enabled. By creating a simple function to test this we can
shorten many if-statements in the code.

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

index 94ba8693e9d193e275248efc2e98983180e84587..25f449fcd6932794366963d011eb48d443cd97ef 100644 (file)
@@ -411,6 +411,13 @@ enum {
        HCI_CONN_REMOTE_OOB,
 };
 
+static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
+{
+       struct hci_dev *hdev = conn->hdev;
+       return (test_bit(HCI_SSP_ENABLED, &hdev->flags) &&
+                               test_bit(HCI_CONN_SSP_ENABLED, &conn->flags));
+}
+
 static inline void hci_conn_hash_init(struct hci_dev *hdev)
 {
        struct hci_conn_hash *h = &hdev->conn_hash;
index 6ec259e84b95158109ca8cb95c6e9ec068d070d2..eae7a53467ef89639d3f17acb6480505e454c712 100644 (file)
@@ -608,9 +608,7 @@ int hci_conn_check_link_mode(struct hci_conn *conn)
 {
        BT_DBG("conn %p", conn);
 
-       if (test_bit(HCI_CONN_SSP_ENABLED, &conn->flags) &&
-                       test_bit(HCI_SSP_ENABLED, &conn->hdev->dev_flags) &&
-                       !(conn->link_mode & HCI_LM_ENCRYPT))
+       if (hci_conn_ssp_enabled(conn) && !(conn->link_mode & HCI_LM_ENCRYPT))
                return 0;
 
        return 1;
@@ -672,9 +670,7 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
 
        /* For non 2.1 devices and low security level we don't need the link
           key. */
-       if (sec_level == BT_SECURITY_LOW &&
-                       (!test_bit(HCI_CONN_SSP_ENABLED, &conn->flags) ||
-                       !test_bit(HCI_SSP_ENABLED, &conn->hdev->dev_flags)))
+       if (sec_level == BT_SECURITY_LOW && !hci_conn_ssp_enabled(conn))
                return 1;
 
        /* For other security levels we need the link key. */
index eb198ccbc10d92f594fc77ea07e218fd7717e018..6fb9016652b7c3ec737279a2eb7cde0d88db5a6f 100644 (file)
@@ -1270,8 +1270,7 @@ static int hci_outgoing_auth_needed(struct hci_dev *hdev,
 
        /* Only request authentication for SSP connections or non-SSP
         * devices with sec_level HIGH or if MITM protection is requested */
-       if (!(test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
-                       test_bit(HCI_CONN_SSP_ENABLED, &conn->flags)) &&
+       if (!hci_conn_ssp_enabled(conn) &&
                                conn->pending_sec_level != BT_SECURITY_HIGH &&
                                !(conn->auth_type & 0x01))
                return 0;
@@ -1845,9 +1844,8 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s
                goto unlock;
 
        if (!ev->status) {
-               if (!(test_bit(HCI_CONN_SSP_ENABLED, &conn->flags) &&
-                               test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) &&
-                               test_bit(HCI_CONN_REAUTH_PEND,  &conn->flags)) {
+               if (!hci_conn_ssp_enabled(conn) &&
+                               test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
                        BT_INFO("re-auth of legacy device is not possible.");
                } else {
                        conn->link_mode |= HCI_LM_AUTH;
@@ -1861,9 +1859,7 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s
        clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
 
        if (conn->state == BT_CONFIG) {
-               if (!ev->status &&
-                               test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
-                               test_bit(HCI_CONN_SSP_ENABLED, &conn->flags)) {
+               if (!ev->status && hci_conn_ssp_enabled(conn)) {
                        struct hci_cp_set_conn_encrypt cp;
                        cp.handle  = ev->handle;
                        cp.encrypt = 0x01;