<p>Stefan Sperling has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9302">View Change</a></p><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, 21 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/02/9302/1</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..4f4f853 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/1000 - 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/1000 - 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/1000 - 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..cd81731 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -182,7 +182,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%);">+     memset(&rssi_tv, 0, sizeof(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 +913,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 +1024,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%);">+  memset(&dl_bw_tv, 0, sizeof(dl_bw_tv));</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(&dl_loss_tv, 0, sizeof(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 +1114,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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Stefan Sperling <ssperling@sysmocom.de> </div>