Skip to content
Snippets Groups Projects
Unverified Commit d3f78a5a authored by Gunar Schorcht's avatar Gunar Schorcht Committed by GitHub
Browse files

Merge pull request #10679 from miri64/gnrc_sixlowpan_frag/fix/send-check-msg-queue

 gnrc_sixlowpan_frag: check if own message queue is full
parents 934c4225 9e3cdeba
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment