From b746b7fc06bbd255f871f765c4b72dd000f8d987 Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Tue, 23 Feb 2010 18:29:53 +0000 Subject: [PATCH] Reworked the Rime/Chameleon interface so that packets now always hit Rime before Chameleon. Chameleon is now only called by Rime. This makes packet sniffing easier, and allows for sniffing packets after their header has been processed by Chameleon, thereby making per-packet power profiling much easier to implement --- core/net/rime.h | 21 ++------------------- core/net/rime/chameleon.c | 13 ++++++------- core/net/rime/chameleon.h | 6 +++--- core/net/rime/rime.c | 33 ++++++++++++++++++++++++--------- 4 files changed, 35 insertions(+), 38 deletions(-) diff --git a/core/net/rime.h b/core/net/rime.h index 4ecd25801..418af7d58 100644 --- a/core/net/rime.h +++ b/core/net/rime.h @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: rime.h,v 1.25 2010/02/18 21:48:39 adamdunkels Exp $ + * $Id: rime.h,v 1.26 2010/02/23 18:29:53 adamdunkels Exp $ */ /** @@ -89,24 +89,7 @@ int rime_init(void); */ void rime_input(void); -/** - * \brief Rime calls this function to send out a packet - * - * This function must be implemented by the driver running - * below Rime. It is called by anonymous broadcast (abc) to - * send out a packet. The packet is consecutive in the - * packetbuf. A pointer to the first byte of the packet is - * obtained from the packetbuf_hdrptr() function. The length - * of the packet to send is obtained with the packetbuf_totlen() - * function. - * - * The driver, which typically is a MAC protocol, may - * queue the packet by using the queuebuf functions. - */ -void rime_driver_send(void); - -void rime_set_output(void (*output_function)(void)); -void rime_output(void); +int rime_output(struct channel *c); extern const struct mac_driver *rime_mac; diff --git a/core/net/rime/chameleon.c b/core/net/rime/chameleon.c index ce7a99a14..79697d97a 100644 --- a/core/net/rime/chameleon.c +++ b/core/net/rime/chameleon.c @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: chameleon.c,v 1.8 2010/02/18 21:48:39 adamdunkels Exp $ + * $Id: chameleon.c,v 1.9 2010/02/23 18:29:53 adamdunkels Exp $ */ /** @@ -101,10 +101,10 @@ printhdr(uint8_t *hdr, int len) } #endif /* DEBUG */ /*---------------------------------------------------------------------------*/ -void -chameleon_input(void) +struct channel * +chameleon_parse(void) { - struct channel *c; + struct channel *c = NULL; PRINTF("%d.%d: chameleon_input\n", rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1]); #if DEBUG @@ -117,16 +117,16 @@ chameleon_input(void) rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], c->channelno); packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno); - abc_input(c); } else { PRINTF("%d.%d: chameleon_input channel not found for incoming packet\n", rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1]); } } + return c; } /*---------------------------------------------------------------------------*/ int -chameleon_output(struct channel *c) +chameleon_create(struct channel *c) { int ret; @@ -141,7 +141,6 @@ chameleon_output(struct channel *c) printhdr(packetbuf_hdrptr(), packetbuf_hdrlen()); #endif /* DEBUG */ if(ret) { - rime_output(); return 1; } } diff --git a/core/net/rime/chameleon.h b/core/net/rime/chameleon.h index 04a52776a..24d19e43d 100644 --- a/core/net/rime/chameleon.h +++ b/core/net/rime/chameleon.h @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: chameleon.h,v 1.2 2009/03/12 21:58:20 adamdunkels Exp $ + * $Id: chameleon.h,v 1.3 2010/02/23 18:29:53 adamdunkels Exp $ */ /** @@ -56,7 +56,7 @@ struct chameleon_module { void chameleon_init(const struct chameleon_module *header_processing_module); int chameleon_hdrsize(const struct packetbuf_attrlist attrlist[]); -void chameleon_input(void); -int chameleon_output(struct channel *c); +struct channel *chameleon_parse(void); +int chameleon_create(struct channel *c); #endif /* __CHAMELEON_H__ */ diff --git a/core/net/rime/rime.c b/core/net/rime/rime.c index 4064cb74b..6c34a0492 100644 --- a/core/net/rime/rime.c +++ b/core/net/rime/rime.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: rime.c,v 1.25 2010/02/18 21:48:39 adamdunkels Exp $ + * $Id: rime.c,v 1.26 2010/02/23 18:29:53 adamdunkels Exp $ */ /** @@ -79,7 +79,7 @@ const struct mac_driver *rime_mac; #ifdef RIME_CONF_POLITE_ANNOUNCEMENT_MAX_TIME #define POLITE_ANNOUNCEMENT_MAX_TIME RIME_CONF_POLITE_ANNOUNCEMENT_MAX_TIME #else /* RIME_CONF_POLITE_ANNOUNCEMENT_MAX_TIME */ -#define POLITE_ANNOUNCEMENT_MAX_TIME CLOCK_SECOND * 64 +#define POLITE_ANNOUNCEMENT_MAX_TIME CLOCK_SECOND * 128 #endif /* RIME_CONF_POLITE_ANNOUNCEMENT_MAX_TIME */ @@ -102,14 +102,20 @@ static void input(void) { struct rime_sniffer *s; + struct channel *c; + RIMESTATS_ADD(rx); + c = chameleon_parse(); + for(s = list_head(sniffers); s != NULL; s = s->next) { if(s->input_callback != NULL) { s->input_callback(); } } - RIMESTATS_ADD(rx); - chameleon_input(); + + if(c != NULL) { + abc_input(c); + } } /*---------------------------------------------------------------------------*/ static void @@ -139,6 +145,9 @@ init(void) static void packet_sent(void *ptr, int status, int num_tx) { + struct channel *c = ptr; + + switch(status) { case MAC_TX_COLLISION: PRINTF("rime: collision after %d tx\n", num_tx); @@ -152,7 +161,7 @@ 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. */ @@ -162,15 +171,21 @@ packet_sent(void *ptr, int status, int num_tx) } } } + + abc_sent(c, status, num_tx); } /*---------------------------------------------------------------------------*/ -void -rime_output(void) +int +rime_output(struct channel *c) { RIMESTATS_ADD(tx); - packetbuf_compact(); + if(chameleon_create(c)) { + packetbuf_compact(); - NETSTACK_MAC.send(packet_sent, NULL); + NETSTACK_MAC.send(packet_sent, c); + return 1; + } + return 0; } /*---------------------------------------------------------------------------*/ const struct mac_driver rime_driver = {