litespeed-quic/src/liblsquic/lsquic_rtt.c

40 lines
1.2 KiB
C

/* Copyright (c) 2017 LiteSpeed Technologies Inc. See LICENSE. */
/*
* lsquic_rtt.c -- RTT calculation
*/
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include "lsquic_int_types.h"
#include "lsquic_rtt.h"
/* See RFC 2988 */
#define ALPHA_SHIFT 3 /* Alpha is 1/8 */
#define BETA_SHIFT 2 /* Beta is 1/4 */
void
lsquic_rtt_stats_update (struct lsquic_rtt_stats *stats,
lsquic_time_t send_delta, lsquic_time_t lack_delta)
{
if (send_delta > lack_delta)
send_delta -= lack_delta;
if (stats->srtt) {
stats->rttvar -= stats->rttvar >> BETA_SHIFT;
// FIXED: subtracting unsigned (the (int) cast gets repromoted to uint64_t
// made abs() irrelevant and allowed overflow. instead cast the difference
// to a signed int64 and use labs() to get abs val.
stats->rttvar += (llabs((int64_t) (send_delta - stats->srtt)))
>> BETA_SHIFT;
stats->srtt -= stats->srtt >> ALPHA_SHIFT;
stats->srtt += send_delta >> ALPHA_SHIFT;
} else {
/* First measurement */
stats->srtt = send_delta;
stats->rttvar = send_delta >> 1;
}
}