[PATCH 15/15] android/gatt: Fix instance id for primary and included service

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Since there might be multiple services with same uuid, we should
make sure that each primary and included service has unique instance
id.

This patch adds this.
---
 android/gatt.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index d1deae4..7f15459 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -543,7 +543,8 @@ done:
 
 }
 
-static struct service *create_service(bool primary, char *uuid, void *data)
+static struct service *create_service(uint8_t id, bool primary, char *uuid,
+								void *data)
 {
 	struct service *s;
 
@@ -567,6 +568,8 @@ static struct service *create_service(bool primary, char *uuid, void *data)
 		return NULL;
 	}
 
+	s->id.instance = id;
+
 	/* Put primary service to our local list */
 	s->primary = primary;
 	if (s->primary)
@@ -593,6 +596,7 @@ static void primary_cb(uint8_t status, GSList *services, void *user_data)
 	struct gatt_device *dev = user_data;
 	GSList *l;
 	int32_t gatt_status;
+	uint8_t instance_id;
 
 	DBG("Status %d", status);
 
@@ -609,11 +613,16 @@ static void primary_cb(uint8_t status, GSList *services, void *user_data)
 		goto done;
 	}
 
+	/* There might be multiply services with same uuid. Therefore make sure
+	 * each primary service one has unique instance_id
+	 */
+	instance_id = 0;
+
 	for (l = services; l; l = l->next) {
 		struct gatt_primary *prim = l->data;
 		struct service *p;
 
-		p = create_service(true, prim->uuid, prim);
+		p = create_service(instance_id++, true, prim->uuid, prim);
 		if (!p)
 			continue;
 
@@ -1267,12 +1276,20 @@ struct get_included_data {
 	struct gatt_device *device;
 };
 
+static uint8_t get_inst_id_of_prim_services(const struct gatt_device *dev)
+{
+	struct service *s = queue_peek_tail(dev->services);
+
+	return s->id.instance;
+}
+
 static void get_included_cb(uint8_t status, GSList *included, void *user_data)
 {
 	struct get_included_data *data = user_data;
 	struct gatt_device *device = data->device;
 	struct service *service = data->prim;
 	struct service *incl;
+	uint8_t instance_id;
 
 	DBG("");
 
@@ -1286,11 +1303,18 @@ static void get_included_cb(uint8_t status, GSList *included, void *user_data)
 	/* Remember that we already search included services.*/
 	service->incl_search_done = true;
 
+	/* There might be multiply services with same uuid. Therefore make sure
+	 * each service has unique instance id. Let's take the latest instance
+	 * id of primary service and start iterate included services from this
+	 * point.
+	 */
+	instance_id = get_inst_id_of_prim_services(device);
 
 	for (; included; included = included->next) {
 		struct gatt_included *included_service = included->data;
 
-		incl = create_service(false, included_service->uuid,
+		incl = create_service(++instance_id, false,
+							included_service->uuid,
 							included_service);
 		if (!incl)
 			continue;
-- 
1.8.4

--
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




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux