shared/gatt-client: Automatically add CCC when discovering
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 26 Aug 2019 11:51:44 +0000 (14:51 +0300)
committerhimanshu <h.himanshu@samsung.com>
Tue, 11 Feb 2020 08:57:47 +0000 (14:27 +0530)
The spec mandates that a CCC exists if either notify or indicate
property is marked:

BLUETOOTH CORE SPECIFICATION Version 5.1 | Vol 3, Part G page 2357

  "If set, the Client Characteristic Configuration Descriptor shall
  exist."

Change-Id: Ib588c87cc3be81e439ff8f7678b7e451b5c34825
Signed-off-by: himanshu <h.himanshu@samsung.com>
src/shared/gatt-client.c

index 94bd7e2..3225cb8 100644 (file)
@@ -717,6 +717,31 @@ static bool discover_descs(struct discovery_op *op, bool *discovering)
 
                desc_start = chrc_data->value_handle + 1;
 
+               if (desc_start == chrc_data->end_handle &&
+                       (chrc_data->properties & BT_GATT_CHRC_PROP_NOTIFY ||
+                        chrc_data->properties & BT_GATT_CHRC_PROP_INDICATE)) {
+                       bt_uuid_t ccc_uuid;
+
+                       /* If there is only one descriptor that must be the CCC
+                        * in case either notify or indicate are supported.
+                        */
+                       bt_uuid16_create(&ccc_uuid,
+                                       GATT_CLIENT_CHARAC_CFG_UUID);
+                       attr = gatt_db_insert_descriptor(client->db, desc_start,
+                                                       &ccc_uuid, 0, NULL,
+                                                       NULL, NULL);
+                       if (attr) {
+                               free(chrc_data);
+                               continue;
+                       }
+               }
+
+               /* Check if the start range is within characteristic range */
+               if (desc_start > chrc_data->end_handle) {
+                       free(chrc_data);
+                       continue;
+               }
+
                client->discovery_req = bt_gatt_discover_descriptors(
                                                        client->att, desc_start,
                                                        chrc_data->end_handle,