From 32e668ae2aa11524bedd2705f4be56244eb1bfdd Mon Sep 17 00:00:00 2001 From: Billy Kozak Date: Tue, 14 Jul 2015 07:53:10 -0600 Subject: [PATCH] Fix for #1165 It is possible that packetbuf is modified by the call to mac_call_sent_callback. If this occurs ContikiMAC will not be able to recognize that a packet is pending. This fixes this problem by storing pending status in a local variable before calling mac_call_sent_callback. --- core/net/mac/contikimac/contikimac.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/net/mac/contikimac/contikimac.c b/core/net/mac/contikimac/contikimac.c index 74da6ef40..9451de2e0 100644 --- a/core/net/mac/contikimac/contikimac.c +++ b/core/net/mac/contikimac/contikimac.c @@ -805,6 +805,7 @@ qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) struct rdc_buf_list *next; int ret; int is_receiver_awake; + int pending; if(buf_list == NULL) { return; @@ -849,7 +850,9 @@ qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) /* Prepare the packetbuf */ queuebuf_to_packetbuf(curr->buf); - + + pending = packetbuf_attr(PACKETBUF_ATTR_PENDING); + /* Send the current packet */ ret = send_packet(sent, ptr, curr, is_receiver_awake); if(ret != MAC_TX_DEFERRED) { @@ -866,7 +869,7 @@ qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) /* The transmission failed, we stop the burst */ next = NULL; } - } while((next != NULL) && packetbuf_attr(PACKETBUF_ATTR_PENDING)); + } while((next != NULL) && pending); } /*---------------------------------------------------------------------------*/ /* Timer callback triggered when receiving a burst, after having