<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/15214">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Replace own timer infra with libosmocore osmo_tdef<br><br>Change-Id: Ia0cf5f0a49737fbc419e2ccc86312d01c6e0056e<br>---<br>M include/osmocom/sgsn/sgsn.h<br>M src/gprs/gprs_gmm.c<br>M src/gprs/gprs_gmm_attach.c<br>M src/gprs/sgsn_vty.c<br>4 files changed, 127 insertions(+), 126 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/14/15214/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/sgsn.h b/include/osmocom/sgsn/sgsn.h</span><br><span>index 0a6ea29..6e4f5ca 100644</span><br><span>--- a/include/osmocom/sgsn/sgsn.h</span><br><span>+++ b/include/osmocom/sgsn/sgsn.h</span><br><span>@@ -86,20 +86,8 @@</span><br><span>   /* CDR configuration */</span><br><span>      struct sgsn_cdr cdr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                int T3312;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3322;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3350;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3360;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3370;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3313;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3314;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3316;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3385;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3386;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3395;</span><br><span style="color: hsl(0, 100%, 40%);">-              int T3397;</span><br><span style="color: hsl(0, 100%, 40%);">-      } timers;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Timer defintions */</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_tdef *T_defs;</span><br><span> </span><br><span>        int dynamic_lookup;</span><br><span> </span><br><span>diff --git a/src/gprs/gprs_gmm.c b/src/gprs/gprs_gmm.c</span><br><span>index 5d03923..c223f2a 100644</span><br><span>--- a/src/gprs/gprs_gmm.c</span><br><span>+++ b/src/gprs/gprs_gmm.c</span><br><span>@@ -40,6 +40,7 @@</span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/tdef.h></span><br><span> #include <osmocom/crypt/auth.h></span><br><span> #include <osmocom/gsm/apn.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08_gprs.h></span><br><span>@@ -231,12 +232,15 @@</span><br><span> </span><br><span> static void mmctx_timer_cb(void *_mm);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void mmctx_timer_start(struct sgsn_mm_ctx *mm, unsigned int T,</span><br><span style="color: hsl(0, 100%, 40%);">-                               unsigned int seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+static void mmctx_timer_start(struct sgsn_mm_ctx *mm, unsigned int T)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned long seconds;</span><br><span>       if (osmo_timer_pending(&mm->timer))</span><br><span>           LOGMMCTXP(LOGL_ERROR, mm, "Starting MM timer %u while old "</span><br><span>                        "timer %u pending\n", T, mm->T);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       seconds = osmo_tdef_get(sgsn->cfg.T_defs, T, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  mm->T = T;</span><br><span>        mm->num_T_exp = 0;</span><br><span> </span><br><span>@@ -255,7 +259,11 @@</span><br><span> </span><br><span> time_t gprs_max_time_to_idle(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return sgsn->cfg.timers.T3314 + (sgsn->cfg.timers.T3312 + 4 * 60);</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned long T3314, T3312;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ T3314 = osmo_tdef_get(sgsn->cfg.T_defs, 3314, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+    T3312 = osmo_tdef_get(sgsn->cfg.T_defs, 3312, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+    return T3314 + (T3312 + 4 * 60);</span><br><span> }</span><br><span> </span><br><span> /* Send a message through the underlying layer.</span><br><span>@@ -447,6 +455,7 @@</span><br><span>   struct gsm48_hdr *gh;</span><br><span>        struct gsm48_attach_ack *aa;</span><br><span>         uint8_t *mid;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned long t;</span><br><span> #if 0</span><br><span>    uint8_t *ptsig;</span><br><span> #endif</span><br><span>@@ -463,7 +472,8 @@</span><br><span>      aa = (struct gsm48_attach_ack *) msgb_put(msg, sizeof(*aa));</span><br><span>         aa->force_stby = 0;  /* not indicated */</span><br><span>  aa->att_result = 1;  /* GPRS only */</span><br><span style="color: hsl(0, 100%, 40%);">- aa->ra_upd_timer = gprs_secs_to_tmr_floor(sgsn->cfg.timers.T3312);</span><br><span style="color: hsl(120, 100%, 40%);">+      t = osmo_tdef_get(sgsn->cfg.T_defs, 3312, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+        aa->ra_upd_timer = gprs_secs_to_tmr_floor(t);</span><br><span>     aa->radio_prio = 4;  /* lowest */</span><br><span>         gsm48_encode_ra(&aa->ra_id, &mm->ra);</span><br><span> </span><br><span>@@ -480,8 +490,8 @@</span><br><span>         * (fixed 44s, default value, GSM 04.08, table 11.4a) to safely limit</span><br><span>         * the inactivity time READY->STANDBY.</span><br><span>     */</span><br><span style="color: hsl(0, 100%, 40%);">-     msgb_tv_put(msg, GSM48_IE_GMM_TIMER_READY,</span><br><span style="color: hsl(0, 100%, 40%);">-                  gprs_secs_to_tmr_floor(sgsn->cfg.timers.T3314));</span><br><span style="color: hsl(120, 100%, 40%);">+       t = osmo_tdef_get(sgsn->cfg.T_defs, 3314, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+        msgb_tv_put(msg, GSM48_IE_GMM_TIMER_READY, gprs_secs_to_tmr_floor(t));</span><br><span> </span><br><span> #ifdef PTMSI_ALLOC</span><br><span>     /* Optional: Allocated P-TMSI */</span><br><span>@@ -1017,12 +1027,12 @@</span><br><span>   /* Request IMSI and IMEI from the MS if they are unknown */</span><br><span>  if (!strlen(ctx->imei)) {</span><br><span>                 ctx->t3370_id_type = GSM_MI_TYPE_IMEI;</span><br><span style="color: hsl(0, 100%, 40%);">-               mmctx_timer_start(ctx, 3370, sgsn->cfg.timers.T3370);</span><br><span style="color: hsl(120, 100%, 40%);">+              mmctx_timer_start(ctx, 3370);</span><br><span>                return gsm48_tx_gmm_id_req(ctx, GSM_MI_TYPE_IMEI);</span><br><span>   }</span><br><span>    if (!strlen(ctx->imsi)) {</span><br><span>                 ctx->t3370_id_type = GSM_MI_TYPE_IMSI;</span><br><span style="color: hsl(0, 100%, 40%);">-               mmctx_timer_start(ctx, 3370, sgsn->cfg.timers.T3370);</span><br><span style="color: hsl(120, 100%, 40%);">+              mmctx_timer_start(ctx, 3370);</span><br><span>                return gsm48_tx_gmm_id_req(ctx, GSM_MI_TYPE_IMSI);</span><br><span>   }</span><br><span> </span><br><span>@@ -1045,7 +1055,7 @@</span><br><span>            && !sgsn_mm_ctx_is_authenticated(ctx)) {</span><br><span>                 struct gsm_auth_tuple *at = &ctx->auth_triplet;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              mmctx_timer_start(ctx, 3360, sgsn->cfg.timers.T3360);</span><br><span style="color: hsl(120, 100%, 40%);">+              mmctx_timer_start(ctx, 3360);</span><br><span>                return gsm48_tx_gmm_auth_ciph_req(ctx, &at->vec, at->key_seq,</span><br><span>                                                false);</span><br><span>    }</span><br><span>@@ -1084,7 +1094,7 @@</span><br><span>            extract_subscr_hlr(ctx);</span><br><span> #ifdef PTMSI_ALLOC</span><br><span>               /* Start T3350 and re-transmit up to 5 times until ATTACH COMPLETE */</span><br><span style="color: hsl(0, 100%, 40%);">-           mmctx_timer_start(ctx, 3350, sgsn->cfg.timers.T3350);</span><br><span style="color: hsl(120, 100%, 40%);">+              mmctx_timer_start(ctx, 3350);</span><br><span>                ctx->t3350_mode = GMM_T3350_MODE_ATT;</span><br><span> #else</span><br><span>            memset(&sig_data, 0, sizeof(sig_data));</span><br><span>@@ -1533,6 +1543,7 @@</span><br><span>  struct gsm48_hdr *gh;</span><br><span>        struct gsm48_ra_upd_ack *rua;</span><br><span>        uint8_t *mid;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned long t;</span><br><span> </span><br><span>         rate_ctr_inc(&sgsn->rate_ctrs->ctr[CTR_GPRS_ROUTING_AREA_ACKED]);</span><br><span>  LOGMMCTXP(LOGL_INFO, mm, "<- ROUTING AREA UPDATE ACCEPT\n");</span><br><span>@@ -1546,7 +1557,8 @@</span><br><span>    rua = (struct gsm48_ra_upd_ack *) msgb_put(msg, sizeof(*rua));</span><br><span>       rua->force_stby = 0; /* not indicated */</span><br><span>  rua->upd_result = 0; /* RA updated */</span><br><span style="color: hsl(0, 100%, 40%);">-        rua->ra_upd_timer = gprs_secs_to_tmr_floor(sgsn->cfg.timers.T3312);</span><br><span style="color: hsl(120, 100%, 40%);">+     t = osmo_tdef_get(sgsn->cfg.T_defs, 3312, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+        rua->ra_upd_timer = gprs_secs_to_tmr_floor(t);</span><br><span> </span><br><span>        gsm48_encode_ra(&rua->ra_id, &mm->ra);</span><br><span> </span><br><span>@@ -1567,8 +1579,8 @@</span><br><span> #endif</span><br><span> </span><br><span>       /* Optional: Negotiated READY timer value */</span><br><span style="color: hsl(0, 100%, 40%);">-    msgb_tv_put(msg, GSM48_IE_GMM_TIMER_READY,</span><br><span style="color: hsl(0, 100%, 40%);">-                  gprs_secs_to_tmr_floor(sgsn->cfg.timers.T3314));</span><br><span style="color: hsl(120, 100%, 40%);">+       t = osmo_tdef_get(sgsn->cfg.T_defs, 3314, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+        msgb_tv_put(msg, GSM48_IE_GMM_TIMER_READY, gprs_secs_to_tmr_floor(t));</span><br><span> </span><br><span>   /* Option: MS ID, ... */</span><br><span>     return gsm48_gmm_sendmsg(msg, 0, mm, true);</span><br><span>@@ -1791,7 +1803,7 @@</span><br><span> </span><br><span>      /* Start T3350 and re-transmit up to 5 times until ATTACH COMPLETE */</span><br><span>        mmctx->t3350_mode = GMM_T3350_MODE_RAU;</span><br><span style="color: hsl(0, 100%, 40%);">-      mmctx_timer_start(mmctx, 3350, sgsn->cfg.timers.T3350);</span><br><span style="color: hsl(120, 100%, 40%);">+    mmctx_timer_start(mmctx, 3350);</span><br><span> #else</span><br><span>     /* Make sure we are NORMAL (i.e. not SUSPENDED anymore) */</span><br><span>   mmctx->gmm_state = GMM_REGISTERED_NORMAL;</span><br><span>@@ -2185,6 +2197,7 @@</span><br><span>         struct sgsn_mm_ctx *mm = _mm;</span><br><span>        struct gsm_auth_tuple *at;</span><br><span>   int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned long seconds;</span><br><span> </span><br><span>   mm->num_T_exp++;</span><br><span> </span><br><span>@@ -2212,7 +2225,8 @@</span><br><span>                                "T3350 mode wasn't set, ignoring timeout\n");</span><br><span>                        break;</span><br><span>               }</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_timer_schedule(&mm->timer, sgsn->cfg.timers.T3350, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         seconds = osmo_tdef_get(sgsn->cfg.T_defs, 3350, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_timer_schedule(&mm->timer, seconds, 0);</span><br><span>          break;</span><br><span>       case 3360:      /* waiting for AUTH AND CIPH RESP */</span><br><span>                 if (mm->num_T_exp >= 5) {</span><br><span>@@ -2230,10 +2244,12 @@</span><br><span>            at = &mm->auth_triplet;</span><br><span> </span><br><span>           rc = gsm48_tx_gmm_auth_ciph_req(mm, &at->vec, at->key_seq, false);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc < 0) {</span><br><span>                     LOGMMCTXP(LOGL_ERROR, mm, "failed sending Auth. & Ciph. Request: %s \n", strerror(-rc));</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmo_timer_schedule(&mm->timer, sgsn->cfg.timers.T3360, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      seconds = osmo_tdef_get(sgsn->cfg.T_defs, 3360, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_timer_schedule(&mm->timer, seconds, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>            break;</span><br><span>       case 3370:      /* waiting for IDENTITY RESPONSE */</span><br><span>          if (mm->num_T_exp >= 5) {</span><br><span>@@ -2244,7 +2260,8 @@</span><br><span>              }</span><br><span>            /* re-tranmit IDENTITY REQUEST and re-start timer */</span><br><span>                 gsm48_tx_gmm_id_req(mm, mm->t3370_id_type);</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_timer_schedule(&mm->timer, sgsn->cfg.timers.T3370, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         seconds = osmo_tdef_get(sgsn->cfg.T_defs, 3370, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_timer_schedule(&mm->timer, seconds, 0);</span><br><span>          break;</span><br><span>       default:</span><br><span>             LOGMMCTXP(LOGL_ERROR, mm, "timer expired in unknown mode %u\n",</span><br><span>@@ -2257,25 +2274,28 @@</span><br><span> static void pdpctx_timer_cb(void *_mm);</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void pdpctx_timer_rearm(struct sgsn_pdp_ctx *pdp, unsigned int T, unsigned int seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+static void pdpctx_timer_rearm(struct sgsn_pdp_ctx *pdp, unsigned int T)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned long seconds;</span><br><span>       if (osmo_timer_pending(&pdp->timer))</span><br><span>          LOGPDPCTXP(LOGL_ERROR, pdp, "Scheduling PDP timer %u while old "</span><br><span>                   "timer %u pending\n", T, pdp->T);</span><br><span style="color: hsl(120, 100%, 40%);">+        seconds = osmo_tdef_get(sgsn->cfg.T_defs, T, OSMO_TDEF_S, -1);</span><br><span>    osmo_timer_schedule(&pdp->timer, seconds, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void pdpctx_timer_start(struct sgsn_pdp_ctx *pdp, unsigned int T,</span><br><span style="color: hsl(0, 100%, 40%);">-                           unsigned int seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+static void pdpctx_timer_start(struct sgsn_pdp_ctx *pdp, unsigned int T)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       if (osmo_timer_pending(&pdp->timer))</span><br><span>          LOGPDPCTXP(LOGL_ERROR, pdp, "Starting PDP timer %u while old "</span><br><span>                     "timer %u pending\n", T, pdp->T);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     pdp->T = T;</span><br><span>       pdp->num_T_exp = 0;</span><br><span> </span><br><span>   osmo_timer_setup(&pdp->timer, pdpctx_timer_cb, pdp);</span><br><span style="color: hsl(0, 100%, 40%);">-     pdpctx_timer_rearm(pdp, pdp->T, seconds);</span><br><span style="color: hsl(120, 100%, 40%);">+  pdpctx_timer_rearm(pdp, pdp->T);</span><br><span> }</span><br><span> </span><br><span> static void pdpctx_timer_stop(struct sgsn_pdp_ctx *pdp, unsigned int T)</span><br><span>@@ -2412,7 +2432,7 @@</span><br><span> }</span><br><span> int gsm48_tx_gsm_deact_pdp_req(struct sgsn_pdp_ctx *pdp, uint8_t sm_cause, bool teardown)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  pdpctx_timer_start(pdp, 3395, sgsn->cfg.timers.T3395);</span><br><span style="color: hsl(120, 100%, 40%);">+     pdpctx_timer_start(pdp, 3395);</span><br><span> </span><br><span>   return _gsm48_tx_gsm_deact_pdp_req(pdp->mm, pdp->ti, sm_cause, teardown);</span><br><span> }</span><br><span>@@ -2828,7 +2848,7 @@</span><br><span>                         break;</span><br><span>               }</span><br><span>            _gsm48_tx_gsm_deact_pdp_req(pdp->mm, pdp->ti, GSM_CAUSE_NET_FAIL, true);</span><br><span style="color: hsl(0, 100%, 40%);">-          pdpctx_timer_rearm(pdp, 3395, sgsn->cfg.timers.T3395);</span><br><span style="color: hsl(120, 100%, 40%);">+             pdpctx_timer_rearm(pdp, 3395);</span><br><span>               break;</span><br><span>       default:</span><br><span>             LOGPDPCTXP(LOGL_ERROR, pdp, "timer expired in unknown mode %u\n",</span><br><span>diff --git a/src/gprs/gprs_gmm_attach.c b/src/gprs/gprs_gmm_attach.c</span><br><span>index 84a2cf5..39efb0d 100644</span><br><span>--- a/src/gprs/gprs_gmm_attach.c</span><br><span>+++ b/src/gprs/gprs_gmm_attach.c</span><br><span>@@ -1,3 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/tdef.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <osmocom/sgsn/gprs_gmm_attach.h></span><br><span> </span><br><span> #include <osmocom/gsm/protocol/gsm_04_08_gprs.h></span><br><span>@@ -10,6 +12,18 @@</span><br><span> static int require_identity_imei = 1;</span><br><span> static int require_auth = 1;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static const struct osmo_tdef_state_timeout gmm_attach_fsm_timeouts[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      [ST_IDENTIY] = { .T=3370 },</span><br><span style="color: hsl(120, 100%, 40%);">+   [ST_AUTH] = { .T=3360 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [ST_ACCEPT] = { .T=3350 },</span><br><span style="color: hsl(120, 100%, 40%);">+    [ST_ASK_VLR] = { .T=3350 },</span><br><span style="color: hsl(120, 100%, 40%);">+   [ST_IU_SECURITY_CMD] = { .T=3350 },</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%);">+#define gmm_attach_fsm_state_chg(fi, NEXT_STATE) \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_tdef_fsm_inst_state_chg(fi, NEXT_STATE, gmm_attach_fsm_timeouts, sgsn->cfg.T_defs, -1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void st_init(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>         struct sgsn_mm_ctx *ctx = fi->priv;</span><br><span>@@ -33,14 +47,14 @@</span><br><span> </span><br><span>     if (require_identity_imei) {</span><br><span>                 ctx->gmm_att_req.id_type = GSM_MI_TYPE_IMEI;</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_fsm_inst_state_chg(fi, ST_IDENTIY, sgsn->cfg.timers.T3370, 3370);</span><br><span style="color: hsl(120, 100%, 40%);">+             gmm_attach_fsm_state_chg(fi, ST_IDENTIY);</span><br><span>    } else if (!strlen(ctx->imsi)) {</span><br><span>          ctx->gmm_att_req.id_type = GSM_MI_TYPE_IMSI;</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_fsm_inst_state_chg(fi, ST_IDENTIY, sgsn->cfg.timers.T3370, 3370);</span><br><span style="color: hsl(120, 100%, 40%);">+             gmm_attach_fsm_state_chg(fi, ST_IDENTIY);</span><br><span>    } else if (require_auth)</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_fsm_inst_state_chg(fi, ST_AUTH, sgsn->cfg.timers.T3360, 3360);</span><br><span style="color: hsl(120, 100%, 40%);">+                gmm_attach_fsm_state_chg(fi, ST_AUTH);</span><br><span>       else</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+              gmm_attach_fsm_state_chg(fi, ST_ACCEPT);</span><br><span> }</span><br><span> </span><br><span> static void st_identity_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span>@@ -94,11 +108,11 @@</span><br><span> </span><br><span>      if (type == GSM_MI_TYPE_IMEI && !strlen(ctx->imsi)) {</span><br><span>             ctx->gmm_att_req.id_type = GSM_MI_TYPE_IMSI;</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_fsm_inst_state_chg(fi, ST_IDENTIY, sgsn->cfg.timers.T3370, 3370);</span><br><span style="color: hsl(120, 100%, 40%);">+             gmm_attach_fsm_state_chg(fi, ST_IDENTIY);</span><br><span>    } else if (require_auth)</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_fsm_inst_state_chg(fi, ST_AUTH, sgsn->cfg.timers.T3360, 3360);</span><br><span style="color: hsl(120, 100%, 40%);">+                gmm_attach_fsm_state_chg(fi, ST_AUTH);</span><br><span>       else</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+              gmm_attach_fsm_state_chg(fi, ST_ACCEPT);</span><br><span> }</span><br><span> </span><br><span> static void st_auth_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span>@@ -124,19 +138,19 @@</span><br><span>     switch(auth_state) {</span><br><span>         case SGSN_AUTH_UMTS_RESYNC: /* ask the vlr for a new vector to match the simcards seq */</span><br><span>     case SGSN_AUTH_UNKNOWN: /* the SGSN doesn know this MS */</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_fsm_inst_state_chg(fi, ST_ASK_VLR, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+             gmm_attach_fsm_state_chg(fi, ST_ASK_VLR);</span><br><span>            break;</span><br><span>       case SGSN_AUTH_REJECTED:</span><br><span>             /* TODO: correct GMM cause */</span><br><span>                osmo_fsm_inst_dispatch(fi, E_REJECT, (void *) GMM_CAUSE_GPRS_NOTALLOWED);</span><br><span>            break;</span><br><span>       case SGSN_AUTH_ACCEPTED:</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+              gmm_attach_fsm_state_chg(fi, ST_ACCEPT);</span><br><span>             break;</span><br><span>       case SGSN_AUTH_AUTHENTICATE:</span><br><span>                 if (ctx->auth_triplet.key_seq == GSM_KEY_SEQ_INVAL) {</span><br><span>                     /* invalid key material */</span><br><span style="color: hsl(0, 100%, 40%);">-                      osmo_fsm_inst_state_chg(fi, ST_ASK_VLR, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+                     gmm_attach_fsm_state_chg(fi, ST_ASK_VLR);</span><br><span>            }</span><br><span> </span><br><span>                struct gsm_auth_tuple *at = &ctx->auth_triplet;</span><br><span>@@ -159,14 +173,14 @@</span><br><span>               sgsn_auth_request(ctx);</span><br><span> #ifdef BUILD_IU</span><br><span>           if (ctx->ran_type == MM_CTX_T_UTRAN_Iu && !ctx->iu.ue_ctx->integrity_active)</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_fsm_inst_state_chg(fi, ST_IU_SECURITY_CMD, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+                     gmm_attach_fsm_state_chg(fi, ST_IU_SECURITY_CMD);</span><br><span>            else</span><br><span> #endif /* BUILD_IU */</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+                      gmm_attach_fsm_state_chg(fi, ST_ACCEPT);</span><br><span>             break;</span><br><span>       case E_AUTH_RESP_RECV_RESYNC:</span><br><span>                if (ctx->gmm_att_req.auth_reattempt <= 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                 osmo_fsm_inst_state_chg(fi, ST_ASK_VLR, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+                     gmm_attach_fsm_state_chg(fi, ST_ASK_VLR);</span><br><span>            else</span><br><span>                         osmo_fsm_inst_dispatch(fi, E_REJECT, (void *) GMM_CAUSE_SYNC_FAIL);</span><br><span>          break;</span><br><span>@@ -234,7 +248,7 @@</span><br><span> {</span><br><span>    switch(event) {</span><br><span>      case E_VLR_ANSWERED:</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_state_chg(fi, ST_AUTH, sgsn->cfg.timers.T3360, 3360);</span><br><span style="color: hsl(120, 100%, 40%);">+                gmm_attach_fsm_state_chg(fi, ST_AUTH);</span><br><span>               break;</span><br><span>       }</span><br><span> }</span><br><span>@@ -246,7 +260,7 @@</span><br><span> </span><br><span>     /* TODO: shouldn't this set always? not only when the integrity_active? */</span><br><span>       if (ctx->iu.ue_ctx->integrity_active) {</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+              gmm_attach_fsm_state_chg(fi, ST_ACCEPT);</span><br><span>             return;</span><br><span>      }</span><br><span> </span><br><span>@@ -259,7 +273,7 @@</span><br><span> {</span><br><span>     switch(event) {</span><br><span>      case E_IU_SECURITY_CMD_COMPLETE:</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350);</span><br><span style="color: hsl(120, 100%, 40%);">+              gmm_attach_fsm_state_chg(fi, ST_ACCEPT);</span><br><span>             break;</span><br><span>       }</span><br><span> }</span><br><span>@@ -373,6 +387,7 @@</span><br><span> {</span><br><span>    struct sgsn_mm_ctx *ctx = fi->priv;</span><br><span>       struct gsm_auth_tuple *at = &ctx->auth_triplet;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned long t_secs;</span><br><span> </span><br><span>    ctx->num_T_exp++;</span><br><span> </span><br><span>@@ -392,7 +407,9 @@</span><br><span>                       break;</span><br><span>               }</span><br><span>            gsm48_tx_gmm_id_req(ctx, ctx->gmm_att_req.id_type);</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_timer_schedule(&fi->timer, sgsn->cfg.timers.T3370, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         t_secs = osmo_tdef_get(sgsn->cfg.T_defs, 3370, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_timer_schedule(&fi->timer, t_secs, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                 break;</span><br><span>       case ST_AUTH:</span><br><span>                /* T3360 */</span><br><span>@@ -401,7 +418,8 @@</span><br><span>                    break;</span><br><span>               }</span><br><span>            gsm48_tx_gmm_auth_ciph_req(ctx, &at->vec, at->key_seq, false);</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_timer_schedule(&fi->timer, sgsn->cfg.timers.T3360, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         t_secs = osmo_tdef_get(sgsn->cfg.T_defs, 3360, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_timer_schedule(&fi->timer, t_secs, 0);</span><br><span>           break;</span><br><span>       case ST_ACCEPT:</span><br><span>              /* T3350 */</span><br><span>@@ -410,7 +428,8 @@</span><br><span>                    break;</span><br><span>               }</span><br><span>            gsm48_tx_gmm_att_ack(ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_timer_schedule(&fi->timer, sgsn->cfg.timers.T3350, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         t_secs = osmo_tdef_get(sgsn->cfg.T_defs, 3350, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_timer_schedule(&fi->timer, t_secs, 0);</span><br><span>           break;</span><br><span>       }</span><br><span> </span><br><span>diff --git a/src/gprs/sgsn_vty.c b/src/gprs/sgsn_vty.c</span><br><span>index d1d53e6..ae26cbe 100644</span><br><span>--- a/src/gprs/sgsn_vty.c</span><br><span>+++ b/src/gprs/sgsn_vty.c</span><br><span>@@ -28,6 +28,7 @@</span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/tdef.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08_gprs.h></span><br><span> #include <osmocom/gsm/apn.h></span><br><span> </span><br><span>@@ -39,6 +40,7 @@</span><br><span> #include <osmocom/sgsn/vty.h></span><br><span> #include <osmocom/gsupclient/gsup_client.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/tdef_vty.h></span><br><span> #include <osmocom/vty/command.h></span><br><span> #include <osmocom/vty/vty.h></span><br><span> #include <osmocom/vty/misc.h></span><br><span>@@ -88,39 +90,42 @@</span><br><span> #define GSM0408_T3395_SECS     8       /* wait for DEACT PDP CTX ACK */</span><br><span> #define GSM0408_T3397_SECS  8       /* wait for DEACT AA PDP CTX ACK */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define DECLARE_TIMER(number, doc) \</span><br><span style="color: hsl(0, 100%, 40%);">-    DEFUN(cfg_sgsn_T##number,                                        \</span><br><span style="color: hsl(0, 100%, 40%);">-      cfg_sgsn_T##number##_cmd,                                        \</span><br><span style="color: hsl(0, 100%, 40%);">-      "timer t" #number  " <0-65535>",                               \</span><br><span style="color: hsl(0, 100%, 40%);">-      "Configure GPRS Timers\n"                                      \</span><br><span style="color: hsl(0, 100%, 40%);">-      doc "\nTimer Value in seconds\n")                              \</span><br><span style="color: hsl(0, 100%, 40%);">-{                                                              \</span><br><span style="color: hsl(0, 100%, 40%);">-       int value = atoi(argv[0]);                              \</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               \</span><br><span style="color: hsl(0, 100%, 40%);">-       if (value < 0 || value > 65535) {                 \</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "Timer value %s out of range.%s",        \</span><br><span style="color: hsl(0, 100%, 40%);">-                       argv[0], VTY_NEWLINE);                  \</span><br><span style="color: hsl(0, 100%, 40%);">-               return CMD_WARNING;                             \</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%);">-       g_cfg->timers.T##number = value;                     \</span><br><span style="color: hsl(0, 100%, 40%);">-       return CMD_SUCCESS;                                     \</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_tdef sgsn_T_defs[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        { .T=3312, .default_val=GSM0408_T3312_SECS, .desc="Periodic RA Update timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .T=3313, .default_val=GSM0408_T3313_SECS, .desc="Waiting for paging response timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { .T=3314, .default_val=GSM0408_T3314_SECS, .desc="Force to STANDBY on expiry timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .T=3316, .default_val=GSM0408_T3316_SECS, .desc="AA-Ready timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { .T=3322, .default_val=GSM0408_T3322_SECS, .desc="Detach request -> accept timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { .T=3350, .default_val=GSM0408_T3350_SECS, .desc="Waiting for ATT/RAU/TMSI_COMPL timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .T=3360, .default_val=GSM0408_T3360_SECS, .desc="Waiting for AUTH/CIPH response timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .T=3370, .default_val=GSM0408_T3370_SECS, .desc="Waiting for IDENTITY response timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { .T=3385, .default_val=GSM0408_T3385_SECS, .desc="Wait for ACT PDP CTX REQ timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { .T=3386, .default_val=GSM0408_T3386_SECS, .desc="Wait for MODIFY PDP CTX ACK timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { .T=3395, .default_val=GSM0408_T3395_SECS, .desc="Wait for DEACT PDP CTX ACK timer (s)" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .T=3397, .default_val=GSM0408_T3397_SECS, .desc="Wait for DEACT AA PDP CTX ACK timer (s)" },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(show_timer, show_timer_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+      SHOW_STR "Show timers\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_TDEF_VTY_DOC_T)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *T_arg = argc > 0 ? argv[0] : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+     return osmo_tdef_vty_show_cmd(vty, g_cfg->T_defs, T_arg, NULL);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3312, "Periodic RA Update timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3322, "Detach request -> accept timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3350, "Waiting for ATT/RAU/TMSI_COMPL timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3360, "Waiting for AUTH/CIPH response timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3370, "Waiting for IDENTITY response timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3313, "Waiting for paging response timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3314, "Force to STANDBY on expiry timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3316, "AA-Ready timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3385, "Wait for ACT PDP CTX REQ timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3386, "Wait for MODIFY PDP CTX ACK timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3395, "Wait for DEACT PDP CTX ACK timer (s)")</span><br><span style="color: hsl(0, 100%, 40%);">-DECLARE_TIMER(3397, "Wait for DEACT AA PDP CTX ACK timer (s)")</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_sgsn_timer, cfg_sgsn_timer_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+      "Configure or show timers\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_TDEF_VTY_DOC_SET)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      /* If any arguments are missing, redirect to 'show' */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (argc < 2)</span><br><span style="color: hsl(120, 100%, 40%);">+              return show_timer(self, vty, argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+     return osmo_tdef_vty_set_cmd(vty, g_cfg->T_defs, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> char *gprs_pdpaddr2str(uint8_t *pdpa, uint8_t len)</span><br><span> {</span><br><span>@@ -253,18 +258,7 @@</span><br><span>          vty_out(vty, " no cdr trap%s", VTY_NEWLINE);</span><br><span>       vty_out(vty, " cdr interval %d%s", g_cfg->cdr.interval, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  vty_out(vty, " timer t3312 %d%s", g_cfg->timers.T3312, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3322 %d%s", g_cfg->timers.T3322, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3350 %d%s", g_cfg->timers.T3350, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3360 %d%s", g_cfg->timers.T3360, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3370 %d%s", g_cfg->timers.T3370, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3313 %d%s", g_cfg->timers.T3313, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3314 %d%s", g_cfg->timers.T3314, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3316 %d%s", g_cfg->timers.T3316, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3385 %d%s", g_cfg->timers.T3385, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3386 %d%s", g_cfg->timers.T3386, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3395 %d%s", g_cfg->timers.T3395, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, " timer t3397 %d%s", g_cfg->timers.T3397, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_tdef_vty_write(vty, g_cfg->T_defs, " timer ");</span><br><span> </span><br><span>         if (g_cfg->pcomp_rfc1144.active) {</span><br><span>                vty_out(vty, " compression rfc1144 active slots %d%s",</span><br><span>@@ -1388,12 +1382,16 @@</span><br><span> {</span><br><span>      g_cfg = cfg;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      g_cfg->T_defs = sgsn_T_defs;</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_tdefs_reset(g_cfg->T_defs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        install_element_ve(&show_sgsn_cmd);</span><br><span>      //install_element_ve(&show_mmctx_tlli_cmd);</span><br><span>      install_element_ve(&show_mmctx_imsi_cmd);</span><br><span>        install_element_ve(&show_mmctx_all_cmd);</span><br><span>         install_element_ve(&show_pdpctx_all_cmd);</span><br><span>        install_element_ve(&show_subscr_cache_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element_ve(&show_timer_cmd);</span><br><span> </span><br><span>         install_element(ENABLE_NODE, &update_subscr_insert_auth_triplet_cmd);</span><br><span>    install_element(ENABLE_NODE, &update_subscr_create_cmd);</span><br><span>@@ -1433,18 +1431,7 @@</span><br><span>        install_element(SGSN_NODE, &cfg_ggsn_dynamic_lookup_cmd);</span><br><span>        install_element(SGSN_NODE, &cfg_grx_ggsn_cmd);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  install_element(SGSN_NODE, &cfg_sgsn_T3312_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3322_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3350_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3360_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3370_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3313_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3314_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3316_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3385_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3386_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3395_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(SGSN_NODE, &cfg_sgsn_T3397_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(SGSN_NODE, &cfg_sgsn_timer_cmd);</span><br><span> </span><br><span>     install_element(SGSN_NODE, &cfg_no_comp_rfc1144_cmd);</span><br><span>    install_element(SGSN_NODE, &cfg_comp_rfc1144_cmd);</span><br><span>@@ -1466,19 +1453,6 @@</span><br><span>      /* make sure sgsn_vty_init() was called before this */</span><br><span>       OSMO_ASSERT(g_cfg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- g_cfg->timers.T3312 = GSM0408_T3312_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3322 = GSM0408_T3322_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3350 = GSM0408_T3350_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3360 = GSM0408_T3360_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3370 = GSM0408_T3370_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3313 = GSM0408_T3313_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3314 = GSM0408_T3314_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3316 = GSM0408_T3316_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3385 = GSM0408_T3385_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3386 = GSM0408_T3386_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3395 = GSM0408_T3395_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->timers.T3397 = GSM0408_T3397_SECS;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         rc = vty_read_config_file(config_file, NULL);</span><br><span>        if (rc < 0) {</span><br><span>             fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/15214">change 15214</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-sgsn/+/15214"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia0cf5f0a49737fbc419e2ccc86312d01c6e0056e </div>
<div style="display:none"> Gerrit-Change-Number: 15214 </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>