From ca0417a9231b64bfbb9bfc461b8cb4425a84cead Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Tue, 23 Feb 2010 18:38:05 +0000 Subject: [PATCH] Added the MAC layer callback functionality so that the Rime network layer gets information from the MAC about the status of sent packets: were they successfully transmitted, or was there a collisions? How many retries were there? --- core/net/rime/abc.c | 17 ++++++++++-- core/net/rime/abc.h | 5 +++- core/net/rime/broadcast.c | 19 ++++++++++++-- core/net/rime/broadcast.h | 3 ++- core/net/rime/ipolite.c | 10 ++++++-- core/net/rime/polite.c | 10 ++++++-- core/net/rime/runicast.c | 54 ++++++++++++++++++++++----------------- core/net/rime/stunicast.c | 25 +++++++++++++----- core/net/rime/stunicast.h | 4 +-- core/net/rime/unicast.c | 20 +++++++++++++-- core/net/rime/unicast.h | 3 ++- 11 files changed, 126 insertions(+), 44 deletions(-) diff --git a/core/net/rime/abc.c b/core/net/rime/abc.c index 6ff8df2b2..3903d9fd4 100644 --- a/core/net/rime/abc.c +++ b/core/net/rime/abc.c @@ -36,7 +36,7 @@ * * Author: Adam Dunkels * - * $Id: abc.c,v 1.19 2009/03/12 21:58:20 adamdunkels Exp $ + * $Id: abc.c,v 1.20 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -83,7 +83,7 @@ abc_send(struct abc_conn *c) PRINTF("%d.%d: abc: abc_send on channel %d\n", rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], c->channel.channelno); - return chameleon_output(&c->channel); + return rime_output(&c->channel); } /*---------------------------------------------------------------------------*/ void @@ -97,5 +97,18 @@ abc_input(struct channel *channel) c->u->recv(c); } /*---------------------------------------------------------------------------*/ +void +abc_sent(struct channel *channel, int status, int num_tx) +{ + struct abc_conn *c = (struct abc_conn *)channel; + PRINTF("%d.%d: abc: abc_sent on channel %d\n", + rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], + channel->channelno); + + if(c->u->sent) { + c->u->sent(c, status, num_tx); + } +} +/*---------------------------------------------------------------------------*/ /** @} */ diff --git a/core/net/rime/abc.h b/core/net/rime/abc.h index 63294e3a7..e0460cce7 100644 --- a/core/net/rime/abc.h +++ b/core/net/rime/abc.h @@ -46,7 +46,7 @@ * * This file is part of the Contiki operating system. * - * $Id: abc.h,v 1.15 2009/03/12 21:58:20 adamdunkels Exp $ + * $Id: abc.h,v 1.16 2010/02/23 18:38:05 adamdunkels Exp $ */ /** * \file @@ -72,6 +72,7 @@ struct abc_conn; struct abc_callbacks { /** Called when a packet has been received by the abc module. */ void (* recv)(struct abc_conn *ptr); + void (* sent)(struct abc_conn *ptr, int status, int num_tx); }; struct abc_conn { @@ -133,8 +134,10 @@ int abc_send(struct abc_conn *c); * directly. * */ + void abc_input(struct channel *channel); +void abc_sent(struct channel *channel, int status, int num_tx); #endif /* __ABC_H__ */ /** @} */ diff --git a/core/net/rime/broadcast.c b/core/net/rime/broadcast.c index 0cf00def1..4f22eecc1 100644 --- a/core/net/rime/broadcast.c +++ b/core/net/rime/broadcast.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: broadcast.c,v 1.2 2009/03/12 21:58:20 adamdunkels Exp $ + * $Id: broadcast.c,v 1.3 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -74,7 +74,22 @@ recv_from_abc(struct abc_conn *bc) c->u->recv(c, &sender); } /*---------------------------------------------------------------------------*/ -static const struct abc_callbacks broadcast = {recv_from_abc}; +static void +sent_by_abc(struct abc_conn *bc, int status, int num_tx) +{ + struct broadcast_conn *c = (struct broadcast_conn *)bc; + + PRINTF("%d.%d: sent to %d.%d status %d num_tx %d\n", + rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], + packetbuf_addr(PACKETBUF_ADDR_SENDER)->u8[0], + packetbuf_addr(PACKETBUF_ADDR_SENDER)->u8[1], + status, num_tx); + if(c->u->sent) { + c->u->sent(c, status, num_tx); + } +} +/*---------------------------------------------------------------------------*/ +static const struct abc_callbacks broadcast = {recv_from_abc, sent_by_abc}; /*---------------------------------------------------------------------------*/ void broadcast_open(struct broadcast_conn *c, uint16_t channel, diff --git a/core/net/rime/broadcast.h b/core/net/rime/broadcast.h index 39f4290bb..8b1dfd471 100644 --- a/core/net/rime/broadcast.h +++ b/core/net/rime/broadcast.h @@ -53,7 +53,7 @@ * * This file is part of the Contiki operating system. * - * $Id: broadcast.h,v 1.4 2009/11/08 19:40:17 adamdunkels Exp $ + * $Id: broadcast.h,v 1.5 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -81,6 +81,7 @@ struct broadcast_conn; struct broadcast_callbacks { /** Called when a packet has been received by the broadcast module. */ void (* recv)(struct broadcast_conn *ptr, const rimeaddr_t *sender); + void (* sent)(struct broadcast_conn *ptr, int status, int num_tx); }; struct broadcast_conn { diff --git a/core/net/rime/ipolite.c b/core/net/rime/ipolite.c index 3e10a9d38..3598bca2c 100644 --- a/core/net/rime/ipolite.c +++ b/core/net/rime/ipolite.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: ipolite.c,v 1.16 2010/01/25 13:54:06 adamdunkels Exp $ + * $Id: ipolite.c,v 1.17 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -90,6 +90,12 @@ recv(struct broadcast_conn *broadcast, const rimeaddr_t *from) if(c->cb->recv) { c->cb->recv(c, from); } +} +/*---------------------------------------------------------------------------*/ +static void +sent(struct broadcast_conn *bc, int status, int num_tx) +{ + } /*---------------------------------------------------------------------------*/ static void @@ -112,7 +118,7 @@ send(void *ptr) } } /*---------------------------------------------------------------------------*/ -static const struct broadcast_callbacks broadcast = { recv }; +static const struct broadcast_callbacks broadcast = { recv, sent }; /*---------------------------------------------------------------------------*/ void ipolite_open(struct ipolite_conn *c, uint16_t channel, uint8_t dups, diff --git a/core/net/rime/polite.c b/core/net/rime/polite.c index 74774f4d1..bbefaab4f 100644 --- a/core/net/rime/polite.c +++ b/core/net/rime/polite.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: polite.c,v 1.9 2009/03/12 21:58:21 adamdunkels Exp $ + * $Id: polite.c,v 1.10 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -79,6 +79,12 @@ recv(struct abc_conn *abc) if(c->cb->recv) { c->cb->recv(c); } +} +/*---------------------------------------------------------------------------*/ +static void +sent(struct abc_conn *c, int status, int num_tx) +{ + } /*---------------------------------------------------------------------------*/ static void @@ -97,7 +103,7 @@ send(void *ptr) } } /*---------------------------------------------------------------------------*/ -static const struct abc_callbacks abc = { recv }; +static const struct abc_callbacks abc = { recv, sent }; /*---------------------------------------------------------------------------*/ void polite_open(struct polite_conn *c, uint16_t channel, diff --git a/core/net/rime/runicast.c b/core/net/rime/runicast.c index c2fda5fdc..5604f27b0 100644 --- a/core/net/rime/runicast.c +++ b/core/net/rime/runicast.c @@ -34,7 +34,7 @@ * * This file is part of the Contiki operating system. * - * $Id: runicast.c,v 1.9 2010/01/26 10:19:26 adamdunkels Exp $ + * $Id: runicast.c,v 1.10 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -73,33 +73,41 @@ static const struct packetbuf_attrlist attributes[] = /*---------------------------------------------------------------------------*/ static void -sent_by_stunicast(struct stunicast_conn *stunicast) +sent_by_stunicast(struct stunicast_conn *stunicast, int status, int num_tx) { struct runicast_conn *c = (struct runicast_conn *)stunicast; - if(c->rxmit != 0) { - RIMESTATS_ADD(rexmit); - PRINTF("%d.%d: runicast: packet %u resent %u\n", - rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], - packetbuf_attr(PACKETBUF_ATTR_PACKET_ID), c->rxmit); - } + PRINTF("runicast: sent_by_stunicast c->rxmit %d num_tx %d\n", + c->rxmit, num_tx); - c->rxmit++; - if(c->rxmit >= c->max_rxmit) { - RIMESTATS_ADD(timedout); - c->is_tx = 0; - stunicast_cancel(&c->c); - if(c->u->timedout) { - c->u->timedout(c, stunicast_receiver(&c->c), c->rxmit); + /* Only process data packets, not ACKs. */ + if(packetbuf_attr(PACKETBUF_ATTR_PACKET_TYPE) == PACKETBUF_ATTR_PACKET_TYPE_DATA) { + + c->rxmit += num_tx; + + if(c->rxmit != 0) { + RIMESTATS_ADD(rexmit); + PRINTF("%d.%d: runicast: packet %u resent %u\n", + rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], + packetbuf_attr(PACKETBUF_ATTR_PACKET_ID), c->rxmit); + } + if(c->rxmit >= c->max_rxmit) { + RIMESTATS_ADD(timedout); + c->is_tx = 0; + stunicast_cancel(&c->c); + if(c->u->timedout) { + c->u->timedout(c, stunicast_receiver(&c->c), c->rxmit); + } + c->rxmit = 0; + PRINTF("%d.%d: runicast: packet %d timed out\n", + rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], + c->sndnxt); + } else { + int shift; + + shift = c->rxmit > 4? 4: c->rxmit; + stunicast_set_timer(&c->c, (REXMIT_TIME) << shift); } - PRINTF("%d.%d: runicast: packet %d timed out\n", - rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], - c->sndnxt); - } else { - int shift; - - shift = c->rxmit > 4? 4: c->rxmit; - stunicast_set_timer(&c->c, (REXMIT_TIME) << shift); } } /*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/stunicast.c b/core/net/rime/stunicast.c index b739b5884..a7e3e426e 100644 --- a/core/net/rime/stunicast.c +++ b/core/net/rime/stunicast.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: stunicast.c,v 1.3 2009/11/08 19:40:18 adamdunkels Exp $ + * $Id: stunicast.c,v 1.4 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -68,7 +68,20 @@ recv_from_uc(struct unicast_conn *uc, const rimeaddr_t *from) } } /*---------------------------------------------------------------------------*/ -static const struct unicast_callbacks stunicast = {recv_from_uc}; +static void +sent_by_uc(struct unicast_conn *uc, int status, int num_tx) +{ + register struct stunicast_conn *c = (struct stunicast_conn *)uc; + PRINTF("%d.%d: stunicast: recv_from_uc from %d.%d\n", + rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], + from->u8[0], from->u8[1]); + if(c->u->sent != NULL) { + c->u->sent(c, status, num_tx); + } +} +/*---------------------------------------------------------------------------*/ +static const struct unicast_callbacks stunicast = {recv_from_uc, + sent_by_uc}; /*---------------------------------------------------------------------------*/ void stunicast_open(struct stunicast_conn *c, uint16_t channel, @@ -105,9 +118,9 @@ send(void *ptr) queuebuf_to_packetbuf(c->buf); unicast_send(&c->c, &c->receiver); stunicast_set_timer(c, CLOCK_SECOND); - if(c->u->sent != NULL) { + /* if(c->u->sent != NULL) { c->u->sent(c); - } + }*/ } /*---------------------------------------------------------------------------*/ void @@ -134,9 +147,9 @@ stunicast_send_stubborn(struct stunicast_conn *c, const rimeaddr_t *receiver, rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], c->receiver.u8[0],c->receiver.u8[1]); unicast_send(&c->c, &c->receiver); - if(c->u->sent != NULL) { + /* if(c->u->sent != NULL) { c->u->sent(c); - } + }*/ return 1; diff --git a/core/net/rime/stunicast.h b/core/net/rime/stunicast.h index 739688eac..ca9b539a9 100644 --- a/core/net/rime/stunicast.h +++ b/core/net/rime/stunicast.h @@ -60,7 +60,7 @@ * * This file is part of the Contiki operating system. * - * $Id: stunicast.h,v 1.4 2009/11/08 19:40:18 adamdunkels Exp $ + * $Id: stunicast.h,v 1.5 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -83,7 +83,7 @@ struct stunicast_conn; struct stunicast_callbacks { void (* recv)(struct stunicast_conn *c, const rimeaddr_t *from); - void (* sent)(struct stunicast_conn *c); + void (* sent)(struct stunicast_conn *c, int status, int num_tx); }; struct stunicast_conn { diff --git a/core/net/rime/unicast.c b/core/net/rime/unicast.c index 83f6a0d76..63662c8d2 100644 --- a/core/net/rime/unicast.c +++ b/core/net/rime/unicast.c @@ -34,7 +34,7 @@ * * This file is part of the Contiki operating system. * - * $Id: unicast.c,v 1.3 2009/11/08 19:40:18 adamdunkels Exp $ + * $Id: unicast.c,v 1.4 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -77,7 +77,23 @@ recv_from_broadcast(struct broadcast_conn *broadcast, const rimeaddr_t *from) } } /*---------------------------------------------------------------------------*/ -static const struct broadcast_callbacks uc = {recv_from_broadcast}; +static void +sent_by_broadcast(struct broadcast_conn *broadcast, int status, int num_tx) +{ + struct unicast_conn *c = (struct unicast_conn *)broadcast; + + PRINTF("%d.%d: uc: recv_from_broadcast, receiver %d.%d\n", + rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], + packetbuf_addr(PACKETBUF_ADDR_RECEIVER)->u8[0], + packetbuf_addr(PACKETBUF_ADDR_RECEIVER)->u8[1]); + + if(c->u->sent) { + c->u->sent(c, status, num_tx); + } +} +/*---------------------------------------------------------------------------*/ +static const struct broadcast_callbacks uc = {recv_from_broadcast, + sent_by_broadcast}; /*---------------------------------------------------------------------------*/ void unicast_open(struct unicast_conn *c, uint16_t channel, diff --git a/core/net/rime/unicast.h b/core/net/rime/unicast.h index a10520367..c6667405a 100644 --- a/core/net/rime/unicast.h +++ b/core/net/rime/unicast.h @@ -50,7 +50,7 @@ * * This file is part of the Contiki operating system. * - * $Id: unicast.h,v 1.5 2009/11/08 19:40:18 adamdunkels Exp $ + * $Id: unicast.h,v 1.6 2010/02/23 18:38:05 adamdunkels Exp $ */ /** @@ -72,6 +72,7 @@ struct unicast_conn; struct unicast_callbacks { void (* recv)(struct unicast_conn *c, const rimeaddr_t *from); + void (* sent)(struct unicast_conn *ptr, int status, int num_tx); }; struct unicast_conn {