From ee2dfbdcf0e060fb4509a762e6225b4037f6b2dd Mon Sep 17 00:00:00 2001 From: Roger Lendenmann Date: Tue, 7 Jun 2016 20:23:22 +0200 Subject: [PATCH] Bluetooth: GATT: Handle ccc cfg values correctly on disconnect * clear non-bonded ccc cfg values as per BT spec * address compare logic * check if cfg_changed is defined Change-Id: Id002f22a6aac1b918d743ef1e73b7e5c4768a229 Signed-off-by: Roger Lendenmann --- net/bluetooth/gatt.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/net/bluetooth/gatt.c b/net/bluetooth/gatt.c index d97e5ef3890..b6e9da08ad8 100644 --- a/net/bluetooth/gatt.c +++ b/net/bluetooth/gatt.c @@ -645,7 +645,7 @@ static uint8_t disconnected_cb(const struct bt_gatt_attr *attr, void *user_data) continue; } - if (bt_addr_le_cmp(&conn->le.dst, &ccc->cfg[i].peer)) { + if (!bt_addr_le_cmp(&conn->le.dst, &ccc->cfg[i].peer)) { struct bt_conn *tmp; /* Skip if there is another peer connected */ @@ -657,13 +657,19 @@ static uint8_t disconnected_cb(const struct bt_gatt_attr *attr, void *user_data) } bt_conn_unref(tmp); + + /* Clear value if not paired */ + if (!ccc->cfg[i].valid) + memset(&ccc->cfg[i].value, 0, + sizeof(ccc->cfg[i].value)); } } } /* Reset value while disconnected */ memset(&ccc->value, 0, sizeof(ccc->value)); - ccc->cfg_changed(ccc->value); + if (ccc->cfg_changed) + ccc->cfg_changed(ccc->value); BT_DBG("ccc %p reseted", ccc);