All of lore.kernel.org
 help / color / mirror / Atom feed
* [Bluez PATCH] gatt: Use the same crypto instance for each device
@ 2021-01-15 12:25 Archie Pusaka
  2021-01-15 13:37 ` [Bluez] " bluez.test.bot
  2021-01-15 18:39 ` [Bluez PATCH] " Luiz Augusto von Dentz
  0 siblings, 2 replies; 3+ messages in thread
From: Archie Pusaka @ 2021-01-15 12:25 UTC (permalink / raw)
  To: linux-bluetooth, Luiz Augusto von Dentz
  Cc: CrosBT Upstreaming, Archie Pusaka, Abhishek Pandit-Subedi,
	Sonny Sasaka

From: Archie Pusaka <apusaka@chromium.org>

Every time a device is found, BlueZ would need to open 3 socket
connections for crypto. On a noisy environment where there is a lot
of advertising devices, we could hit the max opened file limit. As
a result, connection to the device would fail until the temporary
devices are removed due to temporary timer timeouts.

This patch store a crypto instance in adapter and reuse the same
crypto instance for each device.

Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
Reviewed-by: Sonny Sasaka <sonnysasaka@chromium.org>
---
Hi BlueZ maintainers,

Is there a reason to have more than one crypto instance? If not,
we could just have a singleton and a getter get_crypto_instance()
which would instantiate a crypto object if it doesn't exist, in lieu
of bt_crypto_new().

 android/gatt.c        |  2 +-
 peripheral/gatt.c     |  4 ++--
 src/adapter.c         | 12 ++++++++++++
 src/adapter.h         |  2 ++
 src/device.c          |  2 +-
 src/gatt-database.c   |  2 +-
 src/shared/gatt-db.c  |  9 +++++++--
 src/shared/gatt-db.h  |  4 +++-
 tools/btgatt-client.c |  2 +-
 tools/btgatt-server.c |  2 +-
 unit/test-gatt.c      |  4 ++--
 11 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index a8a0c488b0..d00c4adf2c 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -7234,7 +7234,7 @@ bool bt_gatt_register(struct ipc *ipc, const bdaddr_t *addr)
 	app_connections = queue_new();
 	listen_apps = queue_new();
 	services_sdp = queue_new();
-	gatt_db = gatt_db_new();
+	gatt_db = gatt_db_new(NULL);
 
 	if (!gatt_db) {
 		error("gatt: Failed to allocate memory for database");
diff --git a/peripheral/gatt.c b/peripheral/gatt.c
index ff1354cb48..1991ec7d4b 100644
--- a/peripheral/gatt.c
+++ b/peripheral/gatt.c
@@ -261,7 +261,7 @@ void gatt_server_start(void)
 		return;
 	}
 
