OSDN Git Service

attrib: Add mtu argument to g_attrib_new
authorMichael Janssen <jamuraa@chromium.org>
Fri, 31 Oct 2014 18:14:52 +0000 (11:14 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 3 Nov 2014 15:16:56 +0000 (17:16 +0200)
Instead of using the default MTU, use one passed
in by the user, and detect it from the channel when
it is created.

android/gatt.c
attrib/gattrib.c
attrib/gattrib.h
attrib/gatttool.c
attrib/interactive.c
src/device.c

index c26d45a..b3dd6d3 100644 (file)
@@ -1420,6 +1420,8 @@ static void connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
        struct att_range range;
        uint32_t status;
        GAttrib *attrib;
+       uint16_t mtu;
+       uint16_t cid;
 
        if (dev->state != DEVICE_CONNECT_READY) {
                error("gatt: Device not in a connecting state!?");
@@ -1439,7 +1441,11 @@ static void connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
                goto reply;
        }
 
-       attrib = g_attrib_new(io);
+       if (!bt_io_get(io, &gerr, BT_IO_OPT_IMTU, &mtu, BT_IO_OPT_CID, &cid,
+                               BT_IO_OPT_INVALID) || cid == ATT_CID)
+               mtu = ATT_DEFAULT_LE_MTU;
+
+       attrib = g_attrib_new(io, mtu);
        if (!attrib) {
                error("gatt: unable to create new GAttrib instance");
                device_set_state(dev, DEVICE_DISCONNECTED);
index ba2f6cc..a6511a2 100644 (file)
@@ -473,10 +473,9 @@ done:
        return TRUE;
 }
 
-GAttrib *g_attrib_new(GIOChannel *io)
+GAttrib *g_attrib_new(GIOChannel *io, guint16 mtu)
 {
        struct _GAttrib *attrib;
-       uint16_t att_mtu;
 
        g_io_channel_set_encoding(io, NULL, NULL);
        g_io_channel_set_buffered(io, FALSE);
@@ -485,10 +484,8 @@ GAttrib *g_attrib_new(GIOChannel *io)
        if (attrib == NULL)
                return NULL;
 
-       att_mtu = ATT_DEFAULT_LE_MTU;
-
-       attrib->buf = g_malloc0(att_mtu);
-       attrib->buflen = att_mtu;
+       attrib->buf = g_malloc0(mtu);
+       attrib->buflen = mtu;
 
        attrib->io = g_io_channel_ref(io);
        attrib->requests = g_queue_new();
index 18df2ad..99b8b37 100644 (file)
@@ -42,7 +42,7 @@ typedef void (*GAttribDebugFunc)(const char *str, gpointer user_data);
 typedef void (*GAttribNotifyFunc)(const guint8 *pdu, guint16 len,
                                                        gpointer user_data);
 
-GAttrib *g_attrib_new(GIOChannel *io);
+GAttrib *g_attrib_new(GIOChannel *io, guint16 mtu);
 GAttrib *g_attrib_ref(GAttrib *attrib);
 void g_attrib_unref(GAttrib *attrib);
 
index db5da62..b8e0f68 100644 (file)
@@ -123,6 +123,9 @@ static gboolean listen_start(gpointer user_data)
 static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
 {
        GAttrib *attrib;
+       uint16_t mtu;
+       uint16_t cid;
+       GError *gerr = NULL;
 
        if (err) {
                g_printerr("%s\n", err->message);
@@ -130,7 +133,20 @@ static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
                g_main_loop_quit(event_loop);
        }
 
-       attrib = g_attrib_new(io);
+       bt_io_get(io, &gerr, BT_IO_OPT_IMTU, &mtu,
+                               BT_IO_OPT_CID, &cid, BT_IO_OPT_INVALID);
+
+       if (gerr) {
+               g_printerr("Can't detect MTU, using default: %s",
+                                                               gerr->message);
+               g_error_free(gerr);
+               mtu = ATT_DEFAULT_LE_MTU;
+       }
+
+       if (cid == ATT_CID)
+               mtu = ATT_DEFAULT_LE_MTU;
+
+       attrib = g_attrib_new(io, mtu);
 
        if (opt_listen)
                g_idle_add(listen_start, attrib);
index 08f39f7..7911ba5 100644 (file)
@@ -150,13 +150,28 @@ static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data)
 
 static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
 {
+       uint16_t mtu;
+       uint16_t cid;
+
        if (err) {
                set_state(STATE_DISCONNECTED);
                error("%s\n", err->message);
                return;
        }
 
-       attrib = g_attrib_new(iochannel);
+       bt_io_get(io, &err, BT_IO_OPT_IMTU, &mtu,
+                               BT_IO_OPT_CID, &cid, BT_IO_OPT_INVALID);
+
+       if (err) {
+               g_printerr("Can't detect MTU, using default: %s", err->message);
+               g_error_free(err);
+               mtu = ATT_DEFAULT_LE_MTU;
+       }
+
+       if (cid == ATT_CID)
+               mtu = ATT_DEFAULT_LE_MTU;
+
+       attrib = g_attrib_new(iochannel, mtu);
        g_attrib_register(attrib, ATT_OP_HANDLE_NOTIFY, GATTRIB_ALL_HANDLES,
                                                events_handler, attrib, NULL);
        g_attrib_register(attrib, ATT_OP_HANDLE_IND, GATTRIB_ALL_HANDLES,
index db6c4f8..1499d1b 100644 (file)
@@ -3628,9 +3628,14 @@ bool device_attach_attrib(struct btd_device *dev, GIOChannel *io)
        GError *gerr = NULL;
        GAttrib *attrib;
        BtIOSecLevel sec_level;
+       uint16_t mtu;
+       uint16_t cid;
 
        bt_io_get(io, &gerr, BT_IO_OPT_SEC_LEVEL, &sec_level,
+                                               BT_IO_OPT_IMTU, &mtu,
+                                               BT_IO_OPT_CID, &cid,
                                                BT_IO_OPT_INVALID);
+
        if (gerr) {
                error("bt_io_get: %s", gerr->message);
                g_error_free(gerr);
@@ -3650,7 +3655,10 @@ bool device_attach_attrib(struct btd_device *dev, GIOChannel *io)
                }
        }
 
-       attrib = g_attrib_new(io);
+       if (cid == ATT_CID)
+               mtu = ATT_DEFAULT_LE_MTU;
+
+       attrib = g_attrib_new(io, mtu);
        if (!attrib) {
                error("Unable to create new GAttrib instance");
                return false;