<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/17460">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use clock_gettime(CLOCK_MONOTONIC) and timespec everywhere<br><br>We should really be using monotonic clock in all places that<br>gettimeofday is used right now. Since clock_gettime() uses timespec,<br>let's move all code to use timespecs instead to avoid having to convert<br>in several places between timespec and timeval.<br>Actually use osmo_clock_gettime() shim everywhere to be able to control<br>the time everywhere from unit tests.<br><br>Change-Id: Ie265d70f8ffa7dbf7efbef6030505d9fcb5dc338<br>---<br>M src/gprs_bssgp_pcu.cpp<br>M src/gprs_bssgp_pcu.h<br>M src/gprs_codel.c<br>M src/gprs_codel.h<br>M src/gprs_ms.cpp<br>M src/llc.cpp<br>M src/llc.h<br>M src/pcu_utils.h<br>M src/tbf_dl.cpp<br>M src/tbf_dl.h<br>M tests/codel/codel_test.c<br>M tests/llc/LlcTest.cpp<br>12 files changed, 130 insertions(+), 122 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/60/17460/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp</span><br><span>index ccf233a..63c0a6e 100644</span><br><span>--- a/src/gprs_bssgp_pcu.cpp</span><br><span>+++ b/src/gprs_bssgp_pcu.cpp</span><br><span>@@ -662,16 +662,16 @@</span><br><span> </span><br><span> static uint32_t get_and_reset_avg_queue_delay(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct timeval *delay_sum = &the_pcu.queue_delay_sum;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct timespec *delay_sum = &the_pcu.queue_delay_sum;</span><br><span>   uint32_t delay_sum_ms = delay_sum->tv_sec * 1000 +</span><br><span style="color: hsl(0, 100%, 40%);">-                   delay_sum->tv_usec / 1000000;</span><br><span style="color: hsl(120, 100%, 40%);">+                      delay_sum->tv_nsec / 1000000000;</span><br><span>  uint32_t avg_delay_ms = 0;</span><br><span> </span><br><span>       if (the_pcu.queue_delay_count > 0)</span><br><span>                avg_delay_ms = delay_sum_ms / the_pcu.queue_delay_count;</span><br><span> </span><br><span>         /* Reset accumulator */</span><br><span style="color: hsl(0, 100%, 40%);">- delay_sum->tv_sec = delay_sum->tv_usec = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     delay_sum->tv_sec = delay_sum->tv_nsec = 0;</span><br><span>    the_pcu.queue_delay_count = 0;</span><br><span> </span><br><span>   return avg_delay_ms;</span><br><span>@@ -1024,14 +1024,14 @@</span><br><span>       the_pcu.queue_frames_recv += frames_recv;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_bssgp_update_queue_delay(const struct timeval *tv_recv,</span><br><span style="color: hsl(0, 100%, 40%);">-     const struct timeval *tv_now)</span><br><span style="color: hsl(120, 100%, 40%);">+void gprs_bssgp_update_queue_delay(const struct timespec *tv_recv,</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct timespec *tv_now)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct timeval *delay_sum = &the_pcu.queue_delay_sum;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct timeval tv_delay;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct timespec *delay_sum = &the_pcu.queue_delay_sum;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct timespec tv_delay;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   timersub(tv_now, tv_recv, &tv_delay);</span><br><span style="color: hsl(0, 100%, 40%);">-       timeradd(delay_sum, &tv_delay, delay_sum);</span><br><span style="color: hsl(120, 100%, 40%);">+        timespecsub(tv_now, tv_recv, &tv_delay);</span><br><span style="color: hsl(120, 100%, 40%);">+  timespecadd(delay_sum, &tv_delay, delay_sum);</span><br><span> </span><br><span>        the_pcu.queue_delay_count += 1;</span><br><span> }</span><br><span>diff --git a/src/gprs_bssgp_pcu.h b/src/gprs_bssgp_pcu.h</span><br><span>index f98e719..2ceef60 100644</span><br><span>--- a/src/gprs_bssgp_pcu.h</span><br><span>+++ b/src/gprs_bssgp_pcu.h</span><br><span>@@ -37,6 +37,8 @@</span><br><span> }</span><br><span> #include <gprs_debug.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define QOS_PROFILE 4</span><br><span> #define BSSGP_HDR_LEN 53</span><br><span> #define NS_HDR_LEN 4</span><br><span>@@ -57,7 +59,7 @@</span><br><span>  int bvc_unblocked;</span><br><span> </span><br><span>       /* Flow control */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct timeval queue_delay_sum;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct timespec queue_delay_sum;</span><br><span>     unsigned queue_delay_count;</span><br><span>  uint8_t fc_tag;</span><br><span>      unsigned queue_frames_sent;</span><br><span>@@ -87,8 +89,8 @@</span><br><span> </span><br><span> struct bssgp_bvc_ctx *gprs_bssgp_pcu_current_bctx(void);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_bssgp_update_queue_delay(const struct timeval *tv_recv,</span><br><span style="color: hsl(0, 100%, 40%);">-            const struct timeval *tv_now);</span><br><span style="color: hsl(120, 100%, 40%);">+void gprs_bssgp_update_queue_delay(const struct timespec *tv_recv,</span><br><span style="color: hsl(120, 100%, 40%);">+            const struct timespec *tv_now);</span><br><span> void gprs_bssgp_update_frames_sent();</span><br><span> void gprs_bssgp_update_bytes_received(unsigned bytes_recv, unsigned frames_recv);</span><br><span> </span><br><span>diff --git a/src/gprs_codel.c b/src/gprs_codel.c</span><br><span>index 02440b4..7c3b2d4 100644</span><br><span>--- a/src/gprs_codel.c</span><br><span>+++ b/src/gprs_codel.c</span><br><span>@@ -22,12 +22,13 @@</span><br><span> #include "gprs_debug.h"</span><br><span> </span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer_compat.h></span><br><span> </span><br><span> #include <stdint.h></span><br><span> #include <stdlib.h></span><br><span> #include <math.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void control_law(struct gprs_codel *state, struct timeval *delta)</span><br><span style="color: hsl(120, 100%, 40%);">+static void control_law(struct gprs_codel *state, struct timespec *delta)</span><br><span> {</span><br><span>    /* 256 / sqrt(x), limited to 255 */</span><br><span>  static uint8_t inv_sqrt_tab[] = {255,</span><br><span>@@ -57,12 +58,12 @@</span><br><span>          inv_sqrt = inv_sqrt_tab[state->count];</span><br><span> </span><br><span>        /* delta = state->interval / sqrt(count) */</span><br><span style="color: hsl(0, 100%, 40%);">-  delta_usecs = state->interval.tv_sec * 1000000 + state->interval.tv_usec;</span><br><span style="color: hsl(120, 100%, 40%);">+       delta_usecs = state->interval.tv_sec * 1000000 + state->interval.tv_nsec/1000;</span><br><span>         delta_usecs = delta_usecs * inv_sqrt / 256;</span><br><span> </span><br><span>      q = div(delta_usecs, 1000000);</span><br><span>       delta->tv_sec = q.quot;</span><br><span style="color: hsl(0, 100%, 40%);">-      delta->tv_usec = q.rem;</span><br><span style="color: hsl(120, 100%, 40%);">+    delta->tv_nsec = q.rem * 1000;</span><br><span> }</span><br><span> </span><br><span> void gprs_codel_init(struct gprs_codel *state)</span><br><span>@@ -83,12 +84,12 @@</span><br><span> </span><br><span>       q = div(interval_ms, 1000);</span><br><span>  state->interval.tv_sec = q.quot;</span><br><span style="color: hsl(0, 100%, 40%);">-     state->interval.tv_usec = q.rem * 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+    state->interval.tv_nsec = q.rem * 1000000;</span><br><span> </span><br><span>    /* target ~ 5% of interval */</span><br><span>        q = div(interval_ms * 13 / 256, 1000);</span><br><span>       state->target.tv_sec = q.quot;</span><br><span style="color: hsl(0, 100%, 40%);">-       state->target.tv_usec = q.rem * 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+      state->target.tv_nsec = q.rem * 1000000;</span><br><span> }</span><br><span> </span><br><span> void gprs_codel_set_maxpacket(struct gprs_codel *state, int maxpacket)</span><br><span>@@ -104,29 +105,29 @@</span><br><span>  * This is an broken up variant of the algorithm being described in</span><br><span>  * http://queue.acm.org/appendices/codel.html</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-int gprs_codel_control(struct gprs_codel *state, const struct timeval *recv,</span><br><span style="color: hsl(0, 100%, 40%);">-       const struct timeval *now, int bytes)</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_codel_control(struct gprs_codel *state, const struct timespec *recv,</span><br><span style="color: hsl(120, 100%, 40%);">+  const struct timespec *now, int bytes)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct timeval sojourn_time;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct timeval delta;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct timespec sojourn_time;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct timespec delta;</span><br><span> </span><br><span>   if (recv == NULL)</span><br><span>            goto stop_dropping;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- timersub(now, recv, &sojourn_time);</span><br><span style="color: hsl(120, 100%, 40%);">+       timespecsub(now, recv, &sojourn_time);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (timercmp(&sojourn_time, &state->target, <))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (timespeccmp(&sojourn_time, &state->target, <))</span><br><span>             goto stop_dropping;</span><br><span> </span><br><span>      if (bytes >= 0 && (unsigned)bytes <= state->maxpacket)</span><br><span>              goto stop_dropping;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!timerisset(&state->first_above_time)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             timeradd(now, &state->interval, &state->first_above_time);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!timespecisset(&state->first_above_time)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                timespecadd(now, &state->interval, &state->first_above_time);</span><br><span>          goto not_ok_to_drop;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (timercmp(now, &state->first_above_time, <))</span><br><span style="color: hsl(120, 100%, 40%);">+     if (timespeccmp(now, &state->first_above_time, <))</span><br><span>                 goto not_ok_to_drop;</span><br><span> </span><br><span>     /* Ok to drop */</span><br><span>@@ -134,14 +135,14 @@</span><br><span>     if (!state->dropping) {</span><br><span>           int recently = 0;</span><br><span>            int in_drop_cycle = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          if (timerisset(&state->drop_next)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     timersub(now, &state->drop_next, &delta);</span><br><span style="color: hsl(0, 100%, 40%);">-                    in_drop_cycle = timercmp(&delta, &state->interval, <);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (timespecisset(&state->drop_next)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        timespecsub(now, &state->drop_next, &delta);</span><br><span style="color: hsl(120, 100%, 40%);">+                       in_drop_cycle = timespeccmp(&delta, &state->interval, <);</span><br><span>                      recently = in_drop_cycle;</span><br><span>            }</span><br><span>            if (!recently) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        timersub(now, &state->first_above_time, &delta);</span><br><span style="color: hsl(0, 100%, 40%);">-                     recently = !timercmp(&delta, &state->interval, <);</span><br><span style="color: hsl(120, 100%, 40%);">+                      timespecsub(now, &state->first_above_time, &delta);</span><br><span style="color: hsl(120, 100%, 40%);">+                        recently = !timespeccmp(&delta, &state->interval, <);</span><br><span>          };</span><br><span>           if (!recently)</span><br><span>                       return 0;</span><br><span>@@ -155,24 +156,24 @@</span><br><span> </span><br><span>                state->drop_next = *now;</span><br><span>  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (timercmp(now, &state->drop_next, <))</span><br><span style="color: hsl(120, 100%, 40%);">+            if (timespeccmp(now, &state->drop_next, <))</span><br><span>                        return 0;</span><br><span> </span><br><span>                state->count += 1;</span><br><span>        }</span><br><span> </span><br><span>        control_law(state, &delta);</span><br><span style="color: hsl(0, 100%, 40%);">- timeradd(&state->drop_next, &delta, &state->drop_next);</span><br><span style="color: hsl(120, 100%, 40%);">+     timespecadd(&state->drop_next, &delta, &state->drop_next);</span><br><span> </span><br><span> #if 1</span><br><span>    LOGP(DRLCMAC, LOGL_INFO,</span><br><span>             "CoDel decided to drop packet, window = %d.%03dms, count = %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             (int)delta.tv_sec, (int)(delta.tv_usec / 1000), state->count);</span><br><span style="color: hsl(120, 100%, 40%);">+             (int)delta.tv_sec, (int)(delta.tv_nsec / 1000000), state->count);</span><br><span> #endif</span><br><span>       return 1;</span><br><span> </span><br><span> stop_dropping:</span><br><span style="color: hsl(0, 100%, 40%);">- timerclear(&state->first_above_time);</span><br><span style="color: hsl(120, 100%, 40%);">+  timespecclear(&state->first_above_time);</span><br><span> not_ok_to_drop:</span><br><span>   state->dropping = 0;</span><br><span>      return 0;</span><br><span>diff --git a/src/gprs_codel.h b/src/gprs_codel.h</span><br><span>index fb74423..3ad7efc 100644</span><br><span>--- a/src/gprs_codel.h</span><br><span>+++ b/src/gprs_codel.h</span><br><span>@@ -27,7 +27,7 @@</span><br><span> </span><br><span> #pragma once</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span> </span><br><span> /* Spec default values */</span><br><span> #define GPRS_CODEL_DEFAULT_INTERVAL_MS 100</span><br><span>@@ -40,10 +40,10 @@</span><br><span> struct gprs_codel {</span><br><span>   int dropping;</span><br><span>        unsigned count;</span><br><span style="color: hsl(0, 100%, 40%);">- struct timeval first_above_time;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct timeval drop_next;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct timeval target;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct timeval interval;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct timespec first_above_time;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct timespec drop_next;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct timespec target;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct timespec interval;</span><br><span>    unsigned maxpacket;</span><br><span> };</span><br><span> </span><br><span>@@ -66,8 +66,8 @@</span><br><span>  *</span><br><span>  * \return != 0 if the packet should be dropped, 0 otherwise</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-int gprs_codel_control(struct gprs_codel *state, const struct timeval *recv,</span><br><span style="color: hsl(0, 100%, 40%);">-      const struct timeval *now, int bytes);</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_codel_control(struct gprs_codel *state, const struct timespec *recv,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct timespec *now, int bytes);</span><br><span> </span><br><span> /*!</span><br><span>  * \brief Initialise CoDel state</span><br><span>diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp</span><br><span>index 8074cb4..102f558 100644</span><br><span>--- a/src/gprs_ms.cpp</span><br><span>+++ b/src/gprs_ms.cpp</span><br><span>@@ -33,6 +33,7 @@</span><br><span> extern "C" {</span><br><span>        #include <osmocom/core/talloc.h></span><br><span>       #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+ #include <osmocom/core/timer.h></span><br><span>        #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span>    #include <osmocom/core/logging.h></span><br><span>      #include "coding_scheme.h"</span><br><span>@@ -45,7 +46,7 @@</span><br><span> static int64_t now_msec()</span><br><span> {</span><br><span>   struct timespec ts;</span><br><span style="color: hsl(0, 100%, 40%);">-     clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span> </span><br><span>    return int64_t(ts.tv_sec) * 1000 + ts.tv_nsec / 1000000;</span><br><span> }</span><br><span>diff --git a/src/llc.cpp b/src/llc.cpp</span><br><span>index 4cd0cc4..8ef7a53 100644</span><br><span>--- a/src/llc.cpp</span><br><span>+++ b/src/llc.cpp</span><br><span>@@ -27,6 +27,8 @@</span><br><span> #include <osmocom/core/msgb.h></span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include "pcu_utils.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* reset LLC frame */</span><br><span> void gprs_llc::reset()</span><br><span> {</span><br><span>@@ -104,7 +106,7 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_llc_queue::enqueue(struct msgb *llc_msg, const struct timeval *expire_time)</span><br><span style="color: hsl(120, 100%, 40%);">+void gprs_llc_queue::enqueue(struct msgb *llc_msg, const struct timespec *expire_time)</span><br><span> {</span><br><span>         MetaInfo *meta_storage;</span><br><span> </span><br><span>@@ -114,7 +116,7 @@</span><br><span>    m_queue_octets += msgb_length(llc_msg);</span><br><span> </span><br><span>  meta_storage = (MetaInfo *)&llc_msg->cb[0];</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_gettimeofday(&meta_storage->recv_time, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_clock_gettime(CLOCK_MONOTONIC, &meta_storage->recv_time);</span><br><span>        meta_storage->expire_time = *expire_time;</span><br><span> </span><br><span>     msgb_enqueue(&m_queue, llc_msg);</span><br><span>@@ -162,7 +164,7 @@</span><br><span>                   const MetaInfo *mi1 = (MetaInfo *)&msg1->cb[0];</span><br><span>                       const MetaInfo *mi2 = (MetaInfo *)&msg2->cb[0];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                      if (timercmp(&mi2->recv_time, &mi1->recv_time, >)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (timespeccmp(&mi2->recv_time, &mi1->recv_time, >)) {</span><br><span>                             msg = msg1;</span><br><span>                          msg1 = NULL;</span><br><span>                         } else {</span><br><span>@@ -192,7 +194,7 @@</span><br><span> struct msgb *gprs_llc_queue::dequeue(const MetaInfo **info)</span><br><span> {</span><br><span>   struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct timeval *tv, tv_now, tv_result;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct timespec *tv, tv_now, tv_result;</span><br><span>      uint32_t lifetime;</span><br><span>   const MetaInfo *meta_storage;</span><br><span> </span><br><span>@@ -209,17 +211,17 @@</span><br><span>    m_queue_octets -= msgb_length(msg);</span><br><span> </span><br><span>      /* take the second time */</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_gettimeofday(&tv_now, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-   tv = (struct timeval *)&msg->data[sizeof(*tv)];</span><br><span style="color: hsl(0, 100%, 40%);">-  timersub(&tv_now, &meta_storage->recv_time, &tv_result);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_clock_gettime(CLOCK_MONOTONIC, &tv_now);</span><br><span style="color: hsl(120, 100%, 40%);">+     tv = (struct timespec *)&msg->data[sizeof(*tv)];</span><br><span style="color: hsl(120, 100%, 40%);">+       timespecsub(&tv_now, &meta_storage->recv_time, &tv_result);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  lifetime = tv_result.tv_sec*1000 + tv_result.tv_usec/1000;</span><br><span style="color: hsl(120, 100%, 40%);">+    lifetime = tv_result.tv_sec*1000 + tv_result.tv_nsec/1000000;</span><br><span>        m_avg_queue_delay = m_avg_queue_delay * ALPHA + lifetime * (1-ALPHA);</span><br><span> </span><br><span>    return msg;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_llc_queue::calc_pdu_lifetime(BTS *bts, const uint16_t pdu_delay_csec, struct timeval *tv)</span><br><span style="color: hsl(120, 100%, 40%);">+void gprs_llc_queue::calc_pdu_lifetime(BTS *bts, const uint16_t pdu_delay_csec, struct timespec *tv)</span><br><span> {</span><br><span>   uint16_t delay_csec;</span><br><span>         if (bts->bts_data()->force_llc_lifetime)</span><br><span>@@ -234,20 +236,19 @@</span><br><span>       }</span><br><span> </span><br><span>        /* calculate timestamp of timeout */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct timeval now, csec;</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_gettimeofday(&now, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-      csec.tv_usec = (delay_csec % 100) * 10000;</span><br><span style="color: hsl(0, 100%, 40%);">-      csec.tv_sec = delay_csec / 100;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct timespec now, csec;</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_clock_gettime(CLOCK_MONOTONIC, &now);</span><br><span style="color: hsl(120, 100%, 40%);">+        csecs_to_timespec(delay_csec, &csec);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   timeradd(&now, &csec, tv);</span><br><span style="color: hsl(120, 100%, 40%);">+    timespecadd(&now, &csec, tv);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool gprs_llc_queue::is_frame_expired(const struct timeval *tv_now,</span><br><span style="color: hsl(0, 100%, 40%);">-       const struct timeval *tv)</span><br><span style="color: hsl(120, 100%, 40%);">+bool gprs_llc_queue::is_frame_expired(const struct timespec *tv_now,</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct timespec *tv)</span><br><span> {</span><br><span>      /* Timeout is infinite */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (tv->tv_sec == 0 && tv->tv_usec == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        if (tv->tv_sec == 0 && tv->tv_nsec == 0)</span><br><span>               return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       return timercmp(tv_now, tv, >);</span><br><span style="color: hsl(120, 100%, 40%);">+    return timespeccmp(tv_now, tv, >);</span><br><span> }</span><br><span>diff --git a/src/llc.h b/src/llc.h</span><br><span>index 8667e00..3c2e57a 100644</span><br><span>--- a/src/llc.h</span><br><span>+++ b/src/llc.h</span><br><span>@@ -24,7 +24,7 @@</span><br><span> </span><br><span> #include <stdint.h></span><br><span> #include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span> </span><br><span> #define LLC_MAX_LEN 1543</span><br><span> </span><br><span>@@ -63,19 +63,19 @@</span><br><span>  */</span><br><span> struct gprs_llc_queue {</span><br><span>        struct MetaInfo {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct timeval recv_time;</span><br><span style="color: hsl(0, 100%, 40%);">-               struct timeval expire_time;</span><br><span style="color: hsl(120, 100%, 40%);">+           struct timespec recv_time;</span><br><span style="color: hsl(120, 100%, 40%);">+            struct timespec expire_time;</span><br><span>         };</span><br><span> </span><br><span>       static void calc_pdu_lifetime(BTS *bts, const uint16_t pdu_delay_csec,</span><br><span style="color: hsl(0, 100%, 40%);">-          struct timeval *tv);</span><br><span style="color: hsl(0, 100%, 40%);">-    static bool is_frame_expired(const struct timeval *now,</span><br><span style="color: hsl(0, 100%, 40%);">-         const struct timeval *tv);</span><br><span style="color: hsl(120, 100%, 40%);">+            struct timespec *tv);</span><br><span style="color: hsl(120, 100%, 40%);">+ static bool is_frame_expired(const struct timespec *now,</span><br><span style="color: hsl(120, 100%, 40%);">+              const struct timespec *tv);</span><br><span>  static bool is_user_data_frame(uint8_t *data, size_t len);</span><br><span> </span><br><span>       void init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        void enqueue(struct msgb *llc_msg, const struct timeval *expire_time);</span><br><span style="color: hsl(120, 100%, 40%);">+        void enqueue(struct msgb *llc_msg, const struct timespec *expire_time);</span><br><span>      struct msgb *dequeue(const MetaInfo **info = 0);</span><br><span>     void clear(BTS *bts);</span><br><span>        void move_and_merge(gprs_llc_queue *o);</span><br><span>diff --git a/src/pcu_utils.h b/src/pcu_utils.h</span><br><span>index 3292452..8196a93 100644</span><br><span>--- a/src/pcu_utils.h</span><br><span>+++ b/src/pcu_utils.h</span><br><span>@@ -19,6 +19,7 @@</span><br><span> extern "C" {</span><br><span> #include <osmocom/gsm/gsm_utils.h></span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span> </span><br><span> inline int msecs_to_frames(int msecs) {</span><br><span>      return (msecs * (1024 * 1000 / 4615)) / 1024;</span><br><span>@@ -29,9 +30,9 @@</span><br><span>    return (fn + offset) % GSM_MAX_FN;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-inline void csecs_to_timeval(unsigned csecs, struct timeval *tv) {</span><br><span style="color: hsl(0, 100%, 40%);">-   tv->tv_sec  = csecs / 100;</span><br><span style="color: hsl(0, 100%, 40%);">-   tv->tv_usec = (csecs % 100) * 10000;</span><br><span style="color: hsl(120, 100%, 40%);">+inline void csecs_to_timespec(unsigned csecs, struct timespec *ts) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ts->tv_sec  = csecs / 100;</span><br><span style="color: hsl(120, 100%, 40%);">+ ts->tv_nsec = (csecs % 100) * 10000000;</span><br><span> }</span><br><span> </span><br><span> template <typename T></span><br><span>diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp</span><br><span>index 5c0fd9d..4e8966e 100644</span><br><span>--- a/src/tbf_dl.cpp</span><br><span>+++ b/src/tbf_dl.cpp</span><br><span>@@ -98,9 +98,9 @@</span><br><span> void gprs_rlcmac_dl_tbf::start_llc_timer()</span><br><span> {</span><br><span>       if (bts_data()->llc_idle_ack_csec > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-          struct timeval tv;</span><br><span style="color: hsl(0, 100%, 40%);">-              csecs_to_timeval(bts_data()->llc_idle_ack_csec, &tv);</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_timer_schedule(&m_llc_timer, tv.tv_sec, tv.tv_usec);</span><br><span style="color: hsl(120, 100%, 40%);">+         struct timespec tv;</span><br><span style="color: hsl(120, 100%, 40%);">+           csecs_to_timespec(bts_data()->llc_idle_ack_csec, &tv);</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_timer_schedule(&m_llc_timer, tv.tv_sec, tv.tv_nsec / 1000);</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span>@@ -108,7 +108,7 @@</span><br><span>                             const uint16_t pdu_delay_csec,</span><br><span>                               const uint8_t *data, const uint16_t len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct timeval expire_time;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct timespec expire_time;</span><br><span> </span><br><span>     LOGPTBFDL(this, LOGL_DEBUG, "appending %u bytes\n", len);</span><br><span> </span><br><span>@@ -262,21 +262,21 @@</span><br><span> struct msgb *gprs_rlcmac_dl_tbf::llc_dequeue(bssgp_bvc_ctx *bctx)</span><br><span> {</span><br><span>    struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct timeval tv_now, tv_now2;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct timespec tv_now, tv_now2;</span><br><span>     uint32_t octets = 0, frames = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct timeval hyst_delta = {0, 0};</span><br><span style="color: hsl(120, 100%, 40%);">+   struct timespec hyst_delta = {0, 0};</span><br><span>         const unsigned keep_small_thresh = 60;</span><br><span>       const gprs_llc_queue::MetaInfo *info;</span><br><span> </span><br><span>    if (bts_data()->llc_discard_csec)</span><br><span style="color: hsl(0, 100%, 40%);">-            csecs_to_timeval(bts_data()->llc_discard_csec, &hyst_delta);</span><br><span style="color: hsl(120, 100%, 40%);">+           csecs_to_timespec(bts_data()->llc_discard_csec, &hyst_delta);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        gettimeofday(&tv_now, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-        timeradd(&tv_now, &hyst_delta, &tv_now2);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_clock_gettime(CLOCK_MONOTONIC, &tv_now);</span><br><span style="color: hsl(120, 100%, 40%);">+     timespecadd(&tv_now, &hyst_delta, &tv_now2);</span><br><span> </span><br><span>         while ((msg = llc_queue()->dequeue(&info))) {</span><br><span style="color: hsl(0, 100%, 40%);">-            const struct timeval *tv_disc = &info->expire_time;</span><br><span style="color: hsl(0, 100%, 40%);">-              const struct timeval *tv_recv = &info->recv_time;</span><br><span style="color: hsl(120, 100%, 40%);">+              const struct timespec *tv_disc = &info->expire_time;</span><br><span style="color: hsl(120, 100%, 40%);">+           const struct timespec *tv_recv = &info->recv_time;</span><br><span> </span><br><span>                gprs_bssgp_update_queue_delay(tv_recv, &tv_now);</span><br><span> </span><br><span>diff --git a/src/tbf_dl.h b/src/tbf_dl.h</span><br><span>index 1011665..f3838d7 100644</span><br><span>--- a/src/tbf_dl.h</span><br><span>+++ b/src/tbf_dl.h</span><br><span>@@ -72,7 +72,6 @@</span><br><span>    void set_window_size();</span><br><span>      void update_coding_scheme_counter_dl(enum CodingScheme cs);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: add the gettimeofday as parameter */</span><br><span>        struct msgb *llc_dequeue(bssgp_bvc_ctx *bctx);</span><br><span> </span><br><span>   /* Please note that all variables here will be reset when changing</span><br><span>diff --git a/tests/codel/codel_test.c b/tests/codel/codel_test.c</span><br><span>index 2ce2429..4244eae 100644</span><br><span>--- a/tests/codel/codel_test.c</span><br><span>+++ b/tests/codel/codel_test.c</span><br><span>@@ -13,16 +13,17 @@</span><br><span> #endif</span><br><span> #include <osmocom/core/application.h></span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer_compat.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> </span><br><span> #include "gprs_codel.h"</span><br><span> </span><br><span> #include <stdio.h></span><br><span> #include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int do_codel_control(struct gprs_codel *state, const struct timeval *recv,</span><br><span style="color: hsl(0, 100%, 40%);">- struct timeval *now, const struct timeval *delta_now, int count)</span><br><span style="color: hsl(120, 100%, 40%);">+static int do_codel_control(struct gprs_codel *state, const struct timespec *recv,</span><br><span style="color: hsl(120, 100%, 40%);">+  struct timespec *now, const struct timespec *delta_now, int count)</span><br><span> {</span><br><span>      int drop;</span><br><span> </span><br><span>@@ -32,11 +33,11 @@</span><br><span>                  "recv = %d.%03d, now = %d.%03d, "</span><br><span>                  "codel.count = %d\n",</span><br><span>                      count,</span><br><span style="color: hsl(0, 100%, 40%);">-                  (int)recv->tv_sec, (int)recv->tv_usec/1000,</span><br><span style="color: hsl(0, 100%, 40%);">-                       (int)now->tv_sec, (int)now->tv_usec/1000,</span><br><span style="color: hsl(120, 100%, 40%);">+                       (int)recv->tv_sec, (int)recv->tv_nsec/1000000,</span><br><span style="color: hsl(120, 100%, 40%);">+                  (int)now->tv_sec, (int)now->tv_nsec/1000000,</span><br><span>                   state->count);</span><br><span>    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                timeradd(now, delta_now, now);</span><br><span style="color: hsl(120, 100%, 40%);">+                timespecadd(now, delta_now, now);</span><br><span>    }</span><br><span> </span><br><span>        return drop == 0 ? 0 : 1;</span><br><span>@@ -45,11 +46,11 @@</span><br><span> static void test_codel(void)</span><br><span> {</span><br><span>         struct gprs_codel codel;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct timeval now;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct timeval recv;</span><br><span style="color: hsl(0, 100%, 40%);">-    const struct timeval delta_now = {0, 10000};</span><br><span style="color: hsl(0, 100%, 40%);">-    const struct timeval init_delta_recv = {0, 5000};</span><br><span style="color: hsl(0, 100%, 40%);">-       struct timeval delta_recv;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct timespec now;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct timespec recv;</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct timespec delta_now = {0, 10000000};</span><br><span style="color: hsl(120, 100%, 40%);">+      const struct timespec init_delta_recv = {0, 5000000};</span><br><span style="color: hsl(120, 100%, 40%);">+ struct timespec delta_recv;</span><br><span>  unsigned count;</span><br><span>      unsigned sum = 0;</span><br><span>    unsigned dropped = 0;</span><br><span>@@ -59,13 +60,13 @@</span><br><span>  gprs_codel_init(&codel);</span><br><span>         gprs_codel_set_interval(&codel, 100);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   timerclear(&now);</span><br><span style="color: hsl(0, 100%, 40%);">-   timerclear(&recv);</span><br><span style="color: hsl(120, 100%, 40%);">+        timespecclear(&now);</span><br><span style="color: hsl(120, 100%, 40%);">+      timespecclear(&recv);</span><br><span>    delta_recv = init_delta_recv;</span><br><span> </span><br><span>    for (count = 0; count < 20; count++, sum++) {</span><br><span>             drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);</span><br><span style="color: hsl(0, 100%, 40%);">-          timeradd(&recv, &delta_recv, &recv);</span><br><span style="color: hsl(120, 100%, 40%);">+              timespecadd(&recv, &delta_recv, &recv);</span><br><span>          dropped += drop;</span><br><span>     }</span><br><span> </span><br><span>@@ -75,7 +76,7 @@</span><br><span> </span><br><span>        for (count = 0; count < 20; count++, sum++) {</span><br><span>             drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);</span><br><span style="color: hsl(0, 100%, 40%);">-          timeradd(&recv, &delta_recv, &recv);</span><br><span style="color: hsl(120, 100%, 40%);">+              timespecadd(&recv, &delta_recv, &recv);</span><br><span>          dropped += drop;</span><br><span>     }</span><br><span> </span><br><span>@@ -83,11 +84,11 @@</span><br><span>  OSMO_ASSERT(codel.dropping);</span><br><span> </span><br><span>     /* slow down recv rate */</span><br><span style="color: hsl(0, 100%, 40%);">-       delta_recv.tv_usec = delta_now.tv_usec;</span><br><span style="color: hsl(120, 100%, 40%);">+       delta_recv.tv_nsec = delta_now.tv_nsec;</span><br><span> </span><br><span>  for (count = 0; count < 75; count++, sum++) {</span><br><span>             drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);</span><br><span style="color: hsl(0, 100%, 40%);">-          timeradd(&recv, &delta_recv, &recv);</span><br><span style="color: hsl(120, 100%, 40%);">+              timespecadd(&recv, &delta_recv, &recv);</span><br><span>          dropped += drop;</span><br><span>     }</span><br><span> </span><br><span>@@ -96,7 +97,7 @@</span><br><span> </span><br><span>        for (count = 0; count < 50; count++, sum++) {</span><br><span>             drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);</span><br><span style="color: hsl(0, 100%, 40%);">-          timeradd(&recv, &delta_recv, &recv);</span><br><span style="color: hsl(120, 100%, 40%);">+              timespecadd(&recv, &delta_recv, &recv);</span><br><span>          dropped += drop;</span><br><span>     }</span><br><span> </span><br><span>@@ -109,7 +110,7 @@</span><br><span> </span><br><span>      for (count = 0; count < 20; count++, sum++) {</span><br><span>             drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);</span><br><span style="color: hsl(0, 100%, 40%);">-          timeradd(&recv, &delta_recv, &recv);</span><br><span style="color: hsl(120, 100%, 40%);">+              timespecadd(&recv, &delta_recv, &recv);</span><br><span>          dropped += drop;</span><br><span>     }</span><br><span> </span><br><span>@@ -118,7 +119,7 @@</span><br><span> </span><br><span>      for (count = 0; count < 20; count++, sum++) {</span><br><span>             drop = do_codel_control(&codel, &recv, &now, &delta_now, sum);</span><br><span style="color: hsl(0, 100%, 40%);">-          timeradd(&recv, &delta_recv, &recv);</span><br><span style="color: hsl(120, 100%, 40%);">+              timespecadd(&recv, &delta_recv, &recv);</span><br><span>          dropped += drop;</span><br><span>     }</span><br><span> </span><br><span>diff --git a/tests/llc/LlcTest.cpp b/tests/llc/LlcTest.cpp</span><br><span>index 84164a0..10cd96b 100644</span><br><span>--- a/tests/llc/LlcTest.cpp</span><br><span>+++ b/tests/llc/LlcTest.cpp</span><br><span>@@ -42,11 +42,12 @@</span><br><span> void *tall_pcu_ctx;</span><br><span> int16_t spoof_mnc = 0, spoof_mcc = 0;</span><br><span> bool spoof_mnc_3_digits = false;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct timespec *clk_mono_override_time;</span><br><span> </span><br><span> static void enqueue_data(gprs_llc_queue *queue, const uint8_t *data, size_t len,</span><br><span style="color: hsl(0, 100%, 40%);">-                        const struct timeval *expire_time)</span><br><span style="color: hsl(120, 100%, 40%);">+                    const struct timespec *expire_time)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct timeval *tv;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct timespec *tv;</span><br><span>         uint8_t *msg_data;</span><br><span>   struct msgb *llc_msg = msgb_alloc(len + sizeof(*tv) * 2,</span><br><span>             "llc_pdu_queue");</span><br><span>@@ -81,7 +82,7 @@</span><br><span> }</span><br><span> </span><br><span> static void enqueue_data(gprs_llc_queue *queue, const char *message,</span><br><span style="color: hsl(0, 100%, 40%);">-                         const struct timeval *expire_time)</span><br><span style="color: hsl(120, 100%, 40%);">+                    const struct timespec *expire_time)</span><br><span> {</span><br><span>    enqueue_data(queue, (uint8_t *)(message), strlen(message), expire_time);</span><br><span> }</span><br><span>@@ -96,7 +97,7 @@</span><br><span> static void test_llc_queue()</span><br><span> {</span><br><span>       gprs_llc_queue queue;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct timeval expire_time = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+     struct timespec expire_time = {0};</span><br><span> </span><br><span>       printf("=== start %s ===\n", __func__);</span><br><span> </span><br><span>@@ -144,17 +145,17 @@</span><br><span>        OSMO_ASSERT(queue.octets() == 0);</span><br><span> </span><br><span>        info1.recv_time.tv_sec = 123456777;</span><br><span style="color: hsl(0, 100%, 40%);">-     info1.recv_time.tv_usec = 123456;</span><br><span style="color: hsl(120, 100%, 40%);">+     info1.recv_time.tv_nsec = 123456000;</span><br><span>         info1.expire_time.tv_sec = 123456789;</span><br><span style="color: hsl(0, 100%, 40%);">-   info1.expire_time.tv_usec = 987654;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_gettimeofday_override_time = info1.recv_time;</span><br><span style="color: hsl(120, 100%, 40%);">+    info1.expire_time.tv_nsec = 987654000;</span><br><span style="color: hsl(120, 100%, 40%);">+        *clk_mono_override_time = info1.recv_time;</span><br><span>   enqueue_data(&queue, "LLC message 1", &info1.expire_time);</span><br><span> </span><br><span>     info2.recv_time.tv_sec = 123458000;</span><br><span style="color: hsl(0, 100%, 40%);">-     info2.recv_time.tv_usec = 547352;</span><br><span style="color: hsl(120, 100%, 40%);">+     info2.recv_time.tv_nsec = 547352000;</span><br><span>         info2.expire_time.tv_sec = 123458006;</span><br><span style="color: hsl(0, 100%, 40%);">-   info2.expire_time.tv_usec = 867252;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_gettimeofday_override_time = info2.recv_time;</span><br><span style="color: hsl(120, 100%, 40%);">+    info2.expire_time.tv_nsec = 867252000;</span><br><span style="color: hsl(120, 100%, 40%);">+        *clk_mono_override_time = info2.recv_time;</span><br><span>   enqueue_data(&queue, "LLC message 2", &info2.expire_time);</span><br><span> </span><br><span>     dequeue_and_check(&queue, "LLC message 1", &info1);</span><br><span>@@ -171,26 +172,26 @@</span><br><span> {</span><br><span>   gprs_llc_queue queue1;</span><br><span>       gprs_llc_queue queue2;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct timeval expire_time = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+     struct timespec expire_time = {0};</span><br><span> </span><br><span>       printf("=== start %s ===\n", __func__);</span><br><span> </span><br><span>        queue1.init();</span><br><span>       queue2.init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_gettimeofday_override_time.tv_sec += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  clk_mono_override_time->tv_sec += 1;</span><br><span>      enqueue_data(&queue1, "*A*", &expire_time);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_gettimeofday_override_time.tv_sec += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  clk_mono_override_time->tv_sec += 1;</span><br><span>      enqueue_data(&queue1, "*B*", &expire_time);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_gettimeofday_override_time.tv_sec += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  clk_mono_override_time->tv_sec += 1;</span><br><span>      enqueue_data(&queue2, "*C*", &expire_time);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_gettimeofday_override_time.tv_sec += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  clk_mono_override_time->tv_sec += 1;</span><br><span>      enqueue_data(&queue1, "*D*", &expire_time);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_gettimeofday_override_time.tv_sec += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  clk_mono_override_time->tv_sec += 1;</span><br><span>      enqueue_data(&queue2, "*E*", &expire_time);</span><br><span> </span><br><span>    OSMO_ASSERT(queue1.size() == 3);</span><br><span>@@ -235,9 +236,10 @@</span><br><span>      vty_init(&pcu_vty_info);</span><br><span>         pcu_vty_init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_gettimeofday_override = true;</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_gettimeofday_override_time.tv_sec = 123456777;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_gettimeofday_override_time.tv_usec = 123456;</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_clock_override_enable(CLOCK_MONOTONIC, true);</span><br><span style="color: hsl(120, 100%, 40%);">+    clk_mono_override_time = osmo_clock_override_gettimespec(CLOCK_MONOTONIC);</span><br><span style="color: hsl(120, 100%, 40%);">+    clk_mono_override_time->tv_sec = 123456777;</span><br><span style="color: hsl(120, 100%, 40%);">+        clk_mono_override_time->tv_nsec = 123456000;</span><br><span> </span><br><span>  test_llc_queue();</span><br><span>    test_llc_meta();</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/17460">change 17460</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/c/osmo-pcu/+/17460"/><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-Change-Id: Ie265d70f8ffa7dbf7efbef6030505d9fcb5dc338 </div>
<div style="display:none"> Gerrit-Change-Number: 17460 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>