-	gatt_db = gatt_db_new();
+	gatt_db = gatt_db_new(NULL);
 	if (!gatt_db) {
 		close(att_fd);
 		att_fd = -1;
@@ -271,7 +271,7 @@ void gatt_server_start(void)
 	populate_gap_service(gatt_db);
 	populate_devinfo_service(gatt_db);
 
-	gatt_cache = gatt_db_new();
+	gatt_cache = gatt_db_new(NULL);
 
 	conn_list = queue_new();
 	if (!conn_list) {
diff --git a/src/adapter.c b/src/adapter.c
index c1f976323e..794fe1045d 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -46,6 +46,7 @@
 #include "src/shared/queue.h"
 #include "src/shared/att.h"
 #include "src/shared/gatt-db.h"
+#include "src/shared/crypto.h"
 
 #include "btio/btio.h"
 #include "btd.h"
@@ -281,6 +282,8 @@ struct btd_adapter {
 	bool is_default;		/* true if adapter is default one */
 
 	bool le_simult_roles_supported;
+
+	struct bt_crypto *crypto;
 };
 
 typedef enum {
@@ -5376,6 +5379,8 @@ static void adapter_free(gpointer user_data)
 
 	g_slist_free(adapter->connections);
 
+	bt_crypto_unref(adapter->crypto);
+
 	g_free(adapter->path);
 	g_free(adapter->name);
 	g_free(adapter->short_name);
@@ -6321,6 +6326,8 @@ static struct btd_adapter *btd_adapter_new(uint16_t index)
 
 	adapter->auths = g_queue_new();
 
+	adapter->crypto = bt_crypto_new();
+
 	return btd_adapter_ref(adapter);
 }
 
@@ -9917,3 +9924,8 @@ bool btd_has_kernel_features(uint32_t features)
 {
 	return (kernel_features & features) ? true : false;
 }
+
+struct bt_crypto *btd_adapter_get_crypto(struct btd_adapter *adapter)
+{
+	return adapter->crypto;
+}
diff --git a/src/adapter.h b/src/adapter.h
index 60b5e3bcca..2c7f06493a 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -240,3 +240,5 @@ enum kernel_features {
 };
 
 bool btd_has_kernel_features(uint32_t feature);
+
+struct bt_crypto *btd_adapter_get_crypto(struct btd_adapter *adapter);
diff --git a/src/device.c b/src/device.c
index af13badfc8..0cf7423cce 100644
--- a/src/device.c
+++ b/src/device.c
@@ -4047,7 +4047,7 @@ static struct btd_device *device_new(struct btd_adapter *adapter,
 
 	device->tx_power = 127;
 
-	device->db = gatt_db_new();
+	device->db = gatt_db_new(btd_adapter_get_crypto(adapter));
 	if (!device->db) {
 		g_free(device);
 		return NULL;
diff --git a/src/gatt-database.c b/src/gatt-database.c
index d99604826e..2024fdd5d2 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
@@ -3623,7 +3623,7 @@ struct btd_gatt_database *btd_gatt_database_new(struct btd_adapter *adapter)
 
 	database = new0(struct btd_gatt_database, 1);
 	database->adapter = btd_adapter_ref(adapter);
-	database->db = gatt_db_new();
+	database->db = gatt_db_new(btd_adapter_get_crypto(adapter));
 	database->records = queue_new();
 	database->device_states = queue_new();
 	database->apps = queue_new();
diff --git a/src/shared/gatt-db.c b/src/shared/gatt-db.c
index 8bff4d37aa..d616c17e47 100644
--- a/src/shared/gatt-db.c
+++ b/src/shared/gatt-db.c
@@ -235,12 +235,17 @@ struct gatt_db *gatt_db_ref(struct gatt_db *db)
 	return db;
 }
 
-struct gatt_db *gatt_db_new(void)
+struct gatt_db *gatt_db_new(struct bt_crypto *crypto)
 {
 	struct gatt_db *db;
 
 	db = new0(struct gatt_db, 1);
-	db->crypto = bt_crypto_new();
+
+	if (crypto)
+		db->crypto = bt_crypto_ref(crypto);
+	else
+		db->crypto = bt_crypto_new();
+
 	db->services = queue_new();
 	db->notify_list = queue_new();
 	db->next_handle = 0x0001;
diff --git a/src/shared/gatt-db.h b/src/shared/gatt-db.h
index 321a2aba61..1dac1af4fe 100644
--- a/src/shared/gatt-db.h
+++ b/src/shared/gatt-db.h
@@ -8,10 +8,12 @@
  *
  */
 
+#include "src/shared/crypto.h"
+
 struct gatt_db;
 struct gatt_db_attribute;
 
-struct gatt_db *gatt_db_new(void);
+struct gatt_db *gatt_db_new(struct bt_crypto *crypto);
 
 struct gatt_db *gatt_db_ref(struct gatt_db *db);
 void gatt_db_unref(struct gatt_db *db);
diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c
index 8c9365aa2c..945e24d6f8 100644
--- a/tools/btgatt-client.c
+++ b/tools/btgatt-client.c
@@ -197,7 +197,7 @@ static struct client *client_create(int fd, uint16_t mtu)
 	}
 
 	cli->fd = fd;
-	cli->db = gatt_db_new();
+	cli->db = gatt_db_new(NULL);
 	if (!cli->db) {
 		fprintf(stderr, "Failed to create GATT database\n");
 		bt_att_unref(cli->att);
diff --git a/tools/btgatt-server.c b/tools/btgatt-server.c
index 000145a3db..50004acee5 100644
--- a/tools/btgatt-server.c
+++ b/tools/btgatt-server.c
@@ -569,7 +569,7 @@ static struct server *server_create(int fd, uint16_t mtu, bool hr_visible)
 	server->device_name[name_len] = '\0';
 
 	server->fd = fd;
-	server->db = gatt_db_new();
+	server->db = gatt_db_new(NULL);
 	if (!server->db) {
 		fprintf(stderr, "Failed to create GATT database\n");
 		goto fail;
diff --git a/unit/test-gatt.c b/unit/test-gatt.c
index 4aa87d09c4..1916ace6c7 100644
--- a/unit/test-gatt.c
+++ b/unit/test-gatt.c
@@ -674,7 +674,7 @@ static struct context *create_context(uint16_t mtu, gconstpointer data)
 						"bt_gatt_server:", NULL);
 		break;
 	case CLIENT:
-		context->client_db = gatt_db_new();
+		context->client_db = gatt_db_new(NULL);
 		g_assert(context->client_db);
 
 		context->client = bt_gatt_client_new(context->client_db,
@@ -1363,7 +1363,7 @@ struct att_handle_spec {
 
 static struct gatt_db *make_db(const struct att_handle_spec *spec)
 {
-	struct gatt_db *db = gatt_db_new();
+	struct gatt_db *db = gatt_db_new(NULL);
 	struct gatt_db_attribute *att, *include_att;
 	bt_uuid_t uuid;
 
-- 
2.30.0.296.g2bfb1c46d8-goog


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* RE: [Bluez] gatt: Use the same crypto instance for each device
  2021-01-15 12:25 [Bluez PATCH] gatt: Use the same crypto instance for each device Archie Pusaka
@ 2021-01-15 13:37 ` bluez.test.bot
  2021-01-15 18:39 ` [Bluez PATCH] " Luiz Augusto von Dentz
  1 sibling, 0 replies; 3+ messages in thread
From: bluez.test.bot @ 2021-01-15 13:37 UTC (permalink / raw)
  To: linux-bluetooth, apusaka

[-- Attachment #1: Type: text/plain, Size: 9515 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=415407

---Test result---

##############################
Test: CheckPatch - PASS

##############################
Test: CheckGitLint - PASS

##############################
Test: CheckBuild - FAIL
Output:
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:17:19: error: redundant redeclaration of ‘bt_crypto_new’ [-Werror=redundant-decls]
   17 | struct bt_crypto *bt_crypto_new(void);
      |                   ^~~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:17:19: note: previous declaration of ‘bt_crypto_new’ was here
   17 | struct bt_crypto *bt_crypto_new(void);
      |                   ^~~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:19:19: error: redundant redeclaration of ‘bt_crypto_ref’ [-Werror=redundant-decls]
   19 | struct bt_crypto *bt_crypto_ref(struct bt_crypto *crypto);
      |                   ^~~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:19:19: note: previous declaration of ‘bt_crypto_ref’ was here
   19 | struct bt_crypto *bt_crypto_ref(struct bt_crypto *crypto);
      |                   ^~~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:20:6: error: redundant redeclaration of ‘bt_crypto_unref’ [-Werror=redundant-decls]
   20 | void bt_crypto_unref(struct bt_crypto *crypto);
      |      ^~~~~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:20:6: note: previous declaration of ‘bt_crypto_unref’ was here
   20 | void bt_crypto_unref(struct bt_crypto *crypto);
      |      ^~~~~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:22:6: error: redundant redeclaration of ‘bt_crypto_random_bytes’ [-Werror=redundant-decls]
   22 | bool bt_crypto_random_bytes(struct bt_crypto *crypto,
      |      ^~~~~~~~~~~~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:22:6: note: previous declaration of ‘bt_crypto_random_bytes’ was here
   22 | bool bt_crypto_random_bytes(struct bt_crypto *crypto,
      |      ^~~~~~~~~~~~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:25:6: error: redundant redeclaration of ‘bt_crypto_e’ [-Werror=redundant-decls]
   25 | bool bt_crypto_e(struct bt_crypto *crypto, const uint8_t key[16],
      |      ^~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:25:6: note: previous declaration of ‘bt_crypto_e’ was here
   25 | bool bt_crypto_e(struct bt_crypto *crypto, const uint8_t key[16],
      |      ^~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:27:6: error: redundant redeclaration of ‘bt_crypto_ah’ [-Werror=redundant-decls]
   27 | bool bt_crypto_ah(struct bt_crypto *crypto, const uint8_t k[16],
      |      ^~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:27:6: note: previous declaration of ‘bt_crypto_ah’ was here
   27 | bool bt_crypto_ah(struct bt_crypto *crypto, const uint8_t k[16],
      |      ^~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:29:6: error: redundant redeclaration of ‘bt_crypto_c1’ [-Werror=redundant-decls]
   29 | bool bt_crypto_c1(struct bt_crypto *crypto, const uint8_t k[16],
      |      ^~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:29:6: note: previous declaration of ‘bt_crypto_c1’ was here
   29 | bool bt_crypto_c1(struct bt_crypto *crypto, const uint8_t k[16],
      |      ^~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:34:6: error: redundant redeclaration of ‘bt_crypto_s1’ [-Werror=redundant-decls]
   34 | bool bt_crypto_s1(struct bt_crypto *crypto, const uint8_t k[16],
      |      ^~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:34:6: note: previous declaration of ‘bt_crypto_s1’ was here
   34 | bool bt_crypto_s1(struct bt_crypto *crypto, const uint8_t k[16],
      |      ^~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:37:6: error: redundant redeclaration of ‘bt_crypto_f4’ [-Werror=redundant-decls]
   37 | bool bt_crypto_f4(struct bt_crypto *crypto, uint8_t u[32], uint8_t v[32],
      |      ^~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:37:6: note: previous declaration of ‘bt_crypto_f4’ was here
   37 | bool bt_crypto_f4(struct bt_crypto *crypto, uint8_t u[32], uint8_t v[32],
      |      ^~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:39:6: error: redundant redeclaration of ‘bt_crypto_f5’ [-Werror=redundant-decls]
   39 | bool bt_crypto_f5(struct bt_crypto *crypto, uint8_t w[32], uint8_t n1[16],
      |      ^~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:39:6: note: previous declaration of ‘bt_crypto_f5’ was here
   39 | bool bt_crypto_f5(struct bt_crypto *crypto, uint8_t w[32], uint8_t n1[16],
      |      ^~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:42:6: error: redundant redeclaration of ‘bt_crypto_f6’ [-Werror=redundant-decls]
   42 | bool bt_crypto_f6(struct bt_crypto *crypto, uint8_t w[16], uint8_t n1[16],
      |      ^~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:42:6: note: previous declaration of ‘bt_crypto_f6’ was here
   42 | bool bt_crypto_f6(struct bt_crypto *crypto, uint8_t w[16], uint8_t n1[16],
      |      ^~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:45:6: error: redundant redeclaration of ‘bt_crypto_g2’ [-Werror=redundant-decls]
   45 | bool bt_crypto_g2(struct bt_crypto *crypto, uint8_t u[32], uint8_t v[32],
      |      ^~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:45:6: note: previous declaration of ‘bt_crypto_g2’ was here
   45 | bool bt_crypto_g2(struct bt_crypto *crypto, uint8_t u[32], uint8_t v[32],
      |      ^~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:47:6: error: redundant redeclaration of ‘bt_crypto_h6’ [-Werror=redundant-decls]
   47 | bool bt_crypto_h6(struct bt_crypto *crypto, const uint8_t w[16],
      |      ^~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:47:6: note: previous declaration of ‘bt_crypto_h6’ was here
   47 | bool bt_crypto_h6(struct bt_crypto *crypto, const uint8_t w[16],
      |      ^~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:49:6: error: redundant redeclaration of ‘bt_crypto_sign_att’ [-Werror=redundant-decls]
   49 | bool bt_crypto_sign_att(struct bt_crypto *crypto, const uint8_t key[16],
      |      ^~~~~~~~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:49:6: note: previous declaration of ‘bt_crypto_sign_att’ was here
   49 | bool bt_crypto_sign_att(struct bt_crypto *crypto, const uint8_t key[16],
      |      ^~~~~~~~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:52:6: error: redundant redeclaration of ‘bt_crypto_verify_att_sign’ [-Werror=redundant-decls]
   52 | bool bt_crypto_verify_att_sign(struct bt_crypto *crypto, const uint8_t key[16],
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:52:6: note: previous declaration of ‘bt_crypto_verify_att_sign’ was here
   52 | bool bt_crypto_verify_att_sign(struct bt_crypto *crypto, const uint8_t key[16],
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from src/shared/gatt-db.c:25:
./src/shared/crypto.h:54:6: error: redundant redeclaration of ‘bt_crypto_gatt_hash’ [-Werror=redundant-decls]
   54 | bool bt_crypto_gatt_hash(struct bt_crypto *crypto, struct iovec *iov,
      |      ^~~~~~~~~~~~~~~~~~~
In file included from ./src/shared/gatt-db.h:11,
                 from src/shared/gatt-db.c:24:
./src/shared/crypto.h:54:6: note: previous declaration of ‘bt_crypto_gatt_hash’ was here
   54 | bool bt_crypto_gatt_hash(struct bt_crypto *crypto, struct iovec *iov,
      |      ^~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:6808: src/shared/gatt-db.lo] Error 1
make: *** [Makefile:4023: all] Error 2


##############################
Test: MakeCheck - SKIPPED
Output:
checkbuild not success



---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Bluez PATCH] gatt: Use the same crypto instance for each device
  2021-01-15 12:25 [Bluez PATCH] gatt: Use the same crypto instance for each device Archie Pusaka
  2021-01-15 13:37 ` [Bluez] " bluez.test.bot
@ 2021-01-15 18:39 ` Luiz Augusto von Dentz
  1 sibling, 0 replies; 3+ messages in thread
From: Luiz Augusto von Dentz @ 2021-01-15 18:39 UTC (permalink / raw)
  To: Archie Pusaka
  Cc: linux-bluetooth, CrosBT Upstreaming, Archie Pusaka,
	Abhishek Pandit-Subedi, Sonny Sasaka

Hi Archie,

On Fri, Jan 15, 2021 at 4:25 AM Archie Pusaka <apusaka@google.com> wrote:
>
> From: Archie Pusaka <apusaka@chromium.org>
>
> Every time a device is found, BlueZ would need to open 3 socket
> connections for crypto. On a noisy environment where there is a lot
> of advertising devices, we could hit the max opened file limit. As
> a result, connection to the device would fail until the temporary
> devices are removed due to temporary timer timeouts.
>
> This patch store a crypto instance in adapter and reuse the same
> crypto instance for each device.

I think we are better off transforming bt_crypto in a singleton.

> Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
> Reviewed-by: Sonny Sasaka <sonnysasaka@chromium.org>
> ---
> Hi BlueZ maintainers,
>
> Is there a reason to have more than one crypto instance? If not,
> we could just have a singleton and a getter get_crypto_instance()
> which would instantiate a crypto object if it doesn't exist, in lieu
> of bt_crypto_new().
>
>  android/gatt.c        |  2 +-
>  peripheral/gatt.c     |  4 ++--
>  src/adapter.c         | 12 ++++++++++++
>  src/adapter.h         |  2 ++
>  src/device.c          |  2 +-
>  src/gatt-database.c   |  2 +-
>  src/shared/gatt-db.c  |  9 +++++++--
>  src/shared/gatt-db.h  |  4 +++-
>  tools/btgatt-client.c |  2 +-
>  tools/btgatt-server.c |  2 +-
>  unit/test-gatt.c      |  4 ++--
>  11 files changed, 33 insertions(+), 12 deletions(-)
>
> diff --git a/android/gatt.c b/android/gatt.c
> index a8a0c488b0..d00c4adf2c 100644
> --- a/android/gatt.c
> +++ b/android/gatt.c
> @@ -7234,7 +7234,7 @@ bool bt_gatt_register(struct ipc *ipc, const bdaddr_t *addr)
>         app_connections = queue_new();
>         listen_apps = queue_new();
>         services_sdp = queue_new();
> -       gatt_db = gatt_db_new();
> +       gatt_db = gatt_db_new(NULL);
>
>         if (!gatt_db) {
>                 error("gatt: Failed to allocate memory for database");
> diff --git a/peripheral/gatt.c b/peripheral/gatt.c
> index ff1354cb48..1991ec7d4b 100644
> --- a/peripheral/gatt.c
> +++ b/peripheral/gatt.c
> @@ -261,7 +261,7 @@ void gatt_server_start(void)
>                 return;
>         }
>
> -       gatt_db = gatt_db_new();
> +       gatt_db = gatt_db_new(NULL);
>         if (!gatt_db) {
>                 close(att_fd);
>                 att_fd = -1;
> @@ -271,7 +271,7 @@ void gatt_server_start(void)
>         populate_gap_service(gatt_db);
>         populate_devinfo_service(gatt_db);
>
> -       gatt_cache = gatt_db_new();
> +       gatt_cache = gatt_db_new(NULL);
>
>         conn_list = queue_new();
>         if (!conn_list) {
> diff --git a/src/adapter.c b/src/adapter.c
> index c1f976323e..794fe1045d 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -46,6 +46,7 @@
>  #include "src/shared/queue.h"
>  #include "src/shared/att.h"
>  #include "src/shared/gatt-db.h"
> +#include "src/shared/crypto.h"
>
>  #include "btio/btio.h"
>  #include "btd.h"
> @@ -281,6 +282,8 @@ struct btd_adapter {
>         bool is_default;                /* true if adapter is default one */
>
>         bool le_simult_roles_supported;
> +
> +       struct bt_crypto *crypto;
>  };
>
>  typedef enum {
> @@ -5376,6 +5379,8 @@ static void adapter_free(gpointer user_data)
>
>         g_slist_free(adapter->connections);
>
> +       bt_crypto_unref(adapter->crypto);
> +
>         g_free(adapter->path);
>         g_free(adapter->name);
>         g_free(adapter->short_name);
> @@ -6321,6 +6326,8 @@ static struct btd_adapter *btd_adapter_new(uint16_t index)
>
>         adapter->auths = g_queue_new();
>
> +       adapter->crypto = bt_crypto_new();
> +
>         return btd_adapter_ref(adapter);
>  }
>
> @@ -9917,3 +9924,8 @@ bool btd_has_kernel_features(uint32_t features)
>  {
>         return (kernel_features & features) ? true : false;
>  }
> +
> +struct bt_crypto *btd_adapter_get_crypto(struct btd_adapter *adapter)
> +{
> +       return adapter->crypto;
> +}
> diff --git a/src/adapter.h b/src/adapter.h
> index 60b5e3bcca..2c7f06493a 100644
> --- a/src/adapter.h
> +++ b/src/adapter.h
> @@ -240,3 +240,5 @@ enum kernel_features {
>  };
>
>  bool btd_has_kernel_features(uint32_t feature);
> +
> +struct bt_crypto *btd_adapter_get_crypto(struct btd_adapter *adapter);
> diff --git a/src/device.c b/src/device.c
> index af13badfc8..0cf7423cce 100644
> --- a/src/device.c
> +++ b/src/device.c
> @@ -4047,7 +4047,7 @@ static struct btd_device *device_new(struct btd_adapter *adapter,
>
>         device->tx_power = 127;
>
> -       device->db = gatt_db_new();
> +       device->db = gatt_db_new(btd_adapter_get_crypto(adapter));
>         if (!device->db) {
>                 g_free(device);
>                 return NULL;
> diff --git a/src/gatt-database.c b/src/gatt-database.c
> index d99604826e..2024fdd5d2 100644
> --- a/src/gatt-database.c
> +++ b/src/gatt-database.c
> @@ -3623,7 +3623,7 @@ struct btd_gatt_database *btd_gatt_database_new(struct btd_adapter *adapter)
>
>         database = new0(struct btd_gatt_database, 1);
>         database->adapter = btd_adapter_ref(adapter);
> -       database->db = gatt_db_new();
> +       database->db = gatt_db_new(btd_adapter_get_crypto(adapter));
>         database->records = queue_new();
>         database->device_states = queue_new();
>         database->apps = queue_new();
> diff --git a/src/shared/gatt-db.c b/src/shared/gatt-db.c
> index 8bff4d37aa..d616c17e47 100644
> --- a/src/shared/gatt-db.c
> +++ b/src/shared/gatt-db.c
> @@ -235,12 +235,17 @@ struct gatt_db *gatt_db_ref(struct gatt_db *db)
>         return db;
>  }
>
> -struct gatt_db *gatt_db_new(void)
> +struct gatt_db *gatt_db_new(struct bt_crypto *crypto)
>  {
>         struct gatt_db *db;
>
>         db = new0(struct gatt_db, 1);
> -       db->crypto = bt_crypto_new();
> +
> +       if (crypto)
> +               db->crypto = bt_crypto_ref(crypto);
> +       else
> +               db->crypto = bt_crypto_new();
> +
>         db->services = queue_new();
>         db->notify_list = queue_new();
>         db->next_handle = 0x0001;
> diff --git a/src/shared/gatt-db.h b/src/shared/gatt-db.h
> index 321a2aba61..1dac1af4fe 100644
> --- a/src/shared/gatt-db.h
> +++ b/src/shared/gatt-db.h
> @@ -8,10 +8,12 @@
>   *
>   */
>
> +#include "src/shared/crypto.h"
> +
>  struct gatt_db;
>  struct gatt_db_attribute;
>
> -struct gatt_db *gatt_db_new(void);
> +struct gatt_db *gatt_db_new(struct bt_crypto *crypto);
>
>  struct gatt_db *gatt_db_ref(struct gatt_db *db);
>  void gatt_db_unref(struct gatt_db *db);
> diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c
> index 8c9365aa2c..945e24d6f8 100644
> --- a/tools/btgatt-client.c
> +++ b/tools/btgatt-client.c
> @@ -197,7 +197,7 @@ static struct client *client_create(int fd, uint16_t mtu)
>         }
>
>         cli->fd = fd;
> -       cli->db = gatt_db_new();
> +       cli->db = gatt_db_new(NULL);
>         if (!cli->db) {
>                 fprintf(stderr, "Failed to create GATT database\n");
>                 bt_att_unref(cli->att);
> diff --git a/tools/btgatt-server.c b/tools/btgatt-server.c
> index 000145a3db..50004acee5 100644
> --- a/tools/btgatt-server.c
> +++ b/tools/btgatt-server.c
> @@ -569,7 +569,7 @@ static struct server *server_create(int fd, uint16_t mtu, bool hr_visible)
>         server->device_name[name_len] = '\0';
>
>         server->fd = fd;
> -       server->db = gatt_db_new();
> +       server->db = gatt_db_new(NULL);
>         if (!server->db) {
>                 fprintf(stderr, "Failed to create GATT database\n");
>                 goto fail;
> diff --git a/unit/test-gatt.c b/unit/test-gatt.c
> index 4aa87d09c4..1916ace6c7 100644
> --- a/unit/test-gatt.c
> +++ b/unit/test-gatt.c
> @@ -674,7 +674,7 @@ static struct context *create_context(uint16_t mtu, gconstpointer data)
>                                                 "bt_gatt_server:", NULL);
>                 break;
>         case CLIENT:
> -               context->client_db = gatt_db_new();
> +               context->client_db = gatt_db_new(NULL);
>                 g_assert(context->client_db);
>
>                 context->client = bt_gatt_client_new(context->client_db,
> @@ -1363,7 +1363,7 @@ struct att_handle_spec {
>
>  static struct gatt_db *make_db(const struct att_handle_spec *spec)
>  {
> -       struct gatt_db *db = gatt_db_new();
> +       struct gatt_db *db = gatt_db_new(NULL);
>         struct gatt_db_attribute *att, *include_att;
>         bt_uuid_t uuid;
>
> --
> 2.30.0.296.g2bfb1c46d8-goog
>


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-01-15 18:40 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-01-15 12:25 [Bluez PATCH] gatt: Use the same crypto instance for each device Archie Pusaka
2021-01-15 13:37 ` [Bluez] " bluez.test.bot
2021-01-15 18:39 ` [Bluez PATCH] " Luiz Augusto von Dentz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.