From e8a96dc20252a60162b82f07d6b593335a9ecf3f Mon Sep 17 00:00:00 2001 From: Niclas Finne Date: Wed, 15 Jun 2011 16:10:07 +0200 Subject: [PATCH] Bug fix: update packet attributes in queued packets in CSMA instead of doing a full packetbuf copy after transmissions. The lower layers often add their own headers to packetbuf. --- core/net/mac/csma.c | 4 +--- core/net/queuebuf.c | 6 ++++++ core/net/queuebuf.h | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/net/mac/csma.c b/core/net/mac/csma.c index e2776e35d..b8fa3c9a2 100644 --- a/core/net/mac/csma.c +++ b/core/net/mac/csma.c @@ -244,9 +244,7 @@ packet_sent(void *ptr, int status, int num_transmissions) /* This is needed to correctly attribute energy that we spent transmitting this packet. */ - q = list_head(queued_packet_list); - queuebuf_free(q->buf); - q->buf = queuebuf_new_from_packetbuf(); + queuebuf_update_attr_from_packetbuf(q->buf); } else { PRINTF("csma: drop with status %d after %d transmissions, %d collisions\n", diff --git a/core/net/queuebuf.c b/core/net/queuebuf.c index ca5988f7d..3a6bdbf10 100644 --- a/core/net/queuebuf.c +++ b/core/net/queuebuf.c @@ -163,6 +163,12 @@ queuebuf_new_from_packetbuf(void) } /*---------------------------------------------------------------------------*/ void +queuebuf_update_attr_from_packetbuf(struct queuebuf *buf) +{ + packetbuf_attr_copyto(buf->attrs, buf->addrs); +} +/*---------------------------------------------------------------------------*/ +void queuebuf_free(struct queuebuf *buf) { if(memb_inmemb(&bufmem, buf)) { diff --git a/core/net/queuebuf.h b/core/net/queuebuf.h index 92c4b9148..f9d434100 100644 --- a/core/net/queuebuf.h +++ b/core/net/queuebuf.h @@ -78,6 +78,7 @@ struct queuebuf *queuebuf_new_from_packetbuf_debug(const char *file, int line); #else /* QUEUEBUF_DEBUG */ struct queuebuf *queuebuf_new_from_packetbuf(void); #endif /* QUEUEBUF_DEBUG */ +void queuebuf_update_attr_from_packetbuf(struct queuebuf *b); void queuebuf_to_packetbuf(struct queuebuf *b); void queuebuf_free(struct queuebuf *b);