Exemplo n.º 1
0
/*---------------------------------------------------------------------------*/
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();
}
Exemplo n.º 2
0
/*---------------------------------------------------------------------------*/
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
/*---------------------------------------------------------------------------*/
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;
}
Exemplo n.º 5
0
/*---------------------------------------------------------------------------*/
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);
  }
}