/* Update TSCH time source */ int tsch_queue_update_time_source(const linkaddr_t *new_addr) { if(!tsch_is_locked()) { if(!tsch_is_coordinator) { struct tsch_neighbor *old_time_src = tsch_queue_get_time_source(); struct tsch_neighbor *new_time_src = NULL; if(new_addr != NULL) { /* Get/add neighbor, return 0 in case of failure */ new_time_src = tsch_queue_add_nbr(new_addr); if(new_time_src == NULL) { return 0; } } if(new_time_src != old_time_src) { PRINTF("TSCH: update time source: %u -> %u\n", TSCH_LOG_ID_FROM_LINKADDR(old_time_src ? &old_time_src->addr : NULL), TSCH_LOG_ID_FROM_LINKADDR(new_time_src ? &new_time_src->addr : NULL)); /* Update time source */ if(new_time_src != NULL) { new_time_src->is_time_source = 1; /* (Re)set keep-alive timeout */ tsch_set_ka_timeout(TSCH_KEEPALIVE_TIMEOUT); /* Start sending keepalives */ tsch_schedule_keepalive(); } else { /* Stop sending keepalives */ tsch_set_ka_timeout(0); } if(old_time_src != NULL) { old_time_src->is_time_source = 0; } #ifdef TSCH_CALLBACK_NEW_TIME_SOURCE TSCH_CALLBACK_NEW_TIME_SOURCE(old_time_src, new_time_src); #endif } return 1; } } return 0; }
/* Update TSCH time source */ int tsch_queue_update_time_source(const linkaddr_t *new_addr) { if(!tsch_is_locked()) { if(!tsch_is_coordinator) { struct tsch_neighbor *old_time_src = tsch_queue_get_time_source(); struct tsch_neighbor *new_time_src = NULL; if(new_addr != NULL) { /* Get/add neighbor, return 0 in case of failure */ new_time_src = tsch_queue_add_nbr(new_addr); if(new_time_src == NULL) { return 0; } } if(new_time_src != old_time_src) { PRINTF("TSCH: update time source: %u -> %u\n", TSCH_LOG_ID_FROM_LINKADDR(old_time_src ? &old_time_src->addr : NULL), TSCH_LOG_ID_FROM_LINKADDR(new_time_src ? &new_time_src->addr : NULL)); /* Update time source */ if(new_time_src != NULL) { new_time_src->is_time_source = 1; } if(old_time_src != NULL) { old_time_src->is_time_source = 0; } #ifdef TSCH_CALLBACK_NEW_TIME_SOURCE TSCH_CALLBACK_NEW_TIME_SOURCE(old_time_src, new_time_src); #endif } return 1; } } return 0; }