From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This makes sure that all request callback are called with BT_ATT_OP_ERROR_RSP in case the link is dropped so they can propagate the error back to the caller. --- src/shared/att.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/shared/att.c b/src/shared/att.c index 7b20757..a29c100 100644 --- a/src/shared/att.c +++ b/src/shared/att.c @@ -535,6 +535,16 @@ static void disconn_handler(void *data, void *user_data) disconn->callback(err, disconn->user_data); } +static void disc_att_send_op(void *data) +{ + struct att_send_op *op = data; + + if (op->callback) + op->callback(BT_ATT_OP_ERROR_RSP, NULL, 0, op->user_data); + + destroy_att_send_op(op); +} + static bool disconnect_cb(struct io *io, void *user_data) { struct bt_att *att = user_data; @@ -557,7 +567,16 @@ static bool disconnect_cb(struct io *io, void *user_data) io_destroy(att->io); att->io = NULL; - bt_att_cancel_all(att); + /* Notify request callbacks */ + queue_remove_all(att->req_queue, NULL, NULL, disc_att_send_op); + queue_remove_all(att->ind_queue, NULL, NULL, disc_att_send_op); + queue_remove_all(att->write_queue, NULL, NULL, disc_att_send_op); + + if (att->pending_req) + disc_att_send_op(att->pending_req); + + if (att->pending_ind) + disc_att_send_op(att->pending_ind); bt_att_ref(att); -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html