<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9302">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Pau Espin Pedrol: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">read monotonic clock with clock_gettime() instead of gettimeofday()<br><br>There have been test failures on the osmo-pcu Jenkins builders due<br>to apparent clock drift. Switch relevant code from gettimeofday()<br>to clock_gettime() with CLOCK_MONOTONIC to prevent time from going<br>backwards and causing negative time deltas in calculations.<br><br>Change-Id: I775d85d0d3ac740330879e588bdab6fce7f0b46c<br>Related: OS#3225<br>---<br>M src/gprs_rlcmac_meas.cpp<br>M src/tbf.cpp<br>M src/tbf.h<br>3 files changed, 22 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gprs_rlcmac_meas.cpp b/src/gprs_rlcmac_meas.cpp</span><br><span>index 41a7531..ac01f2a 100644</span><br><span>--- a/src/gprs_rlcmac_meas.cpp</span><br><span>+++ b/src/gprs_rlcmac_meas.cpp</span><br><span>@@ -71,22 +71,22 @@</span><br><span> /* RSSI values received from MS */</span><br><span> int gprs_rlcmac_rssi(struct gprs_rlcmac_tbf *tbf, int8_t rssi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct timeval now_tv, *rssi_tv = &tbf->meas.rssi_tv;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct timespec now_tv, *rssi_tv = &tbf->meas.rssi_tv;</span><br><span>        uint32_t elapsed;</span><br><span> </span><br><span>        tbf->meas.rssi_sum += rssi;</span><br><span>       tbf->meas.rssi_num++;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    gettimeofday(&now_tv, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_clock_gettime(CLOCK_MONOTONIC, &now_tv);</span><br><span>    elapsed = ((now_tv.tv_sec - rssi_tv->tv_sec) << 7)</span><br><span style="color: hsl(0, 100%, 40%);">-             + ((now_tv.tv_usec - rssi_tv->tv_usec) << 7) / 1000000;</span><br><span style="color: hsl(120, 100%, 40%);">+              + (((now_tv.tv_nsec - rssi_tv->tv_nsec)/1000) << 7) / 1000000;</span><br><span>      if (elapsed < 128)</span><br><span>                return 0;</span><br><span> </span><br><span>        gprs_rlcmac_rssi_rep(tbf);</span><br><span> </span><br><span>       /* reset rssi values and timestamp */</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(rssi_tv, &now_tv, sizeof(struct timeval));</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(rssi_tv, &now_tv, sizeof(*rssi_tv));</span><br><span>      tbf->meas.rssi_sum = 0;</span><br><span>   tbf->meas.rssi_num = 0;</span><br><span> </span><br><span>@@ -115,7 +115,7 @@</span><br><span> int gprs_rlcmac_received_lost(struct gprs_rlcmac_dl_tbf *tbf, uint16_t received,</span><br><span>     uint16_t lost)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct timeval now_tv, *loss_tv = &tbf->m_bw.dl_loss_tv;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct timespec now_tv, *loss_tv = &tbf->m_bw.dl_loss_tv;</span><br><span>     uint32_t elapsed;</span><br><span>    uint16_t sum = received + lost;</span><br><span> </span><br><span>@@ -129,16 +129,16 @@</span><br><span>  tbf->m_bw.dl_loss_received += received;</span><br><span>   tbf->m_bw.dl_loss_lost += lost;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  gettimeofday(&now_tv, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_clock_gettime(CLOCK_MONOTONIC, &now_tv);</span><br><span>    elapsed = ((now_tv.tv_sec - loss_tv->tv_sec) << 7)</span><br><span style="color: hsl(0, 100%, 40%);">-             + ((now_tv.tv_usec - loss_tv->tv_usec) << 7) / 1000000;</span><br><span style="color: hsl(120, 100%, 40%);">+              + (((now_tv.tv_nsec - loss_tv->tv_nsec)/1000) << 7) / 1000000;</span><br><span>      if (elapsed < 128)</span><br><span>                return 0;</span><br><span> </span><br><span>        gprs_rlcmac_lost_rep(tbf);</span><br><span> </span><br><span>       /* reset lost values and timestamp */</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(loss_tv, &now_tv, sizeof(struct timeval));</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(loss_tv, &now_tv, sizeof(*loss_tv));</span><br><span>      tbf->m_bw.dl_loss_received = 0;</span><br><span>   tbf->m_bw.dl_loss_lost = 0;</span><br><span> </span><br><span>@@ -168,14 +168,14 @@</span><br><span> </span><br><span> int gprs_rlcmac_dl_bw(struct gprs_rlcmac_dl_tbf *tbf, uint16_t octets)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct timeval now_tv, *bw_tv = &tbf->m_bw.dl_bw_tv;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct timespec now_tv, *bw_tv = &tbf->m_bw.dl_bw_tv;</span><br><span>         uint32_t elapsed;</span><br><span> </span><br><span>        tbf->m_bw.dl_bw_octets += octets;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        gettimeofday(&now_tv, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_clock_gettime(CLOCK_MONOTONIC, &now_tv);</span><br><span>    elapsed = ((now_tv.tv_sec - bw_tv->tv_sec) << 7)</span><br><span style="color: hsl(0, 100%, 40%);">-               + ((now_tv.tv_usec - bw_tv->tv_usec) << 7) / 1000000;</span><br><span style="color: hsl(120, 100%, 40%);">+                + (((now_tv.tv_nsec - bw_tv->tv_nsec)/1000) << 7) / 1000000;</span><br><span>        if (elapsed < 128)</span><br><span>                return 0;</span><br><span> </span><br><span>@@ -186,7 +186,7 @@</span><br><span>          tbf->m_bw.dl_bw_octets / elapsed);</span><br><span> </span><br><span>    /* reset bandwidth values timestamp */</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(bw_tv, &now_tv, sizeof(struct timeval));</span><br><span style="color: hsl(120, 100%, 40%);">+   memcpy(bw_tv, &now_tv, sizeof(*bw_tv));</span><br><span>  tbf->m_bw.dl_bw_octets = 0;</span><br><span> </span><br><span>   return 0;</span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index 14c1ee2..76137df 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -40,6 +40,7 @@</span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/stats.h></span><br><span> #include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer_compat.h></span><br><span>   #include <osmocom/core/bitvec.h></span><br><span>       #include <osmocom/core/rate_ctr.h></span><br><span>     #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span>@@ -182,7 +183,7 @@</span><br><span>      rssi_sum(0),</span><br><span>         rssi_num(0)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        timerclear(&rssi_tv);</span><br><span style="color: hsl(120, 100%, 40%);">+     timespecclear(&rssi_tv);</span><br><span> }</span><br><span> </span><br><span> gprs_rlcmac_tbf::gprs_rlcmac_tbf(BTS *bts_, gprs_rlcmac_tbf_direction dir) :</span><br><span>@@ -913,7 +914,7 @@</span><br><span>  }</span><br><span> </span><br><span>        /* set timestamp */</span><br><span style="color: hsl(0, 100%, 40%);">-     gettimeofday(&tbf->meas.rssi_tv, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_clock_gettime(CLOCK_MONOTONIC, &tbf->meas.rssi_tv);</span><br><span> </span><br><span>  tbf->set_ms(ms);</span><br><span> </span><br><span>@@ -1024,8 +1025,8 @@</span><br><span>      dl_loss_lost(0),</span><br><span>     dl_loss_received(0)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        timerclear(&dl_bw_tv);</span><br><span style="color: hsl(0, 100%, 40%);">-      timerclear(&dl_loss_tv);</span><br><span style="color: hsl(120, 100%, 40%);">+  timespecclear(&dl_bw_tv);</span><br><span style="color: hsl(120, 100%, 40%);">+ timespecclear(&dl_loss_tv);</span><br><span> }</span><br><span> </span><br><span> gprs_rlcmac_dl_tbf::gprs_rlcmac_dl_tbf(BTS *bts_) :</span><br><span>@@ -1114,8 +1115,8 @@</span><br><span>      tbf->m_last_dl_poll_fn = -1;</span><br><span>      tbf->m_last_dl_drained_fn = -1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  gettimeofday(&tbf->m_bw.dl_bw_tv, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- gettimeofday(&tbf->m_bw.dl_loss_tv, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_clock_gettime(CLOCK_MONOTONIC, &tbf->m_bw.dl_bw_tv);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_clock_gettime(CLOCK_MONOTONIC, &tbf->m_bw.dl_loss_tv);</span><br><span> </span><br><span>       return tbf;</span><br><span> }</span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index 803b294..dc0b050 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -318,7 +318,7 @@</span><br><span>      unsigned int num_fT_exp; /* number of consecutive fT expirations */</span><br><span> </span><br><span>      struct Meas {</span><br><span style="color: hsl(0, 100%, 40%);">-           struct timeval rssi_tv; /* timestamp for rssi calculation */</span><br><span style="color: hsl(120, 100%, 40%);">+          struct timespec rssi_tv; /* timestamp for rssi calculation */</span><br><span>                int32_t rssi_sum; /* sum of rssi values */</span><br><span>           int rssi_num; /* number of rssi values added since rssi_tv */</span><br><span> </span><br><span>@@ -665,11 +665,11 @@</span><br><span>    int32_t m_last_dl_drained_fn;</span><br><span> </span><br><span>    struct BandWidth {</span><br><span style="color: hsl(0, 100%, 40%);">-              struct timeval dl_bw_tv; /* timestamp for dl bw calculation */</span><br><span style="color: hsl(120, 100%, 40%);">+                struct timespec dl_bw_tv; /* timestamp for dl bw calculation */</span><br><span>              uint32_t dl_bw_octets; /* number of octets since bw_tv */</span><br><span>            uint32_t dl_throughput; /* throughput to be displayed in stats */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           struct timeval dl_loss_tv; /* timestamp for loss calculation */</span><br><span style="color: hsl(120, 100%, 40%);">+               struct timespec dl_loss_tv; /* timestamp for loss calculation */</span><br><span>             uint16_t dl_loss_lost; /* sum of lost packets */</span><br><span>             uint16_t dl_loss_received; /* sum of received packets */</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9302">change 9302</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9302"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I775d85d0d3ac740330879e588bdab6fce7f0b46c </div>
<div style="display:none"> Gerrit-Change-Number: 9302 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Stefan Sperling <ssperling@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Stefan Sperling <ssperling@sysmocom.de> </div>