Re: [PATCH v2 6/9] shared/gatt-db: Add gatt_db_attribute_read

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

 



Hi Arman,

On Wed, Oct 29, 2014 at 4:59 PM, Arman Uguray <armansito@xxxxxxxxxxxx> wrote:
> Hi Luiz,
>
> On Wed, Oct 29, 2014 at 2:15 AM, Luiz Augusto von Dentz
> <luiz.dentz@xxxxxxxxx> wrote:
>> Hi Arman,
>>
>> On Wed, Oct 29, 2014 at 12:20 AM, Arman Uguray <armansito@xxxxxxxxxxxx> wrote:
>>> Hi Luiz,
>>>
>>> On Tue, Oct 28, 2014 at 9:18 AM, Luiz Augusto von Dentz
>>> <luiz.dentz@xxxxxxxxx> wrote:
>>>> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>>>>
>>>> ---
>>>>  src/shared/gatt-db.c | 18 +++++++++++++++++-
>>>>  1 file changed, 17 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/src/shared/gatt-db.c b/src/shared/gatt-db.c
>>>> index f43cac3..b5b6c72 100644
>>>> --- a/src/shared/gatt-db.c
>>>> +++ b/src/shared/gatt-db.c
>>>> @@ -891,7 +891,23 @@ bool gatt_db_attribute_read(struct gatt_db_attribute *attrib, uint16_t offset,
>>>>                                 uint8_t opcode, bdaddr_t *bdaddr,
>>>>                                 gatt_db_attribute_read_t func, void *user_data)
>>>>  {
>>>> -       return false;
>>>> +       if (!attrib || !func)
>>>> +               return false;
>>>> +
>>>> +       if (attrib->read_func) {
>>>> +               attrib->read_func(attrib->handle, offset, opcode, bdaddr,
>>>> +                                                       attrib->user_data);
>>>> +               return true;
>>>> +       }
>>>> +
>>>> +       /* Check length boundary if value is stored in the db */
>>>> +       if (offset >= attrib->value_len)
>>>> +               return false;
>>>
>>> Thanks for moving this after the callback check. As for valid
>>> boundaries, I've actually seen devices that allow sending an offset
>>> that is the same as the length of the value. They just return an empty
>>> value PDU back. So maybe return NULL for the value if offset ==
>>> attrib->value_len? What I had in mind was:
>>
>> But then this would be valid for any offset past value_len doesn't it
>> or this is specific to determine the side of the value, in the other
>> hand there does exist an error for invalid offset which I thought
>> would be preferable, well if we can distinct this error which
>> currently we do not because of the bool return.
>>
>
> So for your first point, the offset should be valid for the side of
> the value only but invalid beyond that. E.g. the CSR uEnergy device I
> have does the following:
>
>    offset == value_len - 1 --->  result is 1 byte (the last byte)
>    offset == value_len ---> result is 0 bytes
>    offset > value_len ---> result is ERROR_INVALID_OFFSET
>
> I'm not exactly sure if the spec dictates that it be this way but this
> is how I've seen several devices behave.
>
> As for the bool return problem, maybe we can report the error in the
> callback instead? When the read is being handled by read_func, we will
> use the "err" argument gatt_db_attribute_read_t to report ATT errors
> in the future, so maybe we should do the same here. If the offset is
> invalid, we call func(attrib, BT_ATT_ERROR_INVALID_OFFSET, NULL, 0,
> user_data); and return true.

Fair enough, I will fix it in v3.

-- 
Luiz Augusto von Dentz
--
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