diff --git a/core/net/rime/multihop.c b/core/net/rime/multihop.c index 31c22842a..aad937559 100644 --- a/core/net/rime/multihop.c +++ b/core/net/rime/multihop.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: multihop.c,v 1.5 2009/04/28 14:01:46 adamdunkels Exp $ + * $Id: multihop.c,v 1.6 2009/05/10 21:10:02 adamdunkels Exp $ */ /** @@ -70,6 +70,13 @@ data_packet_received(struct unicast_conn *uc, rimeaddr_t *from) { struct multihop_conn *c = (struct multihop_conn *)uc; rimeaddr_t *nexthop; + rimeaddr_t sender, receiver; + + /* Copy the packet attributes to avoid them being overwritten or + cleared by an application program that uses the packet buffer for + its own needs. */ + rimeaddr_copy(&sender, packetbuf_addr(PACKETBUF_ADDR_ESENDER)); + rimeaddr_copy(&receiver, packetbuf_addr(PACKETBUF_ADDR_ERECEIVER)); PRINTF("data_packet_received from %d.%d towards %d.%d len %d\n", from->u8[0], from->u8[1], @@ -81,15 +88,13 @@ data_packet_received(struct unicast_conn *uc, rimeaddr_t *from) &rimeaddr_node_addr)) { PRINTF("for us!\n"); if(c->cb->recv) { - c->cb->recv(c, packetbuf_addr(PACKETBUF_ADDR_ESENDER), from, + c->cb->recv(c, &sender, from, packetbuf_attr(PACKETBUF_ATTR_HOPS)); } } else { nexthop = NULL; if(c->cb->forward) { - nexthop = c->cb->forward(c, - packetbuf_addr(PACKETBUF_ADDR_ESENDER), - packetbuf_addr(PACKETBUF_ADDR_ERECEIVER), + nexthop = c->cb->forward(c, &sender, &receiver, from, packetbuf_attr(PACKETBUF_ATTR_HOPS)); packetbuf_set_attr(PACKETBUF_ATTR_HOPS,