summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2009-01-13 15:06:46 +0200
committerJohan Hedberg <johan.hedberg@nokia.com>2009-01-13 15:08:16 +0200
commit51382802f433d7ce6ee1d5ceeeb1d90d543d0e6d (patch)
treeee587a86600736dfac7be1334122ad584525db77 /src
parentd2244495dfc50c22ce275f6194c19d3293de70cb (diff)
Fix new pairing detection with SSP
Propagate old and new link key type info to dbus-hci.c so it can know whether this is a new pairing or not.
Diffstat (limited to 'src')
-rw-r--r--src/dbus-hci.c5
-rw-r--r--src/dbus-hci.h3
-rw-r--r--src/security.c8
3 files changed, 12 insertions, 4 deletions
diff --git a/src/dbus-hci.c b/src/dbus-hci.c
index 5118ffc8..290bbfd6 100644
--- a/src/dbus-hci.c
+++ b/src/dbus-hci.c
@@ -916,7 +916,8 @@ proceed:
adapter_set_state(adapter, state);
}
-void hcid_dbus_link_key_notify(bdaddr_t *local, bdaddr_t *peer)
+void hcid_dbus_link_key_notify(bdaddr_t *local, bdaddr_t *peer,
+ uint8_t key_type, uint8_t old_key_type)
{
char peer_addr[18];
struct btd_device *device;
@@ -938,7 +939,7 @@ void hcid_dbus_link_key_notify(bdaddr_t *local, bdaddr_t *peer)
if (!device_is_connected(device))
device_set_secmode3_conn(device, TRUE);
- else if (!device_is_bonding(device, NULL))
+ else if (!device_is_bonding(device, NULL) && old_key_type == 0xFF)
hcid_dbus_bonding_process_complete(local, peer, 0);
}
diff --git a/src/dbus-hci.h b/src/dbus-hci.h
index 515823c2..7481522e 100644
--- a/src/dbus-hci.h
+++ b/src/dbus-hci.h
@@ -45,7 +45,8 @@ int hcid_dbus_set_io_cap(bdaddr_t *local, bdaddr_t *remote,
int hcid_dbus_user_confirm(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey);
int hcid_dbus_user_passkey(bdaddr_t *sba, bdaddr_t *dba);
int hcid_dbus_user_notify(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey);
-void hcid_dbus_link_key_notify(bdaddr_t *local, bdaddr_t *peer);
+void hcid_dbus_link_key_notify(bdaddr_t *local, bdaddr_t *peer,
+ uint8_t key_type, uint8_t old_key_type);
DBusMessage *new_authentication_return(DBusMessage *msg, uint8_t status);
diff --git a/src/security.c b/src/security.c
index 267cd27e..1ab952ae 100644
--- a/src/security.c
+++ b/src/security.c
@@ -341,10 +341,16 @@ static void link_key_notify(int dev, bdaddr_t *sba, void *ptr)
bdaddr_t *dba = &evt->bdaddr;
char sa[18], da[18];
int dev_id, err;
+ unsigned char old_key[16];
+ uint8_t old_key_type;
ba2str(sba, sa); ba2str(dba, da);
info("link_key_notify (sba=%s, dba=%s)", sa, da);
+ err = read_link_key(sba, dba, old_key, &old_key_type);
+ if (err < 0)
+ old_key_type = 0xFF;
+
dev_id = hci_devid(sa);
err = write_link_key(sba, dba, evt->link_key, evt->key_type,
@@ -367,7 +373,7 @@ static void link_key_notify(int dev, bdaddr_t *sba, void *ptr)
DISCONNECT_CP_SIZE, &cp);
}
} else
- hcid_dbus_link_key_notify(sba, dba);
+ hcid_dbus_link_key_notify(sba, dba, evt->key_type, old_key_type);
io_data[dev_id].pin_length = -1;
}