public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/8] android/gatt: Fix service class id of built in gatt services
@ 2014-07-17  8:42 Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 2/8] attrib: Fix discovering descriptors Marcin Kraglak
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Marcin Kraglak @ 2014-07-17  8:42 UTC (permalink / raw)
  To: linux-bluetooth

---
 android/gatt.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/android/gatt.c b/android/gatt.c
index 986f435..19d9b60 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -6199,6 +6199,7 @@ static void register_gap_service(void)
 	gatt_db_service_set_active(gatt_db, gap_srvc_data.srvc , true);
 
 	/* SDP */
+	bt_uuid16_create(&uuid, 0x1800);
 	start = gap_srvc_data.srvc;
 	end = gatt_db_get_end_handle(gatt_db, gap_srvc_data.srvc);
 	gap_sdp_handle = add_sdp_record(&uuid, start, end,
@@ -6308,6 +6309,7 @@ static void register_device_info_service(void)
 	gatt_db_service_set_active(gatt_db, srvc_handle, true);
 
 	/* SDP */
+	bt_uuid16_create(&uuid, 0x180a);
 	end_handle = gatt_db_get_end_handle(gatt_db, srvc_handle);
 	dis_sdp_handle = add_sdp_record(&uuid, srvc_handle, end_handle,
 						"Device Information Service");
@@ -6404,6 +6406,7 @@ static void register_gatt_service(void)
 	gatt_db_service_set_active(gatt_db, srvc_handle, true);
 
 	/* SDP */
+	bt_uuid16_create(&uuid, 0x1801);
 	end_handle = gatt_db_get_end_handle(gatt_db, srvc_handle);
 	gatt_sdp_handle = add_sdp_record(&uuid, srvc_handle, end_handle,
 						"Generic Attribute Profile");
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/8] attrib: Fix discovering descriptors
  2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
@ 2014-07-17  8:42 ` Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 3/8] android/gatt: Fix searching primary services by uuids Marcin Kraglak
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2014-07-17  8:42 UTC (permalink / raw)
  To: linux-bluetooth

Discover all attributes in given range. In same cases we ommited
last attribute in range.
---
 attrib/gatt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/attrib/gatt.c b/attrib/gatt.c
index 27fb0b3..f8ff2a5 100644
--- a/attrib/gatt.c
+++ b/attrib/gatt.c
@@ -1004,7 +1004,7 @@ static void desc_discovered_cb(guint8 status, const guint8 *ipdu,
 
 	att_data_list_free(list);
 
-	if (last + 1 < dd->end && !uuid_found) {
+	if (last < dd->end && !uuid_found) {
 		guint16 oplen;
 		size_t buflen;
 		uint8_t *buf;
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/8] android/gatt: Fix searching primary services by uuids
  2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 2/8] attrib: Fix discovering descriptors Marcin Kraglak
@ 2014-07-17  8:42 ` Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 4/8] android/gatt: Fix check for permissions error Marcin Kraglak
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2014-07-17  8:42 UTC (permalink / raw)
  To: linux-bluetooth

Return all instances of services. It is not proper behaviour to
return only one instance of service with same uuid.
---
 android/gatt.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index 19d9b60..4cd94b8 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -1136,28 +1136,28 @@ static void discover_srvc_by_uuid_cb(uint8_t status, GSList *ranges,
 	}
 
 	bt_uuid_to_string(&cb_data->uuid, prim.uuid, sizeof(prim.uuid));
-	/*
-	 * If multiple instances of the same service (as identified by UUID)
-	 * exist, the first instance of the service is returned.
-	 */
-	memcpy(&prim.range, ranges->data, sizeof(prim.range));
 
