diff options
| author | Johan Hedberg <johan.hedberg@nokia.com> | 2009-01-13 15:06:46 +0200 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2009-01-13 15:08:16 +0200 | 
| commit | 51382802f433d7ce6ee1d5ceeeb1d90d543d0e6d (patch) | |
| tree | ee587a86600736dfac7be1334122ad584525db77 | |
| parent | d2244495dfc50c22ce275f6194c19d3293de70cb (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.
| -rw-r--r-- | src/dbus-hci.c | 5 | ||||
| -rw-r--r-- | src/dbus-hci.h | 3 | ||||
| -rw-r--r-- | src/security.c | 8 | 
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;  } | 
