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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">paging: Add VTY options to calculate T3113 timeout dynamically<br><br>The idea is to have a base static value which is set like before "timer<br>t3113 [seconds]", but now have a part of this timeout calculated<br>dynamically based on BTS channel configuration and channel load.<br><br>This patch only implements initial support to calculate based on channel<br>configuration, but doesn't include code to calculate based on channel<br>load. To implement the later part, we probably need to keep track of BTS<br>paging queues per paging group, which we don't do nowadays.<br><br>Dynamic calculation is enabled by default, and default static base value<br>is decreased accordingly. This way, in a typical setup were the default<br>10 seconds were used, now the calculated final value is 11 seconds.<br>That's intended because it was observed experimentally in osmo-gsm-tester with<br>a similar channel setup that sometimes paging response can arrive slightly<br>later than 10 seconds.<br><br>Related: OS#3680<br>Change-Id: I4fb2969b690151415038631fb6ad059aa6835c7f<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M include/osmocom/bsc/gsm_timers.h<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/gsm_timers_vty.c<br>M src/osmo-bsc/net_init.c<br>M src/osmo-bsc/paging.c<br>7 files changed, 86 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 0b472a4..e57da55 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1147,6 +1147,7 @@</span><br><span> </span><br><span>      /* BTS-specific overrides for timer values from struct gsm_network. */</span><br><span>       uint8_t T3122;  /* ASSIGMENT REJECT wait indication */</span><br><span style="color: hsl(120, 100%, 40%);">+        bool T3113_dynamic; /* Calculate T3113 timeout dynamically based on BTS channel config and load */</span><br><span> </span><br><span>       /* Periodic channel load measurements are used to maintain T3122. */</span><br><span>         struct load_counter chan_load_samples[7];</span><br><span>diff --git a/include/osmocom/bsc/gsm_timers.h b/include/osmocom/bsc/gsm_timers.h</span><br><span>index 78f04ed..699c461 100644</span><br><span>--- a/include/osmocom/bsc/gsm_timers.h</span><br><span>+++ b/include/osmocom/bsc/gsm_timers.h</span><br><span>@@ -37,7 +37,7 @@</span><br><span> </span><br><span> void T_defs_vty_init(struct T_def *T_defs, int cfg_parent_node);</span><br><span> void T_defs_vty_write(struct vty *vty, const char *indent);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+struct T_def *parse_T_arg(struct vty *vty, const char *T_str);</span><br><span> </span><br><span> struct state_timeout {</span><br><span>      int T;</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 983dcb9..8c7d8e1 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -3951,6 +3951,56 @@</span><br><span>         return check_amr_config(vty);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define TNUM_STR "T-number, optionally preceded by 't' or 'T'\n"</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_bts_t3113_dynamic, cfg_bts_t3113_dynamic_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+   "timer-dynamic TNNNN",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Calculate T3113 dynamically based on channel config and load\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    TNUM_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct T_def *d;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        d = parse_T_arg(vty, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!d)</span><br><span style="color: hsl(120, 100%, 40%);">+               return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (d->T) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case 3113:</span><br><span style="color: hsl(120, 100%, 40%);">+            bts->T3113_dynamic = true;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "T%d cannot be set to dynamic%s", d->T, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_bts_no_t3113_dynamic, cfg_bts_no_t3113_dynamic_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "no timer-dynamic TNNNN",</span><br><span style="color: hsl(120, 100%, 40%);">+   NO_STR</span><br><span style="color: hsl(120, 100%, 40%);">+        "Set given timer to non-dynamic and use the default or user provided fixed value\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ TNUM_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct T_def *d;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        d = parse_T_arg(vty, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!d)</span><br><span style="color: hsl(120, 100%, 40%);">+               return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (d->T) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case 3113:</span><br><span style="color: hsl(120, 100%, 40%);">+            bts->T3113_dynamic = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "T%d already is non-dynamic%s", d->T, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define TRX_TEXT "Radio Transceiver\n"</span><br><span> </span><br><span> /* per TRX configuration */</span><br><span>@@ -5129,6 +5179,8 @@</span><br><span>      install_element(BTS_NODE, &cfg_bts_no_acc_ramping_cmd);</span><br><span>  install_element(BTS_NODE, &cfg_bts_acc_ramping_step_interval_cmd);</span><br><span>       install_element(BTS_NODE, &cfg_bts_acc_ramping_step_size_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(BTS_NODE, &cfg_bts_t3113_dynamic_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(BTS_NODE, &cfg_bts_no_t3113_dynamic_cmd);</span><br><span>        neighbor_ident_vty_init(network, network->neighbor_bss_cells);</span><br><span>    /* See also handover commands added on bts level from handover_vty.c */</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 6d39642..0f76a27 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -849,6 +849,7 @@</span><br><span> </span><br><span>       /* timer overrides */</span><br><span>        bts->T3122 = 0; /* not overriden by default */</span><br><span style="color: hsl(120, 100%, 40%);">+     bts->T3113_dynamic = true; /* dynamic by default */</span><br><span> </span><br><span>   bts->dtxu = GSM48_DTX_SHALL_NOT_BE_USED;</span><br><span>  bts->dtxd = false;</span><br><span>diff --git a/src/osmo-bsc/gsm_timers_vty.c b/src/osmo-bsc/gsm_timers_vty.c</span><br><span>index de61e24..e744dfa 100644</span><br><span>--- a/src/osmo-bsc/gsm_timers_vty.c</span><br><span>+++ b/src/osmo-bsc/gsm_timers_vty.c</span><br><span>@@ -32,7 +32,7 @@</span><br><span> </span><br><span> /* Parse an argument like "T1234", "t1234" or "1234" and return the corresponding T_def entry from</span><br><span>  * g_vty_T_defs, if any. */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct T_def *parse_T_arg(struct vty *vty, const char *T_str)</span><br><span style="color: hsl(120, 100%, 40%);">+struct T_def *parse_T_arg(struct vty *vty, const char *T_str)</span><br><span> {</span><br><span>    int T;</span><br><span>       struct T_def *d;</span><br><span>diff --git a/src/osmo-bsc/net_init.c b/src/osmo-bsc/net_init.c</span><br><span>index 1199bdc..5ea564d 100644</span><br><span>--- a/src/osmo-bsc/net_init.c</span><br><span>+++ b/src/osmo-bsc/net_init.c</span><br><span>@@ -37,7 +37,7 @@</span><br><span>        { .T=3109, .default_val=5, .desc="RSL SACCH deactivation" },</span><br><span>       { .T=3111, .default_val=2, .desc="Wait time before RSL RF Channel Release" },</span><br><span>      { .T=993111, .default_val=4, .desc="Wait time after lchan was released in error (should be T3111 + 2s)" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { .T=3113, .default_val=10, .desc="Paging"},</span><br><span style="color: hsl(120, 100%, 40%);">+        { .T=3113, .default_val=7, .desc="Paging"},</span><br><span>        { .T=3115, .default_val=10, .desc="(unused)" },</span><br><span>    { .T=3117, .default_val=10, .desc="(unused)" },</span><br><span>    { .T=3119, .default_val=10, .desc="(unused)" },</span><br><span>diff --git a/src/osmo-bsc/paging.c b/src/osmo-bsc/paging.c</span><br><span>index afe3245..246114f 100644</span><br><span>--- a/src/osmo-bsc/paging.c</span><br><span>+++ b/src/osmo-bsc/paging.c</span><br><span>@@ -287,6 +287,32 @@</span><br><span>    paging_remove_request(&req->bts->paging, req);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define GSM_FRAME_DURATION_us        4615</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSM51_MFRAME_DURATION_us (51 * GSM_FRAME_DURATION_us) /* 235365 us */</span><br><span style="color: hsl(120, 100%, 40%);">+static unsigned int calculate_timer_3113(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int to_us, to;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct T_def *d = T_def_get_entry(bts->network->T_defs, 3113);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!bts->T3113_dynamic)</span><br><span style="color: hsl(120, 100%, 40%);">+           return d->val;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* TODO: take into account load of paging group for req->bsub */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MFRMS defines repeat interval of paging messages for MSs that belong</span><br><span style="color: hsl(120, 100%, 40%);">+        * to same paging group accross multiple 51 frame multiframes.</span><br><span style="color: hsl(120, 100%, 40%);">+         * MAXTRANS defines maximum number of RACH retransmissions.</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+   to_us = GSM51_MFRAME_DURATION_us * (bts->si_common.chan_desc.bs_pa_mfrms + 2) *</span><br><span style="color: hsl(120, 100%, 40%);">+            bts->si_common.rach_control.max_trans;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* ceiling in seconds + extra time */</span><br><span style="color: hsl(120, 100%, 40%);">+ to = (to_us + 999999) / 1000000 + d->val;</span><br><span style="color: hsl(120, 100%, 40%);">+  LOGP(DPAG, LOGL_DEBUG, "(bts=%d) Paging request: T3113 expires in %u seconds\n",</span><br><span style="color: hsl(120, 100%, 40%);">+         bts->nr, to);</span><br><span style="color: hsl(120, 100%, 40%);">+ return to;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Start paging + paging timer for given subscriber on given BTS</span><br><span>  * \param bts BTS on which to page</span><br><span>  * \param[in] bsub subscriber we want to page</span><br><span>@@ -298,6 +324,7 @@</span><br><span> {</span><br><span>       struct gsm_bts_paging_state *bts_entry = &bts->paging;</span><br><span>        struct gsm_paging_request *req;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int t3113_timeout_s;</span><br><span> </span><br><span>    rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_ATTEMPTED]);</span><br><span> </span><br><span>@@ -317,7 +344,8 @@</span><br><span>     req->chan_type = type;</span><br><span>    req->msc = msc;</span><br><span>   osmo_timer_setup(&req->T3113, paging_T3113_expired, req);</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_timer_schedule(&req->T3113, T_def_get(bts->network->T_defs, 3113, T_S, -1), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     t3113_timeout_s = calculate_timer_3113(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_timer_schedule(&req->T3113, t3113_timeout_s, 0);</span><br><span>         llist_add_tail(&req->entry, &bts_entry->pending_requests);</span><br><span>     paging_schedule_if_needed(bts_entry);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11654">change 11654</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/11654"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I4fb2969b690151415038631fb6ad059aa6835c7f </div>
<div style="display:none"> Gerrit-Change-Number: 11654 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Assignee: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Stefan Sperling <stsp@stsp.name> </div>