linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Szymon Janc <szymon.janc@tieto.com>
To: Marcin Kraglak <marcin.kraglak@tieto.com>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [PATCHv5 02/14] shared/gatt: Add initial implementation of discover_included_services
Date: Wed, 22 Oct 2014 15:37:05 +0200	[thread overview]
Message-ID: <2219675.GnLsqXaRSG@uw000953> (raw)
In-Reply-To: <1413454646-23076-3-git-send-email-marcin.kraglak@tieto.com>

Hi Marcin,

On Thursday 16 of October 2014 12:17:14 Marcin Kraglak wrote:
> Current implementation allow to discover included services with
> 16 bit UUID only.
> ---
>  src/shared/gatt-helpers.c | 108 +++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 106 insertions(+), 2 deletions(-)
> 
> diff --git a/src/shared/gatt-helpers.c b/src/shared/gatt-helpers.c
> index 4dc787f..dcb2a2f 100644
> --- a/src/shared/gatt-helpers.c
> +++ b/src/shared/gatt-helpers.c
> @@ -692,6 +692,82 @@ bool bt_gatt_discover_secondary_services(struct bt_att *att, bt_uuid_t *uuid,
>  								destroy, false);
>  }
>  
> +static void discover_included_cb(uint8_t opcode, const void *pdu,
> +					uint16_t length, void *user_data)
> +{
> +	struct bt_gatt_result *final_result = NULL;
> +	struct discovery_op *op = user_data;
> +	struct bt_gatt_result *cur_result;
> +	uint8_t att_ecode = 0;
> +	uint16_t last_handle;
> +	size_t data_length;
> +	bool success;
> +
> +	if (opcode == BT_ATT_OP_ERROR_RSP) {
> +		success = false;

set this right before goto , otherwise it looks strange to
set success to false and then jump to success label.

> +		att_ecode = process_error(pdu, length);
> +
> +		if (att_ecode == BT_ATT_ERROR_ATTRIBUTE_NOT_FOUND &&
> +							op->result_head)
> +			goto success;
> +
> +		goto done;
> +	}
> +
> +	if (opcode != BT_ATT_OP_READ_BY_TYPE_RSP || !pdu || length < 6) {
> +		success = false;
> +		goto done;
> +	}
> +
> +	data_length = ((uint8_t *) pdu)[0];

pdu is const pointer so cast it to (const uint8_t *).
Also I'm not entirely sure about this byte pdu processing, maybe we should have
proper packed structs for those (not sure how feasible that would be, though)

> +

Please comment this in code.

> +	if ((length - 1) % data_length || data_length != 8) {
> +		success = false;
> +		goto done;
> +	}
> +
> +	cur_result = result_create(opcode, pdu + 1, length - 1,
> +							data_length, op);
> +	if (!cur_result) {
> +		success = false;
> +		goto done;
> +	}
> +
> +	if (!op->result_head)
> +		op->result_head = op->result_tail = cur_result;

Both branches should in braces.

> +	else {
> +		op->result_tail->next = cur_result;
> +		op->result_tail = cur_result;
> +	}
> +
> +	last_handle = get_le16(pdu + length - data_length);
> +	if (last_handle != op->end_handle) {
> +		uint8_t pdu[6];
> +
> +		put_le16(last_handle + 1, pdu);
> +		put_le16(op->end_handle, pdu + 2);
> +		put_le16(GATT_INCLUDE_UUID, pdu + 4);
> +
> +		if (bt_att_send(op->att, BT_ATT_OP_READ_BY_TYPE_REQ,
> +							pdu, sizeof(pdu),
> +							discover_included_cb,
> +							discovery_op_ref(op),
> +							discovery_op_unref))
> +			return;
> +
> +		discovery_op_unref(op);
> +		success = false;

goto done: missing maybe?

also I'd change labels' names a bit:
done -> failed
success -> done

> +	}
> +
> +success:
> +	success = true;
> +	final_result = op->result_head;
> +
> +done:
> +	if (op->callback)
> +		op->callback(success, att_ecode, final_result, op->user_data);
> +}
> +
>  bool bt_gatt_discover_included_services(struct bt_att *att,
>  					uint16_t start, uint16_t end,
>  					bt_uuid_t *uuid,
> @@ -699,8 +775,36 @@ bool bt_gatt_discover_included_services(struct bt_att *att,
>  					void *user_data,
>  					bt_gatt_destroy_func_t destroy)
>  {
> -	/* TODO */
> -	return false;
> +	struct discovery_op *op;
> +	uint8_t pdu[6];
> +
> +	if (!att)
> +		return false;
> +
> +	op = new0(struct discovery_op, 1);
> +	if (!op)
> +		return false;
> +
> +	op->att = att;
> +	op->callback = callback;
> +	op->user_data = user_data;
> +	op->destroy = destroy;
> +	op->end_handle = end;
> +
> +	put_le16(start, pdu);
> +	put_le16(end, pdu + 2);
> +	put_le16(GATT_INCLUDE_UUID, pdu + 4);
> +
> +	if (!bt_att_send(att, BT_ATT_OP_READ_BY_TYPE_REQ,
> +					pdu, sizeof(pdu),
> +					discover_included_cb,
> +					discovery_op_ref(op),
> +					discovery_op_unref)) {
> +		free(op);
> +		return false;
> +	}
> +
> +	return true;
>  }
>  
>  static void discover_chrcs_cb(uint8_t opcode, const void *pdu,
> 

-- 
Best regards, 
Szymon Janc

  reply	other threads:[~2014-10-22 13:37 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-16 10:17 [PATCHv5 00/14] Included service discovery Marcin Kraglak
2014-10-16 10:17 ` [PATCHv5 01/14] shared/gatt: Add discover_secondary_services() Marcin Kraglak
2014-10-22 13:37   ` Szymon Janc
2014-10-16 10:17 ` [PATCHv5 02/14] shared/gatt: Add initial implementation of discover_included_services Marcin Kraglak
2014-10-22 13:37   ` Szymon Janc [this message]
2014-10-16 10:17 ` [PATCHv5 03/14] shared/gatt: Discover included services 128 bit UUIDS Marcin Kraglak
2014-10-22 18:43   ` Szymon Janc
2014-10-16 10:17 ` [PATCHv5 04/14] shared/gatt: Add extra check in characteristic iterator Marcin Kraglak
2014-10-22 17:49   ` Szymon Janc
2014-10-16 10:17 ` [PATCHv5 05/14] shared/gatt: Add included service iterator Marcin Kraglak
2014-10-22 18:43   ` Szymon Janc
2014-10-16 10:17 ` [PATCHv5 06/14] shared/gatt: Remove not needed function parameter Marcin Kraglak
2014-10-16 10:17 ` [PATCHv5 07/14] shared/gatt: Distinguish Primary from Secondary services Marcin Kraglak
2014-10-16 10:17 ` [PATCHv5 08/14] tools/btgatt-client: Print type of service Marcin Kraglak
2014-10-22 18:00   ` Szymon Janc
2014-10-16 10:17 ` [PATCHv5 09/14] shared/gatt: Discover secondary services Marcin Kraglak
2014-10-16 10:17 ` [PATCHv5 10/14] shared/gatt: Discover included services Marcin Kraglak
2014-10-22 18:20   ` Szymon Janc
2014-10-16 10:17 ` [PATCHv5 11/14] shared/gatt: Add gatt-client include service iterator Marcin Kraglak
2014-10-22 18:29   ` Szymon Janc
2014-10-16 10:17 ` [PATCHv5 12/14] tools/btgatt-client: Print found include services Marcin Kraglak
2014-10-16 10:17 ` [PATCHv5 13/14] shared/gatt: Fix searching descriptors Marcin Kraglak
2014-10-16 10:17 ` [PATCHv5 14/14] shared/gatt: Add function bt_gatt_result_included_count() Marcin Kraglak
2014-10-22  6:25 ` [PATCHv5 00/14] Included service discovery Marcin Kraglak
2014-10-22 14:54   ` Luiz Augusto von Dentz
2014-10-22 15:35     ` Arman Uguray
2014-10-22 18:39       ` Szymon Janc
2014-10-23  7:55         ` Luiz Augusto von Dentz
2014-10-24 19:32           ` Arman Uguray

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2219675.GnLsqXaRSG@uw000953 \
    --to=szymon.janc@tieto.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=marcin.kraglak@tieto.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).