From 77cbd27a809c4933d31cc697b0c1a193ca5b6b5b Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Wed, 10 Jul 2024 15:12:09 +0200 Subject: [PATCH] bluetooth: gatt: Fix ATT Read By Type by DB change unaware client When change unaware client send ATT request it shall get Database Out of Sync error. Reading GATT database hash is an exception here. This was affecting GATT/SR/GAS/BV-05-C qualification test case. Signed-off-by: Szymon Janc --- subsys/bluetooth/host/att.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/subsys/bluetooth/host/att.c b/subsys/bluetooth/host/att.c index 4489de0924a..2a670a18f19 100644 --- a/subsys/bluetooth/host/att.c +++ b/subsys/bluetooth/host/att.c @@ -1549,6 +1549,23 @@ static uint8_t att_read_type_req(struct bt_att_chan *chan, struct net_buf *buf) return 0; } + /* Reading Database Hash is special as it may be used to make client change aware + * (Core Specification 5.4 Vol 3. Part G. 2.5.2.1 Robust Caching). + * + * GATT client shall always use GATT Read Using Characteristic UUID sub-procedure for + * reading Database Hash + * (Core Specification 5.4 Vol 3. Part G. 7.3 Databse Hash) + */ + if (bt_uuid_cmp(&u.uuid, BT_UUID_GATT_DB_HASH) != 0) { + if (!bt_gatt_change_aware(chan->att->conn, true)) { + if (!atomic_test_and_set_bit(chan->flags, ATT_OUT_OF_SYNC_SENT)) { + return BT_ATT_ERR_DB_OUT_OF_SYNC; + } else { + return 0; + } + } + } + return att_read_type_rsp(chan, &u.uuid, start_handle, end_handle); }