From 396b3b62c9c1d2c55a4d53714e82627d803d0a3d Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 13 May 2014 10:48:01 +0300 Subject: [PATCH] core: Add API to monitor device disconnections This patch adds an API to monitor devices disconnections, including the reason for the disconnection. It paves the way to allow creating a policy for reconnecting when disconnected. --- src/adapter.c | 26 +++++++++++++++++++++++++- src/adapter.h | 4 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/adapter.c b/src/adapter.c index 25875de39..b38c813cb 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -97,6 +97,8 @@ static uint8_t mgmt_revision = 0; static GSList *adapter_drivers = NULL; +static GSList *disconnect_list = NULL; + struct link_key_info { bdaddr_t bdaddr; unsigned char key[16]; @@ -5396,6 +5398,16 @@ int adapter_bonding_attempt(struct btd_adapter *adapter, const bdaddr_t *bdaddr, return 0; } +static void disconnect_notify(struct btd_device *dev, uint8_t reason) +{ + GSList *l; + + for (l = disconnect_list; l; l = g_slist_next(l)) { + btd_disconnect_cb disconnect_cb = l->data; + disconnect_cb(dev, reason); + } +} + static void dev_disconnected(struct btd_adapter *adapter, const struct mgmt_addr_info *addr, uint8_t reason) @@ -5408,13 +5420,25 @@ static void dev_disconnected(struct btd_adapter *adapter, DBG("Device %s disconnected, reason %u", dst, reason); device = btd_adapter_find_device(adapter, &addr->bdaddr, addr->type); - if (device) + if (device) { adapter_remove_connection(adapter, device, addr->type); + disconnect_notify(device, reason); + } bonding_attempt_complete(adapter, &addr->bdaddr, addr->type, MGMT_STATUS_DISCONNECTED); } +void btd_add_disconnect_cb(btd_disconnect_cb func) +{ + disconnect_list = g_slist_append(disconnect_list, func); +} + +void btd_remove_disconnect_cb(btd_disconnect_cb func) +{ + disconnect_list = g_slist_remove(disconnect_list, func); +} + static void disconnect_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { diff --git a/src/adapter.h b/src/adapter.h index 49eca11e1..88951975f 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -63,6 +63,10 @@ int adapter_init(void); void adapter_cleanup(void); void adapter_shutdown(void); +typedef void (*btd_disconnect_cb) (struct btd_device *device, uint8_t reason); +void btd_add_disconnect_cb(btd_disconnect_cb func); +void btd_remove_disconnect_cb(btd_disconnect_cb func); + struct btd_adapter *adapter_find(const bdaddr_t *sba); struct btd_adapter *adapter_find_by_id(int id); void adapter_foreach(adapter_cb func, gpointer user_data); -- 2.47.3