From 967a38d45a4e92bbaa86bf2de376c6634e25426d Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 13 May 2014 16:03:22 +0300 Subject: [PATCH] core: Export API for tracking connection failures This will be used by the reconnection policy logic. --- src/adapter.c | 23 +++++++++++++++++++++++ src/adapter.h | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/src/adapter.c b/src/adapter.c index b38c813cb..f5abfe362 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -98,6 +98,7 @@ static uint8_t mgmt_revision = 0; static GSList *adapter_drivers = NULL; static GSList *disconnect_list = NULL; +static GSList *conn_fail_list = NULL; struct link_key_info { bdaddr_t bdaddr; @@ -6268,6 +6269,26 @@ static void device_unblocked_callback(uint16_t index, uint16_t length, device_unblock(device, FALSE, TRUE); } +static void conn_fail_notify(struct btd_device *dev, uint8_t status) +{ + GSList *l; + + for (l = conn_fail_list; l; l = g_slist_next(l)) { + btd_conn_fail_cb conn_fail_cb = l->data; + conn_fail_cb(dev, status); + } +} + +void btd_add_conn_fail_cb(btd_conn_fail_cb func) +{ + conn_fail_list = g_slist_append(conn_fail_list, func); +} + +void btd_remove_conn_fail_cb(btd_conn_fail_cb func) +{ + conn_fail_list = g_slist_remove(conn_fail_list, func); +} + static void connect_failed_callback(uint16_t index, uint16_t length, const void *param, void *user_data) { @@ -6288,6 +6309,8 @@ static void connect_failed_callback(uint16_t index, uint16_t length, device = btd_adapter_find_device(adapter, &ev->addr.bdaddr, ev->addr.type); if (device) { + conn_fail_notify(device, ev->status); + /* If the device is in a bonding process cancel any auth request * sent to the agent before proceeding, but keep the bonding * request structure. */ diff --git a/src/adapter.h b/src/adapter.h index 88951975f..f88c33918 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -67,6 +67,10 @@ 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); +typedef void (*btd_conn_fail_cb) (struct btd_device *device, uint8_t status); +void btd_add_conn_fail_cb(btd_conn_fail_cb func); +void btd_remove_conn_fail_cb(btd_conn_fail_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