diff --git a/core/net/rime/mesh.c b/core/net/rime/mesh.c index 779628c97..bb11f1a2a 100644 --- a/core/net/rime/mesh.c +++ b/core/net/rime/mesh.c @@ -94,7 +94,15 @@ data_packet_forward(struct multihop_conn *multihop, rt = route_lookup(dest); if(rt == NULL) { + if(c->queued_data != NULL) { + queuebuf_free(c->queued_data); + } + + PRINTF("data_packet_forward: queueing data, sending rreq\n"); + c->queued_data = queuebuf_new_from_packetbuf(); + rimeaddr_copy(&c->queued_data_dest, dest); route_discovery_discover(&c->route_discovery_conn, dest, PACKET_TIMEOUT); + return NULL; } else { route_refresh(rt); @@ -106,15 +114,21 @@ data_packet_forward(struct multihop_conn *multihop, static void found_route(struct route_discovery_conn *rdc, const rimeaddr_t *dest) { + struct route_entry *rt; struct mesh_conn *c = (struct mesh_conn *) ((char *)rdc - offsetof(struct mesh_conn, route_discovery_conn)); + PRINTF("found_route\n"); + if(c->queued_data != NULL && rimeaddr_cmp(dest, &c->queued_data_dest)) { queuebuf_to_packetbuf(c->queued_data); queuebuf_free(c->queued_data); c->queued_data = NULL; - if(multihop_send(&c->multihop, dest)) { + + rt = route_lookup(dest); + if (rt != NULL) { + multihop_resend(&c->multihop, &rt->nexthop); c->cb->sent(c); } else { c->cb->timedout(c); @@ -175,15 +189,7 @@ mesh_send(struct mesh_conn *c, const rimeaddr_t *to) could_send = multihop_send(&c->multihop, to); if(!could_send) { - if(c->queued_data != NULL) { - queuebuf_free(c->queued_data); - } - - PRINTF("mesh_send: queueing data, sending rreq\n"); - c->queued_data = queuebuf_new_from_packetbuf(); - rimeaddr_copy(&c->queued_data_dest, to); - route_discovery_discover(&c->route_discovery_conn, to, - PACKET_TIMEOUT); + PRINTF("mesh_send: could not send\n"); return 0; } c->cb->sent(c); diff --git a/core/net/rime/multihop.c b/core/net/rime/multihop.c index 5f45b9106..486c7f969 100644 --- a/core/net/rime/multihop.c +++ b/core/net/rime/multihop.c @@ -94,11 +94,10 @@ data_packet_received(struct unicast_conn *uc, const rimeaddr_t *from) } else { nexthop = NULL; if(c->cb->forward) { - nexthop = c->cb->forward(c, &sender, &receiver, - from, packetbuf_attr(PACKETBUF_ATTR_HOPS)); - packetbuf_set_attr(PACKETBUF_ATTR_HOPS, packetbuf_attr(PACKETBUF_ATTR_HOPS) + 1); + nexthop = c->cb->forward(c, &sender, &receiver, + from, packetbuf_attr(PACKETBUF_ATTR_HOPS) - 1); } if(nexthop) { PRINTF("forwarding to %d.%d\n", nexthop->u8[0], nexthop->u8[1]); @@ -133,6 +132,9 @@ multihop_send(struct multihop_conn *c, const rimeaddr_t *to) return 0; } packetbuf_compact(); + packetbuf_set_addr(PACKETBUF_ADDR_ERECEIVER, to); + packetbuf_set_addr(PACKETBUF_ADDR_ESENDER, &rimeaddr_node_addr); + packetbuf_set_attr(PACKETBUF_ATTR_HOPS, 1); nexthop = c->cb->forward(c, &rimeaddr_node_addr, to, NULL, 0); if(nexthop == NULL) { @@ -141,12 +143,15 @@ multihop_send(struct multihop_conn *c, const rimeaddr_t *to) } else { PRINTF("multihop_send: sending data towards %d.%d\n", nexthop->u8[0], nexthop->u8[1]); - packetbuf_set_addr(PACKETBUF_ADDR_ERECEIVER, to); - packetbuf_set_addr(PACKETBUF_ADDR_ESENDER, &rimeaddr_node_addr); - packetbuf_set_attr(PACKETBUF_ATTR_HOPS, 1); unicast_send(&c->c, nexthop); return 1; } } /*---------------------------------------------------------------------------*/ +void +multihop_resend(const struct multihop_conn *const c, const rimeaddr_t *const nexthop) +{ + unicast_send(&c->c, nexthop); +} +/*---------------------------------------------------------------------------*/ /** @} */ diff --git a/core/net/rime/multihop.h b/core/net/rime/multihop.h index 23acb41fb..978005ed4 100644 --- a/core/net/rime/multihop.h +++ b/core/net/rime/multihop.h @@ -104,6 +104,7 @@ void multihop_open(struct multihop_conn *c, uint16_t channel, const struct multihop_callbacks *u); void multihop_close(struct multihop_conn *c); int multihop_send(struct multihop_conn *c, const rimeaddr_t *to); +void multihop_resend(const struct multihop_conn *const c, const rimeaddr_t *const nexthop); #endif /* __MULTIHOP_H__ */ /** @} */