2014-11-26 08:45:50

by Jakub Tyszkowski

[permalink] [raw]
Subject: [PATCH 1/2] gattrib: Fix not setting att's mtu size in g_attrib_new()

We were setting only the buffer in gattrib but att was left with the
default value of 23 (LE transport layer defaults). For BREDR transport
layer this may result in using smaller MTU than the minimum allowed (48).

This was affecting cases when MTU Exchange was not supported by the
remote device and defaults were used.
---
attrib/gattrib.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/attrib/gattrib.c b/attrib/gattrib.c
index ce7f7b3..a04a0ee 100644
--- a/attrib/gattrib.c
+++ b/attrib/gattrib.c
@@ -83,6 +83,9 @@ GAttrib *g_attrib_new(GIOChannel *io, guint16 mtu)
if (!attr->att)
goto fail;

+ if (!bt_att_set_mtu(attr->att, mtu))
+ goto fail;
+
attr->buf = malloc0(mtu);
attr->buflen = mtu;
if (!attr->buf)
--
1.9.1



2014-11-26 08:45:51

by Jakub Tyszkowski

[permalink] [raw]
Subject: [PATCH 2/2] gattrib: Fix not changing the buffer size when mtu is reduced

Using larger buffer than mtu resulted in not sending the message at all
as encode_pdu() in shared/att.c fails when provided data buffer is larger
than current mtu.
---
attrib/gattrib.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/attrib/gattrib.c b/attrib/gattrib.c
index a04a0ee..f20b4f9 100644
--- a/attrib/gattrib.c
+++ b/attrib/gattrib.c
@@ -325,7 +325,7 @@ uint8_t *g_attrib_get_buffer(GAttrib *attrib, size_t *len)
gboolean g_attrib_set_mtu(GAttrib *attrib, int mtu)
{
/* Clients of this expect a buffer to use. */
- if (mtu > attrib->buflen) {
+ if (mtu != attrib->buflen) {
attrib->buf = g_realloc(attrib->buf, mtu);
attrib->buflen = mtu;
}
--
1.9.1


2014-12-01 12:04:29

by Szymon Janc

[permalink] [raw]
Subject: Re: [PATCH 1/2] gattrib: Fix not setting att's mtu size in g_attrib_new()

Hi Jakub,

On Wednesday 26 of November 2014 09:45:50 Jakub Tyszkowski wrote:
> We were setting only the buffer in gattrib but att was left with the
> default value of 23 (LE transport layer defaults). For BREDR transport
> layer this may result in using smaller MTU than the minimum allowed (48).
>
> This was affecting cases when MTU Exchange was not supported by the
> remote device and defaults were used.
> ---
> attrib/gattrib.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/attrib/gattrib.c b/attrib/gattrib.c
> index ce7f7b3..a04a0ee 100644
> --- a/attrib/gattrib.c
> +++ b/attrib/gattrib.c
> @@ -83,6 +83,9 @@ GAttrib *g_attrib_new(GIOChannel *io, guint16 mtu)
> if (!attr->att)
> goto fail;
>
> + if (!bt_att_set_mtu(attr->att, mtu))
> + goto fail;
> +
> attr->buf = malloc0(mtu);
> attr->buflen = mtu;
> if (!attr->buf)

This patch is now applied. thanks.

--
Best regards,
Szymon Janc