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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">NACC: allow setting keep time for entries in neigh and si cache<br><br>Related: SYS#4909<br>Change-Id: Ifa336aa27dd88ff5b78dbc5a2799740f542bb369<br>---<br>M src/gprs_pcu.c<br>M src/gprs_pcu.h<br>M src/neigh_cache.c<br>M src/neigh_cache.h<br>M src/pcu_vty.c<br>5 files changed, 45 insertions(+), 15 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gprs_pcu.c b/src/gprs_pcu.c</span><br><span>index 9a21cdb..31ed8b7 100644</span><br><span>--- a/src/gprs_pcu.c</span><br><span>+++ b/src/gprs_pcu.c</span><br><span>@@ -33,6 +33,8 @@</span><br><span>         { .T=1,     .default_val=30,  .unit=OSMO_TDEF_S,  .desc="BSSGP (un)blocking procedures timer (s)",  .val=0 },</span><br><span>      { .T=2,     .default_val=30,  .unit=OSMO_TDEF_S,  .desc="BSSGP reset procedure timer (s)",          .val=0 },</span><br><span>      { .T=3190,  .default_val=5,   .unit=OSMO_TDEF_S,  .desc="Return to packet idle mode after Packet DL Assignment on CCCH (s)", .val=0},</span><br><span style="color: hsl(120, 100%, 40%);">+       { .T=PCU_TDEF_NEIGH_CACHE_ALIVE,   .default_val=5,  .unit=OSMO_TDEF_S,   .desc="[ARFCN+BSIC]->[RAC+CI] resolution cache entry storage timeout (s)", .val=0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .T=PCU_TDEF_SI_CACHE_ALIVE,      .default_val=5,  .unit=OSMO_TDEF_S,   .desc="[RAC+CI]->[SI] resolution cache entry storage timeout (s)", .val=0 },</span><br><span>   { .T=-2000, .default_val=2,   .unit=OSMO_TDEF_MS, .desc="Tbf reject for PRR timer (ms)",            .val=0 },</span><br><span>      { .T=-2001, .default_val=2,   .unit=OSMO_TDEF_S,  .desc="PACCH assignment timer (s)",               .val=0 },</span><br><span>      { .T=-2002, .default_val=200, .unit=OSMO_TDEF_MS, .desc="Waiting after IMM.ASS confirm timer (ms)", .val=0 },</span><br><span>@@ -114,8 +116,8 @@</span><br><span> </span><br><span>    INIT_LLIST_HEAD(&pcu->bts_list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     pcu->neigh_cache = neigh_cache_alloc(pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   pcu->si_cache = si_cache_alloc(pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+       pcu->neigh_cache = neigh_cache_alloc(pcu, osmo_tdef_get(pcu->T_defs, PCU_TDEF_NEIGH_CACHE_ALIVE, OSMO_TDEF_S, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+     pcu->si_cache = si_cache_alloc(pcu, osmo_tdef_get(pcu->T_defs, PCU_TDEF_SI_CACHE_ALIVE, OSMO_TDEF_S, -1));</span><br><span> </span><br><span>         return pcu;</span><br><span> }</span><br><span>diff --git a/src/gprs_pcu.h b/src/gprs_pcu.h</span><br><span>index 8e18f89..4f22f68 100644</span><br><span>--- a/src/gprs_pcu.h</span><br><span>+++ b/src/gprs_pcu.h</span><br><span>@@ -37,6 +37,9 @@</span><br><span> #define MAX_EDGE_MCS 9</span><br><span> #define MAX_GPRS_CS 4</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define PCU_TDEF_NEIGH_CACHE_ALIVE (-10)</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCU_TDEF_SI_CACHE_ALIVE    (-11)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* see bts->gsmtap_categ_mask */</span><br><span> enum pcu_gsmtap_category {</span><br><span>  PCU_GSMTAP_C_DL_UNKNOWN         = 0,    /* unknown or undecodable downlink blocks */</span><br><span>diff --git a/src/neigh_cache.c b/src/neigh_cache.c</span><br><span>index a4bdfbe..ae619d3 100644</span><br><span>--- a/src/neigh_cache.c</span><br><span>+++ b/src/neigh_cache.c</span><br><span>@@ -27,10 +27,6 @@</span><br><span> #include <neigh_cache.h></span><br><span> #include <gprs_debug.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define KEEP_TIME_DEFAULT_SEC 5</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*TODO: add a timer to the_pcu T_defs, pass value to struct neigh_cache instead of KEEP_TIME_DEFAULT_SEC */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static inline bool neigh_cache_entry_key_eq(const struct neigh_cache_entry_key *a,</span><br><span>                                        const struct neigh_cache_entry_key *b)</span><br><span> {</span><br><span>@@ -89,16 +85,23 @@</span><br><span>        osmo_timer_schedule(&cache->cleanup_timer, result.tv_sec, result.tv_nsec*1000);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct neigh_cache *neigh_cache_alloc(void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+struct neigh_cache *neigh_cache_alloc(void *ctx, unsigned int keep_time_sec)</span><br><span> {</span><br><span>   struct neigh_cache *cache = talloc_zero(ctx, struct neigh_cache);</span><br><span>    OSMO_ASSERT(cache);</span><br><span>  INIT_LLIST_HEAD(&cache->list);</span><br><span>        osmo_timer_setup(&cache->cleanup_timer, neigh_cache_cleanup_cb, cache);</span><br><span style="color: hsl(0, 100%, 40%);">-  cache->keep_time_intval = (struct timespec){ .tv_sec = KEEP_TIME_DEFAULT_SEC, .tv_nsec = 0};</span><br><span style="color: hsl(120, 100%, 40%);">+       cache->keep_time_intval = (struct timespec){ .tv_sec = keep_time_sec, .tv_nsec = 0};</span><br><span>      return cache;</span><br><span> </span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void neigh_cache_set_keep_time_interval(struct neigh_cache *cache, unsigned int keep_time_sec)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   cache->keep_time_intval = (struct timespec){ .tv_sec = keep_time_sec, .tv_nsec = 0};</span><br><span style="color: hsl(120, 100%, 40%);">+       neigh_cache_schedule_cleanup(cache);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct neigh_cache_entry *neigh_cache_add(struct neigh_cache *cache,</span><br><span>                                      const struct neigh_cache_entry_key *key,</span><br><span>                                     const struct osmo_cell_global_id_ps *value)</span><br><span>@@ -168,8 +171,6 @@</span><br><span> // SI CACHE</span><br><span> ///////////////////</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*TODO: add a timer to the_pcu T_defs, pass value to struct neigh_cache instead of KEEP_TIME_DEFAULT_SEC */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void si_cache_schedule_cleanup(struct si_cache *cache);</span><br><span> static void si_cache_cleanup_cb(void *data)</span><br><span> {</span><br><span>@@ -218,15 +219,22 @@</span><br><span>       osmo_timer_schedule(&cache->cleanup_timer, result.tv_sec, result.tv_nsec*1000);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct si_cache *si_cache_alloc(void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+struct si_cache *si_cache_alloc(void *ctx, unsigned int keep_time_sec)</span><br><span> {</span><br><span>       struct si_cache *cache = talloc_zero(ctx, struct si_cache);</span><br><span>  OSMO_ASSERT(cache);</span><br><span>  INIT_LLIST_HEAD(&cache->list);</span><br><span>        osmo_timer_setup(&cache->cleanup_timer, si_cache_cleanup_cb, cache);</span><br><span style="color: hsl(0, 100%, 40%);">-     cache->keep_time_intval = (struct timespec){ .tv_sec = KEEP_TIME_DEFAULT_SEC, .tv_nsec = 0};</span><br><span style="color: hsl(120, 100%, 40%);">+       cache->keep_time_intval = (struct timespec){ .tv_sec = keep_time_sec, .tv_nsec = 0};</span><br><span>      return cache;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void si_cache_set_keep_time_interval(struct si_cache *cache, unsigned int keep_time_sec)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     cache->keep_time_intval = (struct timespec){ .tv_sec = keep_time_sec, .tv_nsec = 0};</span><br><span style="color: hsl(120, 100%, 40%);">+       si_cache_schedule_cleanup(cache);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct si_cache_entry *si_cache_add(struct si_cache *cache,</span><br><span>                                    const struct osmo_cell_global_id_ps *key,</span><br><span>                                    const struct si_cache_value *value)</span><br><span>diff --git a/src/neigh_cache.h b/src/neigh_cache.h</span><br><span>index 3fd56b7..4fed0fa 100644</span><br><span>--- a/src/neigh_cache.h</span><br><span>+++ b/src/neigh_cache.h</span><br><span>@@ -55,7 +55,8 @@</span><br><span>         struct osmo_cell_global_id_ps value;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct neigh_cache *neigh_cache_alloc(void *ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+struct neigh_cache *neigh_cache_alloc(void *ctx, unsigned int keep_time_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+void neigh_cache_set_keep_time_interval(struct neigh_cache *cache, unsigned int keep_time_sec);</span><br><span> struct neigh_cache_entry *neigh_cache_add(struct neigh_cache *cache,</span><br><span>                                        const struct neigh_cache_entry_key *key,</span><br><span>                                     const struct osmo_cell_global_id_ps *value);</span><br><span>@@ -90,7 +91,8 @@</span><br><span>   struct si_cache_value value;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct si_cache *si_cache_alloc(void *ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+struct si_cache *si_cache_alloc(void *ctx, unsigned int keep_time_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+void si_cache_set_keep_time_interval(struct si_cache *cache, unsigned int keep_time_sec);</span><br><span> struct si_cache_entry *si_cache_add(struct si_cache *cache,</span><br><span>                                     const struct osmo_cell_global_id_ps *key,</span><br><span>                                    const struct si_cache_value *value);</span><br><span>diff --git a/src/pcu_vty.c b/src/pcu_vty.c</span><br><span>index 8f97f30..b0d1ac6 100644</span><br><span>--- a/src/pcu_vty.c</span><br><span>+++ b/src/pcu_vty.c</span><br><span>@@ -1064,10 +1064,25 @@</span><br><span>     OSMO_TDEF_VTY_DOC_SET,</span><br><span>       CMD_ATTR_IMMEDIATE)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_tdef *t;</span><br><span>         /* If any arguments are missing, redirect to 'show' */</span><br><span>       if (argc < 2)</span><br><span>             return show_timer(self, vty, argc, argv);</span><br><span style="color: hsl(0, 100%, 40%);">-       return osmo_tdef_vty_set_cmd(vty, the_pcu->T_defs, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+  if ((rc = osmo_tdef_vty_set_cmd(vty, the_pcu->T_defs, argv)) != CMD_SUCCESS)</span><br><span style="color: hsl(120, 100%, 40%);">+               return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    t = osmo_tdef_vty_parse_T_arg(vty, the_pcu->T_defs, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (t->T) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case PCU_TDEF_NEIGH_CACHE_ALIVE:</span><br><span style="color: hsl(120, 100%, 40%);">+              neigh_cache_set_keep_time_interval(the_pcu->neigh_cache, t->val);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case PCU_TDEF_SI_CACHE_ALIVE:</span><br><span style="color: hsl(120, 100%, 40%);">+         si_cache_set_keep_time_interval(the_pcu->si_cache, t->val);</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%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> DEFUN(show_tbf,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/22449">change 22449</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/+/22449"/><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: Ifa336aa27dd88ff5b78dbc5a2799740f542bb369 </div>
<div style="display:none"> Gerrit-Change-Number: 22449 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>