/*---------------------------------------------------------------------------*/ 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(); } } } } }
/*---------------------------------------------------------------------------*/ 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; } } } }
/*---------------------------------------------------------------------------*/ 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; } } } }
/*---------------------------------------------------------------------------*/ 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"); } }