aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Paliy <dmitriy.paliy@nokia.com>2011-07-11 15:20:06 +0300
committerJaikumar Ganesh <jaikumar@google.com>2011-07-26 17:59:49 -0700
commit3e28ead202ff45d0fd66876f6a9cd3e8c3dbf42e (patch)
tree759d7abc4babf3d788ac3c785a5385bc631e9256
parent2645460e07951a5c66c24b057c0dafce3f399c63 (diff)
downloadbluez-3e28ead202ff45d0fd66876f6a9cd3e8c3dbf42e.tar.gz
Fix unpair device when disconnected for No Bonding
Fix Paired device property if 'No Bonding' authentication is used. It is set to be false when device is disconnected and no link key is stored. Otherwise, there can be cases when device is still valid and being claimed as paired without available bonding information. For instanse, use of CreateDevice method call and obex client file transfer is such use case.
-rw-r--r--src/device.c19
-rw-r--r--src/device.h1
-rw-r--r--src/event.c8
3 files changed, 25 insertions, 3 deletions
diff --git a/src/device.c b/src/device.c
index fba43d9d..8805c27b 100644
--- a/src/device.c
+++ b/src/device.c
@@ -132,6 +132,7 @@ struct btd_device {
gboolean trusted;
gboolean paired;
gboolean blocked;
+ gboolean bonded;
gboolean authorizing;
gint ref;
@@ -896,6 +897,9 @@ void device_remove_connection(struct btd_device *device, DBusConnection *conn)
device->disconnects = g_slist_remove(device->disconnects, msg);
}
+ if (device_is_paired(device) && !device->bonded)
+ device_set_paired(device, FALSE);
+
emit_property_changed(conn, device->path,
DEVICE_INTERFACE, "Connected",
DBUS_TYPE_BOOLEAN, &device->connected);
@@ -978,8 +982,10 @@ struct btd_device *device_create(DBusConnection *conn,
if (read_blocked(&src, &device->bdaddr))
device_block(conn, device);
- if (read_link_key(&src, &device->bdaddr, NULL, NULL) == 0)
+ if (read_link_key(&src, &device->bdaddr, NULL, NULL) == 0) {
device->paired = TRUE;
+ device_set_bonded(device, TRUE);
+ }
return btd_device_ref(device);
}
@@ -1030,6 +1036,7 @@ void device_remove_bonding(struct btd_device *device)
/* Delete the link key from storage */
textfile_casedel(filename, dstaddr);
+ device_set_bonded(device, FALSE);
btd_adapter_remove_bonding(device->adapter, &device->bdaddr);
}
@@ -1859,6 +1866,16 @@ void device_set_temporary(struct btd_device *device, gboolean temporary)
device->temporary = temporary;
}
+void device_set_bonded(struct btd_device *device, gboolean bonded)
+{
+ if (!device)
+ return;
+
+ DBG("bonded %d", bonded);
+
+ device->bonded = bonded;
+}
+
void device_set_type(struct btd_device *device, device_type_t type)
{
if (!device)
diff --git a/src/device.h b/src/device.h
index 17d9a3e2..11ab7c7a 100644
--- a/src/device.h
+++ b/src/device.h
@@ -74,6 +74,7 @@ gboolean device_is_trusted(struct btd_device *device);
void device_set_paired(struct btd_device *device, gboolean paired);
void device_set_temporary(struct btd_device *device, gboolean temporary);
void device_set_type(struct btd_device *device, device_type_t type);
+void device_set_bonded(struct btd_device *device, gboolean bonded);
gboolean device_is_connected(struct btd_device *device);
DBusMessage *device_create_bonding(struct btd_device *device,
DBusConnection *conn, DBusMessage *msg,
diff --git a/src/event.c b/src/event.c
index 7f3e3573..cc9e99e0 100644
--- a/src/event.c
+++ b/src/event.c
@@ -451,8 +451,12 @@ int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer,
ret = write_link_key(local, peer, key, key_type, pin_length);
- if (ret == 0 && device_is_temporary(device))
- device_set_temporary(device, FALSE);
+ if (ret == 0) {
+ device_set_bonded(device, TRUE);
+
+ if (device_is_temporary(device))
+ device_set_temporary(device, FALSE);
+ }
return ret;
}