summaryrefslogtreecommitdiffstats
path: root/src/dbus-hci.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2008-09-26 00:05:27 -0700
committerJohan Hedberg <johan.hedberg@nokia.com>2008-09-26 00:05:27 -0700
commite21ec2652c54dbc8abbf84039b43fbd3be0b5ebc (patch)
tree7ed363699330bf6e10e4bdeb08314f2c771ee78b /src/dbus-hci.c
parentd0c0409d8ad37a042539706ff5382899acc81395 (diff)
Don't do bonding_process_complete upon link_key_notify
Diffstat (limited to 'src/dbus-hci.c')
-rw-r--r--src/dbus-hci.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/src/dbus-hci.c b/src/dbus-hci.c
index e480eb7e..795df0a3 100644
--- a/src/dbus-hci.c
+++ b/src/dbus-hci.c
@@ -518,6 +518,9 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,
bonding = adapter_get_bonding_info(adapter);
+ if (bacmp(&bonding->bdaddr, peer))
+ bonding = NULL;
+
if (status == 0) {
device = adapter_get_device(connection, adapter, peer_addr);
if (!device) {
@@ -547,12 +550,13 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,
/* If this is a new pairing send the appropriate signal for it
* and proceed with service discovery */
if (status == 0) {
- device_set_paired(connection, device, bonding);
+ if (device_set_paired(connection, device, bonding) && bonding)
+ adapter_free_bonding_request(adapter);
return;
}
proceed:
- if (!bonding || bacmp(&bonding->bdaddr, peer))
+ if (!bonding)
return; /* skip: no bonding req pending */
if (bonding->cancel)
@@ -996,12 +1000,38 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,
adapter_set_state(adapter, state);
}
+void hcid_dbus_link_key_notify(bdaddr_t *local, bdaddr_t *peer)
+{
+ char peer_addr[18];
+ struct btd_device *device;
+ struct btd_adapter *adapter;
+ struct bonding_request_info *bonding;
+
+ adapter = manager_find_adapter(local);
+ if (!adapter) {
+ error("No matching adapter found");
+ return;
+ }
+
+ ba2str(peer, peer_addr);
+
+ device = adapter_find_device(adapter, peer_addr);
+
+ bonding = adapter_get_bonding_info(adapter);
+
+ if (!device_get_connected(device))
+ device_set_secmode3_conn(device, TRUE);
+ else if (!bonding)
+ hcid_dbus_bonding_process_complete(local, peer, 0);
+}
+
void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle,
bdaddr_t *peer)
{
char peer_addr[18];
struct btd_adapter *adapter;
struct bonding_request_info *bonding;
+ struct btd_device *device;
adapter = manager_find_adapter(local);
if (!adapter) {
@@ -1011,6 +1041,8 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle,
ba2str(peer, peer_addr);
+ device = adapter_get_device(connection, adapter, peer_addr);
+
if (status) {
struct pending_auth_info *auth;
@@ -1020,13 +1052,13 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle,
adapter_remove_auth_request(adapter, peer);
+ if (device)
+ device_set_secmode3_conn(device, FALSE);
+
bonding = adapter_get_bonding_info(adapter);
if (bonding)
bonding->hci_status = status;
} else {
- struct btd_device *device;
-
- device = adapter_find_device(adapter, peer_addr);
if (device)
device_set_connected(connection, device, TRUE);