From dfaf4afc8ef050d701d9ef5403db34d427c933ec Mon Sep 17 00:00:00 2001 From: Adam Dunkels Date: Mon, 2 May 2011 15:06:34 +0200 Subject: [PATCH] Rime sniffers must be called for all transmissions, even if they failed, to get energy attribution right. This means that rime output sniffers now also must take the MAC transmission status as an argument. --- core/net/rime.h | 2 +- core/net/rime/rime.c | 17 +++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/core/net/rime.h b/core/net/rime.h index 5cd296205..cfd36c6fe 100644 --- a/core/net/rime.h +++ b/core/net/rime.h @@ -94,7 +94,7 @@ extern const struct mac_driver *rime_mac; struct rime_sniffer { struct rime_sniffer *next; void (* input_callback)(void); - void (* output_callback)(void); + void (* output_callback)(int mac_status); }; #define RIME_SNIFFER(name, input_callback, output_callback) \ diff --git a/core/net/rime/rime.c b/core/net/rime/rime.c index 323743cff..08db5b8aa 100644 --- a/core/net/rime/rime.c +++ b/core/net/rime/rime.c @@ -151,7 +151,7 @@ static void packet_sent(void *ptr, int status, int num_tx) { struct channel *c = ptr; - + struct rime_sniffer *s; switch(status) { case MAC_TX_COLLISION: @@ -166,17 +166,14 @@ packet_sent(void *ptr, int status, int num_tx) default: PRINTF("rime: error %d after %d tx\n", status, num_tx); } - - if(status == MAC_TX_OK) { - struct rime_sniffer *s; - /* Call sniffers, but only if the packet was sent. */ - for(s = list_head(sniffers); s != NULL; s = list_item_next(s)) { - if(s->output_callback != NULL) { - s->output_callback(); - } + + /* Call sniffers, pass along the MAC status code. */ + for(s = list_head(sniffers); s != NULL; s = list_item_next(s)) { + if(s->output_callback != NULL) { + s->output_callback(status); } } - + abc_sent(c, status, num_tx); } /*---------------------------------------------------------------------------*/