diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2021-07-28 13:44:44 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2021-07-28 13:44:44 -0700 |
commit | ba8a23d4af16a747cf5e1f62f410d05aa277ee5c (patch) | |
tree | 7a25aa6f8e9e886cfc627e3fce6356c219a98e59 /src/gatt-database.c | |
parent | b497b5942a8beb8f89ca1c359c54ad67ec843055 (diff) | |
download | bluez-ba8a23d4af16a747cf5e1f62f410d05aa277ee5c.tar.gz |
gatt: Add support for Central Address Resolution characteristic
This adds Central Address Resolution characteristic so peripherals can
use directed advertising using RPA as initiator address.
Diffstat (limited to 'src/gatt-database.c')
-rw-r--r-- | src/gatt-database.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/src/gatt-database.c b/src/gatt-database.c index 8cf60c597..99c95f2d6 100644 --- a/src/gatt-database.c +++ b/src/gatt-database.c @@ -699,6 +699,18 @@ static void gap_appearance_read_cb(struct gatt_db_attribute *attrib, gatt_db_attribute_read_result(attrib, id, error, value, len); } +static void gap_car_read_cb(struct gatt_db_attribute *attrib, + unsigned int id, uint16_t offset, + uint8_t opcode, struct bt_att *att, + void *user_data) +{ + uint8_t value = 0x01; + + DBG("GAP Central Address Resolution read request\n"); + + gatt_db_attribute_read_result(attrib, id, 0, &value, sizeof(value)); +} + static sdp_record_t *record_new(uuid_t *uuid, uint16_t start, uint16_t end) { sdp_list_t *svclass_id, *apseq, *proto[2], *root, *aproto; @@ -820,7 +832,7 @@ static void populate_gap_service(struct btd_gatt_database *database) /* Add the GAP service */ bt_uuid16_create(&uuid, UUID_GAP); - service = gatt_db_add_service(database->db, &uuid, true, 5); + service = gatt_db_add_service(database->db, &uuid, true, 7); /* * Device Name characteristic. @@ -842,6 +854,17 @@ static void populate_gap_service(struct btd_gatt_database *database) NULL, database); gatt_db_attribute_set_fixed_length(attrib, 2); + /* + * Central Address Resolution characteristic. + */ + bt_uuid16_create(&uuid, GATT_CHARAC_CAR); + attrib = gatt_db_service_add_characteristic(service, &uuid, + BT_ATT_PERM_READ, + BT_GATT_CHRC_PROP_READ, + gap_car_read_cb, + NULL, database); + gatt_db_attribute_set_fixed_length(attrib, 1); + gatt_db_service_set_active(service, true); database_add_record(database, service); @@ -3853,13 +3876,7 @@ void btd_gatt_database_restore_svc_chng_ccc(struct btd_gatt_database *database) */ btd_adapter_for_each_device(database->adapter, restore_state, database); - /* This needs to be updated (probably to 0x0001) if we ever change - * core services - * - * TODO we could also store this info (along with CCC value) and be able - * to send 0x0001-0xffff only once per device. - */ - put_le16(0x000a, value); + put_le16(0x0001, value); put_le16(0xffff, value + 2); send_notification_to_devices(database, handle, value, sizeof(value), |