@@ -5628,6 +5628,8 @@ static void gatt_debug(const char *str, void *user_data)
static void gatt_client_init(struct btd_device *device)
{
+ uint8_t features;
+
gatt_client_cleanup(device);
if (!device->connect && !btd_opts.reverse_discovery) {
@@ -5639,8 +5641,13 @@ static void gatt_client_init(struct btd_device *device)
return;
}
+ features = BT_GATT_CHRC_CLI_FEAT_ROBUST_CACHING
+ | BT_GATT_CHRC_CLI_FEAT_NFY_MULTI;
+ if (btd_opts.gatt_channels > 1)
+ features |= BT_GATT_CHRC_CLI_FEAT_EATT;
+
device->client = bt_gatt_client_new(device->db, device->att,
- device->att_mtu, 0);
+ device->att_mtu, features);
if (!device->client) {
DBG("Failed to initialize");
return;
@@ -1245,7 +1245,8 @@ static void server_feat_read_cb(struct gatt_db_attribute *attrib,
goto done;
}
- value |= BT_GATT_CHRC_SERVER_FEAT_EATT;
+ if (btd_opts.gatt_channels > 1)
+ value |= BT_GATT_CHRC_SERVER_FEAT_EATT;
done:
gatt_db_attribute_read_result(attrib, id, ecode, &value, sizeof(value));
@@ -2043,7 +2043,7 @@ static void write_client_features(struct bt_gatt_client *client)
handle = gatt_db_attribute_get_handle(attr);
- client->features = BT_GATT_CHRC_CLI_FEAT_ROBUST_CACHING;
+ client->features |= BT_GATT_CHRC_CLI_FEAT_ROBUST_CACHING;
bt_uuid16_create(&uuid, GATT_CHARAC_SERVER_FEAT);
@@ -2055,10 +2055,12 @@ static void write_client_features(struct bt_gatt_client *client)
gatt_db_attribute_read(attr, 0, BT_ATT_OP_READ_REQ,
NULL, server_feat_read_value,
&feat);
- if (feat && feat[0] & BT_GATT_CHRC_SERVER_FEAT_EATT)
- client->features |= BT_GATT_CHRC_CLI_FEAT_EATT;
+ if (!(feat && feat[0] & BT_GATT_CHRC_SERVER_FEAT_EATT)
+ || !(client->features & BT_GATT_CHRC_CLI_FEAT_EATT))
+ client->features &= ~BT_GATT_CHRC_CLI_FEAT_EATT;
}
+
client->features |= BT_GATT_CHRC_CLI_FEAT_NFY_MULTI;
DBG(client, "Writing Client Features 0x%02x", client->features);