Ejemplo n.º 1
0
/*---------------------------------------------------------------------------*/
void
rpl_link_neighbor_callback(const linkaddr_t *addr, int status, int numtx)
{
  uip_ipaddr_t ipaddr;
  rpl_parent_t *parent;
  rpl_instance_t *instance;
  rpl_instance_t *end;

  uip_ip6addr(&ipaddr, 0xfe80, 0, 0, 0, 0, 0, 0, 0);
  uip_ds6_set_addr_iid(&ipaddr, (uip_lladdr_t *)addr);

  for(instance = &instance_table[0], end = instance + RPL_MAX_INSTANCES; instance < end; ++instance) {
    if(instance->used == 1 ) {
      parent = rpl_find_parent_any_dag(instance, &ipaddr);
      if(parent != NULL) {
        /* Trigger DAG rank recalculation. */
        PRINTF("RPL: rpl_link_neighbor_callback triggering update\n");
        parent->flags |= RPL_PARENT_FLAG_UPDATED;
        if(instance->of->neighbor_link_callback != NULL) {
          instance->of->neighbor_link_callback(parent, status, numtx);
          parent->last_tx_time = clock_time();
        }
      }
    }
  }
}
Ejemplo n.º 2
0
/*---------------------------------------------------------------------------*/
void
rpl_ipv6_neighbor_callback(uip_ds6_nbr_t *nbr)
{
  rpl_parent_t *p;
  rpl_instance_t *instance;
  rpl_instance_t *end;

  PRINTF("RPL: Neighbor state changed for ");
  PRINT6ADDR(&nbr->ipaddr);
#if UIP_ND6_SEND_NA || UIP_ND6_SEND_RA
  PRINTF(", nscount=%u, state=%u\n", nbr->nscount, nbr->state);
#else /* UIP_ND6_SEND_NA || UIP_ND6_SEND_RA */
  PRINTF(", state=%u\n", nbr->state);
#endif /* UIP_ND6_SEND_NA || UIP_ND6_SEND_RA */
  for(instance = &instance_table[0], end = instance + RPL_MAX_INSTANCES; instance < end; ++instance) {
    if(instance->used == 1 ) {
      p = rpl_find_parent_any_dag(instance, &nbr->ipaddr);
      if(p != NULL) {
        p->rank = INFINITE_RANK;
        /* Trigger DAG rank recalculation. */
        PRINTF("RPL: rpl_ipv6_neighbor_callback infinite rank\n");
        p->flags |= RPL_PARENT_FLAG_UPDATED;
      }
    }
  }
}
Ejemplo n.º 3
0
/*---------------------------------------------------------------------------*/
void
rpl_ipv6_neighbor_callback(uip_ds6_nbr_t *nbr)
{
  rpl_parent_t *p;
  rpl_instance_t *instance;
  rpl_instance_t *end;

  PRINTF("RPL: Removing neighbor ");
  PRINT6ADDR(&nbr->ipaddr);
  PRINTF("\n");
  for(instance = &instance_table[0], end = instance + RPL_MAX_INSTANCES; instance < end; ++instance) {
    if(instance->used == 1 ) {
      p = rpl_find_parent_any_dag(instance, &nbr->ipaddr);
      if(p != NULL) {
        p->rank = INFINITE_RANK;
        /* Trigger DAG rank recalculation. */
        PRINTF("RPL: rpl_ipv6_neighbor_callback infinite rank\n");
        p->updated = 1;
      }
    }
  }
}
Ejemplo n.º 4
0
/*---------------------------------------------------------------------------*/
static void
sendpacket(int mode)
{

    static uip_ipaddr_t *parent_ipaddr=NULL,tempadd;
    static rpl_dag_t *current_dag=NULL;
    	
    static int i=0;
    static rpl_instance_t * instance_id=NULL;
    for(i = 0; i < RPL_MAX_INSTANCES; ++i) {
        if(instance_table[i].used && instance_table[i].current_dag->joined) {
            current_dag = instance_table[i].current_dag;
            instance_id = &instance_table[i];
            break;
        }
    }

    if(current_dag != NULL) {
        parent_ipaddr=rpl_get_parent_ipaddr(current_dag->preferred_parent);
    }else return; //if current dag is null return

    if(!parent_ipaddr->u8[15])// if parent is null return
	return;	    
	 		
    uip_ds6_nbr_t *nbr=NULL;
    int num = uip_ds6_nbr_num();
    int sizeof_buf = sizeof(int) + sizeof(uint8_t)  + sizeof(uint8_t) + sizeof(int) + sizeof(uint16_t) +sizeof(uint8_t) + sizeof(uint16_t)+ sizeof(int) + num * ( sizeof(uint8_t) + sizeof(uint16_t) );
    // code + node + id_of_intermediate + msg_instance + own rank + parent + rank + numof_nbr*(nbr+rank)
    unsigned char buf[sizeof_buf];
    unsigned char * buf_p = buf;
    i=2;myrank=current_dag->rank;
    MAPPER_ADD_PACKETDATA(buf_p, i);
    MAPPER_ADD_PACKETDATA(buf_p, myip.u8[15]);

	
    if(mode)		//for first time setting 
    msg_instance = 100*myip.u8[15]; 	
        		
    MAPPER_ADD_PACKETDATA(buf_p, myip.u8[15]);   //added to track limited boradcasting intermediate node id
    MAPPER_ADD_PACKETDATA(buf_p, msg_instance);        //added to track limited boradcasting
    msg_instance++;	

    
    MAPPER_ADD_PACKETDATA(buf_p, current_dag->rank);
    MAPPER_ADD_PACKETDATA(buf_p, parent_ipaddr->u8[15]);
    MAPPER_ADD_PACKETDATA(buf_p, current_dag->preferred_parent->rank);
    MAPPER_ADD_PACKETDATA(buf_p, num);

    printf(" %02x R %u P %u PR %u Bufsize %d msg_instance %d ",myip.u8[15],current_dag->rank,parent_ipaddr->u8[15],current_dag->preferred_parent->rank, sizeof_buf, msg_instance-1);

    num_nbrs=0;
    rpl_parent_t *p=NULL; 
    for(nbr = nbr_table_head(ds6_neighbors); nbr != NULL; nbr = nbr_table_next(ds6_neighbors, nbr)) {
        //p=find_parent_any_dag_any_instance(&nbr->ipaddr);
        p=rpl_find_parent_any_dag(instance_id, &nbr->ipaddr);
	
        MAPPER_ADD_PACKETDATA(buf_p,nbr->ipaddr.u8[15]);
        //rank = rpl_get_parent_rank(uip_ds6_nbr_get_ll(nbr));
        MAPPER_ADD_PACKETDATA(buf_p,p->rank);
        printf("No of nbrs %d : %02x rank %u ",num,nbr->ipaddr.u8[15],p->rank);
	
	nbrs[num_nbrs]=nbr->ipaddr.u8[15];
	num_nbrs++;

    }
    printf("\n");

    if(mode)	
    {
	uip_udp_packet_sendto(client_conn, buf, sizeof(buf), &server_ipaddr, UIP_HTONS(2345));
	uip_create_unspecified(&client_conn->ripaddr);    
	parent_change=0;
	printf("parent change info send via unicast 6BR\n");		
    }
    else
    {   
	

	//uip_udp_packet_sendto(client_conn, buf, sizeof(buf), &server_ipaddr, UIP_HTONS(2345));//temporaryly aadded
	//uip_create_unspecified(&client_conn->ripaddr);  
	
	//send_broadcast(buf,sizeof(buf)); ///*
	//uip_create_unspecified(&udp_bconn->ripaddr);

	int j=0;
	for(i=0,j=0;i<=num_nbrs*3;i++,j=0)
		for(nbr = nbr_table_head(ds6_neighbors); nbr != NULL; nbr = nbr_table_next(ds6_neighbors, nbr)) {        
		uip_ipaddr_copy(&tempadd, &nbr->ipaddr);
		j++;
		if(nbr->ipaddr.u8[15]!=myip.u8[15] && i==j){
			uip_udp_packet_sendto(client_conn, buf, sizeof(buf), &tempadd, UIP_HTONS(10000+(int)tempadd.u8[15]));
			printf("send to %u \n",tempadd.u8[15]);
			uip_create_unspecified(&client_conn->ripaddr);
		}
	}	
	printf("parent change info send via broadcast 6BR\n");		
    }		 	
}