GATT: use one type for all server attributes

Right now we have three types, for attributes depending on how long
the uuid is. Instead, use one type.

Change-Id: I33bb4f3c57b7b1516eda871a77b71661b7ba39ce
diff --git a/stack/gatt/gatt_db.c b/stack/gatt/gatt_db.c
index cffcc70..91da722 100644
--- a/stack/gatt/gatt_db.c
+++ b/stack/gatt/gatt_db.c
@@ -102,7 +102,7 @@
     }
     else
     {
-        return &((tGATT_ATTR16 *)p_db->p_attr_list)->p_value->uuid;
+        return &((tGATT_ATTR *)p_db->p_attr_list)->p_value->uuid;
     }
 }
 
@@ -115,7 +115,7 @@
 ** Returns          status of operation.
 **
 *******************************************************************************/
-static tGATT_STATUS gatts_check_attr_readability(tGATT_ATTR16 *p_attr,
+static tGATT_STATUS gatts_check_attr_readability(tGATT_ATTR *p_attr,
                                                  UINT16 offset,
                                                  BOOLEAN read_long,
                                                  tGATT_SEC_FLAG sec_flag,
@@ -163,9 +163,9 @@
     }
 
 
-    if (read_long)
+    if (read_long && p_attr->uuid.len == LEN_UUID_16)
     {
-        switch (p_attr->uuid)
+        switch (p_attr->uuid.uu.uuid16)
         {
             case GATT_UUID_PRI_SERVICE:
             case GATT_UUID_SEC_SERVICE:
@@ -216,7 +216,7 @@
     UINT16          len = 0, uuid16 = 0;
     UINT8           *p = *p_data;
     tGATT_STATUS    status;
-    tGATT_ATTR16    *p_attr16  = (tGATT_ATTR16  *)p_attr;
+    tGATT_ATTR    *p_attr16  = (tGATT_ATTR  *)p_attr;
 
     GATT_TRACE_DEBUG("read_attr_value uuid=0x%04x perm=0x%0x sec_flag=0x%x offset=%d read_long=%d",
                       p_attr16->uuid,
@@ -225,13 +225,13 @@
                       offset,
                       read_long);
 
-    status = gatts_check_attr_readability((tGATT_ATTR16 *)p_attr, offset, read_long, sec_flag, key_size);
+    status = gatts_check_attr_readability((tGATT_ATTR *)p_attr, offset, read_long, sec_flag, key_size);
 
     if (status != GATT_SUCCESS)
         return status;
 
-    if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16)
-        uuid16 = p_attr16->uuid;
+    if (p_attr16->uuid.len == LEN_UUID_16)
+        uuid16 = p_attr16->uuid.uu.uuid16;
 
     status = GATT_NO_RESOURCES;
 
@@ -246,26 +246,26 @@
     }
     else if (uuid16 == GATT_UUID_CHAR_DECLARE)
     {
-        len = (((tGATT_ATTR16 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_16) ? 5 :19;
+        len = (((tGATT_ATTR *)(p_attr16->p_next))->uuid.len == LEN_UUID_16) ? 5 :19;
 
         if (mtu >= len)
         {
             UINT8_TO_STREAM(p, p_attr16->p_value->char_decl.property);
             UINT16_TO_STREAM(p, p_attr16->p_value->char_decl.char_val_handle);
 
-            if (((tGATT_ATTR16 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_16)
+            if (((tGATT_ATTR *)(p_attr16->p_next))->uuid.len == LEN_UUID_16)
             {
-                UINT16_TO_STREAM(p, ((tGATT_ATTR16 *)(p_attr16->p_next))->uuid);
+                UINT16_TO_STREAM(p, ((tGATT_ATTR *)(p_attr16->p_next))->uuid.uu.uuid16);
             }
             /* convert a 32bits UUID to 128 bits */
-            else if (((tGATT_ATTR32 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_32)
+            else if (((tGATT_ATTR *)(p_attr16->p_next))->uuid.len == LEN_UUID_32)
             {
-                gatt_convert_uuid32_to_uuid128 (p, ((tGATT_ATTR32 *)(p_attr16->p_next))->uuid);
+                gatt_convert_uuid32_to_uuid128 (p, ((tGATT_ATTR *)(p_attr16->p_next))->uuid.uu.uuid32);
                 p += LEN_UUID_128;
             }
             else
             {
-                ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *)(p_attr16->p_next))->uuid, LEN_UUID_128);
+                ARRAY_TO_STREAM (p, ((tGATT_ATTR *)(p_attr16->p_next))->uuid.uu.uuid128, LEN_UUID_128);
             }
             status = GATT_SUCCESS;
         }
@@ -332,32 +332,18 @@
                                                UINT16       *p_cur_handle)
 {
     tGATT_STATUS status = GATT_NOT_FOUND;
-    tGATT_ATTR16  *p_attr;
+    tGATT_ATTR  *p_attr;
     UINT16      len = 0;
     UINT8       *p = (UINT8 *)(p_rsp + 1) + p_rsp->len + L2CAP_MIN_OFFSET;
     tBT_UUID    attr_uuid;
 
     if (p_db && p_db->p_attr_list)
     {
-        p_attr = (tGATT_ATTR16 *)p_db->p_attr_list;
+        p_attr = (tGATT_ATTR *)p_db->p_attr_list;
 
         while (p_attr && p_attr->handle <= e_handle)
         {
-            if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16)
-            {
-                attr_uuid.len = LEN_UUID_16;
-                attr_uuid.uu.uuid16 = p_attr->uuid;
-            }
-            else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
-            {
-                attr_uuid.len = LEN_UUID_32;
-                attr_uuid.uu.uuid32 = ((tGATT_ATTR32 *)p_attr)->uuid;
-            }
-            else
-            {
-                attr_uuid.len = LEN_UUID_128;
-                memcpy(attr_uuid.uu.uuid128, ((tGATT_ATTR128 *)p_attr)->uuid, LEN_UUID_128);
-            }
+            attr_uuid = p_attr->uuid;
 
             if (p_attr->handle >= s_handle && gatt_uuid_compare(type, attr_uuid))
             {
@@ -401,7 +387,7 @@
                     break;
                 }
             }
-            p_attr = (tGATT_ATTR16 *)p_attr->p_next;
+            p_attr = (tGATT_ATTR *)p_attr->p_next;
         }
     }
 
@@ -440,7 +426,7 @@
 UINT16 gatts_add_included_service (tGATT_SVC_DB *p_db, UINT16 s_handle, UINT16 e_handle,
                                    tBT_UUID service)
 {
-    tGATT_ATTR16      *p_attr;
+    tGATT_ATTR      *p_attr;
     tBT_UUID         uuid = {LEN_UUID_16, {GATT_UUID_INCLUDE_SERVICE}};
 
     GATT_TRACE_DEBUG("gatts_add_included_service: s_hdl = 0x%04x e_hdl = 0x%04x uuid = 0x%04x",
@@ -452,7 +438,7 @@
         return 0;
     }
 
-    if ((p_attr = (tGATT_ATTR16 *) allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL)
+    if ((p_attr = (tGATT_ATTR *) allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL)
     {
         if (copy_extra_byte_in_db(p_db, (void **)&p_attr->p_value, sizeof(tGATT_INCL_SRVC)))
         {
@@ -490,12 +476,12 @@
                                  tGATT_CHAR_PROP property,
                                  tBT_UUID * p_char_uuid)
 {
-    tGATT_ATTR16     *p_char_decl, *p_char_val;
+    tGATT_ATTR     *p_char_decl, *p_char_val;
     tBT_UUID        uuid = {LEN_UUID_16, {GATT_UUID_CHAR_DECLARE}};
 
     GATT_TRACE_DEBUG("gatts_add_characteristic perm=0x%0x property=0x%0x", perm, property);
 
-    if ((p_char_decl = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL)
+    if ((p_char_decl = (tGATT_ATTR *)allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL)
     {
         if (!copy_extra_byte_in_db(p_db, (void **)&p_char_decl->p_value, sizeof(tGATT_CHAR_DECL)))
         {
@@ -503,7 +489,7 @@
             return 0;
         }
 
-        p_char_val = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, p_char_uuid, perm);
+        p_char_val = (tGATT_ATTR *)allocate_attr_in_db(p_db, p_char_uuid, perm);
 
         if (p_char_val == NULL)
         {
@@ -583,12 +569,12 @@
 UINT16 gatts_add_char_descr (tGATT_SVC_DB *p_db, tGATT_PERM perm,
                              tBT_UUID *     p_descr_uuid)
 {
-    tGATT_ATTR16    *p_char_dscptr;
+    tGATT_ATTR    *p_char_dscptr;
 
     GATT_TRACE_DEBUG("gatts_add_char_descr uuid=0x%04x", p_descr_uuid->uu.uuid16);
 
     /* Add characteristic descriptors */
-    if ((p_char_dscptr = (tGATT_ATTR16 *)allocate_attr_in_db(p_db,
+    if ((p_char_dscptr = (tGATT_ATTR *)allocate_attr_in_db(p_db,
                                                              p_descr_uuid,
                                                              perm))
         == NULL)
@@ -635,12 +621,12 @@
                                              UINT32 trans_id)
 {
     tGATT_STATUS status = GATT_NOT_FOUND;
-    tGATT_ATTR16  *p_attr;
+    tGATT_ATTR  *p_attr;
     UINT8       *pp = p_value;
 
     if (p_db && p_db->p_attr_list)
     {
-        p_attr = (tGATT_ATTR16 *)p_db->p_attr_list;
+        p_attr = (tGATT_ATTR *)p_db->p_attr_list;
 
         while (p_attr && handle >= p_attr->handle)
         {
@@ -656,7 +642,7 @@
                 }
                 break;
             }
-            p_attr = (tGATT_ATTR16 *)p_attr->p_next;
+            p_attr = (tGATT_ATTR *)p_attr->p_next;
         }
     }
 
@@ -689,11 +675,11 @@
                                         UINT8 key_size)
 {
     tGATT_STATUS status = GATT_NOT_FOUND;
-    tGATT_ATTR16  *p_attr;
+    tGATT_ATTR  *p_attr;
 
     if (p_db && p_db->p_attr_list)
     {
-        p_attr = (tGATT_ATTR16 *)p_db->p_attr_list;
+        p_attr = (tGATT_ATTR *)p_db->p_attr_list;
 
         while (p_attr && handle >= p_attr->handle)
         {
@@ -704,7 +690,7 @@
                                                        sec_flag, key_size);
                 break;
             }
-            p_attr = (tGATT_ATTR16 *) p_attr->p_next;
+            p_attr = (tGATT_ATTR *) p_attr->p_next;
         }
     }
 
@@ -733,7 +719,7 @@
                                           UINT16 len, tGATT_SEC_FLAG sec_flag, UINT8 key_size)
 {
     tGATT_STATUS    status = GATT_NOT_FOUND;
-    tGATT_ATTR16    *p_attr;
+    tGATT_ATTR    *p_attr;
     UINT16          max_size = 0;
     tGATT_PERM      perm;
     UINT16          min_key_size;
@@ -743,7 +729,7 @@
 
     if (p_db != NULL)
     {
-        p_attr = (tGATT_ATTR16 *) p_db->p_attr_list;
+        p_attr = (tGATT_ATTR *) p_db->p_attr_list;
 
         while (p_attr != NULL)
         {
@@ -824,9 +810,9 @@
                 }
                 else /* writable: must be char value declaration or char descritpors */
                 {
-                    if(p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16)
+                    if(p_attr->uuid.len == LEN_UUID_16)
                     {
-                    switch (p_attr->uuid)
+                    switch (p_attr->uuid.uu.uuid16)
                     {
                         case GATT_UUID_CHAR_PRESENT_FORMAT:/* should be readable only */
                         case GATT_UUID_CHAR_EXT_PROP:/* should be readable only */
@@ -847,8 +833,8 @@
                             break;
                         }
                     }
-                    else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 ||
-				              p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
+                    else if (p_attr->uuid.len == LEN_UUID_128 ||
+				              p_attr->uuid.len == LEN_UUID_32)
                     {
                          status = GATT_SUCCESS;
                     }
@@ -862,9 +848,9 @@
                         status = GATT_INVALID_PDU;
                     }
                     /* these attribute does not allow write blob */
-                    else if ( (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) &&
-                              (p_attr->uuid == GATT_UUID_CHAR_CLIENT_CONFIG ||
-                               p_attr->uuid == GATT_UUID_CHAR_SRVR_CONFIG) )
+                    else if ( (p_attr->uuid.len == LEN_UUID_16) &&
+                              (p_attr->uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG ||
+                               p_attr->uuid.uu.uuid16 == GATT_UUID_CHAR_SRVR_CONFIG) )
                     {
                         if (op_code == GATT_REQ_PREPARE_WRITE && offset != 0) /* does not allow write blob */
                         {
@@ -885,13 +871,38 @@
                 break;
             }
             else
-                p_attr = (tGATT_ATTR16 *)p_attr->p_next;
+                p_attr = (tGATT_ATTR *)p_attr->p_next;
         }
     }
 
     return status;
 }
 
+static void uuid_to_str(const tBT_UUID bt_uuid, char *str_buf)
+{
+    int x = 0;
+
+    if (bt_uuid.len == LEN_UUID_16) {
+        sprintf(str_buf, "0x%04x", bt_uuid.uu.uuid16);
+    } else if (bt_uuid.len == LEN_UUID_16) {
+        sprintf(str_buf, "0x%08x", bt_uuid.uu.uuid32);
+    } else if (bt_uuid.len == LEN_UUID_128)
+    {
+        x += sprintf(&str_buf[x], "%02x%02x%02x%02x-%02x%02x-%02x%02x-",
+                bt_uuid.uu.uuid128[15], bt_uuid.uu.uuid128[14],
+                bt_uuid.uu.uuid128[13], bt_uuid.uu.uuid128[12],
+                bt_uuid.uu.uuid128[11], bt_uuid.uu.uuid128[10],
+                bt_uuid.uu.uuid128[9], bt_uuid.uu.uuid128[8]);
+        sprintf(&str_buf[x], "%02x%02x-%02x%02x%02x%02x%02x%02x",
+                bt_uuid.uu.uuid128[7], bt_uuid.uu.uuid128[6],
+                bt_uuid.uu.uuid128[5], bt_uuid.uu.uuid128[4],
+                bt_uuid.uu.uuid128[3], bt_uuid.uu.uuid128[2],
+                bt_uuid.uu.uuid128[1], bt_uuid.uu.uuid128[0]);
+    }
+    else
+        sprintf(str_buf, "Unknown (len=%d)", bt_uuid.len);
+}
+
 /*******************************************************************************
 **
 ** Function         allocate_attr_in_db
@@ -909,97 +920,54 @@
 *******************************************************************************/
 static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, tBT_UUID *p_uuid, tGATT_PERM perm)
 {
-    tGATT_ATTR16    *p_attr16 = NULL, *p_last;
-    tGATT_ATTR32    *p_attr32 = NULL;
-    tGATT_ATTR128   *p_attr128 = NULL;
-    UINT16      len = sizeof(tGATT_ATTR128);
-
-    if (p_uuid == NULL)
-    {
+    if (p_uuid == NULL) {
         GATT_TRACE_ERROR("illegal UUID");
         return NULL;
     }
 
-    if (p_uuid->len == LEN_UUID_16)
-        len = sizeof(tGATT_ATTR16);
-    else if (p_uuid->len == LEN_UUID_32)
-        len = sizeof(tGATT_ATTR32);
-
-    GATT_TRACE_DEBUG("allocate attr %d bytes ",len);
-
-    if (p_db->end_handle <= p_db->next_handle)
-    {
+    if (p_db->end_handle <= p_db->next_handle) {
         GATT_TRACE_DEBUG("handle space full. handle_max = %d next_handle = %d",
                           p_db->end_handle, p_db->next_handle);
         return NULL;
     }
 
-    if (p_db->mem_free < len)
-    {
-        if (!allocate_svc_db_buf(p_db))
-        {
+    UINT16 len = sizeof(tGATT_ATTR);
+    if (p_db->mem_free < len) {
+        if (!allocate_svc_db_buf(p_db)) {
             GATT_TRACE_ERROR("allocate_attr_in_db failed, no resources");
             return NULL;
         }
     }
     memset(p_db->p_free_mem, 0, len);
-    p_attr16 = (tGATT_ATTR16 *) p_db->p_free_mem;
 
-    if (p_uuid->len == LEN_UUID_16 && p_uuid->uu.uuid16 != GATT_ILLEGAL_UUID)
-    {
-        p_attr16->uuid_type = GATT_ATTR_UUID_TYPE_16;
-        p_attr16->uuid = p_uuid->uu.uuid16;
-    }
-    else if (p_uuid->len == LEN_UUID_32)
-    {
-        p_attr32 = (tGATT_ATTR32 *) p_db->p_free_mem;
-        p_attr32->uuid_type = GATT_ATTR_UUID_TYPE_32;
-        p_attr32->uuid = p_uuid->uu.uuid32;
-    }
-    else if (p_uuid->len == LEN_UUID_128)
-    {
-        p_attr128 = (tGATT_ATTR128 *) p_db->p_free_mem;
-        p_attr128->uuid_type = GATT_ATTR_UUID_TYPE_128;
-        memcpy(p_attr128->uuid, p_uuid->uu.uuid128, LEN_UUID_128);
-    }
-
+    tGATT_ATTR    *p_attr = (tGATT_ATTR *) p_db->p_free_mem;
     p_db->p_free_mem += len;
     p_db->mem_free -= len;
 
-    p_attr16->handle = p_db->next_handle++;
-    p_attr16->permission = perm;
-    p_attr16->p_next = NULL;
+    p_attr->handle = p_db->next_handle++;
+    p_attr->uuid = *p_uuid;
+    p_attr->permission = perm;
+    p_attr->p_next = NULL;
 
     /* link the attribute record into the end of DB */
     if (p_db->p_attr_list == NULL)
-        p_db->p_attr_list = p_attr16;
+        p_db->p_attr_list = p_attr;
     else
     {
-        p_last = (tGATT_ATTR16 *)p_db->p_attr_list;
+        tGATT_ATTR *p_last = (tGATT_ATTR *)p_db->p_attr_list;
 
         while (p_last != NULL && p_last->p_next != NULL)
-            p_last = (tGATT_ATTR16 *)p_last->p_next;
+            p_last = (tGATT_ATTR *)p_last->p_next;
 
-        p_last->p_next = p_attr16;
+        p_last->p_next = p_attr;
     }
 
-    if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16)
-    {
-        GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid16 = [0x%04x] perm=0x%02x ",
-                          p_attr16->handle, p_attr16->uuid, p_attr16->permission);
-    }
-    else if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_32)
-    {
-        GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid32 = [0x%08x] perm=0x%02x ",
-                          p_attr32->handle, p_attr32->uuid, p_attr32->permission);
-    }
-    else
-    {
-        GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid128 = [0x%02x:0x%02x] perm=0x%02x ",
-                          p_attr128->handle, p_attr128->uuid[0],p_attr128->uuid[1],
-                          p_attr128->permission);
-    }
-    return(void *)p_attr16;
+    char uuid_str[37];
+    uuid_to_str(p_attr->uuid, uuid_str);
+    GATT_TRACE_ERROR("=====> handle = [0x%04x] uuid = [%s] perm=0x%02x ",
+                     p_attr->handle, uuid_str, p_attr->permission);
+
+    return(void *)p_attr;
 }
 
 /*******************************************************************************
@@ -1016,17 +984,17 @@
 *******************************************************************************/
 static BOOLEAN deallocate_attr_in_db(tGATT_SVC_DB *p_db, void *p_attr)
 {
-    tGATT_ATTR16  *p_cur, *p_next;
+    tGATT_ATTR  *p_cur, *p_next;
     BOOLEAN     found = FALSE;
 
     if (p_db->p_attr_list == NULL)
         return found;
 
-    p_cur   = (tGATT_ATTR16 *) p_db->p_attr_list;
-    p_next  = (tGATT_ATTR16 *) p_cur->p_next;
+    p_cur   = (tGATT_ATTR *) p_db->p_attr_list;
+    p_next  = (tGATT_ATTR *) p_cur->p_next;
 
     for (; p_cur != NULL && p_next != NULL;
-        p_cur = p_next, p_next = (tGATT_ATTR16 *)p_next->p_next)
+        p_cur = p_next, p_next = (tGATT_ATTR *)p_next->p_next)
     {
         if (p_next == p_attr)
         {
@@ -1166,7 +1134,7 @@
 *******************************************************************************/
 static BOOLEAN gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri)
 {
-    tGATT_ATTR16  *p_attr;
+    tGATT_ATTR  *p_attr;
     tBT_UUID    uuid = {LEN_UUID_16, {0}};
     BOOLEAN     rt = FALSE;
 
@@ -1178,7 +1146,7 @@
         uuid.uu.uuid16 = GATT_UUID_SEC_SERVICE;
 
     /* add service declration record */
-    if ((p_attr = (tGATT_ATTR16 *)(allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ))) != NULL)
+    if ((p_attr = (tGATT_ATTR *)(allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ))) != NULL)
     {
         if (copy_extra_byte_in_db (p_db, (void **)&p_attr->p_value, sizeof(tBT_UUID)))
         {
diff --git a/stack/gatt/gatt_int.h b/stack/gatt/gatt_int.h
index dc1ee6b..f1dc1fc 100644
--- a/stack/gatt/gatt_int.h
+++ b/stack/gatt/gatt_int.h
@@ -180,38 +180,10 @@
     void                                *p_next;  /* pointer to the next attribute,
                                                     either tGATT_ATTR16 or tGATT_ATTR128 */
     tGATT_ATTR_VALUE                    *p_value;
-    tGATT_ATTR_UUID_TYPE                uuid_type;
     tGATT_PERM                          permission;
     UINT16                              handle;
-    UINT16                              uuid;
-} tGATT_ATTR16;
-
-/* 32 bits UUID Attribute in server database
-*/
-typedef struct
-{
-    void                                *p_next;  /* pointer to the next attribute,
-                                                    either tGATT_ATTR16, tGATT_ATTR32 or tGATT_ATTR128 */
-    tGATT_ATTR_VALUE                    *p_value;
-    tGATT_ATTR_UUID_TYPE                uuid_type;
-    tGATT_PERM                          permission;
-    UINT16                              handle;
-    UINT32                              uuid;
-} tGATT_ATTR32;
-
-
-/* 128 bits UUID Attribute in server database
-*/
-typedef struct
-{
-    void                                *p_next;  /* pointer to the next attribute,
-                                                    either tGATT_ATTR16 or tGATT_ATTR128 */
-    tGATT_ATTR_VALUE                    *p_value;
-    tGATT_ATTR_UUID_TYPE                uuid_type;
-    tGATT_PERM                          permission;
-    UINT16                              handle;
-    UINT8                               uuid[LEN_UUID_128];
-} tGATT_ATTR128;
+    tBT_UUID                            uuid;
+} tGATT_ATTR;
 
 /* Service Database definition
 */
diff --git a/stack/gatt/gatt_sr.c b/stack/gatt/gatt_sr.c
index f5c5f0f..1c08526 100644
--- a/stack/gatt/gatt_sr.c
+++ b/stack/gatt/gatt_sr.c
@@ -599,14 +599,14 @@
     tGATT_STATUS        status = GATT_NOT_FOUND;
     UINT8               *p;
     UINT16              len = *p_len;
-    tGATT_ATTR16        *p_attr = NULL;
+    tGATT_ATTR        *p_attr = NULL;
     UINT8               info_pair_len[2] = {4, 18};
 
     if (!p_rcb->p_db || !p_rcb->p_db->p_attr_list)
         return status;
 
     /* check the attribute database */
-    p_attr = (tGATT_ATTR16 *) p_rcb->p_db->p_attr_list;
+    p_attr = (tGATT_ATTR *) p_rcb->p_db->p_attr_list;
 
     p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET + p_msg->len;
 
@@ -620,24 +620,24 @@
         if (p_attr->handle >= s_hdl)
         {
             if (p_msg->offset == 0)
-                p_msg->offset = (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) ? GATT_INFO_TYPE_PAIR_16 : GATT_INFO_TYPE_PAIR_128;
+                p_msg->offset = (p_attr->uuid.len == LEN_UUID_16) ? GATT_INFO_TYPE_PAIR_16 : GATT_INFO_TYPE_PAIR_128;
 
             if (len >= info_pair_len[p_msg->offset - 1])
             {
-                if (p_msg->offset == GATT_INFO_TYPE_PAIR_16 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16)
+                if (p_msg->offset == GATT_INFO_TYPE_PAIR_16 && p_attr->uuid.len == LEN_UUID_16)
                 {
                     UINT16_TO_STREAM(p, p_attr->handle);
-                    UINT16_TO_STREAM(p, p_attr->uuid);
+                    UINT16_TO_STREAM(p, p_attr->uuid.uu.uuid16);
                 }
-                else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128  )
+                else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid.len == LEN_UUID_128  )
                 {
                     UINT16_TO_STREAM(p, p_attr->handle);
-                    ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *) p_attr)->uuid, LEN_UUID_128);
+                    ARRAY_TO_STREAM (p, p_attr->uuid.uu.uuid128, LEN_UUID_128);
                 }
-                else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
+                else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid.len == LEN_UUID_32)
                 {
                     UINT16_TO_STREAM(p, p_attr->handle);
-                    gatt_convert_uuid32_to_uuid128(p, ((tGATT_ATTR32 *) p_attr)->uuid);
+                    gatt_convert_uuid32_to_uuid128(p, p_attr->uuid.uu.uuid32);
                     p += LEN_UUID_128;
                 }
                 else
@@ -658,7 +658,7 @@
                 break;
             }
         }
-        p_attr = (tGATT_ATTR16 *)p_attr->p_next;
+        p_attr = (tGATT_ATTR *)p_attr->p_next;
     }
 
     *p_len = len;
@@ -1197,7 +1197,7 @@
     UINT8           *p = p_data, i;
     tGATT_SR_REG    *p_rcb = gatt_cb.sr_reg;
     tGATT_STATUS    status = GATT_INVALID_HANDLE;
-    tGATT_ATTR16    *p_attr;
+    tGATT_ATTR    *p_attr;
 
     if (len < 2)
     {
@@ -1228,7 +1228,7 @@
         {
             if (p_rcb->in_use && p_rcb->s_hdl <= handle && p_rcb->e_hdl >= handle)
             {
-                p_attr = (tGATT_ATTR16 *)p_rcb->p_db->p_attr_list;
+                p_attr = (tGATT_ATTR *)p_rcb->p_db->p_attr_list;
 
                 while (p_attr)
                 {
@@ -1253,7 +1253,7 @@
                         status = GATT_SUCCESS;
                         break;
                     }
-                    p_attr = (tGATT_ATTR16 *)p_attr->p_next;
+                    p_attr = (tGATT_ATTR *)p_attr->p_next;
                 }
                 break;
             }