<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10477">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gbproxy: Add VTY parameter: link stored-msgs-max-length<br><br>It was discovered in some prod setups that some TLLIs can maintain quite<br>long queues of msgb in case its IMSI is not acquired and the tlli is not<br>pruned due to link-list max-{age,length} being set to 0. As a result,<br>the osmo-gpbroxy steadly increases the list size of maintained TLLIs, and<br>some TLLI was found without IMSI catching already 1211 msgb.<br><br>Let's allow setting a maxiumum length for the queue storing those msgb<br>in a per TLLI base. If the limit is reached, oldest msgb are removed<br>before adding a new one.<br><br>Related: SYS#4297<br><br>Change-Id: I4473be8604f80302df03ffdd5a13280dc072f824<br>---<br>M include/osmocom/sgsn/gb_proxy.h<br>M src/gprs/gb_proxy.c<br>M src/gprs/gb_proxy_vty.c<br>3 files changed, 58 insertions(+), 6 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/77/10477/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/gb_proxy.h b/include/osmocom/sgsn/gb_proxy.h</span><br><span>index 70de3d7..16082fc 100644</span><br><span>--- a/include/osmocom/sgsn/gb_proxy.h</span><br><span>+++ b/include/osmocom/sgsn/gb_proxy.h</span><br><span>@@ -105,8 +105,12 @@</span><br><span>        struct osmo_plmn_id core_plmn;</span><br><span>       uint8_t* core_apn;</span><br><span>   size_t core_apn_size;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* If !0, Max age to consider a struct gbproxy_link_info as stale */</span><br><span>         int tlli_max_age;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* If !0, Max len of gbproxy_peer->list (list of struct gbproxy_link_info) */</span><br><span>     int tlli_max_len;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* If !0, Max len of gbproxy_link_info->stored_msgs (list of msgb) */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t stored_msgs_max_len;</span><br><span> </span><br><span>    /* Experimental config */</span><br><span>    int patch_ptmsi;</span><br><span>@@ -171,6 +175,7 @@</span><br><span> </span><br><span>   int imsi_acq_pending;</span><br><span>        struct llist_head stored_msgs;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t stored_msgs_len;</span><br><span>    unsigned vu_gen_tx_bss;</span><br><span> </span><br><span>  int is_deregistered;</span><br><span>diff --git a/src/gprs/gb_proxy.c b/src/gprs/gb_proxy.c</span><br><span>index dc3c810..5b2149e 100644</span><br><span>--- a/src/gprs/gb_proxy.c</span><br><span>+++ b/src/gprs/gb_proxy.c</span><br><span>@@ -344,6 +344,8 @@</span><br><span>          tmp_parse_ctx.peer_nsei = msgb_nsei(stored_msg);</span><br><span>             int len_change = 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               link_info->stored_msgs_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>           gprs_gb_parse_bssgp(msgb_bssgph(stored_msg),</span><br><span>                                     msgb_bssgp_len(stored_msg),</span><br><span>                                  &tmp_parse_ctx);</span><br><span>@@ -492,6 +494,24 @@</span><br><span> </span><br><span>  /* The message cannot be processed since the IMSI is still missing */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     /* If queue is getting too large, drop oldest msgb before adding new one */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (peer->cfg->stored_msgs_max_len > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            int exceeded_max_len = link_info->stored_msgs_len</span><br><span style="color: hsl(120, 100%, 40%);">+                             + 1 - peer->cfg->stored_msgs_max_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              for (; exceeded_max_len > 0; exceeded_max_len--) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 struct msgb *msgb_drop;</span><br><span style="color: hsl(120, 100%, 40%);">+                       msgb_drop = msgb_dequeue(&link_info->stored_msgs);</span><br><span style="color: hsl(120, 100%, 40%);">+                     link_info->stored_msgs_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DLLC, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                      "NSEI=%d(BSS) Dropping stored msgb from list "</span><br><span style="color: hsl(120, 100%, 40%);">+                      "(!acq imsi, length %d, max_len exceeded)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       msgb_nsei(msgb_drop), link_info->stored_msgs_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  msgb_free(msgb_drop);</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>  /* Enqueue unpatched messages */</span><br><span>     LOGP(DLLC, LOGL_INFO,</span><br><span>             "NSEI=%d(BSS) IMSI acquisition in progress, "</span><br><span>@@ -501,6 +521,7 @@</span><br><span> </span><br><span>       stored_msg = bssgp_msgb_copy(msg, "process_bssgp_ul");</span><br><span>     msgb_enqueue(&link_info->stored_msgs, stored_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+     link_info->stored_msgs_len++;</span><br><span> </span><br><span>         if (!link_info->imsi_acq_pending) {</span><br><span>               LOGP(DLLC, LOGL_INFO,</span><br><span>diff --git a/src/gprs/gb_proxy_vty.c b/src/gprs/gb_proxy_vty.c</span><br><span>index d7d35fe..dc0b502 100644</span><br><span>--- a/src/gprs/gb_proxy_vty.c</span><br><span>+++ b/src/gprs/gb_proxy_vty.c</span><br><span>@@ -23,6 +23,7 @@</span><br><span> #include <arpa/inet.h></span><br><span> #include <string.h></span><br><span> #include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span> </span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span>@@ -128,6 +129,9 @@</span><br><span>      vty_out(vty, " link-list keep-mode %s%s",</span><br><span>          get_value_string(keep_modes, g_cfg->keep_link_infos),</span><br><span>             VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_cfg->stored_msgs_max_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, " link stored-msgs-max-length %"PRIu32"%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                  g_cfg->stored_msgs_max_len, VTY_NEWLINE);</span><br><span> </span><br><span> </span><br><span>         return CMD_SUCCESS;</span><br><span>@@ -402,6 +406,7 @@</span><br><span> }</span><br><span> </span><br><span> #define GBPROXY_LINK_LIST_STR "Set TLLI list parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define GBPROXY_LINK_STR "Set TLLI parameters\n"</span><br><span> #define GBPROXY_MAX_AGE_STR "Limit maximum age\n"</span><br><span> </span><br><span> DEFUN(cfg_gbproxy_link_list_max_age,</span><br><span>@@ -464,6 +469,27 @@</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_gbproxy_link_stored_msgs_max_len,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_gbproxy_link_stored_msgs_max_len_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "link stored-msgs-max-length <1-99999>",</span><br><span style="color: hsl(120, 100%, 40%);">+      GBPROXY_LINK_STR GBPROXY_MAX_LEN_STR</span><br><span style="color: hsl(120, 100%, 40%);">+      "Maximum number of msgb stored in the logical link waiting to acquire its IMSI\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ g_cfg->stored_msgs_max_len = (uint32_t) atoi(argv[0]);</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_gbproxy_link_no_stored_msgs_max_len,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_gbproxy_link_no_stored_msgs_max_len_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "no link stored-msgs-max-length",</span><br><span style="color: hsl(120, 100%, 40%);">+      NO_STR GBPROXY_LINK_STR GBPROXY_MAX_LEN_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        g_cfg->stored_msgs_max_len = 0;</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> </span><br><span> DEFUN(show_gbproxy, show_gbproxy_cmd, "show gbproxy [stats]",</span><br><span>        SHOW_STR "Display information about the Gb proxy\n" "Show statistics\n")</span><br><span>@@ -502,10 +528,6 @@</span><br><span> </span><br><span>            llist_for_each_entry(link_info, &state->logical_links, list) {</span><br><span>                        time_t age = now - link_info->timestamp;</span><br><span style="color: hsl(0, 100%, 40%);">-                     int stored_msgs = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                    struct llist_head *iter;</span><br><span style="color: hsl(0, 100%, 40%);">-                        llist_for_each(iter, &link_info->stored_msgs)</span><br><span style="color: hsl(0, 100%, 40%);">-                            stored_msgs++;</span><br><span> </span><br><span>                   if (link_info->imsi > 0) {</span><br><span>                             snprintf(mi_buf, sizeof(mi_buf), "(invalid)");</span><br><span>@@ -518,8 +540,10 @@</span><br><span>                      vty_out(vty, "  TLLI %08x, IMSI %s, AGE %d",</span><br><span>                               link_info->tlli.current, mi_buf, (int)age);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                      if (stored_msgs)</span><br><span style="color: hsl(0, 100%, 40%);">-                                vty_out(vty, ", STORED %d", stored_msgs);</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (link_info->stored_msgs_len)</span><br><span style="color: hsl(120, 100%, 40%);">+                            vty_out(vty, ", STORED %"PRIu32"/%"PRIu32,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        link_info->stored_msgs_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        g_cfg->stored_msgs_max_len);</span><br><span> </span><br><span>                  if (g_cfg->route_to_sgsn2)</span><br><span>                                vty_out(vty, ", SGSN NSEI %d",</span><br><span>@@ -825,6 +849,7 @@</span><br><span>       install_element(GBPROXY_NODE, &cfg_gbproxy_link_list_max_age_cmd);</span><br><span>       install_element(GBPROXY_NODE, &cfg_gbproxy_link_list_max_len_cmd);</span><br><span>       install_element(GBPROXY_NODE, &cfg_gbproxy_link_list_keep_mode_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(GBPROXY_NODE, &cfg_gbproxy_link_stored_msgs_max_len_cmd);</span><br><span>        install_element(GBPROXY_NODE, &cfg_gbproxy_no_core_mcc_cmd);</span><br><span>     install_element(GBPROXY_NODE, &cfg_gbproxy_no_core_mnc_cmd);</span><br><span>     install_element(GBPROXY_NODE, &cfg_gbproxy_no_match_imsi_cmd);</span><br><span>@@ -834,6 +859,7 @@</span><br><span>     install_element(GBPROXY_NODE, &cfg_gbproxy_no_acquire_imsi_cmd);</span><br><span>         install_element(GBPROXY_NODE, &cfg_gbproxy_link_list_no_max_age_cmd);</span><br><span>    install_element(GBPROXY_NODE, &cfg_gbproxy_link_list_no_max_len_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(GBPROXY_NODE, &cfg_gbproxy_link_no_stored_msgs_max_len_cmd);</span><br><span> </span><br><span>         /* broken or deprecated to allow an upgrade path */</span><br><span>  install_element(GBPROXY_NODE, &cfg_gbproxy_broken_apn_match_cmd);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10477">change 10477</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/10477"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I4473be8604f80302df03ffdd5a13280dc072f824 </div>
<div style="display:none"> Gerrit-Change-Number: 10477 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>