<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/22280">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, but someone else must approve
  osmith: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Get rid of unused gsm_timer.{cpp,h}<br><br>Those files are not really being used other than for calling<br>get_current_fn() which is just a placeholder to call<br>bts_current_frame_number on the global bts object.<br><br>Change-Id: I6d50a8c15c1de5e2a308a24b313a7776f94ae54f<br>---<br>M debian/copyright<br>M src/Makefile.am<br>M src/gprs_rlcmac.h<br>D src/gsm_timer.cpp<br>D src/gsm_timer.h<br>M src/pcu_l1_if.cpp<br>M src/pcu_main.cpp<br>M src/tbf.cpp<br>M src/tbf.h<br>9 files changed, 7 insertions(+), 346 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/debian/copyright b/debian/copyright</span><br><span>index 0069d0c..99ea408 100644</span><br><span>--- a/debian/copyright</span><br><span>+++ b/debian/copyright</span><br><span>@@ -34,8 +34,6 @@</span><br><span>            src/gprs_debug.h</span><br><span>            src/pcu_main.cpp</span><br><span>            src/pcu_l1_if.h</span><br><span style="color: hsl(0, 100%, 40%);">-           src/gsm_timer.cpp</span><br><span style="color: hsl(0, 100%, 40%);">-           src/gsm_timer.h</span><br><span> Copyright: 2012 Ivan Klyuchnikov</span><br><span> License:   GPL-2.0+</span><br><span> </span><br><span>@@ -131,4 +129,3 @@</span><br><span>  .</span><br><span>  On Debian systems, the complete text of the GNU General Public License</span><br><span>  Version 2 can be found in `/usr/share/common-licenses/GPL-2'.</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index c9c7aa3..05fac55 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -50,7 +50,6 @@</span><br><span>         gprs_ms.c \</span><br><span>  gprs_ms_storage.cpp \</span><br><span>        gprs_pcu.c \</span><br><span style="color: hsl(0, 100%, 40%);">-    gsm_timer.cpp \</span><br><span>      pcu_l1_if.cpp \</span><br><span>      pcu_vty.c \</span><br><span>  pcu_vty_functions.cpp \</span><br><span>@@ -87,7 +86,6 @@</span><br><span>  gprs_ms_storage.h \</span><br><span>  gprs_pcu.h \</span><br><span>         pcu_l1_if.h \</span><br><span style="color: hsl(0, 100%, 40%);">-   gsm_timer.h \</span><br><span>        pcu_vty.h \</span><br><span>  pcu_vty_functions.h \</span><br><span>        mslot_class.h \</span><br><span>diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h</span><br><span>index 3d5ea99..d779d08 100644</span><br><span>--- a/src/gprs_rlcmac.h</span><br><span>+++ b/src/gprs_rlcmac.h</span><br><span>@@ -24,7 +24,6 @@</span><br><span> #include <stdbool.h></span><br><span> </span><br><span> #ifdef __cplusplus</span><br><span style="color: hsl(0, 100%, 40%);">-#include <gsm_timer.h></span><br><span> #include <pcu_l1_if.h></span><br><span> </span><br><span> extern "C" {</span><br><span>diff --git a/src/gsm_timer.cpp b/src/gsm_timer.cpp</span><br><span>deleted file mode 100644</span><br><span>index 0627753..0000000</span><br><span>--- a/src/gsm_timer.cpp</span><br><span>+++ /dev/null</span><br><span>@@ -1,234 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* gsm_timer.cpp</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2012 Ivan Klyuchnikov</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(0, 100%, 40%);">- * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(0, 100%, 40%);">- * of the License, or (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(0, 100%, 40%);">- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* These store the amount of frame number that we wait until next timer expires. */</span><br><span style="color: hsl(0, 100%, 40%);">-static int nearest;</span><br><span style="color: hsl(0, 100%, 40%);">-static int *nearest_p;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \addtogroup gsm_timer</span><br><span style="color: hsl(0, 100%, 40%);">- *  @{</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \file gsm_timer.cpp</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <assert.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <limits.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <gsm_timer.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <pcu_l1_if.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <bts.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct rb_root timer_root = RB_ROOT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * TODO: make this depend on the BTS. This means that</span><br><span style="color: hsl(0, 100%, 40%);">- * all time functions schedule based on the BTS they</span><br><span style="color: hsl(0, 100%, 40%);">- * are scheduled on.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-int get_current_fn()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return bts_current_frame_number(the_pcu->bts);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void __add_gsm_timer(struct osmo_gsm_timer_list *timer)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct rb_node **new_node = &(timer_root.rb_node);</span><br><span style="color: hsl(0, 100%, 40%);">-  struct rb_node *parent = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  while (*new_node) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct osmo_gsm_timer_list *this_timer;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         this_timer = container_of(*new_node, struct osmo_gsm_timer_list, node);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         parent = *new_node;</span><br><span style="color: hsl(0, 100%, 40%);">-             if (timer->fn < this_timer->fn)</span><br><span style="color: hsl(0, 100%, 40%);">-                        new_node = &((*new_node)->rb_left);</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-                    new_node = &((*new_node)->rb_right);</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               rb_link_node(&timer->node, parent, new_node);</span><br><span style="color: hsl(0, 100%, 40%);">-            rb_insert_color(&timer->node, &timer_root);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief add a new timer to the timer management</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] timer the timer that should be added</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsm_timer_add(struct osmo_gsm_timer_list *timer)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_gsm_timer_del(timer);</span><br><span style="color: hsl(0, 100%, 40%);">-      timer->active = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-   INIT_LLIST_HEAD(&timer->list);</span><br><span style="color: hsl(0, 100%, 40%);">-   __add_gsm_timer(timer);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief schedule a gsm timer at a given future relative time</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] timer the to-be-added timer</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] number of frames from now</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This function can be used to (re-)schedule a given timer at a</span><br><span style="color: hsl(0, 100%, 40%);">- * specified number of frames in the future.  It will</span><br><span style="color: hsl(0, 100%, 40%);">- * internally add it to the timer management data structures, thus</span><br><span style="color: hsl(0, 100%, 40%);">- * osmo_timer_add() is automatically called.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-void</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_gsm_timer_schedule(struct osmo_gsm_timer_list *timer, int fn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        int current_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- current_fn = get_current_fn();</span><br><span style="color: hsl(0, 100%, 40%);">-  timer->fn = current_fn + fn;</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_gsm_timer_add(timer);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief delete a gsm timer from timer management</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] timer the to-be-deleted timer</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This function can be used to delete a previously added/scheduled</span><br><span style="color: hsl(0, 100%, 40%);">- * timer from the timer management code.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsm_timer_del(struct osmo_gsm_timer_list *timer)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   if (timer->active) {</span><br><span style="color: hsl(0, 100%, 40%);">-         timer->active = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           rb_erase(&timer->node, &timer_root);</span><br><span style="color: hsl(0, 100%, 40%);">-         /* make sure this is not already scheduled for removal. */</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!llist_empty(&timer->list))</span><br><span style="color: hsl(0, 100%, 40%);">-                  llist_del_init(&timer->list);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief check if given timer is still pending</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] timer the to-be-checked timer</span><br><span style="color: hsl(0, 100%, 40%);">- *  \return 1 if pending, 0 otherwise</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This function can be used to determine whether a given timer</span><br><span style="color: hsl(0, 100%, 40%);">- * has alredy expired (returns 0) or is still pending (returns 1)</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_gsm_timer_pending(struct osmo_gsm_timer_list *timer)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return timer->active;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * if we have a nearest frame number return the delta between the current</span><br><span style="color: hsl(0, 100%, 40%);">- * FN and the FN of the nearest timer.</span><br><span style="color: hsl(0, 100%, 40%);">- * If the nearest timer timed out return NULL and then we will</span><br><span style="color: hsl(0, 100%, 40%);">- * dispatch everything after the select</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-int *osmo_gsm_timers_nearest(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   /* nearest_p is exactly what we need already: NULL if nothing is</span><br><span style="color: hsl(0, 100%, 40%);">-         * waiting, {0,0} if we must dispatch immediately, and the correct</span><br><span style="color: hsl(0, 100%, 40%);">-       * delay if we need to wait */</span><br><span style="color: hsl(0, 100%, 40%);">-  return nearest_p;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void update_nearest(int *cand, int *current)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  if (*cand > *current)</span><br><span style="color: hsl(0, 100%, 40%);">-                nearest = *cand - *current;</span><br><span style="color: hsl(0, 100%, 40%);">-     else {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* loop again inmediately */</span><br><span style="color: hsl(0, 100%, 40%);">-            nearest = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       nearest_p = &nearest;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Find the nearest FN and update s_nearest_time</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsm_timers_prepare(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct rb_node *node;</span><br><span style="color: hsl(0, 100%, 40%);">-   int current_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- current_fn = get_current_fn();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  node = rb_first(&timer_root);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (node) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct osmo_gsm_timer_list *this_timer;</span><br><span style="color: hsl(0, 100%, 40%);">-         this_timer = container_of(node, struct osmo_gsm_timer_list, node);</span><br><span style="color: hsl(0, 100%, 40%);">-              update_nearest(&this_timer->fn, &current_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                nearest_p = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * fire all timers... and remove them</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_gsm_timers_update(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int current_fn;</span><br><span style="color: hsl(0, 100%, 40%);">- struct rb_node *node;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct llist_head timer_eviction_list;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct osmo_gsm_timer_list *this_timer;</span><br><span style="color: hsl(0, 100%, 40%);">- int work = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   current_fn = get_current_fn();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  INIT_LLIST_HEAD(&timer_eviction_list);</span><br><span style="color: hsl(0, 100%, 40%);">-      for (node = rb_first(&timer_root); node; node = rb_next(node)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            this_timer = container_of(node, struct osmo_gsm_timer_list, node);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              if (this_timer->fn > current_fn)</span><br><span style="color: hsl(0, 100%, 40%);">-                  break;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          llist_add(&this_timer->list, &timer_eviction_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*</span><br><span style="color: hsl(0, 100%, 40%);">-       * The callbacks might mess with our list and in this case</span><br><span style="color: hsl(0, 100%, 40%);">-       * even llist_for_each_entry_safe is not safe to use. To allow</span><br><span style="color: hsl(0, 100%, 40%);">-   * osmo_gsm_timer_del to be called from within the callback we need</span><br><span style="color: hsl(0, 100%, 40%);">-      * to restart the iteration for each element scheduled for removal.</span><br><span style="color: hsl(0, 100%, 40%);">-      *</span><br><span style="color: hsl(0, 100%, 40%);">-       * The problematic scenario is the following: Given two timers A</span><br><span style="color: hsl(0, 100%, 40%);">-         * and B that have expired at the same time. Thus, they are both</span><br><span style="color: hsl(0, 100%, 40%);">-         * in the eviction list in this order: A, then B. If we remove</span><br><span style="color: hsl(0, 100%, 40%);">-   * timer B from the A's callback, we continue with B in the next</span><br><span style="color: hsl(0, 100%, 40%);">-     * iteration step, leading to an access-after-release.</span><br><span style="color: hsl(0, 100%, 40%);">-   */</span><br><span style="color: hsl(0, 100%, 40%);">-restart:</span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry(this_timer, &timer_eviction_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_gsm_timer_del(this_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-         this_timer->cb(this_timer->data);</span><br><span style="color: hsl(0, 100%, 40%);">-         work = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-               goto restart;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return work;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_gsm_timers_check(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct rb_node *node;</span><br><span style="color: hsl(0, 100%, 40%);">-   int i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (node = rb_first(&timer_root); node; node = rb_next(node)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            i++;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       return i;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! }@ */</span><br><span>diff --git a/src/gsm_timer.h b/src/gsm_timer.h</span><br><span>deleted file mode 100644</span><br><span>index cfabd0c..0000000</span><br><span>--- a/src/gsm_timer.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,90 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* gsm_timer.h</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2012 Ivan Klyuchnikov</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(0, 100%, 40%);">- * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(0, 100%, 40%);">- * of the License, or (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(0, 100%, 40%);">- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \defgroup timer GSM timers</span><br><span style="color: hsl(0, 100%, 40%);">- *  @{</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \file gsm_timer.h</span><br><span style="color: hsl(0, 100%, 40%);">- *  \brief GSM timer handling routines</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef GSM_TIMER_H</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_TIMER_H</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" {</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxrbtree.h></span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-/**</span><br><span style="color: hsl(0, 100%, 40%);">- * Timer management:</span><br><span style="color: hsl(0, 100%, 40%);">- *      - Create a struct osmo_gsm_timer_list</span><br><span style="color: hsl(0, 100%, 40%);">- *      - Fill out timeout and use add_gsm_timer or</span><br><span style="color: hsl(0, 100%, 40%);">- *        use schedule_gsm_timer to schedule a timer in</span><br><span style="color: hsl(0, 100%, 40%);">- *        x frames from now...</span><br><span style="color: hsl(0, 100%, 40%);">- *      - Use del_gsm_timer to remove the timer</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- *  Internally:</span><br><span style="color: hsl(0, 100%, 40%);">- *      - We hook into select.c to give a frame number of the</span><br><span style="color: hsl(0, 100%, 40%);">- *        nearest timer. On already passed timers we give</span><br><span style="color: hsl(0, 100%, 40%);">- *        it a 0 to immediately fire after the select.</span><br><span style="color: hsl(0, 100%, 40%);">- *      - update_gsm_timers will call the callbacks and remove</span><br><span style="color: hsl(0, 100%, 40%);">- *        the timers.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief A structure representing a single instance of a gsm timer */</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_gsm_timer_list {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct rb_node node;      /*!< \brief rb-tree node header */</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head list;   /*!< \brief internal list header */</span><br><span style="color: hsl(0, 100%, 40%);">-        int fn;                   /*!< \brief expiration frame number */</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int active  : 1; /*!< \brief is it active? */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       void (*cb)(void*);        /*!< \brief call-back called at timeout */</span><br><span style="color: hsl(0, 100%, 40%);">- void *data;               /*!< \brief user data for callback */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/**</span><br><span style="color: hsl(0, 100%, 40%);">- * timer management</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsm_timer_add(struct osmo_gsm_timer_list *timer);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsm_timer_schedule(struct osmo_gsm_timer_list *timer, int fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsm_timer_del(struct osmo_gsm_timer_list *timer);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_gsm_timer_pending(struct osmo_gsm_timer_list *timer);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * internal timer list management</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-int *osmo_gsm_timers_nearest(void);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsm_timers_prepare(void);</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_gsm_timers_update(void);</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_gsm_timers_check(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Get Current Frame Number</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-int get_current_fn();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! }@ */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif // GSM_TIMER_H</span><br><span>diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp</span><br><span>index e5ad1de..8847960 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -173,7 +173,7 @@</span><br><span>     struct msgb *msg;</span><br><span>    struct gsm_pcu_if *pcu_prim;</span><br><span>         struct gsm_pcu_if_data *data_req;</span><br><span style="color: hsl(0, 100%, 40%);">-       int current_fn = get_current_fn();</span><br><span style="color: hsl(120, 100%, 40%);">+    int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span> </span><br><span>      LOGP(DL1IF, LOGL_DEBUG, "Sending data request: trx=%d ts=%d sapi=%d "</span><br><span>              "arfcn=%d fn=%d cur_fn=%d block=%d data=%s\n", trx, ts, sapi, arfcn, fn, current_fn,</span><br><span>@@ -314,7 +314,7 @@</span><br><span> static int pcu_rx_data_ind(struct gsm_pcu_if_data *data_ind)</span><br><span> {</span><br><span>    int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- int current_fn = get_current_fn();</span><br><span style="color: hsl(120, 100%, 40%);">+    int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span>  struct pcu_l1_meas meas = {0};</span><br><span>       uint8_t gsmtap_chantype;</span><br><span> </span><br><span>@@ -361,7 +361,7 @@</span><br><span> static int pcu_rx_data_cnf(struct gsm_pcu_if_data *data_cnf)</span><br><span> {</span><br><span>      int rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     int current_fn = get_current_fn();</span><br><span style="color: hsl(120, 100%, 40%);">+    int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span> </span><br><span>      LOGP(DL1IF, LOGL_DEBUG, "Data confirm received: sapi=%d fn=%d cur_fn=%d\n",</span><br><span>                data_cnf->sapi, data_cnf->fn, current_fn);</span><br><span>@@ -410,7 +410,7 @@</span><br><span> static int pcu_rx_rts_req(struct gsm_pcu_if_rts_req *rts_req)</span><br><span> {</span><br><span>         int rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     int current_fn = get_current_fn();</span><br><span style="color: hsl(120, 100%, 40%);">+    int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span> </span><br><span>      LOGP(DL1IF, LOGL_DEBUG, "RTS request received: trx=%d ts=%d sapi=%d "</span><br><span>              "arfcn=%d fn=%d cur_fn=%d block=%d\n", rts_req->trx_nr, rts_req->ts_nr,</span><br><span>@@ -454,7 +454,7 @@</span><br><span> static int pcu_rx_rach_ind(const struct gsm_pcu_if_rach_ind *rach_ind)</span><br><span> {</span><br><span>         int rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     int current_fn = get_current_fn();</span><br><span style="color: hsl(120, 100%, 40%);">+    int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span> </span><br><span>      LOGP(DL1IF, LOGL_INFO, "RACH request received: sapi=%d "</span><br><span>           "qta=%d, ra=0x%02x, fn=%u, cur_fn=%d, is_11bit=%d\n", rach_ind->sapi, rach_ind->qta,</span><br><span>diff --git a/src/pcu_main.cpp b/src/pcu_main.cpp</span><br><span>index 8bb7c1f..23d16a3 100644</span><br><span>--- a/src/pcu_main.cpp</span><br><span>+++ b/src/pcu_main.cpp</span><br><span>@@ -19,7 +19,6 @@</span><br><span> </span><br><span> #include <pcu_l1_if.h></span><br><span> #include <gprs_rlcmac.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <gsm_timer.h></span><br><span> #include <gprs_debug.h></span><br><span> #include <unistd.h></span><br><span> #include <stdbool.h></span><br><span>@@ -331,10 +330,6 @@</span><br><span>   }</span><br><span> </span><br><span>        while (!quit) {</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_gsm_timers_check();</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_gsm_timers_prepare();</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_gsm_timers_update();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>            osmo_select_main(0);</span><br><span>         }</span><br><span> </span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index 3464242..859ebcd 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -34,7 +34,6 @@</span><br><span> #include <pcu_utils.h></span><br><span> #include <gprs_ms_storage.h></span><br><span> #include <sba.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <gsm_timer.h></span><br><span> #include <pdch.h></span><br><span> </span><br><span> extern "C" {</span><br><span>@@ -154,7 +153,6 @@</span><br><span>        memset(&pdch, 0, sizeof(pdch));</span><br><span>  memset(&Tarr, 0, sizeof(Tarr));</span><br><span>  memset(&Narr, 0, sizeof(Narr));</span><br><span style="color: hsl(0, 100%, 40%);">-     memset(&gsm_timer, 0, sizeof(gsm_timer));</span><br><span> </span><br><span>    memset(&m_ms_list, 0, sizeof(m_ms_list));</span><br><span>        m_ms_list.entry = this;</span><br><span>@@ -483,7 +481,7 @@</span><br><span> void gprs_rlcmac_tbf::t_start(enum tbf_timers t, int T, const char *reason, bool force,</span><br><span>                           const char *file, unsigned line)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     int current_fn = get_current_fn();</span><br><span style="color: hsl(120, 100%, 40%);">+    int current_fn = bts_current_frame_number(bts);</span><br><span>      int sec;</span><br><span>     int microsec;</span><br><span>        struct osmo_tdef *tdef;</span><br><span>@@ -777,7 +775,7 @@</span><br><span> </span><br><span> void gprs_rlcmac_tbf::handle_timeout()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        int current_fn = get_current_fn();</span><br><span style="color: hsl(120, 100%, 40%);">+    int current_fn = bts_current_frame_number(bts);</span><br><span> </span><br><span>  LOGPTBF(this, LOGL_DEBUG, "timer 0 expired. cur_fn=%d\n", current_fn);</span><br><span> </span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index 73266bf..460de70 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -27,7 +27,6 @@</span><br><span> #include "cxx_linuxlist.h"</span><br><span> #include "pcu_utils.h"</span><br><span> #include <gprs_debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <gsm_timer.h></span><br><span> #include <stdint.h></span><br><span> </span><br><span> struct bssgp_bvc_ctx;</span><br><span>@@ -313,7 +312,6 @@</span><br><span> </span><br><span>       gprs_rlc m_rlc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_gsm_timer_list      gsm_timer;</span><br><span>   unsigned int fT; /* fTxxxx number */</span><br><span>         unsigned int num_fT_exp; /* number of consecutive fT expirations */</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/22280">change 22280</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/+/22280"/><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: I6d50a8c15c1de5e2a308a24b313a7776f94ae54f </div>
<div style="display:none"> Gerrit-Change-Number: 22280 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>