summaryrefslogtreecommitdiff
path: root/src/gatt-database.c
diff options
context:
space:
mode:
authorAlain Michaud <alainm@chromium.org>2020-07-17 14:40:07 +0000
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-07-17 13:35:34 -0700
commitd5e07945c4aa36a83addc3c269f55c720c28afdb (patch)
tree5712111b1e15a62dc590368286bf8ec99473d677 /src/gatt-database.c
parent5fa084b0a81cdb684bb8e8c5ee5bf2fc356c0182 (diff)
downloadbluez-d5e07945c4aa36a83addc3c269f55c720c28afdb.tar.gz
gatt: Support DeviceInfo Service when vid/pid is specified
This patch adds support for the PNPID characteristic when configured in main.conf. This was validated as read correclty both by manually reading the valud and confirming in the Ellisys Analyzer. ATT Read (PnP ID: Source=Bluetooth ID, Vendor=224, Product=50181, ATT Read Response Packet (Source=Bluetooth ID, Vendor=224, Product=50181, Version=86) | OK | 7 bytes (01 E0 00 05 C4 56 00)
Diffstat (limited to 'src/gatt-database.c')
-rw-r--r--src/gatt-database.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/gatt-database.c b/src/gatt-database.c
index 95ba39897..07d567078 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
@@ -57,6 +57,7 @@
#define UUID_GAP 0x1800
#define UUID_GATT 0x1801
+#define UUID_DIS 0x180a
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
@@ -1233,11 +1234,51 @@ static void populate_gatt_service(struct btd_gatt_database *database)
database_add_record(database, service);
}
+static void device_info_read_pnp_id_cb(struct gatt_db_attribute *attrib,
+ unsigned int id, uint16_t offset,
+ uint8_t opcode, struct bt_att *att,
+ void *user_data)
+{
+ uint8_t pdu[7];
+
+ pdu[0] = main_opts.did_source;
+ put_le16(main_opts.did_vendor, &pdu[1]);
+ put_le16(main_opts.did_product, &pdu[3]);
+ put_le16(main_opts.did_version, &pdu[5]);
+
+ gatt_db_attribute_read_result(attrib, id, 0, pdu, sizeof(pdu));
+}
+
+static void populate_devinfo_service(struct btd_gatt_database *database)
+{
+ struct gatt_db_attribute *service;
+ bt_uuid_t uuid;
+
+ bt_uuid16_create(&uuid, UUID_DIS);
+ service = gatt_db_add_service(database->db, &uuid, true, 3);
+
+ if (main_opts.did_source > 0) {
+ bt_uuid16_create(&uuid, GATT_CHARAC_PNP_ID);
+ gatt_db_service_add_characteristic(service, &uuid,
+ BT_ATT_PERM_READ,
+ BT_GATT_CHRC_PROP_READ,
+ device_info_read_pnp_id_cb,
+ NULL, database);
+ }
+
+ gatt_db_service_set_active(service, true);
+
+ database_add_record(database, service);
+}
static void register_core_services(struct btd_gatt_database *database)
{
populate_gap_service(database);
populate_gatt_service(database);
+
+ if (main_opts.did_source > 0)
+ populate_devinfo_service(database);
+
}
static void conf_cb(void *user_data)