-	s = create_service(instance_id++, true, prim.uuid, &prim);
-	if (!s) {
-		gatt_status = GATT_FAILURE;
-		goto reply;
-	}
+	for (; ranges; ranges = ranges->next) {
+		memcpy(&prim.range, ranges->data, sizeof(prim.range));
 
-	if (!queue_push_tail(dev->services, s)) {
-		error("gatt: Cannot push primary service to the list");
-		gatt_status = GATT_FAILURE;
-		goto reply;
-	}
+		s = create_service(instance_id++, true, prim.uuid, &prim);
+		if (!s) {
+			gatt_status = GATT_FAILURE;
+			goto reply;
+		}
+
+		if (!queue_push_tail(dev->services, s)) {
+			error("gatt: Cannot push primary service to the list");
+			destroy_service(s);
+			gatt_status = GATT_FAILURE;
+			goto reply;
+		}
 
-	send_client_primary_notify(s, INT_TO_PTR(cb_data->conn->id));
+		send_client_primary_notify(s, INT_TO_PTR(cb_data->conn->id));
 
-	DBG("attr handle = 0x%04x, end grp handle = 0x%04x uuid: %s",
-		prim.range.start, prim.range.end, prim.uuid);
+		DBG("attr handle = 0x%04x, end grp handle = 0x%04x uuid: %s",
+				prim.range.start, prim.range.end, prim.uuid);
+	}
 
 	/* Partial search service scanning was performed */
 	dev->partial_srvc_search = true;
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 4/8] android/gatt: Fix check for permissions error
  2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 2/8] attrib: Fix discovering descriptors Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 3/8] android/gatt: Fix searching primary services by uuids Marcin Kraglak
@ 2014-07-17  8:42 ` Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 5/8] android/gatt: Fix read responses with o length value Marcin Kraglak
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2014-07-17  8:42 UTC (permalink / raw)
  To: linux-bluetooth

If error is returned from check_device_permissions, fill response
data and return. In case of read errors we didn't send error response.
Zero length data was send instead.
---
 android/gatt.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index 4cd94b8..002592c 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -4508,8 +4508,11 @@ static void read_requested_attributes(void *data, void *user_data)
 	error = check_device_permissions(process_data->device,
 							process_data->opcode,
 							permissions);
-	if (error)
-		goto done;
+	if (error != 0) {
+		resp_data->error = error;
+		resp_data->state = REQUEST_DONE;
+		return;
+	}
 
 	resp_data->state = REQUEST_PENDING;
 
@@ -4517,12 +4520,9 @@ static void read_requested_attributes(void *data, void *user_data)
 						resp_data->offset,
 						process_data->opcode,
 						&process_data->device->bdaddr,
-						&value, &value_len)) {
+						&value, &value_len))
 		error = ATT_ECODE_UNLIKELY;
-		goto done;
-	}
 
-done:
 	/* We have value here already if no callback will be called */
 	if (value_len > 0)
 		fill_gatt_response(resp_data, resp_data->handle,
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 5/8] android/gatt: Fix read responses with o length value
  2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
                   ` (2 preceding siblings ...)
  2014-07-17  8:42 ` [PATCH 4/8] android/gatt: Fix check for permissions error Marcin Kraglak
@ 2014-07-17  8:42 ` Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 6/8] android/gatt: Add GATT_PERM_NONE define Marcin Kraglak
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2014-07-17  8:42 UTC (permalink / raw)
  To: linux-bluetooth

Attribute's value length can be 0, so fill read response and send.
---
 android/gatt.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index 002592c..4d16d1e 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -4488,7 +4488,7 @@ static void read_requested_attributes(void *data, void *user_data)
 	struct pending_request *resp_data = data;
 	struct request_processing_data *process_data = user_data;
 	uint32_t permissions;
