linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ 21/22] core: Add support for setting the number of GATT bearers
Date: Tue,  7 Jan 2020 16:33:41 -0800	[thread overview]
Message-ID: <20200108003342.15458-22-luiz.dentz@gmail.com> (raw)
In-Reply-To: <20200108003342.15458-1-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds option to set the numbers of GATT Channels/Bearers to be
connected in main.conf.
---
 src/device.c        |  5 +++++
 src/gatt-client.c   |  8 +++++---
 src/gatt-database.c | 12 ++++++++++--
 src/hcid.h          |  1 +
 src/main.c          | 14 ++++++++++++++
 src/main.conf       |  5 +++++
 6 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/src/device.c b/src/device.c
index f7f0bc789..828fe9810 100644
--- a/src/device.c
+++ b/src/device.c
@@ -5049,6 +5049,11 @@ bool device_attach_att(struct btd_device *dev, GIOChannel *io)
 	}
 
 	if (dev->att) {
+		if (main_opts.gatt_channels == bt_att_get_channels(dev->att)) {
+			DBG("EATT channel limit reached");
+			return false;
+		}
+
 		if (!bt_att_attach_fd(dev->att, g_io_channel_unix_get_fd(io))) {
 			DBG("EATT channel connected");
 			g_io_channel_set_close_on_unref(io, FALSE);
diff --git a/src/gatt-client.c b/src/gatt-client.c
index 04a7e5319..203af709b 100644
--- a/src/gatt-client.c
+++ b/src/gatt-client.c
@@ -59,8 +59,6 @@
 #define GATT_CHARACTERISTIC_IFACE	"org.bluez.GattCharacteristic1"
 #define GATT_DESCRIPTOR_IFACE		"org.bluez.GattDescriptor1"
 
-#define EATT_MAX_BEARERS 2
-
 struct btd_gatt_client {
 	struct btd_device *device;
 	uint8_t features;
@@ -2171,6 +2169,7 @@ static void eatt_connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
 
 static void eatt_connect(struct btd_gatt_client *client)
 {
+	struct bt_att *att = bt_gatt_client_get_att(client->gatt);
 	struct btd_device *dev = client->device;
 	struct btd_adapter *adapter = device_get_adapter(dev);
 	GIOChannel *io;
@@ -2178,11 +2177,14 @@ static void eatt_connect(struct btd_gatt_client *client)
 	char addr[18];
 	int i;
 
+	if (bt_att_get_channels(att) == main_opts.gatt_channels)
+		return;
+
 	ba2str(device_get_address(dev), addr);
 
 	DBG("Connection attempt to: %s", addr);
 
-	for (i = 0; i < EATT_MAX_BEARERS; i++) {
+	for (i = bt_att_get_channels(att); i < main_opts.gatt_channels; i++) {
 		io = bt_io_connect(eatt_connect_cb, client, NULL, NULL,
 				BT_IO_OPT_SOURCE_BDADDR,
 				btd_adapter_get_address(adapter),
diff --git a/src/gatt-database.c b/src/gatt-database.c
index d4c892113..455201efd 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
@@ -1215,10 +1215,13 @@ static void populate_gatt_service(struct btd_gatt_database *database)
 				&uuid, BT_ATT_PERM_READ, BT_GATT_CHRC_PROP_READ,
 				db_hash_read_cb, NULL, database);
 
-	bt_uuid16_create(&uuid, GATT_CHARAC_SERVER_FEAT);
-	database->eatt = gatt_db_service_add_characteristic(service,
+	/* Only enable EATT if there is a socket listening */
+	if (database->eatt_io) {
+		bt_uuid16_create(&uuid, GATT_CHARAC_SERVER_FEAT);
+		database->eatt = gatt_db_service_add_characteristic(service,
 				&uuid, BT_ATT_PERM_READ, BT_GATT_CHRC_PROP_READ,
 				server_feat_read_cb, NULL, database);
+	}
 
 	gatt_db_service_set_active(service, true);
 
@@ -3564,6 +3567,10 @@ struct btd_gatt_database *btd_gatt_database_new(struct btd_adapter *adapter)
 		goto fail;
 	}
 
+	/* If just just 1 channel is enabled EATT is not required */
+	if (main_opts.gatt_channels == 1)
+		goto bredr;
+
 	/* EATT socket */
 	database->eatt_io = bt_io_listen(connect_cb, NULL, NULL, NULL, NULL,
 					BT_IO_OPT_SOURCE_BDADDR, addr,
@@ -3591,6 +3598,7 @@ struct btd_gatt_database *btd_gatt_database_new(struct btd_adapter *adapter)
 		}
 	}
 
+bredr:
 	/* BR/EDR socket */
 	database->bredr_io = bt_io_listen(connect_cb, NULL, NULL, NULL, &gerr,
 					BT_IO_OPT_SOURCE_BDADDR, addr,
diff --git a/src/hcid.h b/src/hcid.h
index adea85ce2..083f70c5b 100644
--- a/src/hcid.h
+++ b/src/hcid.h
@@ -56,6 +56,7 @@ struct main_opts {
 	bt_mode_t	mode;
 	bt_gatt_cache_t gatt_cache;
 	uint16_t	gatt_mtu;
+	uint8_t		gatt_channels;
 
 	uint8_t		key_size;
 };
diff --git a/src/main.c b/src/main.c
index 1a6ab36a3..701cd279c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -108,6 +108,7 @@ static const char *gatt_options[] = {
 	"Cache",
 	"KeySize",
 	"ExchangeMTU",
+	"EATTChannels",
 	NULL
 };
 
@@ -444,6 +445,18 @@ static void parse_config(GKeyFile *config)
 		DBG("ExchangeMTU=%d", val);
 		main_opts.gatt_mtu = val;
 	}
+
+	val = g_key_file_get_integer(config, "GATT", "Channels", &err);
+	if (err) {
+		DBG("%s", err->message);
+		g_clear_error(&err);
+	} else {
+		DBG("Channels=%d", val);
+		/* Ensure the channels is within a valid range. */
+		val = MIN(val, 5);
+		val = MAX(val, 1);
+		main_opts.gatt_channels = val;
+	}
 }
 
 static void init_defaults(void)
@@ -470,6 +483,7 @@ static void init_defaults(void)
 
 	main_opts.gatt_cache = BT_GATT_CACHE_ALWAYS;
 	main_opts.gatt_mtu = BT_ATT_MAX_LE_MTU;
+	main_opts.gatt_channels = 3;
 }
 
 static void log_handler(const gchar *log_domain, GLogLevelFlags log_level,
diff --git a/src/main.conf b/src/main.conf
index 40687a755..35e4238f2 100644
--- a/src/main.conf
+++ b/src/main.conf
@@ -94,6 +94,11 @@
 # Defaults to 517
 #ExchangeMTU = 517
 
+# Number of ATT channels
+# Possible values: 1-5 (1 disables EATT)
+# Default to 3
+#Channels = 3
+
 [Policy]
 #
 # The ReconnectUUIDs defines the set of remote services that should try
-- 
2.21.0


  parent reply	other threads:[~2020-01-08  0:34 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-08  0:33 [PATCH BlueZ 00/22] Userspace Bluetooth 5.2 initial support Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 01/22] monitor: Add support for decoding ISO related commands Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 02/22] monitor: Add decoding of ISO related Link Layer PDUs Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 03/22] lib: Add definitions for ISO socket Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 04/22] tools: Add isotest tool Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 05/22] emulator: Add initial support for BT 5.2 Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 06/22] monitor: Add support for ISO packets Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 07/22] tools/btproxy: " Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 08/22] monitor: Fix decoding of CIS estabilished event Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 09/22] emulator/btdev: Add parameter to CIS Estabilished Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 10/22] lib: Add definitions for Enhanced Credits Based Mode Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 11/22] btio: Add mode to for Enhanced Credit Mode Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 12/22] monitor: Add decoding for L2CAP Enhanced Credit Based PDUs Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 13/22] l2test: Add support for L2CAP_ECRED_MODE Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 14/22] share/att: Add EATT support Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 15/22] shared/gatt-client: Add support for EATT features Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 16/22] gatt: Enable EATT bearer support Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 17/22] shared/gatt-server: Add support for Read Multiple Variable Length Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 18/22] shared/gatt-client: " Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 19/22] shared/gatt: Add support for Handle Value Multiple Notifications Luiz Augusto von Dentz
2020-01-08  0:33 ` [PATCH BlueZ 20/22] gatt: Add support for Notify Multiple Luiz Augusto von Dentz
2020-01-08  0:33 ` Luiz Augusto von Dentz [this message]
2020-01-08  0:33 ` [PATCH BlueZ 22/22] monitor: Add support for decoding EATT Luiz Augusto von Dentz
2020-01-16 11:54 ` [PATCH BlueZ 00/22] Userspace Bluetooth 5.2 initial support Grzegorz Kołodziejczyk
2020-01-16 19:51   ` Luiz Augusto von Dentz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200108003342.15458-22-luiz.dentz@gmail.com \
    --to=luiz.dentz@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).