Thread (14 messages) 14 messages, 2 authors, 2012-01-24

Re: [PATCH 1/8] gatt-service: Add support for 128-bit Bluetooth UUIDs

From: Anderson Lizardo <hidden>
Date: 2012-01-24 12:03:17

Hi Santiago,

On Tue, Jan 24, 2012 at 7:06 AM, Santiago Carot-Nemesio
[off-list ref] wrote:
quoted hunk ↗ jump to hunk
UUID services in GATT should be either 16-bit or 128-bit. Current
GATT interface does not allow to provide 128-bit ones. This patch
enables plugins to register services using 128-bit UUIDs.
---
 attrib/gatt-service.c  |   57 ++++++++++++++++++++++++++++++++++-------------
 attrib/gatt-service.h  |    2 +-
 plugins/gatt-example.c |    7 ++++-
 time/server.c          |    6 ++++-
 4 files changed, 52 insertions(+), 20 deletions(-)
diff --git a/attrib/gatt-service.c b/attrib/gatt-service.c
index bfefdee..eeda366 100644
--- a/attrib/gatt-service.c
+++ b/attrib/gatt-service.c
@@ -116,6 +116,28 @@ static GSList *parse_opts(gatt_option opt1, va_list args)
       return l;
 }

+static struct attribute *add_service_declaration(struct btd_adapter *adapter,
+                               uint16_t handle, uint16_t scv, bt_uuid_t *uuid)
typo: scv -> svc
quoted hunk ↗ jump to hunk
+{
+       bt_uuid_t bt_uuid;
+       uint8_t atval[16];
+       int len;
+
+       if (uuid->type == BT_UUID16) {
+               att_put_u16(uuid->value.u16, &atval[0]);
+               len = 2;
+       } else if (uuid->type == BT_UUID128) {
+               att_put_u128(uuid->value.u128, &atval[0]);
+               len = 16;
+       } else
+               return NULL;
+
+       bt_uuid16_create(&bt_uuid, scv);
+
+       return attrib_db_add(adapter, handle, &bt_uuid, ATT_NONE,
+                                               ATT_NOT_PERMITTED, atval, len);
+}
+
 static int att_read_reqs(int authorization, int authentication, uint8_t props)
 {
       if (authorization == GATT_CHR_VALUE_READ ||
@@ -268,15 +290,21 @@ static void service_attr_del(struct btd_adapter *adapter, uint16_t start_handle,
 }

 gboolean gatt_service_add(struct btd_adapter *adapter, uint16_t uuid,
-                               uint16_t svc_uuid, gatt_option opt1, ...)
+                               bt_uuid_t svc_uuid, gatt_option opt1, ...)
I think it is more efficient to pass svc_uuid as pointer (this avoids
a possible 128-bit copy).
 {
+       char uuidstr[MAX_LEN_UUID_STR];
       uint16_t start_handle, h;
       unsigned int size;
-       bt_uuid_t bt_uuid;
-       uint8_t atval[2];
       va_list args;
       GSList *chrs, *l;

+       bt_uuid_to_string(&svc_uuid, uuidstr, MAX_LEN_UUID_STR);
+
+       if (svc_uuid.type != BT_UUID16 && svc_uuid.type != BT_UUID128) {
+               error("Invalid service uuid: %s", uuidstr);
+               return FALSE;
+       }
+
       va_start(args, opt1);
       chrs = parse_opts(opt1, args);
       /* calculate how many attributes are necessary for this service */
Regards,
-- 
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help