<p>daniel has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21705">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gbproxy: Add SGSN NRI configuration<br><br>In order to support SGSN pooling we need to configure the various NRI<br>parameters such as the bitlen, NULL NRI, and which NRIs are assigned to<br>which SGSN.<br><br>Related: OS#4890<br>Change-Id: Id67592aa7712e5e04e7264b2fb8f26d57eb7e69e<br>---<br>M doc/examples/osmo-gbproxy/osmo-gbproxy.cfg<br>M include/osmocom/sgsn/gb_proxy.h<br>M src/gbproxy/gb_proxy.c<br>M src/gbproxy/gb_proxy_main.c<br>M src/gbproxy/gb_proxy_peer.c<br>M src/gbproxy/gb_proxy_vty.c<br>M tests/Makefile.am<br>A tests/osmo-gbproxy_test-nodes.vty<br>R tests/osmo-sgsn_test_nodes.vty<br>9 files changed, 386 insertions(+), 14 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/05/21705/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/examples/osmo-gbproxy/osmo-gbproxy.cfg b/doc/examples/osmo-gbproxy/osmo-gbproxy.cfg</span><br><span>index 29f698f..df765c0 100644</span><br><span>--- a/doc/examples/osmo-gbproxy/osmo-gbproxy.cfg</span><br><span>+++ b/doc/examples/osmo-gbproxy/osmo-gbproxy.cfg</span><br><span>@@ -6,13 +6,25 @@</span><br><span>  no login</span><br><span> !</span><br><span> gbproxy</span><br><span style="color: hsl(0, 100%, 40%);">- sgsn nsei 101</span><br><span style="color: hsl(120, 100%, 40%);">+  nri bitlen 4</span><br><span style="color: hsl(120, 100%, 40%);">+  nri null add 0 4</span><br><span style="color: hsl(120, 100%, 40%);">+sgsn nsei 101</span><br><span style="color: hsl(120, 100%, 40%);">+ nri add 1</span><br><span style="color: hsl(120, 100%, 40%);">+ nri add 11</span><br><span style="color: hsl(120, 100%, 40%);">+sgsn nsei 102</span><br><span style="color: hsl(120, 100%, 40%);">+ nri add 2</span><br><span style="color: hsl(120, 100%, 40%);">+ nri add 12</span><br><span> ns</span><br><span>  nse 101 nsvci 101</span><br><span>  nse 101 remote-role sgsn</span><br><span>  nse 101 encapsulation udp</span><br><span>  nse 101 remote-ip 192.168.100.239</span><br><span>  nse 101 remote-port 7777</span><br><span style="color: hsl(120, 100%, 40%);">+ nse 102 nsvci 102</span><br><span style="color: hsl(120, 100%, 40%);">+ nse 102 remote-role sgsn</span><br><span style="color: hsl(120, 100%, 40%);">+ nse 102 encapsulation udp</span><br><span style="color: hsl(120, 100%, 40%);">+ nse 102 remote-ip 192.168.100.239</span><br><span style="color: hsl(120, 100%, 40%);">+ nse 102 remote-port 7778</span><br><span>  timer tns-block 3</span><br><span>  timer tns-block-retries 3</span><br><span>  timer tns-reset 3</span><br><span>diff --git a/include/osmocom/sgsn/gb_proxy.h b/include/osmocom/sgsn/gb_proxy.h</span><br><span>index 200a539..58755a6 100644</span><br><span>--- a/include/osmocom/sgsn/gb_proxy.h</span><br><span>+++ b/include/osmocom/sgsn/gb_proxy.h</span><br><span>@@ -7,6 +7,7 @@</span><br><span> #include <osmocom/core/fsm.h></span><br><span> #include <osmocom/core/hashtable.h></span><br><span> #include <osmocom/gsm/gsm23003.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm23236.h></span><br><span> </span><br><span> #include <osmocom/gprs/gprs_ns2.h></span><br><span> #include <osmocom/vty/command.h></span><br><span>@@ -55,6 +56,9 @@</span><br><span>         struct {</span><br><span>             /* percentage of BVC flow control advertised to each SGSN in the pool */</span><br><span>             uint8_t bvc_fc_ratio;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* NRI bitlen and usable NULL-NRI ranges */</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t nri_bitlen;</span><br><span style="color: hsl(120, 100%, 40%);">+           struct osmo_nri_ranges *null_nri_ranges;</span><br><span>     } pool;</span><br><span> </span><br><span>  /* Linked list of all BSS side Gb peers */</span><br><span>@@ -128,6 +132,11 @@</span><br><span> </span><br><span>        /* Are we facing towards a SGSN (true) or BSS (false) */</span><br><span>     bool sgsn_facing;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Pool configuration for the sgsn (only valid if sgsn_facing == true) */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              bool allow_attach;</span><br><span style="color: hsl(120, 100%, 40%);">+            struct osmo_nri_ranges *nri_ranges;</span><br><span style="color: hsl(120, 100%, 40%);">+   } pool;</span><br><span> </span><br><span>  /* List of all BVCs in this NSE */</span><br><span>   DECLARE_HASHTABLE(bvcs, 10);</span><br><span>diff --git a/src/gbproxy/gb_proxy.c b/src/gbproxy/gb_proxy.c</span><br><span>index 53aecdf..337a4fd 100644</span><br><span>--- a/src/gbproxy/gb_proxy.c</span><br><span>+++ b/src/gbproxy/gb_proxy.c</span><br><span>@@ -44,6 +44,7 @@</span><br><span> #include <osmocom/gprs/gprs_bssgp_bss.h></span><br><span> #include <osmocom/gprs/bssgp_bvc_fsm.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm23236.h></span><br><span> #include <osmocom/gsm/gsm_utils.h></span><br><span> </span><br><span> #include <osmocom/sgsn/signal.h></span><br><span>@@ -1286,6 +1287,8 @@</span><br><span> </span><br><span>  /* by default we advertise 100% of the BSS-side capacity to _each_ SGSN */</span><br><span>   cfg->pool.bvc_fc_ratio = 100;</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg->pool.null_nri_ranges = osmo_nri_ranges_alloc(cfg);</span><br><span style="color: hsl(120, 100%, 40%);">+    cfg->pool.nri_bitlen = OSMO_NRI_BITLEN_DEFAULT;</span><br><span>   hash_init(cfg->bss_nses);</span><br><span>         cfg->ctrg = rate_ctr_group_alloc(tall_sgsn_ctx, &global_ctrg_desc, 0);</span><br><span>        if (!cfg->ctrg) {</span><br><span>diff --git a/src/gbproxy/gb_proxy_main.c b/src/gbproxy/gb_proxy_main.c</span><br><span>index e85e951..c660ede 100644</span><br><span>--- a/src/gbproxy/gb_proxy_main.c</span><br><span>+++ b/src/gbproxy/gb_proxy_main.c</span><br><span>@@ -303,6 +303,8 @@</span><br><span> </span><br><span>      gprs_ns2_vty_create();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* TODO: Warn if we create a gbproxy_nse for an NSEI which we don't have a bind */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* start telnet after reading config for vty_get_bind_addr() */</span><br><span>      rc = telnet_init_dynif(tall_sgsn_ctx, NULL,</span><br><span>                         vty_get_bind_addr(), OSMO_VTY_PORT_GBPROXY);</span><br><span>diff --git a/src/gbproxy/gb_proxy_peer.c b/src/gbproxy/gb_proxy_peer.c</span><br><span>index c38b2f7..fd9548a 100644</span><br><span>--- a/src/gbproxy/gb_proxy_peer.c</span><br><span>+++ b/src/gbproxy/gb_proxy_peer.c</span><br><span>@@ -261,10 +261,13 @@</span><br><span>         nse->cfg = cfg;</span><br><span>   nse->sgsn_facing = sgsn_facing;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (sgsn_facing)</span><br><span style="color: hsl(120, 100%, 40%);">+      if (sgsn_facing) {</span><br><span style="color: hsl(120, 100%, 40%);">+            nse->pool.allow_attach = true;</span><br><span style="color: hsl(120, 100%, 40%);">+             nse->pool.nri_ranges = osmo_nri_ranges_alloc(nse);</span><br><span>                hash_add(cfg->sgsn_nses, &nse->list, nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-   else</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span>             hash_add(cfg->bss_nses, &nse->list, nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>        hash_init(nse->bvcs);</span><br><span> </span><br><span>diff --git a/src/gbproxy/gb_proxy_vty.c b/src/gbproxy/gb_proxy_vty.c</span><br><span>index 976ac12..bae2f95 100644</span><br><span>--- a/src/gbproxy/gb_proxy_vty.c</span><br><span>+++ b/src/gbproxy/gb_proxy_vty.c</span><br><span>@@ -25,14 +25,17 @@</span><br><span> #include <time.h></span><br><span> #include <inttypes.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/hashtable.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/timer.h></span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm48.h></span><br><span> </span><br><span> #include <osmocom/gprs/gprs_ns2.h></span><br><span> #include <osmocom/gprs/bssgp_bvc_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <osmocom/gsm/apn.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm23236.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm48.h></span><br><span> </span><br><span> #include <osmocom/sgsn/debug.h></span><br><span> #include <osmocom/sgsn/gb_proxy.h></span><br><span>@@ -44,6 +47,17 @@</span><br><span> #include <osmocom/vty/vty.h></span><br><span> #include <osmocom/vty/misc.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define NRI_STR "Mapping of Network Resource Indicators to this MSC, for MSC pooling\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define NULL_NRI_STR "Define NULL-NRI values that cause re-assignment of an MS to a different MSC, for MSC pooling.\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define NRI_FIRST_LAST_STR "First value of the NRI value range, should not surpass the configured 'nri bitlen'.\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+       "Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the" \</span><br><span style="color: hsl(120, 100%, 40%);">+        " first value; if omitted, apply only the first value.\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define NRI_ARGS_TO_STR_FMT "%s%s%s"</span><br><span style="color: hsl(120, 100%, 40%);">+#define NRI_ARGS_TO_STR_ARGS(ARGC, ARGV) ARGV[0], (ARGC>1)? ".." : "", (ARGC>1)? ARGV[1] : ""</span><br><span style="color: hsl(120, 100%, 40%);">+#define NRI_WARN(NSE, FORMAT, args...) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "%% Warning: NSE %05d: " FORMAT "%s", (NSE)->nsei, ##args, VTY_NEWLINE); \</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DLBSSGP, LOGL_ERROR, "NSE %05d: " FORMAT "\n", (NSE)->nsei, ##args); \</span><br><span style="color: hsl(120, 100%, 40%);">+    } while (0)</span><br><span> </span><br><span> static struct gbproxy_config *g_cfg = NULL;</span><br><span> </span><br><span>@@ -85,18 +99,23 @@</span><br><span> </span><br><span> static int config_write_gbproxy(struct vty *vty)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_nri_range *r;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: Proper write */</span><br><span>    vty_out(vty, "gbproxy%s", VTY_NEWLINE);</span><br><span> </span><br><span>        if (g_cfg->pool.bvc_fc_ratio != 100)</span><br><span>              vty_out(vty, " pool bvc-flow-control-ratio %u%s", g_cfg->pool.bvc_fc_ratio, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      hash_for_each(g_cfg->sgsn_nses, i, nse, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-              vty_out(vty, " sgsn nsei %u%s", nse->nsei, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (g_cfg->pool.nri_bitlen != OSMO_NRI_BITLEN_DEFAULT)</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, " nri bitlen %u%s", g_cfg->pool.nri_bitlen, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       llist_for_each_entry(r, &g_cfg->pool.null_nri_ranges->entries, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, " nri null add %d", r->first);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (r->first != r->last)</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_out(vty, " %d", r->last);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -109,13 +128,60 @@</span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* VTY code for SGSN (pool) configuration */</span><br><span> extern const struct bssgp_bvc_fsm_ops sgsn_sig_bvc_fsm_ops;</span><br><span> #include <osmocom/gprs/protocol/gsm_08_18.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_nsip_sgsn_nsei,</span><br><span style="color: hsl(0, 100%, 40%);">-      cfg_nsip_sgsn_nsei_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+static struct cmd_node sgsn_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+       SGSN_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+    "%s(config-sgsn)# ",</span><br><span style="color: hsl(120, 100%, 40%);">+        1,</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%);">+static void sgsn_write_nri(struct vty *vty, struct gbproxy_nse *nse, bool verbose)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_nri_range *r;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (verbose) {</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "sgsn %d%s", nse->nsei, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (llist_empty(&nse->pool.nri_ranges->entries)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, " %% no NRI mappings%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return;</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%);">+   llist_for_each_entry(r, &nse->pool.nri_ranges->entries, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (osmo_nri_range_validate(r, 255))</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, " %% INVALID RANGE:");</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, " nri add %d", r->first);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (r->first != r->last)</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_out(vty, " %d", r->last);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "%s", VTY_NEWLINE);</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%);">+static void write_sgsn(struct vty *vty, struct gbproxy_nse *nse)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_out(vty, "sgsn nsei %u%s", nse->nsei, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, " %sallow-attach%s", nse->pool.allow_attach ? "" : "no ", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ sgsn_write_nri(vty, nse, false);</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%);">+static int config_write_sgsn(struct vty *vty)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gbproxy_nse *nse;</span><br><span style="color: hsl(120, 100%, 40%);">+      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      hash_for_each(g_cfg->sgsn_nses, i, nse, list)</span><br><span style="color: hsl(120, 100%, 40%);">+              write_sgsn(vty, nse);</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_sgsn_nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_sgsn_nsei_cmd,</span><br><span>       "sgsn nsei <0-65534>",</span><br><span style="color: hsl(0, 100%, 40%);">-      "SGSN information\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Configure the SGSN\n"</span><br><span>       "NSEI to be used in the connection with the SGSN\n"</span><br><span>       "The NSEI\n")</span><br><span> {</span><br><span>@@ -140,6 +206,8 @@</span><br><span>              osmo_fsm_inst_dispatch(bvc->fi, BSSGP_BVCFSM_E_REQ_RESET, &cause);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ vty->node = SGSN_NODE;</span><br><span style="color: hsl(120, 100%, 40%);">+     vty->index = nse;</span><br><span>         return CMD_SUCCESS;</span><br><span> </span><br><span> free_bvc:</span><br><span>@@ -151,6 +219,121 @@</span><br><span>         return CMD_WARNING;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR(cfg_sgsn_nri_add, cfg_sgsn_nri_add_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         "nri add <0-32767> [<0-32767>]",</span><br><span style="color: hsl(120, 100%, 40%);">+        NRI_STR "Add NRI value or range to the NRI mapping for this MSC\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          NRI_FIRST_LAST_STR,</span><br><span style="color: hsl(120, 100%, 40%);">+           CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_nse *nse = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gbproxy_nse *other_nse;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool before;</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc, i;</span><br><span style="color: hsl(120, 100%, 40%);">+    const char *message;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_nri_range add_range;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = osmo_nri_ranges_vty_add(&message, &add_range, nse->pool.nri_ranges, argc, argv, g_cfg->pool.nri_bitlen);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (message) {</span><br><span style="color: hsl(120, 100%, 40%);">+                NRI_WARN(nse, "%s: " NRI_ARGS_TO_STR_FMT, message, NRI_ARGS_TO_STR_ARGS(argc, argv));</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0)</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%);">+ /* Issue a warning about NRI range overlaps (but still allow them).</span><br><span style="color: hsl(120, 100%, 40%);">+    * Overlapping ranges will map to whichever MSC comes fist in the bsc_gsmnet->mscs llist,</span><br><span style="color: hsl(120, 100%, 40%);">+   * which is not necessarily in the order of increasing msc->nr. */</span><br><span style="color: hsl(120, 100%, 40%);">+ before = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      hash_for_each(g_cfg->sgsn_nses, i, other_nse, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (other_nse == nse) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       before = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                       continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (osmo_nri_range_overlaps_ranges(&add_range, other_nse->pool.nri_ranges)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  NRI_WARN(nse, "NRI range [%d..%d] overlaps between NSE %05d and NSE %05d."</span><br><span style="color: hsl(120, 100%, 40%);">+                           " For overlaps, NSE %05d has higher priority than NSE %05d",</span><br><span style="color: hsl(120, 100%, 40%);">+                                add_range.first, add_range.last, nse->nsei, other_nse->nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+                            before ? other_nse->nsei : nse->nsei, before ? nse->nsei : other_nse->nsei);</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_ATTR(cfg_sgsn_nri_del, cfg_sgsn_nri_del_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+     "nri del <0-32767> [<0-32767>]",</span><br><span style="color: hsl(120, 100%, 40%);">+        NRI_STR "Remove NRI value or range from the NRI mapping for this MSC\n"</span><br><span style="color: hsl(120, 100%, 40%);">+     NRI_FIRST_LAST_STR,</span><br><span style="color: hsl(120, 100%, 40%);">+           CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_nse *nse = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *message;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = osmo_nri_ranges_vty_del(&message, NULL, nse->pool.nri_ranges, argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (message) {</span><br><span style="color: hsl(120, 100%, 40%);">+                NRI_WARN(nse, "%s: " NRI_ARGS_TO_STR_FMT, message, NRI_ARGS_TO_STR_ARGS(argc, argv));</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return CMD_WARNING;</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_ATTR(cfg_sgsn_allow_attach, cfg_sgsn_allow_attach_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+           "allow-attach",</span><br><span style="color: hsl(120, 100%, 40%);">+     "Allow this SGSN to attach new subscribers (default).\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_nse *nse = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      nse->pool.allow_attach = true;</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_ATTR(cfg_sgsn_no_allow_attach, cfg_sgsn_no_allow_attach_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+     "no allow-attach",</span><br><span style="color: hsl(120, 100%, 40%);">+          NO_STR</span><br><span style="color: hsl(120, 100%, 40%);">+        "Do not assign new subscribers to this MSC."</span><br><span style="color: hsl(120, 100%, 40%);">+        " Useful if an MSC in an MSC pool is configured to off-load subscribers."</span><br><span style="color: hsl(120, 100%, 40%);">+           " The MSC will still be operational for already IMSI-Attached subscribers,"</span><br><span style="color: hsl(120, 100%, 40%);">+         " but the NAS node selection function will skip this MSC for new subscribers\n",</span><br><span style="color: hsl(120, 100%, 40%);">+    CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_nse *nse = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      nse->pool.allow_attach = false;</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_sgsn_show_nri_all, show_nri_all_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "show nri all",</span><br><span style="color: hsl(120, 100%, 40%);">+      SHOW_STR NRI_STR "Show all SGSNs\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_nse *nse;</span><br><span style="color: hsl(120, 100%, 40%);">+      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      hash_for_each(g_cfg->sgsn_nses, i, nse, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+            sgsn_write_nri(vty, nse, true);</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(show_nri, show_nri_nsei_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "show nri nsei <0-65535>",</span><br><span style="color: hsl(120, 100%, 40%);">+      SHOW_STR NRI_STR "Identify SGSN by NSEI\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "NSEI of the SGSN\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gbproxy_nse *nse;</span><br><span style="color: hsl(120, 100%, 40%);">+      int nsei = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   nse = gbproxy_nse_by_nsei(g_cfg, nsei, NSE_F_SGSN);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!nse) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% No SGSN with found for NSEI %05d%s", nsei, VTY_NEWLINE);</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%);">+     sgsn_write_nri(vty, nse, true);</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> DEFUN(cfg_pool_bvc_fc_ratio,</span><br><span>       cfg_pool_bvc_fc_ratio_cmd,</span><br><span>       "pool bvc-flow-control-ratio <1-100>",</span><br><span>@@ -161,6 +344,56 @@</span><br><span>  g_cfg->pool.bvc_fc_ratio = atoi(argv[0]);</span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR(cfg_gbproxy_nri_bitlen,</span><br><span style="color: hsl(120, 100%, 40%);">+     cfg_gbproxy_nri_bitlen_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+           "nri bitlen <1-15>",</span><br><span style="color: hsl(120, 100%, 40%);">+          NRI_STR</span><br><span style="color: hsl(120, 100%, 40%);">+       "Set number of bits that an NRI has, to extract from TMSI identities (always starting just after the TMSI's most significant octet).\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "bit count (default: " OSMO_STRINGIFY_VAL(NRI_BITLEN_DEFAULT) ")\n",</span><br><span style="color: hsl(120, 100%, 40%);">+      CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     g_cfg->pool.nri_bitlen = atoi(argv[0]);</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_ATTR(cfg_gbproxy_nri_null_add,</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_gbproxy_nri_null_add_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         "nri null add <0-32767> [<0-32767>]",</span><br><span style="color: hsl(120, 100%, 40%);">+           NRI_STR NULL_NRI_STR "Add NULL-NRI value (or range)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      NRI_FIRST_LAST_STR,</span><br><span style="color: hsl(120, 100%, 40%);">+           CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *message;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = osmo_nri_ranges_vty_add(&message, NULL, g_cfg->pool.null_nri_ranges, argc, argv,</span><br><span style="color: hsl(120, 100%, 40%);">+                               g_cfg->pool.nri_bitlen);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (message) {</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "%% %s: " NRI_ARGS_TO_STR_FMT "%s", message, NRI_ARGS_TO_STR_ARGS(argc, argv),</span><br><span style="color: hsl(120, 100%, 40%);">+                       VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return CMD_WARNING;</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_ATTR(cfg_gbproxy_nri_null_del,</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_gbproxy_nri_null_del_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         "nri null del <0-32767> [<0-32767>]",</span><br><span style="color: hsl(120, 100%, 40%);">+           NRI_STR NULL_NRI_STR "Remove NRI value or range from the NRI mapping for this MSC\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        NRI_FIRST_LAST_STR,</span><br><span style="color: hsl(120, 100%, 40%);">+           CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *message;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = osmo_nri_ranges_vty_del(&message, NULL, g_cfg->pool.null_nri_ranges, argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (message) {</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "%% %s: " NRI_ARGS_TO_STR_FMT "%s", message, NRI_ARGS_TO_STR_ARGS(argc, argv),</span><br><span style="color: hsl(120, 100%, 40%);">+                       VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> static void log_set_bvc_filter(struct log_target *target,</span><br><span>                              const uint16_t *bvci)</span><br><span>@@ -336,15 +569,26 @@</span><br><span> {</span><br><span>   install_element_ve(&show_gbproxy_cmd);</span><br><span>   install_element_ve(&show_gbproxy_links_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element_ve(&show_nri_all_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element_ve(&show_nri_nsei_cmd);</span><br><span>  install_element_ve(&logging_fltr_bvc_cmd);</span><br><span> </span><br><span>   install_element(ENABLE_NODE, &delete_gb_bvci_cmd);</span><br><span>       install_element(ENABLE_NODE, &delete_gb_nsei_cmd);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(CONFIG_NODE, &cfg_sgsn_nsei_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_node(&sgsn_node, config_write_sgsn);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(SGSN_NODE, &cfg_sgsn_allow_attach_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(SGSN_NODE, &cfg_sgsn_no_allow_attach_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(SGSN_NODE, &cfg_sgsn_nri_add_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(SGSN_NODE, &cfg_sgsn_nri_del_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     install_element(CONFIG_NODE, &cfg_gbproxy_cmd);</span><br><span>  install_node(&gbproxy_node, config_write_gbproxy);</span><br><span style="color: hsl(0, 100%, 40%);">-  install_element(GBPROXY_NODE, &cfg_nsip_sgsn_nsei_cmd);</span><br><span>  install_element(GBPROXY_NODE, &cfg_pool_bvc_fc_ratio_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(GBPROXY_NODE, &cfg_gbproxy_nri_bitlen_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(GBPROXY_NODE, &cfg_gbproxy_nri_null_add_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(GBPROXY_NODE, &cfg_gbproxy_nri_null_del_cmd);</span><br><span> </span><br><span>        return 0;</span><br><span> }</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 4a9449a..a1b4c4d 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -61,9 +61,13 @@</span><br><span> #   make vty-transcript-test U=-u</span><br><span> vty-transcript-test:</span><br><span>    osmo_verify_transcript_vty.py -v \</span><br><span style="color: hsl(120, 100%, 40%);">+            -n OsmoGbProxy -p 4246 \</span><br><span style="color: hsl(120, 100%, 40%);">+              -r "$(top_builddir)/src/gbproxy/osmo-gbproxy -c $(top_srcdir)/doc/examples/osmo-gbproxy/osmo-gbproxy.cfg" \</span><br><span style="color: hsl(120, 100%, 40%);">+         $(U) $${T:-$(srcdir)/osmo-gbproxy*.vty}</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_verify_transcript_vty.py -v \</span><br><span>           -n OsmoSGSN -p 4245 \</span><br><span>                -r "$(top_builddir)/src/sgsn/osmo-sgsn -c $(top_srcdir)/doc/examples/osmo-sgsn/osmo-sgsn.cfg" \</span><br><span style="color: hsl(0, 100%, 40%);">-               $(U) $${T:-$(srcdir)/*.vty}</span><br><span style="color: hsl(120, 100%, 40%);">+           $(U) $${T:-$(srcdir)/osmo-sgsn*.vty}</span><br><span>         rm -f $(builddir)/sms.db $(builddir)/gsn_restart</span><br><span> </span><br><span> # don't run multiple tests concurrently so that the ports don't conflict</span><br><span>diff --git a/tests/osmo-gbproxy_test-nodes.vty b/tests/osmo-gbproxy_test-nodes.vty</span><br><span>new file mode 100644</span><br><span>index 0000000..7267c1d</span><br><span>--- /dev/null</span><br><span>+++ b/tests/osmo-gbproxy_test-nodes.vty</span><br><span>@@ -0,0 +1,95 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy> enable</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy# show nri all</span><br><span style="color: hsl(120, 100%, 40%);">+sgsn 101</span><br><span style="color: hsl(120, 100%, 40%);">+ nri add 1</span><br><span style="color: hsl(120, 100%, 40%);">+ nri add 11</span><br><span style="color: hsl(120, 100%, 40%);">+sgsn 102</span><br><span style="color: hsl(120, 100%, 40%);">+ nri add 2</span><br><span style="color: hsl(120, 100%, 40%);">+ nri add 12</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy# configure terminal</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy(config)# list</span><br><span style="color: hsl(120, 100%, 40%);">+  help</span><br><span style="color: hsl(120, 100%, 40%);">+  list [with-flags]</span><br><span style="color: hsl(120, 100%, 40%);">+  show vty-attributes</span><br><span style="color: hsl(120, 100%, 40%);">+  show vty-attributes (application|library|global)</span><br><span style="color: hsl(120, 100%, 40%);">+  write terminal</span><br><span style="color: hsl(120, 100%, 40%);">+  write file [PATH]</span><br><span style="color: hsl(120, 100%, 40%);">+  write memory</span><br><span style="color: hsl(120, 100%, 40%);">+  write</span><br><span style="color: hsl(120, 100%, 40%);">+  show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+  exit</span><br><span style="color: hsl(120, 100%, 40%);">+  end</span><br><span style="color: hsl(120, 100%, 40%);">+  hostname WORD</span><br><span style="color: hsl(120, 100%, 40%);">+  no hostname [HOSTNAME]</span><br><span style="color: hsl(120, 100%, 40%);">+  password (8|) WORD</span><br><span style="color: hsl(120, 100%, 40%);">+  password LINE</span><br><span style="color: hsl(120, 100%, 40%);">+  enable password (8|) WORD</span><br><span style="color: hsl(120, 100%, 40%);">+  enable password LINE</span><br><span style="color: hsl(120, 100%, 40%);">+  no enable password</span><br><span style="color: hsl(120, 100%, 40%);">+  banner motd default</span><br><span style="color: hsl(120, 100%, 40%);">+  banner motd file [FILE]</span><br><span style="color: hsl(120, 100%, 40%);">+  no banner motd</span><br><span style="color: hsl(120, 100%, 40%);">+  service terminal-length <0-512></span><br><span style="color: hsl(120, 100%, 40%);">+  no service terminal-length [<0-512>]</span><br><span style="color: hsl(120, 100%, 40%);">+  line vty</span><br><span style="color: hsl(120, 100%, 40%);">+  service advanced-vty</span><br><span style="color: hsl(120, 100%, 40%);">+  no service advanced-vty</span><br><span style="color: hsl(120, 100%, 40%);">+  show history</span><br><span style="color: hsl(120, 100%, 40%);">+  log stderr</span><br><span style="color: hsl(120, 100%, 40%);">+  no log stderr</span><br><span style="color: hsl(120, 100%, 40%);">+  log file .FILENAME</span><br><span style="color: hsl(120, 100%, 40%);">+  no log file .FILENAME</span><br><span style="color: hsl(120, 100%, 40%);">+  log alarms <2-32700></span><br><span style="color: hsl(120, 100%, 40%);">+  no log alarms</span><br><span style="color: hsl(120, 100%, 40%);">+  log syslog (authpriv|cron|daemon|ftp|lpr|mail|news|user|uucp)</span><br><span style="color: hsl(120, 100%, 40%);">+  log syslog local <0-7></span><br><span style="color: hsl(120, 100%, 40%);">+  no log syslog</span><br><span style="color: hsl(120, 100%, 40%);">+  log systemd-journal [raw]</span><br><span style="color: hsl(120, 100%, 40%);">+  no log systemd-journal</span><br><span style="color: hsl(120, 100%, 40%);">+  log gsmtap [HOSTNAME]</span><br><span style="color: hsl(120, 100%, 40%);">+  stats reporter statsd</span><br><span style="color: hsl(120, 100%, 40%);">+  no stats reporter statsd</span><br><span style="color: hsl(120, 100%, 40%);">+  stats reporter log</span><br><span style="color: hsl(120, 100%, 40%);">+  no stats reporter log</span><br><span style="color: hsl(120, 100%, 40%);">+  stats interval <0-65535></span><br><span style="color: hsl(120, 100%, 40%);">+  sgsn nsei <0-65534></span><br><span style="color: hsl(120, 100%, 40%);">+  gbproxy</span><br><span style="color: hsl(120, 100%, 40%);">+  ns</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy(config)# sgsn nsei 101</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy(config-sgsn)# list</span><br><span style="color: hsl(120, 100%, 40%);">+  help</span><br><span style="color: hsl(120, 100%, 40%);">+  list [with-flags]</span><br><span style="color: hsl(120, 100%, 40%);">+  show vty-attributes</span><br><span style="color: hsl(120, 100%, 40%);">+  show vty-attributes (application|library|global)</span><br><span style="color: hsl(120, 100%, 40%);">+  write terminal</span><br><span style="color: hsl(120, 100%, 40%);">+  write file [PATH]</span><br><span style="color: hsl(120, 100%, 40%);">+  write memory</span><br><span style="color: hsl(120, 100%, 40%);">+  write</span><br><span style="color: hsl(120, 100%, 40%);">+  show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+  exit</span><br><span style="color: hsl(120, 100%, 40%);">+  end</span><br><span style="color: hsl(120, 100%, 40%);">+  allow-attach</span><br><span style="color: hsl(120, 100%, 40%);">+  no allow-attach</span><br><span style="color: hsl(120, 100%, 40%);">+  nri add <0-32767> [<0-32767>]</span><br><span style="color: hsl(120, 100%, 40%);">+  nri del <0-32767> [<0-32767>]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy(config-sgsn)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy(config)# gbproxy</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoGbProxy(config-gbproxy)# list</span><br><span style="color: hsl(120, 100%, 40%);">+  help</span><br><span style="color: hsl(120, 100%, 40%);">+  list [with-flags]</span><br><span style="color: hsl(120, 100%, 40%);">+  show vty-attributes</span><br><span style="color: hsl(120, 100%, 40%);">+  show vty-attributes (application|library|global)</span><br><span style="color: hsl(120, 100%, 40%);">+  write terminal</span><br><span style="color: hsl(120, 100%, 40%);">+  write file [PATH]</span><br><span style="color: hsl(120, 100%, 40%);">+  write memory</span><br><span style="color: hsl(120, 100%, 40%);">+  write</span><br><span style="color: hsl(120, 100%, 40%);">+  show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+  exit</span><br><span style="color: hsl(120, 100%, 40%);">+  end</span><br><span style="color: hsl(120, 100%, 40%);">+  pool bvc-flow-control-ratio <1-100></span><br><span style="color: hsl(120, 100%, 40%);">+  nri bitlen <1-15></span><br><span style="color: hsl(120, 100%, 40%);">+  nri null add <0-32767> [<0-32767>]</span><br><span style="color: hsl(120, 100%, 40%);">+  nri null del <0-32767> [<0-32767>]</span><br><span>diff --git a/tests/test_nodes.vty b/tests/osmo-sgsn_test_nodes.vty</span><br><span>similarity index 100%</span><br><span>rename from tests/test_nodes.vty</span><br><span>rename to tests/osmo-sgsn_test_nodes.vty</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21705">change 21705</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/+/21705"/><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: Id67592aa7712e5e04e7264b2fb8f26d57eb7e69e </div>
<div style="display:none"> Gerrit-Change-Number: 21705 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>