unsigned long long pong_timeout; /* timeout */
unsigned long long pong_timeout_adj; /* timeout adjusted for latency */
uint8_t pong_timeout_backoff; /* see link.h for definition */
- unsigned int latency_fix; /* precision */
+ unsigned int latency_max_samples; /* precision */
+ unsigned int latency_cur_samples;
uint8_t pong_count; /* how many ping/pong to send/receive before link is up */
uint64_t flags;
/* status */
int outsock;
unsigned int configured:1; /* set to 1 if src/dst have been configured transport initialized on this link*/
unsigned int transport_connected:1; /* set to 1 if lower level transport is connected */
- unsigned int latency_exp;
uint8_t received_pong;
struct timespec ping_last;
/* used by PMTUD thread as temp per-link variables and should always contain the onwire_len value! */
link->pong_timeout = KNET_LINK_DEFAULT_PING_TIMEOUT * 1000; /* microseconds */
link->pong_timeout_backoff = KNET_LINK_PONG_TIMEOUT_BACKOFF;
link->pong_timeout_adj = link->pong_timeout * link->pong_timeout_backoff; /* microseconds */
- link->latency_fix = KNET_LINK_DEFAULT_PING_PRECISION;
- link->latency_exp = KNET_LINK_DEFAULT_PING_PRECISION - \
- ((link->ping_interval * KNET_LINK_DEFAULT_PING_PRECISION) / 8000000);
+ link->latency_max_samples = KNET_LINK_DEFAULT_PING_PRECISION;
+ link->latency_cur_samples = 0;
link->flags = flags;
if (transport_link_set_config(knet_h, link, transport) < 0) {
link->ping_interval = interval * 1000; /* microseconds */
link->pong_timeout = timeout * 1000; /* microseconds */
- link->latency_fix = precision;
- link->latency_exp = precision - \
- ((link->ping_interval * precision) / 8000000);
+ link->latency_max_samples = precision;
log_debug(knet_h, KNET_SUB_LINK,
"host: %u link: %u timeout update - interval: %llu timeout: %llu precision: %u",
*interval = link->ping_interval / 1000; /* microseconds */
*timeout = link->pong_timeout / 1000;
- *precision = link->latency_fix;
+ *precision = link->latency_max_samples;
exit_unlock:
pthread_rwlock_unlock(&knet_h->global_rwlock);
if ((knet_h->host_index[1]->link[0].ping_interval != 1000000) ||
(knet_h->host_index[1]->link[0].pong_timeout != 2000000) ||
- (knet_h->host_index[1]->link[0].latency_fix != 2048)) {
+ (knet_h->host_index[1]->link[0].latency_max_samples != 2048)) {
printf("knet_link_set_ping_timers failed to set values\n");
knet_link_clear_config(knet_h, 1, 0);
knet_host_remove(knet_h, 1);
"Incoming pong packet from host: %u link: %u has higher latency than pong_timeout. Discarding",
src_host->host_id, src_link->link_id);
} else {
+
+ /*
+ * in words : ('previous mean' * '(count -1)') + 'new value') / 'count'
+ */
+
+ src_link->latency_cur_samples++;
+
+ /*
+ * limit to max_samples (precision)
+ */
+ if (src_link->latency_cur_samples >= src_link->latency_max_samples) {
+ src_link->latency_cur_samples = src_link->latency_max_samples;
+ }
src_link->status.latency =
- ((src_link->status.latency * src_link->latency_exp) +
- ((latency_last / 1000llu) *
- (src_link->latency_fix - src_link->latency_exp))) /
- src_link->latency_fix;
+ (((src_link->status.latency * (src_link->latency_cur_samples - 1)) + (latency_last / 1000llu)) / src_link->latency_cur_samples);
if (src_link->status.latency < src_link->pong_timeout_adj) {
if (!src_link->status.connected) {