/*---------------------------------------------------------------------------*/ static void recv_data(struct unicast_conn *c, const linkaddr_t *from) { struct route_entry *e; linkaddr_t source; uip_len = packetbuf_copyto(&uip_buf[UIP_LLH_LEN]); source.u8[0] = BUF->srcipaddr.u8[2]; source.u8[1] = BUF->srcipaddr.u8[3]; e = route_lookup(&source); if(e == NULL) { route_add(&source, from, 10, 0); } else { route_refresh(e); } /* If we received data via a gateway, we refresh the gateway route. * Note: we refresh OUR gateway route, although we are not sure it forwarded the data. */ if(!uip_ipaddr_maskcmp(&BUF->srcipaddr, &netaddr, &netmask)) { e = route_lookup(&gateway); if(e != NULL) { route_refresh(e); } } PRINTF("uip-over-mesh: %d.%d: recv_data with len %d\n", linkaddr_node_addr.u8[0], linkaddr_node_addr.u8[1], uip_len); tcpip_input(); }
/*---------------------------------------------------------------------------*/ static rimeaddr_t * data_packet_forward(struct multihop_conn *multihop, const rimeaddr_t *originator, const rimeaddr_t *dest, const rimeaddr_t *prevhop, uint8_t hops) { struct route_entry *rt; struct mesh_conn *c = (struct mesh_conn *) ((char *)multihop - offsetof(struct mesh_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); } return &rt->R_next_addr; }
rimeaddr_t * c_multihop_forward(struct pipe *p, struct stackmodule_i *module) { printf("multihop forward \n"); struct route_entry *rt, *previous_rt; rimeaddr_t *tmpaddr = get_node_addr(module->stack_id, 0, 3); rt = route_lookup(tmpaddr); if (rt == NULL) { return NULL; } else { /*if(clock_time()*1000/CLOCK_SECOND < 50100 && rimeaddr_node_addr.u8[0] == 1) { previous_rt->nexthop.u8[0] = rt->nexthop.u8[0]; previous_rt->cost = rt->cost; } if(clock_time()*1000/CLOCK_SECOND > 50100 && rimeaddr_node_addr.u8[0] == 1 && rt->nexthop.u8[0] == previous_rt->nexthop.u8[0] && previous_rt->cost == rt->cost) { route_remove(rt); rt = route_lookup(tmpaddr); }*/ /*if(clock_time()*1000/CLOCK_SECOND < 50100) { previous_rt->nexthop.u8[0] = rt->nexthop.u8[0]; previous_rt->cost = rt->cost; } if(clock_time()*1000/CLOCK_SECOND > 50100 && rt->nexthop.u8[0] == previous_rt->nexthop.u8[0] && previous_rt->cost == rt->cost) { route_remove(rt); return NULL; }*/ route_refresh(rt); } PRINTF("~c_multihop_forward \n"); return &rt->nexthop; }
/*---------------------------------------------------------------------------*/ static rimeaddr_t * data_packet_forward(struct multihop_conn *multihop, const rimeaddr_t *originator, const rimeaddr_t *dest, const rimeaddr_t *prevhop, uint8_t hops) { struct route_entry *rt; struct mesh_conn *c = (struct mesh_conn *) ((char *)multihop - offsetof(struct mesh_conn, multihop)); rt = route_lookup(dest); if(rt == NULL) { route_discovery_discover(&c->route_discovery_conn, dest, PACKET_TIMEOUT); return NULL; } else { route_refresh(rt); } return &rt->nexthop; }
/*---------------------------------------------------------------------------*/ static void data_packet_received(struct multihop_conn *multihop, const rimeaddr_t *from, const rimeaddr_t *prevhop, uint8_t hops) { struct mesh_conn *c = (struct mesh_conn *) ((char *)multihop - offsetof(struct mesh_conn, multihop)); struct route_entry *rt; /* Refresh the route when we hear a packet from a neighbor. */ rt = route_lookup(from); if(rt != NULL) { route_refresh(rt); } if(c->cb->recv) { c->cb->recv(c, from, hops); } }