diff --git a/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c b/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c index a873267e34949f8f833161a305416d48a82b1ca9..eb781ef613542e20dd89b86e18dae40d4690a17b 100644 --- a/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c +++ b/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c @@ -263,46 +263,40 @@ void gnrc_sixlowpan_frag_send(gnrc_pktsnip_t *pkt, void *ctx, unsigned page) if (fragment_msg->offset == 0) { /* increment tag for successive, fragmented datagrams */ _tag++; - if ((res = _send_1st_fragment(iface, fragment_msg->pkt, payload_len, fragment_msg->datagram_size)) == 0) { + if ((res = _send_1st_fragment(iface, fragment_msg->pkt, payload_len, + fragment_msg->datagram_size)) == 0) { /* error sending first fragment */ DEBUG("6lo frag: error sending 1st fragment\n"); - gnrc_pktbuf_release(fragment_msg->pkt); - fragment_msg->pkt = NULL; - return; + goto error; } - fragment_msg->offset += res; - - /* send message to self*/ - msg.type = GNRC_SIXLOWPAN_MSG_FRAG_SND; - msg.content.ptr = (void *)fragment_msg; - msg_send_to_self(&msg); - thread_yield(); } - else { - /* (offset + (datagram_size - payload_len) < datagram_size) simplified */ - if (fragment_msg->offset < payload_len) { - if ((res = _send_nth_fragment(iface, fragment_msg->pkt, payload_len, fragment_msg->datagram_size, - fragment_msg->offset)) == 0) { - /* error sending subsequent fragment */ - DEBUG("6lo frag: error sending subsequent fragment (offset = %" PRIu16 - ")\n", fragment_msg->offset); - gnrc_pktbuf_release(fragment_msg->pkt); - fragment_msg->pkt = NULL; - return; - } - fragment_msg->offset += res; - - /* send message to self*/ - msg.type = GNRC_SIXLOWPAN_MSG_FRAG_SND; - msg.content.ptr = (void *)fragment_msg; - msg_send_to_self(&msg); - thread_yield(); - } - else { - gnrc_pktbuf_release(fragment_msg->pkt); - fragment_msg->pkt = NULL; + /* (offset + (datagram_size - payload_len) < datagram_size) simplified */ + else if (fragment_msg->offset < payload_len) { + if ((res = _send_nth_fragment(iface, fragment_msg->pkt, payload_len, + fragment_msg->datagram_size, + fragment_msg->offset)) == 0) { + /* error sending subsequent fragment */ + DEBUG("6lo frag: error sending subsequent fragment" + "(offset = %u)\n", fragment_msg->offset); + goto error; } } + else { + goto error; + } + fragment_msg->offset += res; + msg.type = GNRC_SIXLOWPAN_MSG_FRAG_SND, + msg.content.ptr = fragment_msg; + if (msg_send_to_self(&msg) == 0) { + printf("6lo frag: message queue full, can't issue next fragment " + "sending\n"); + goto error; + } + thread_yield(); + return; +error: + gnrc_pktbuf_release(fragment_msg->pkt); + fragment_msg->pkt = NULL; } void gnrc_sixlowpan_frag_recv(gnrc_pktsnip_t *pkt, void *ctx, unsigned page)