From: Andre Guedes <andre.guedes@xxxxxxxxxxxxx> This patch adds a helper function to create attribute with static values. It is intended to be used to create GATT services, and characteristic declarations. --- src/gatt.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/gatt.c b/src/gatt.c index f7b74d6..eed4fae 100644 --- a/src/gatt.c +++ b/src/gatt.c @@ -26,10 +26,12 @@ #endif #include <glib.h> +#include <bluetooth/bluetooth.h> #include "log.h" #include "lib/uuid.h" #include "attrib/att.h" +#include "src/shared/util.h" #include "gatt-dbus.h" #include "gatt.h" @@ -48,6 +50,33 @@ struct btd_attribute { static GList *local_attribute_db; static uint16_t next_handle = 0x0001; +static inline void put_uuid(const bt_uuid_t *src, void *dst) +{ + if (src->type == BT_UUID16) + put_unaligned(cpu_to_le16(src->value.u16), (uint16_t *) dst); + else + htob128(&(src->value.u128), (uint128_t *) dst); +} + +/* + * Helper function to create new attributes containing constant/static values. + * eg: declaration of services/characteristics, and characteristics with + * fixed values. + */ +static struct btd_attribute *new_const_attribute(const bt_uuid_t *type, + const uint8_t *value, + uint16_t len) +{ + struct btd_attribute *attr = malloc0(sizeof(struct btd_attribute) + + len); + + attr->type = *type; + memcpy(&attr->value, value, len); + attr->value_len = len; + + return attr; +} + static int local_database_add(uint16_t handle, struct btd_attribute *attr) { attr->handle = handle; @@ -59,9 +88,9 @@ static int local_database_add(uint16_t handle, struct btd_attribute *attr) struct btd_attribute *btd_gatt_add_service(const bt_uuid_t *uuid) { + struct btd_attribute *attr; uint16_t len = bt_uuid_len(uuid); - struct btd_attribute *attr = g_malloc0(sizeof(struct btd_attribute) + - len); + uint8_t value[len]; /* * Service DECLARATION @@ -75,13 +104,13 @@ struct btd_attribute *btd_gatt_add_service(const bt_uuid_t *uuid) * (2) - 2 or 16 octets: Service UUID */ - attr->type = primary_uuid; + /* Set attribute value */ + put_uuid(uuid, value); - att_put_uuid(*uuid, attr->value); - attr->value_len = len; + attr = new_const_attribute(&primary_uuid, value, len); if (local_database_add(next_handle, attr) < 0) { - g_free(attr); + free(attr); return NULL; } -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html