From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This makes use of BT_IO_MODE_EXT_FLOWCTL to connect to EATT channels. --- src/gatt-client.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/gatt-client.c b/src/gatt-client.c index 20efb7ae9..f7e5f38f4 100644 --- a/src/gatt-client.c +++ b/src/gatt-client.c @@ -2185,6 +2185,9 @@ static void eatt_connect(struct btd_gatt_client *client) DBG("Connection attempt to: %s", addr); for (i = bt_att_get_channels(att); i < main_opts.gatt_channels; i++) { + int defer_timeout = i + 1 < main_opts.gatt_channels ? 1 : 0; + + /* Attempt to connect using the Ext-Flowctl */ io = bt_io_connect(eatt_connect_cb, client, NULL, &gerr, BT_IO_OPT_SOURCE_BDADDR, btd_adapter_get_address(adapter), @@ -2194,15 +2197,34 @@ static void eatt_connect(struct btd_gatt_client *client) device_get_address(dev), BT_IO_OPT_DEST_TYPE, device_get_le_address_type(dev), + BT_IO_OPT_MODE, BT_IO_MODE_EXT_FLOWCTL, BT_IO_OPT_PSM, BT_ATT_EATT_PSM, BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW, BT_IO_OPT_MTU, main_opts.gatt_mtu, + BT_IO_OPT_DEFER_TIMEOUT, defer_timeout, BT_IO_OPT_INVALID); if (!io) { - error("EATT bt_io_connect(%s): %s", addr, - gerr->message); g_error_free(gerr); - return; + /* Fallback to legacy LE Mode */ + io = bt_io_connect(eatt_connect_cb, client, NULL, &gerr, + BT_IO_OPT_SOURCE_BDADDR, + btd_adapter_get_address(adapter), + BT_IO_OPT_SOURCE_TYPE, + btd_adapter_get_address_type(adapter), + BT_IO_OPT_DEST_BDADDR, + device_get_address(dev), + BT_IO_OPT_DEST_TYPE, + device_get_le_address_type(dev), + BT_IO_OPT_PSM, BT_ATT_EATT_PSM, + BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW, + BT_IO_OPT_MTU, main_opts.gatt_mtu, + BT_IO_OPT_INVALID); + if (!io) { + error("EATT bt_io_connect(%s): %s", addr, + gerr->message); + g_error_free(gerr); + return; + } } g_io_channel_unref(io); -- 2.21.1