NDN-DPDK
High-Speed Named Data Networking Forwarder
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
rttest.h
Go to the documentation of this file.
1 #ifndef NDNDPDK_CORE_RTTEST_H
2 #define NDNDPDK_CORE_RTTEST_H
3 
6 #include "../dpdk/tsc.h"
7 #include "rttest-enum.h"
8 
13 typedef struct RttValue {
14  float sRtt;
15  float rttVar;
17 static_assert(sizeof(RttValue) == sizeof(uint64_t), "");
18 
19 __attribute__((nonnull)) static __rte_always_inline TscDuration
20 RttValue_RTO(RttValue* rttv) {
21  return rttv->sRtt + RttEstK * rttv->rttVar;
22 }
23 
24 #ifndef __BPF__
25 
26 #define RttEstAlpha (1.0 * RttEstAlphaDividend / RttEstAlphaDivisor)
27 #define RttEstBeta (1.0 * RttEstBetaDividend / RttEstBetaDivisor)
28 
37 __attribute__((nonnull)) static inline void
38 RttValue_Push(RttValue* rttv, TscDuration rtt) {
39  if (unlikely(*(uint64_t*)rttv == 0)) {
40  rttv->sRtt = rtt;
41  rttv->rttVar = rtt / 2.0;
42  } else {
43  rttv->rttVar = (1.0 - RttEstBeta) * rttv->rttVar + RttEstBeta * fabs(rttv->sRtt - rtt);
44  rttv->sRtt = (1.0 - RttEstAlpha) * rttv->sRtt + RttEstAlpha * rtt;
45  }
46 }
47 
50 
55 typedef struct RttEst {
58  TscDuration last; // last input RTT (for external sampling only)
59  TscTime next_; // when to take next RTT sample
61 
62 __attribute__((nonnull)) void
63 RttEst_Init(RttEst* rtte);
64 
65 __attribute__((nonnull)) static inline void
66 RttEst_SetRTO_(RttEst* rtte, TscDuration rto) {
68 }
69 
74 __attribute__((nonnull)) static inline void
75 RttEst_Push(RttEst* rtte, TscTime now, TscDuration rtt) {
76  rtte->last = rtt;
77  if (likely(rtte->next_ > now)) {
78  return;
79  }
80 
81  RttValue_Push(&rtte->rttv, rtt);
82  RttEst_SetRTO_(rtte, RttValue_RTO(&rtte->rttv));
83  rtte->next_ = now + rtte->rttv.sRtt;
84 }
85 
87 __attribute__((nonnull)) static inline void
88 RttEst_Backoff(RttEst* rtte) {
89  RttEst_SetRTO_(rtte, rtte->rto * 2);
90 }
91 
92 #endif // __BPF__
93 
94 #endif // NDNDPDK_CORE_RTTEST_H
#define CLAMP(x, lo, hi)
Definition: common.h:106
@ RttEstK
Definition: rttest-enum.h:7
#define RttEstAlpha
Definition: rttest.h:26
TscDuration RttEstTscMinRto
Definition: rttest.c:8
struct RttValue RttValue
SRTT and RTTVAR values in RTT estimator.
#define RttEstBeta
Definition: rttest.h:27
TscDuration RttEstTscMaxRto
Definition: rttest.c:9
struct RttEst RttEst
RTT estimator.
void RttEst_Init(RttEst *rtte)
Definition: rttest.c:19
RTT estimator.
Definition: rttest.h:55
TscDuration last
Definition: rttest.h:58
TscTime next_
Definition: rttest.h:59
TscDuration rto
Definition: rttest.h:57
RttValue rttv
Definition: rttest.h:56
SRTT and RTTVAR values in RTT estimator.
Definition: rttest.h:13
float sRtt
Definition: rttest.h:14
float rttVar
Definition: rttest.h:15
int64_t TscDuration
Duration in TscTime unit.
Definition: tsc.h:12
uint64_t TscTime
TSC clock time point.
Definition: tsc.h:9