Hi Brian, On Tue, Jan 4, 2011 at 9:01 PM, Brian Gix <bgix@xxxxxxxxxxxxxx> wrote: > Overall purpose of change is to enable a GATT procedure to be >    Âexecuted atomically, even if it requires multiple ATT >    Ârequest/response transactions. > > Fix g_attrib_send() to include an ID parameter, if the pkt to >    Âbe sent should be added to the Head of the pkt queue. >    ÂIf the ID is Zero, legacy functionality is maintained, >    Âand the pkt will be added at the tail of the queuer, and >    Âa new ID will be generated, and returned to the caller. If >    ÂID is non-zero, the pkt will be added to the head of the >    Âqueue, with the ID value requested, which will also be >    Âreturned to the caller. > > Fix received_data() to not service the send queue until after the >    Âreceived data has been processed by calling the cmd->func() >    Âcallback, to allow the callback to insert another pkt on >    Âthe head of the queue. > We don't use tabs in the comments. > Fix all callers of g_attrib_send() to include new parameter. > --- > Âattrib/client.c   |  Â2 +- > Âattrib/gatt.c    |  12 ++++++------ > Âattrib/gattrib.c  Â|  22 +++++++++++++++------- > Âattrib/gattrib.h  Â|  Â7 ++++--- > Âattrib/gatttool.c  |  Â2 +- > Âsrc/attrib-server.c |  Â2 +- > Â6 files changed, 28 insertions(+), 19 deletions(-) > > diff --git a/attrib/client.c b/attrib/client.c > index 10bbf7d..4301082 100644 > --- a/attrib/client.c > +++ b/attrib/client.c > @@ -295,7 +295,7 @@ static void events_handler(const uint8_t *pdu, uint16_t len, >    Âswitch (pdu[0]) { >    Âcase ATT_OP_HANDLE_IND: >        Âolen = enc_confirmation(opdu, sizeof(opdu)); > -        g_attrib_send(gatt->attrib, opdu[0], opdu, olen, > +        g_attrib_send(gatt->attrib, 0, opdu[0], opdu, olen, >                        ÂNULL, NULL, NULL); >    Âcase ATT_OP_HANDLE_NOTIFY: >        Âif (characteristic_set_value(chr, &pdu[3], len - 3) < 0) > diff --git a/attrib/gatt.c b/attrib/gatt.c > index bca8b49..320759f 100644 > --- a/attrib/gatt.c > +++ b/attrib/gatt.c > @@ -68,7 +68,7 @@ guint gatt_discover_primary(GAttrib *attrib, uint16_t start, uint16_t end, >    Âif (plen == 0) >        Âreturn 0; > > -    return g_attrib_send(attrib, op, pdu, plen, func, user_data, NULL); > +    return g_attrib_send(attrib, 0, op, pdu, plen, func, user_data, NULL); > Â} > > Âguint gatt_discover_char(GAttrib *attrib, uint16_t start, uint16_t end, > @@ -93,7 +93,7 @@ guint gatt_read_char_by_uuid(GAttrib *attrib, uint16_t start, uint16_t end, >    Âif (plen == 0) >        Âreturn 0; > > -    return g_attrib_send(attrib, ATT_OP_READ_BY_TYPE_REQ, > +    return g_attrib_send(attrib, 0, ATT_OP_READ_BY_TYPE_REQ, >                    Âpdu, plen, func, user_data, NULL); > Â} > > @@ -104,7 +104,7 @@ guint gatt_read_char(GAttrib *attrib, uint16_t handle, GAttribResultFunc func, >    Âguint16 plen; > >    Âplen = enc_read_req(handle, pdu, sizeof(pdu)); > -    return g_attrib_send(attrib, ATT_OP_READ_REQ, pdu, plen, func, > +    return g_attrib_send(attrib, 0, ATT_OP_READ_REQ, pdu, plen, func, >                            Âuser_data, NULL); > Â} > > @@ -115,7 +115,7 @@ guint gatt_write_char(GAttrib *attrib, uint16_t handle, uint8_t *value, >    Âguint16 plen; > >    Âplen = enc_write_req(handle, value, vlen, pdu, sizeof(pdu)); > -    return g_attrib_send(attrib, ATT_OP_WRITE_REQ, pdu, plen, func, > +    return g_attrib_send(attrib, 0, ATT_OP_WRITE_REQ, pdu, plen, func, >                            Âuser_data, NULL); > Â} > > @@ -129,7 +129,7 @@ guint gatt_find_info(GAttrib *attrib, uint16_t start, uint16_t end, >    Âif (plen == 0) >        Âreturn 0; > > -    return g_attrib_send(attrib, ATT_OP_FIND_INFO_REQ, pdu, plen, func, > +    return g_attrib_send(attrib, 0, ATT_OP_FIND_INFO_REQ, pdu, plen, func, >                            Âuser_data, NULL); > Â} > > @@ -140,6 +140,6 @@ guint gatt_write_cmd(GAttrib *attrib, uint16_t handle, uint8_t *value, int vlen, >    Âguint16 plen; > >    Âplen = enc_write_cmd(handle, value, vlen, pdu, sizeof(pdu)); > -    return g_attrib_send(attrib, ATT_OP_WRITE_CMD, pdu, plen, NULL, > +    return g_attrib_send(attrib, 0, ATT_OP_WRITE_CMD, pdu, plen, NULL, >                            Âuser_data, notify); > Â} > diff --git a/attrib/gattrib.c b/attrib/gattrib.c > index 9268001..79ee2e9 100644 > --- a/attrib/gattrib.c > +++ b/attrib/gattrib.c > @@ -286,6 +286,7 @@ static gboolean received_data(GIOChannel *io, GIOCondition cond, gpointer data) >    Âuint8_t buf[512], status; >    Âgsize len; >    ÂGIOStatus iostat; > +    gboolean qempty; > >    Âif (cond & (G_IO_HUP | G_IO_ERR | G_IO_NVAL)) { >        Âattrib->read_watch = 0; > @@ -333,8 +334,7 @@ static gboolean received_data(GIOChannel *io, GIOCondition cond, gpointer data) >    Âstatus = 0; > > Âdone: > -    if (attrib->queue && g_queue_is_empty(attrib->queue) == FALSE) > -        wake_up_sender(attrib); > +    qempty = attrib->queue == NULL || g_queue_is_empty(attrib->queue); > >    Âif (cmd) { >        Âif (cmd->func) > @@ -343,6 +343,9 @@ done: >        Âcommand_destroy(cmd); >    Â} > > +    if (!qempty) > +        wake_up_sender(attrib); > + >    Âreturn TRUE; > Â} > > @@ -368,9 +371,9 @@ GAttrib *g_attrib_new(GIOChannel *io) >    Âreturn g_attrib_ref(attrib); > Â} > > -guint g_attrib_send(GAttrib *attrib, guint8 opcode, const guint8 *pdu, > -                guint16 len, GAttribResultFunc func, > -                gpointer user_data, GDestroyNotify notify) > +guint g_attrib_send(GAttrib *attrib, guint id, guint8 opcode, > +        const guint8 *pdu, guint16 len, GAttribResultFunc func, > +        gpointer user_data, GDestroyNotify notify) Missing tab here. > Â{ >    Âstruct command *c; > > @@ -386,9 +389,14 @@ guint g_attrib_send(GAttrib *attrib, guint8 opcode, const guint8 *pdu, >    Âc->func = func; >    Âc->user_data = user_data; >    Âc->notify = notify; > -    c->id = ++attrib->next_cmd_id; > > -    g_queue_push_tail(attrib->queue, c); > +    if (id) { > +        c->id = id; > +        g_queue_push_head(attrib->queue, c); > +    } else { > +        c->id = ++attrib->next_cmd_id; > +        g_queue_push_tail(attrib->queue, c); > +    } > >    Âif (g_queue_get_length(attrib->queue) == 1) >        Âwake_up_sender(attrib); > diff --git a/attrib/gattrib.h b/attrib/gattrib.h > index 0940289..1a966a7 100644 > --- a/attrib/gattrib.h > +++ b/attrib/gattrib.h > @@ -50,9 +50,10 @@ gboolean g_attrib_set_disconnect_function(GAttrib *attrib, > Âgboolean g_attrib_set_destroy_function(GAttrib *attrib, >        ÂGDestroyNotify destroy, gpointer user_data); > > -guint g_attrib_send(GAttrib *attrib, guint8 opcode, const guint8 *pdu, > -                guint16 len, GAttribResultFunc func, > -                gpointer user_data, GDestroyNotify notify); > +guint g_attrib_send(GAttrib *attrib, guint id, guint8 opcode, > +            const guint8 *pdu, guint16 len, GAttribResultFunc func, > +            gpointer user_data, GDestroyNotify notify); > + Missing tab here. > Âgboolean g_attrib_cancel(GAttrib *attrib, guint id); > Âgboolean g_attrib_cancel_all(GAttrib *attrib); > > diff --git a/attrib/gatttool.c b/attrib/gatttool.c > index a234e36..a6f92db 100644 > --- a/attrib/gatttool.c > +++ b/attrib/gatttool.c > @@ -272,7 +272,7 @@ static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) >    Âolen = enc_confirmation(opdu, sizeof(opdu)); > >    Âif (olen > 0) > -        g_attrib_send(attrib, opdu[0], opdu, olen, NULL, NULL, NULL); > +        g_attrib_send(attrib, 0, opdu[0], opdu, olen, NULL, NULL, NULL); > Â} > > Âstatic gboolean listen_start(gpointer user_data) > diff --git a/src/attrib-server.c b/src/attrib-server.c > index cbc01ee..aee2ace 100644 > --- a/src/attrib-server.c > +++ b/src/attrib-server.c > @@ -694,7 +694,7 @@ done: >    Âif (status) >        Âlength = enc_error_resp(ipdu[0], 0x0000, status, opdu, channel->mtu); > > -    g_attrib_send(channel->attrib, opdu[0], opdu, length, > +    g_attrib_send(channel->attrib, 0, opdu[0], opdu, length, >                            ÂNULL, NULL, NULL); > Â} > > -- > 1.7.1 > -- > Brian Gix > bgix@xxxxxxxxxxxxxx > Employee of Qualcomm Innovation Center, Inc. > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum > We need only to avoid calling g_attrib_send outside gatt.c passing id !=0, otherwise it may break the commands sequence. Could you please change the the attribute server adding a service with long attributes? Regards, Claudio. -- 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