diff --git a/core/net/mac/tsch/tsch-adaptive-timesync.c b/core/net/mac/tsch/tsch-adaptive-timesync.c index 08d4df2ee..2fb2caef9 100644 --- a/core/net/mac/tsch/tsch-adaptive-timesync.c +++ b/core/net/mac/tsch/tsch-adaptive-timesync.c @@ -38,8 +38,10 @@ * */ -#include "tsch-adaptive-timesync.h" -#include "tsch-log.h" +#include "net/mac/tsch/tsch.h" +#include "net/mac/tsch/tsch-conf.h" +#include "net/mac/tsch/tsch-adaptive-timesync.h" +#include "net/mac/tsch/tsch-log.h" #include #if TSCH_ADAPTIVE_TIMESYNC @@ -72,6 +74,10 @@ timesync_entry_add(int32_t val, uint32_t time_delta) buffer[pos] = val; if(timesync_entry_count < NUM_TIMESYNC_ENTRIES) { timesync_entry_count++; + } else { + /* We now have accurate drift compensation. + * Increase keep-alive timeout. */ + tsch_set_ka_timeout(TSCH_MAX_KEEPALIVE_TIMEOUT); } pos = (pos + 1) % NUM_TIMESYNC_ENTRIES; diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index a214519be..877b1d3c9 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -151,6 +151,8 @@ uint8_t tsch_join_priority; static uint8_t tsch_packet_seqno = 0; /* Current period for EB output */ static clock_time_t tsch_current_eb_period; +/* Current period for keepalive output */ +static clock_time_t tsch_current_ka_timeout; /* timer for sending keepalive messages */ static struct ctimer keepalive_timer; @@ -187,6 +189,12 @@ tsch_set_join_priority(uint8_t jp) } /*---------------------------------------------------------------------------*/ void +tsch_set_ka_timeout(uint32_t timeout) +{ + tsch_current_ka_timeout = timeout; +} +/*---------------------------------------------------------------------------*/ +void tsch_set_eb_period(uint32_t period) { tsch_current_eb_period = MIN(period, TSCH_MAX_EB_PERIOD); @@ -256,10 +264,10 @@ keepalive_send() void tsch_schedule_keepalive() { - /* Pick a delay in the range [TSCH_KEEPALIVE_TIMEOUT*0.9, TSCH_KEEPALIVE_TIMEOUT[ */ - if(!tsch_is_coordinator && tsch_is_associated) { - unsigned long delay = (TSCH_KEEPALIVE_TIMEOUT - TSCH_KEEPALIVE_TIMEOUT / 10) - + random_rand() % (TSCH_KEEPALIVE_TIMEOUT / 10); + /* Pick a delay in the range [tsch_current_ka_timeout*0.9, tsch_current_ka_timeout[ */ + if(!tsch_is_coordinator && tsch_is_associated && tsch_current_ka_timeout > 0) { + unsigned long delay = (tsch_current_ka_timeout - tsch_current_ka_timeout / 10) + + random_rand() % (tsch_current_ka_timeout / 10); ctimer_set(&keepalive_timer, delay, keepalive_send, NULL); } } diff --git a/core/net/mac/tsch/tsch.h b/core/net/mac/tsch/tsch.h index 03a0068a5..b56ffaf3a 100644 --- a/core/net/mac/tsch/tsch.h +++ b/core/net/mac/tsch/tsch.h @@ -49,11 +49,19 @@ #define TSCH_KEEPALIVE_TIMEOUT (12 * CLOCK_SECOND) #endif +/* With TSCH_ADAPTIVE_TIMESYNC enabled: keep-alive timeout used after reaching + * accurate drift compensation. */ +#ifdef TSCH_CONF_MAX_KEEPALIVE_TIMEOUT +#define TSCH_MAX_KEEPALIVE_TIMEOUT TSCH_CONF_MAX_KEEPALIVE_TIMEOUT +#else +#define TSCH_MAX_KEEPALIVE_TIMEOUT (60 * CLOCK_SECOND) +#endif + /* Max time without synchronization before leaving the PAN */ #ifdef TSCH_CONF_DESYNC_THRESHOLD #define TSCH_DESYNC_THRESHOLD TSCH_CONF_DESYNC_THRESHOLD #else -#define TSCH_DESYNC_THRESHOLD (4 * TSCH_KEEPALIVE_TIMEOUT) +#define TSCH_DESYNC_THRESHOLD (2 * TSCH_MAX_KEEPALIVE_TIMEOUT) #endif /* Period between two consecutive EBs */ @@ -166,6 +174,8 @@ extern const struct mac_driver tschmac_driver; void tsch_set_join_priority(uint8_t jp); /* The period at which EBs are sent */ void tsch_set_eb_period(uint32_t period); +/* The keep-alive timeout */ +void tsch_set_ka_timeout(uint32_t timeout); /* Set the node as PAN coordinator */ void tsch_set_coordinator(int enable); /* Set the pan as secured or not */