aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2014-02-26 16:33:44 -0500
committerMarcel Holtmann <marcel@holtmann.org>2014-02-26 16:46:04 -0500
commitefabba37fec4cf093fedcfcba443d0f04b606eb4 (patch)
tree0d654c733f4b9ec66553cce4f4473e617fbd5309
parent9747a9f31756362e1b9d0b2347c25ae5120c3319 (diff)
Bluetooth: Simplify logic for checking for SMP completion
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>
-rw-r--r--net/bluetooth/smp.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index fe41df5c320c..1b17adfffef8 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -1184,7 +1184,7 @@ int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
1184 rsp = (void *) &smp->prsp[1]; 1184 rsp = (void *) &smp->prsp[1];
1185 1185
1186 /* The responder sends its keys first */ 1186 /* The responder sends its keys first */
1187 if (!force && hcon->out && (rsp->resp_key_dist & 0x07)) 1187 if (hcon->out && (smp->remote_key_dist & 0x07))
1188 return 0; 1188 return 0;
1189 1189
1190 req = (void *) &smp->preq[1]; 1190 req = (void *) &smp->preq[1];
@@ -1259,13 +1259,16 @@ int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
1259 *keydist &= ~SMP_DIST_SIGN; 1259 *keydist &= ~SMP_DIST_SIGN;
1260 } 1260 }
1261 1261
1262 if (hcon->out || force || !(rsp->init_key_dist & 0x07)) { 1262 /* If there are still keys to be received wait for them */
1263 clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags); 1263 if ((smp->remote_key_dist & 0x07))
1264 cancel_delayed_work_sync(&conn->security_timer); 1264 return 0;
1265 set_bit(SMP_FLAG_COMPLETE, &smp->smp_flags); 1265
1266 smp_notify_keys(conn); 1266 clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags);
1267 smp_chan_destroy(conn); 1267 cancel_delayed_work_sync(&conn->security_timer);
1268 } 1268 set_bit(SMP_FLAG_COMPLETE, &smp->smp_flags);
1269 smp_notify_keys(conn);
1270
1271 smp_chan_destroy(conn);
1269 1272
1270 return 0; 1273 return 0;
1271} 1274}