Re: [PATCHv5 02/14] shared/gatt: Add initial implementation of discover_included_services

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

 



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