]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
Bluetooth: Simplify logic for checking for SMP completion
authorJohan Hedberg <johan.hedberg@intel.com>
Wed, 26 Feb 2014 21:33:44 +0000 (23:33 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 26 Feb 2014 21:46:04 +0000 (13:46 -0800)
Now that smp->remote_key_dist is tracking the keys we're still waiting
for we can use it to simplify the logic for checking whether we're done
with key distribution or not. At the same time the reliance on the
"force" parameter of smp_distribute_keys goes away and it can completely
be removed in a subsequent patch.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/smp.c

index fe41df5c320c970b720767bc43e26ec6ab55cfbf..1b17adfffef8f2708d03e1d2400de8b7742447b8 100644 (file)
@@ -1184,7 +1184,7 @@ int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
        rsp = (void *) &smp->prsp[1];
 
        /* The responder sends its keys first */
-       if (!force && hcon->out && (rsp->resp_key_dist & 0x07))
+       if (hcon->out && (smp->remote_key_dist & 0x07))
                return 0;
 
        req = (void *) &smp->preq[1];
@@ -1259,13 +1259,16 @@ int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
                *keydist &= ~SMP_DIST_SIGN;
        }
 
-       if (hcon->out || force || !(rsp->init_key_dist & 0x07)) {
-               clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags);
-               cancel_delayed_work_sync(&conn->security_timer);
-               set_bit(SMP_FLAG_COMPLETE, &smp->smp_flags);
-               smp_notify_keys(conn);
-               smp_chan_destroy(conn);
-       }
+       /* If there are still keys to be received wait for them */
+       if ((smp->remote_key_dist & 0x07))
+               return 0;
+
+       clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags);
+       cancel_delayed_work_sync(&conn->security_timer);
+       set_bit(SMP_FLAG_COMPLETE, &smp->smp_flags);
+       smp_notify_keys(conn);
+
+       smp_chan_destroy(conn);
 
        return 0;
 }