-	uint8_t *value, error;
+	uint8_t *value = NULL, error;
 	int value_len = 0;
 
 	if (!gatt_db_get_attribute_permissions(gatt_db, resp_data->handle,
@@ -4524,7 +4524,7 @@ static void read_requested_attributes(void *data, void *user_data)
 		error = ATT_ECODE_UNLIKELY;
 
 	/* We have value here already if no callback will be called */
-	if (value_len > 0)
+	if (value_len >= 0)
 		fill_gatt_response(resp_data, resp_data->handle,
 					resp_data->offset, error, value_len,
 					value);
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 6/8] android/gatt: Add GATT_PERM_NONE define
  2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
                   ` (3 preceding siblings ...)
  2014-07-17  8:42 ` [PATCH 5/8] android/gatt: Fix read responses with o length value Marcin Kraglak
@ 2014-07-17  8:42 ` Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 7/8] android/gatt: Send proper status of read descriptor callback Marcin Kraglak
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2014-07-17  8:42 UTC (permalink / raw)
  To: linux-bluetooth

Use this permission if no read and write is allowed. It is now set
in service change characteristic.
---
 android/gatt.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/android/gatt.c b/android/gatt.c
index 4d16d1e..6253d28 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -68,6 +68,7 @@
 #define GATT_PERM_WRITE_AUTHORIZATION	0x00000800
 #define GATT_PERM_WRITE_SIGNED		0x00010000
 #define GATT_PERM_WRITE_SIGNED_MITM	0x00020000
+#define GATT_PERM_NONE			0x10000000
 
 #define GATT_CONN_TIMEOUT 2
 
@@ -6393,7 +6394,7 @@ static void register_gatt_service(void)
 
 	bt_uuid16_create(&uuid, GATT_CHARAC_SERVICE_CHANGED);
 	service_changed_handle =  gatt_db_add_characteristic(gatt_db,
-					srvc_handle, &uuid, 0,
+					srvc_handle, &uuid, GATT_PERM_NONE,
 					GATT_CHR_PROP_INDICATE, NULL, NULL,
 					NULL);
 
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 7/8] android/gatt: Send proper status of read descriptor callback
  2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
                   ` (4 preceding siblings ...)
  2014-07-17  8:42 ` [PATCH 6/8] android/gatt: Add GATT_PERM_NONE define Marcin Kraglak
@ 2014-07-17  8:42 ` Marcin Kraglak
  2014-07-17  8:42 ` [PATCH 8/8] android/gatt: Fix incorrect status in read characteristic cb Marcin Kraglak
  2014-07-18  9:15 ` [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Szymon Janc
  7 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2014-07-17  8:42 UTC (permalink / raw)
  To: linux-bluetooth

Pass proper status to upper layer.
---
 android/gatt.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/android/gatt.c b/android/gatt.c
index 6253d28..852c50b 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -3140,12 +3140,13 @@ static void send_client_descr_read_notify(int32_t status, const uint8_t *pdu,
 
 	ev->status = status;
 	ev->conn_id = conn_id;
+	ev->data.status = ev->status;
 
 	element_id_to_hal_srvc_id(srvc, primary, &ev->data.srvc_id);
 	element_id_to_hal_gatt_id(ch, &ev->data.char_id);
 	element_id_to_hal_gatt_id(descr, &ev->data.descr_id);
 
-	if (len && pdu) {
+	if (status == 0 && pdu) {
 		ssize_t ret;
 
 		ret = dec_read_resp(pdu, len, ev->data.value,
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 8/8] android/gatt: Fix incorrect status in read characteristic cb
  2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
                   ` (5 preceding siblings ...)
  2014-07-17  8:42 ` [PATCH 7/8] android/gatt: Send proper status of read descriptor callback Marcin Kraglak
@ 2014-07-17  8:42 ` Marcin Kraglak
  2014-07-18  9:15 ` [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Szymon Janc
  7 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2014-07-17  8:42 UTC (permalink / raw)
  To: linux-bluetooth

Pass correct status to upper layer.
---
 android/gatt.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/android/gatt.c b/android/gatt.c
index 852c50b..2ddbf29 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -2769,11 +2769,12 @@ static void send_client_read_char_notify(int32_t status, const uint8_t *pdu,
 
 	ev->conn_id = conn_id;
 	ev->status = status;
+	ev->data.status = status;
 
 	element_id_to_hal_srvc_id(s_id, primary, &ev->data.srvc_id);
 	element_id_to_hal_gatt_id(ch_id, &ev->data.char_id);
 
-	if (pdu) {
+	if (status == 0 && pdu) {
 		vlen = dec_read_resp(pdu, len, ev->data.value, sizeof(buf));
 		if (vlen < 0) {
 			error("gatt: Protocol error");
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/8] android/gatt: Fix service class id of built in gatt services
  2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
                   ` (6 preceding siblings ...)
  2014-07-17  8:42 ` [PATCH 8/8] android/gatt: Fix incorrect status in read characteristic cb Marcin Kraglak
@ 2014-07-18  9:15 ` Szymon Janc
  7 siblings, 0 replies; 9+ messages in thread
From: Szymon Janc @ 2014-07-18  9:15 UTC (permalink / raw)
  To: Marcin Kraglak; +Cc: linux-bluetooth

Hi Marcin,

On Thursday 17 of July 2014 10:42:43 Marcin Kraglak wrote:
> ---
>  android/gatt.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/android/gatt.c b/android/gatt.c
> index 986f435..19d9b60 100644
> --- a/android/gatt.c
> +++ b/android/gatt.c
> @@ -6199,6 +6199,7 @@ static void register_gap_service(void)
>  	gatt_db_service_set_active(gatt_db, gap_srvc_data.srvc , true);
>  
>  	/* SDP */
> +	bt_uuid16_create(&uuid, 0x1800);
>  	start = gap_srvc_data.srvc;
>  	end = gatt_db_get_end_handle(gatt_db, gap_srvc_data.srvc);
>  	gap_sdp_handle = add_sdp_record(&uuid, start, end,
> @@ -6308,6 +6309,7 @@ static void register_device_info_service(void)
>  	gatt_db_service_set_active(gatt_db, srvc_handle, true);
>  
>  	/* SDP */
> +	bt_uuid16_create(&uuid, 0x180a);
>  	end_handle = gatt_db_get_end_handle(gatt_db, srvc_handle);
>  	dis_sdp_handle = add_sdp_record(&uuid, srvc_handle, end_handle,
>  						"Device Information Service");
> @@ -6404,6 +6406,7 @@ static void register_gatt_service(void)
>  	gatt_db_service_set_active(gatt_db, srvc_handle, true);
>  
>  	/* SDP */
> +	bt_uuid16_create(&uuid, 0x1801);
>  	end_handle = gatt_db_get_end_handle(gatt_db, srvc_handle);
>  	gatt_sdp_handle = add_sdp_record(&uuid, srvc_handle, end_handle,
>  						"Generic Attribute Profile");
> 

All patches applied, thanks.

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-07-18  9:15 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-17  8:42 [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Marcin Kraglak
2014-07-17  8:42 ` [PATCH 2/8] attrib: Fix discovering descriptors Marcin Kraglak
2014-07-17  8:42 ` [PATCH 3/8] android/gatt: Fix searching primary services by uuids Marcin Kraglak
2014-07-17  8:42 ` [PATCH 4/8] android/gatt: Fix check for permissions error Marcin Kraglak
2014-07-17  8:42 ` [PATCH 5/8] android/gatt: Fix read responses with o length value Marcin Kraglak
2014-07-17  8:42 ` [PATCH 6/8] android/gatt: Add GATT_PERM_NONE define Marcin Kraglak
2014-07-17  8:42 ` [PATCH 7/8] android/gatt: Send proper status of read descriptor callback Marcin Kraglak
2014-07-17  8:42 ` [PATCH 8/8] android/gatt: Fix incorrect status in read characteristic cb Marcin Kraglak
2014-07-18  9:15 ` [PATCH 1/8] android/gatt: Fix service class id of built in gatt services Szymon Janc

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox