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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2: set transfer cap in NS Status primitive<br><br>Related: SYS#5153 OS#4835<br>Change-Id: Ia1046db9e0d50855bff9de670b612ffc57af9995<br>---<br>M src/gb/Makefile.am<br>M src/gb/gprs_ns2.c<br>M src/gb/gprs_ns2_fr.c<br>M src/gb/gprs_ns2_frgre.c<br>M src/gb/gprs_ns2_internal.h<br>M src/gb/gprs_ns2_udp.c<br>M tests/Makefile.am<br>A tests/gb/gprs_ns2_test.c<br>A tests/gb/gprs_ns2_test.ok<br>M tests/testsuite.at<br>10 files changed, 276 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/Makefile.am b/src/gb/Makefile.am</span><br><span>index c829c29..cbee333 100644</span><br><span>--- a/src/gb/Makefile.am</span><br><span>+++ b/src/gb/Makefile.am</span><br><span>@@ -28,6 +28,12 @@</span><br><span>             gprs_ns2_message.c gprs_ns2_vty.c gprs_ns2_vty2.c \</span><br><span>                  gprs_bssgp2.c bssgp_bvc_fsm.c \</span><br><span>              common_vty.c frame_relay.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# convenience library for testing with access to all non-static symbols</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_LTLIBRARIES = libosmogb-test.la</span><br><span style="color: hsl(120, 100%, 40%);">+libosmogb_test_la_LIBADD = $(libosmogb_la_LIBADD)</span><br><span style="color: hsl(120, 100%, 40%);">+libosmogb_test_la_SOURCES= $(libosmogb_la_SOURCES)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> endif</span><br><span> </span><br><span> EXTRA_DIST = libosmogb.map</span><br><span>diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c</span><br><span>index 1098f22..e43b636 100644</span><br><span>--- a/src/gb/gprs_ns2.c</span><br><span>+++ b/src/gb/gprs_ns2.c</span><br><span>@@ -471,7 +471,7 @@</span><br><span>   nsp.nsei = nse->nsei;</span><br><span>     nsp.bvci = bvci;</span><br><span>     nsp.u.status.cause = cause;</span><br><span style="color: hsl(0, 100%, 40%);">-     nsp.u.status.transfer = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+   nsp.u.status.transfer = ns2_count_transfer_cap(nse, bvci);</span><br><span>   nsp.u.status.first = nse->first;</span><br><span>  nsp.u.status.persistent = nse->persistent;</span><br><span>        if (nsvc)</span><br><span>@@ -1263,4 +1263,68 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void add_bind_array(struct gprs_ns2_vc_bind **array,</span><br><span style="color: hsl(120, 100%, 40%);">+                          struct gprs_ns2_vc_bind *bind, int size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i=0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (array[i] == bind)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return;</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!array[i])</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (i == size)</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%);">+     array[i] = bind;</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%);">+/*! calculate the transfer capabilities for a nse</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param nse the nse to count the transfer capability</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param bvci a bvci - unused</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \return the transfer capability in mbit. On error < 0.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_count_transfer_cap(struct gprs_ns2_nse *nse,</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint16_t bvci)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gprs_ns2_vc *nsvc;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_ns2_vc_bind **active_binds;</span><br><span style="color: hsl(120, 100%, 40%);">+       int i, active_nsvcs = 0, transfer_cap = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* calculate the transfer capabilities based on the binds.</span><br><span style="color: hsl(120, 100%, 40%);">+     * A bind has a transfer capability which is shared across all NSVCs.</span><br><span style="color: hsl(120, 100%, 40%);">+  * Take care the bind cap is not counted twice within a NSE.</span><br><span style="color: hsl(120, 100%, 40%);">+   * This should be accurate for FR and UDP but not for FR/GRE. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!nse->alive)</span><br><span style="color: hsl(120, 100%, 40%);">+           return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_for_each_entry(nsvc, &nse->nsvc, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (gprs_ns2_vc_is_unblocked(nsvc))</span><br><span style="color: hsl(120, 100%, 40%);">+                   active_nsvcs++;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* an alive nse should always have active_nsvcs */</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(active_nsvcs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  active_binds = talloc_zero_array(nse, struct gprs_ns2_vc_bind*, active_nsvcs);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!active_binds)</span><br><span style="color: hsl(120, 100%, 40%);">+            return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     llist_for_each_entry(nsvc, &nse->nsvc, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!gprs_ns2_vc_is_unblocked(nsvc))</span><br><span style="color: hsl(120, 100%, 40%);">+                  continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             add_bind_array(active_binds, nsvc->bind, active_nsvcs);</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%);">+   /* TODO: change calcuation for FR/GRE */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0; i < active_nsvcs; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (active_binds[i])</span><br><span style="color: hsl(120, 100%, 40%);">+                  transfer_cap += active_binds[i]->transfer_capability;</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%);">+   talloc_free(active_binds);</span><br><span style="color: hsl(120, 100%, 40%);">+    return transfer_cap;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! @} */</span><br><span>diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c</span><br><span>index e972a34..ca2d38c 100644</span><br><span>--- a/src/gb/gprs_ns2_fr.c</span><br><span>+++ b/src/gb/gprs_ns2_fr.c</span><br><span>@@ -579,6 +579,8 @@</span><br><span> </span><br><span>        bind->driver = &vc_driver_fr;</span><br><span>         bind->ll = GPRS_NS2_LL_FR;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 2 mbit */</span><br><span style="color: hsl(120, 100%, 40%);">+  bind->transfer_capability = 2;</span><br><span>    bind->send_vc = fr_vc_sendmsg;</span><br><span>    bind->free_vc = free_vc;</span><br><span>  bind->dump_vty = dump_vty;</span><br><span>diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c</span><br><span>index 014517a..625d05c 100644</span><br><span>--- a/src/gb/gprs_ns2_frgre.c</span><br><span>+++ b/src/gb/gprs_ns2_frgre.c</span><br><span>@@ -569,6 +569,8 @@</span><br><span> </span><br><span>     bind->driver = &vc_driver_frgre;</span><br><span>      bind->ll = GPRS_NS2_LL_FR_GRE;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* 2 mbit transfer capability. Counting should be done different for this. */</span><br><span style="color: hsl(120, 100%, 40%);">+ bind->transfer_capability = 2;</span><br><span>    bind->send_vc = frgre_vc_sendmsg;</span><br><span>         bind->free_vc = free_vc;</span><br><span>  bind->nsi = nsi;</span><br><span>diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h</span><br><span>index 4c0cdd0..c33f7f8 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -198,6 +198,9 @@</span><br><span>       bool accept_ipaccess;</span><br><span>        bool accept_sns;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /*! transfer capability in mbit */</span><br><span style="color: hsl(120, 100%, 40%);">+    int transfer_capability;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /*! which link-layer are we based on? */</span><br><span>     enum gprs_ns2_ll ll;</span><br><span> </span><br><span>@@ -312,3 +315,5 @@</span><br><span> /* nse */</span><br><span> void ns2_nse_notify_unblocked(struct gprs_ns2_vc *nsvc, bool unblocked);</span><br><span> enum gprs_ns2_vc_mode gprs_ns2_dialect_to_vc_mode(enum gprs_ns2_dialect dialect);</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_count_transfer_cap(struct gprs_ns2_nse *nse,</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint16_t bvci);</span><br><span>diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c</span><br><span>index 9058279..370937f 100644</span><br><span>--- a/src/gb/gprs_ns2_udp.c</span><br><span>+++ b/src/gb/gprs_ns2_udp.c</span><br><span>@@ -336,6 +336,10 @@</span><br><span> </span><br><span>       bind->driver = &vc_driver_ip;</span><br><span>         bind->ll = GPRS_NS2_LL_UDP;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* expect 100 mbit at least.</span><br><span style="color: hsl(120, 100%, 40%);">+   * TODO: ask the network layer about the speed. But would require</span><br><span style="color: hsl(120, 100%, 40%);">+      * notification on change. */</span><br><span style="color: hsl(120, 100%, 40%);">+ bind->transfer_capability = 100;</span><br><span>  bind->send_vc = nsip_vc_sendmsg;</span><br><span>  bind->free_vc = free_vc;</span><br><span>  bind->dump_vty = dump_vty;</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index dbca9d7..f769603 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -74,7 +74,7 @@</span><br><span> endif</span><br><span> </span><br><span> if ENABLE_GB</span><br><span style="color: hsl(0, 100%, 40%);">-check_PROGRAMS += gb/bssgp_fc_test gb/gprs_bssgp_test gb/gprs_ns_test fr/fr_test</span><br><span style="color: hsl(120, 100%, 40%);">+check_PROGRAMS += gb/bssgp_fc_test gb/gprs_bssgp_test gb/gprs_ns_test gb/gprs_ns2_test fr/fr_test</span><br><span> endif</span><br><span> </span><br><span> utils_utils_test_SOURCES = utils/utils_test.c</span><br><span>@@ -180,6 +180,16 @@</span><br><span>                      $(top_builddir)/src/vty/libosmovty.la \</span><br><span>                      $(top_builddir)/src/gsm/libosmogsm.la</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+gb_gprs_ns2_test_SOURCES = gb/gprs_ns2_test.c</span><br><span style="color: hsl(120, 100%, 40%);">+gb_gprs_ns2_test_LDADD = $(LDADD) $(LIBRARY_DLSYM) \</span><br><span style="color: hsl(120, 100%, 40%);">+                        $(top_builddir)/src/vty/libosmovty.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                       $(top_builddir)/src/gsm/libosmogsm.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                       $(top_builddir)/src/libosmocore.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                  $(top_builddir)/src/gb/libosmogb-test.la</span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_LIBMNL</span><br><span style="color: hsl(120, 100%, 40%);">+gb_gprs_ns2_test_LDADD += $(LIBMNL_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> logging_logging_test_SOURCES = logging/logging_test.c</span><br><span> </span><br><span> logging_logging_vty_test_SOURCES = logging/logging_vty_test.c</span><br><span>@@ -321,6 +331,7 @@</span><br><span>              gb/bssgp_fc_tests.ok gb/bssgp_fc_tests.sh                     \</span><br><span>              gb/gprs_bssgp_test.ok gb/gprs_ns_test.ok gea/gea_test.ok      \</span><br><span>              gb/gprs_ns2_vty.vty gb/osmoappdesc.py gb/osmo-ns-dummy.cfg \</span><br><span style="color: hsl(120, 100%, 40%);">+             gb/gprs_ns2_test.ok                                        \</span><br><span>              gprs/gprs_test.ok kasumi/kasumi_test.ok                       \</span><br><span>              msgfile/msgfile_test.ok msgfile/msgconfig.cfg         \</span><br><span>              logging/logging_test.ok logging/logging_test.err              \</span><br><span>diff --git a/tests/gb/gprs_ns2_test.c b/tests/gb/gprs_ns2_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..86a0190</span><br><span>--- /dev/null</span><br><span>+++ b/tests/gb/gprs_ns2_test.c</span><br><span>@@ -0,0 +1,164 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* test routines for NS connection handling</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Alexander Couzens <lynxis@fe80.eu></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0+</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%);">+#undef _GNU_SOURCE</span><br><span style="color: hsl(120, 100%, 40%);">+#define _GNU_SOURCE</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <getopt.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <dlfcn.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/types.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/write_queue.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/gprs_msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/gprs_ns2.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/gprs_bssgp.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "../../src/gb/gprs_ns2_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  return -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 struct log_info info = {};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int ns_prim_cb(struct osmo_prim_hdr *oph, void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  return 0;</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%);">+void free_bind(struct gprs_ns2_vc_bind *bind)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bind);</span><br><span style="color: hsl(120, 100%, 40%);">+    talloc_free(bind);</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%);">+struct gprs_ns2_vc_driver vc_driver_dummy = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .name = "GB UDP dummy",</span><br><span style="color: hsl(120, 100%, 40%);">+     .free_bind = free_bind,</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 vc_sendmsg(struct gprs_ns2_vc *nsvc, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_ns2_vc_bind *bind = nsvc->bind;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_wqueue *queue = bind->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_wqueue_enqueue(queue, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</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 struct gprs_ns2_vc_bind *dummy_bind(struct gprs_ns2_inst *nsi, const char *name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_ns2_vc_bind *bind = talloc_zero(nsi, struct gprs_ns2_vc_bind);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bind);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  bind->name = talloc_strdup(bind, name);</span><br><span style="color: hsl(120, 100%, 40%);">+    bind->driver = &vc_driver_dummy;</span><br><span style="color: hsl(120, 100%, 40%);">+       bind->ll = GPRS_NS2_LL_UDP;</span><br><span style="color: hsl(120, 100%, 40%);">+        bind->transfer_capability = 42;</span><br><span style="color: hsl(120, 100%, 40%);">+    bind->nsi = nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+   bind->send_vc = vc_sendmsg;</span><br><span style="color: hsl(120, 100%, 40%);">+        bind->priv = talloc_zero(bind, struct osmo_wqueue);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_wqueue *queue = bind->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  INIT_LLIST_HEAD(&bind->nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_add(&bind->list, &nsi->binding);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_wqueue_init(queue, 100);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return bind;</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%);">+void test_nse_transfer_cap(void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_ns2_inst *nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_ns2_vc_bind *bind[2];</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_ns2_nse *nse;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_ns2_vc *nsvc[3];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* create a UDP dummy bind[0] with transfer cap 42.</span><br><span style="color: hsl(120, 100%, 40%);">+    * create nse (nsei 1001)</span><br><span style="color: hsl(120, 100%, 40%);">+      * create 2x nsvc with the same bind.</span><br><span style="color: hsl(120, 100%, 40%);">+  * nsvc[0] or nsvc[1] is alive (or both) cap == 42</span><br><span style="color: hsl(120, 100%, 40%);">+     *</span><br><span style="color: hsl(120, 100%, 40%);">+     * create a second bind with transfer cap == 23</span><br><span style="color: hsl(120, 100%, 40%);">+        * create 3rd nsvc with bind[1]</span><br><span style="color: hsl(120, 100%, 40%);">+        * transfer cap should be 42 + 23</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%);">+ printf("--- Testing NSE transfer cap\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("---- Create NSE + Binds\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        nsi = gprs_ns2_instantiate(ctx, ns_prim_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+    bind[0] = dummy_bind(nsi, "transfercap1");</span><br><span style="color: hsl(120, 100%, 40%);">+  bind[1] = dummy_bind(nsi, "transfercap2");</span><br><span style="color: hsl(120, 100%, 40%);">+  bind[1]->transfer_capability = 23;</span><br><span style="color: hsl(120, 100%, 40%);">+ nse = gprs_ns2_create_nse(nsi, 1001, GPRS_NS2_LL_UDP, NS2_DIALECT_STATIC_ALIVE);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(nse);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("---- Test with NSVC[0]\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc[0] = ns2_vc_alloc(bind[0], nse, false, NS2_VC_MODE_ALIVE);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(nsvc[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(ns2_count_transfer_cap(nse, 0) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     nsvc[0]->fi->state = 3;   /* HACK: 3 = GPRS_NS2_ST_UNBLOCKED */</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_nse_notify_unblocked(nsvc[0], true);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(ns2_count_transfer_cap(nse, 0) == 42);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("---- Test with NSVC[1]\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc[1] = ns2_vc_alloc(bind[0], nse, false, NS2_VC_MODE_ALIVE);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(nsvc[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(ns2_count_transfer_cap(nse, 0) == 42);</span><br><span style="color: hsl(120, 100%, 40%);">+    nsvc[1]->fi->state = 3; /* HACK: 3 = GPRS_NS2_ST_UNBLOCKED */</span><br><span style="color: hsl(120, 100%, 40%);">+   ns2_nse_notify_unblocked(nsvc[1], true);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(ns2_count_transfer_cap(nse, 0) == 42);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("---- Test with NSVC[2]\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc[2] = ns2_vc_alloc(bind[1], nse, false, NS2_VC_MODE_ALIVE);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(nsvc[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(ns2_count_transfer_cap(nse, 0) == 42);</span><br><span style="color: hsl(120, 100%, 40%);">+    nsvc[2]->fi->state = 3; /* HACK: 3 = GPRS_NS2_ST_UNBLOCKED */</span><br><span style="color: hsl(120, 100%, 40%);">+   ns2_nse_notify_unblocked(nsvc[2], true);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(ns2_count_transfer_cap(nse, 0) == 42 + 23);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("---- Test with NSVC[1] removed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ /* reset nsvc[1] to be unconfigured - shouldn't change anything */</span><br><span style="color: hsl(120, 100%, 40%);">+        nsvc[1]->fi->state = 0; /* HACK: 0 = GPRS_NS2_ST_UNCONFIGURED */</span><br><span style="color: hsl(120, 100%, 40%);">+        ns2_nse_notify_unblocked(nsvc[1], false);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(ns2_count_transfer_cap(nse, 0) == 42 + 23);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("--- Finish NSE transfer cap\n");</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%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ void *ctx = talloc_named_const(NULL, 0, "gprs_ns2_test");</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_init_logging2(ctx, &info);</span><br><span style="color: hsl(120, 100%, 40%);">+   log_set_use_color(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     log_set_print_filename(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_print_filename(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_log_level(osmo_stderr_target, LOGL_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+     setlinebuf(stdout);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("===== NS2 protocol test START\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  test_nse_transfer_cap(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("===== NS2 protocol test END\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        exit(EXIT_SUCCESS);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/gb/gprs_ns2_test.ok b/tests/gb/gprs_ns2_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..62bbbfe</span><br><span>--- /dev/null</span><br><span>+++ b/tests/gb/gprs_ns2_test.ok</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+===== NS2 protocol test START</span><br><span style="color: hsl(120, 100%, 40%);">+--- Testing NSE transfer cap</span><br><span style="color: hsl(120, 100%, 40%);">+---- Create NSE + Binds</span><br><span style="color: hsl(120, 100%, 40%);">+---- Test with NSVC[0]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Test with NSVC[1]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Test with NSVC[2]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Test with NSVC[1] removed</span><br><span style="color: hsl(120, 100%, 40%);">+--- Finish NSE transfer cap</span><br><span style="color: hsl(120, 100%, 40%);">+===== NS2 protocol test END</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index 43f515a..ad93e16 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -221,6 +221,12 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/gb/gprs_ns_test], [0], [expout], [ignore])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([gprs-ns2])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([gprs-ns2])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/gb/gprs_ns2_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/gb/gprs_ns2_test], [0], [expout], [ignore])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AT_SETUP([utils])</span><br><span> AT_KEYWORDS([utils])</span><br><span> cat $abs_srcdir/utils/utils_test.ok > expout</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/21753">change 21753</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/libosmocore/+/21753"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia1046db9e0d50855bff9de670b612ffc57af9995 </div>
<div style="display:none"> Gerrit-Change-Number: 21753 </div>
<div style="display:none"> Gerrit-PatchSet: 9 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>