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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-ns-dummy: Add simple NS traffic generator<br><br>This adds a simple NS traffic generator that can be used to perform<br>load testing on NS links, particularly those with limited bandwidth<br>such as frame-relay E1 lines.<br><br>Related: OS#4995<br>Change-Id: Iad3b694c85962dbbc6b4a27a0ed5bc841add464f<br>---<br>M utils/Makefile.am<br>A utils/osmo-ns-dummy-vty.c<br>M utils/osmo-ns-dummy.c<br>3 files changed, 312 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/utils/Makefile.am b/utils/Makefile.am</span><br><span>index 4fac477..4e54a78 100644</span><br><span>--- a/utils/Makefile.am</span><br><span>+++ b/utils/Makefile.am</span><br><span>@@ -29,7 +29,7 @@</span><br><span> if ENABLE_EXT_TESTS</span><br><span> if ENABLE_GB</span><br><span> noinst_PROGRAMS += osmo-ns-dummy</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_ns_dummy_SOURCES = osmo-ns-dummy.c</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_ns_dummy_SOURCES = osmo-ns-dummy.c osmo-ns-dummy-vty.c</span><br><span> osmo_ns_dummy_LDADD = $(LDADD) $(TALLOC_LIBS) \</span><br><span>                       $(top_builddir)/src/gb/libosmogb.la \</span><br><span>                        $(top_builddir)/src/vty/libosmovty.la \</span><br><span>diff --git a/utils/osmo-ns-dummy-vty.c b/utils/osmo-ns-dummy-vty.c</span><br><span>new file mode 100644</span><br><span>index 0000000..1b7ce1c</span><br><span>--- /dev/null</span><br><span>+++ b/utils/osmo-ns-dummy-vty.c</span><br><span>@@ -0,0 +1,309 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* VTY for osmo-ns-dummy */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</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%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">+#include <talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.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 <inttypes.h></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%);">+#include <osmocom/core/select.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/stats.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/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/prim.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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/command.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/misc.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gprs_ns2_inst *g_nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct llist_head g_ns_traf_gens = LLIST_HEAD_INIT(g_ns_traf_gens);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* one NS traffic generator instance.  You can have as many of these as you want,</span><br><span style="color: hsl(120, 100%, 40%);">+ * just as long as they have unique names */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ns_traf_gen {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct llist_head list;</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint16_t nsei;</span><br><span style="color: hsl(120, 100%, 40%);">+                uint16_t bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* size of each packet */</span><br><span style="color: hsl(120, 100%, 40%);">+             uint16_t pkt_size;</span><br><span style="color: hsl(120, 100%, 40%);">+            /* interval between packets in us */</span><br><span style="color: hsl(120, 100%, 40%);">+          uint32_t interval_us;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* fixed (false) or random (true) LSP */</span><br><span style="color: hsl(120, 100%, 40%);">+              bool lsp_randomize;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* (fixeD) Link Selector Parameter */</span><br><span style="color: hsl(120, 100%, 40%);">+         uint32_t lsp;</span><br><span style="color: hsl(120, 100%, 40%);">+ } cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_fd timerfd;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool running;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGNTG(ntg, lvl, fmt, args ...) \</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGP(DLGLOBAL, lvl, "traf-gen(%s): " fmt, (ntg)->name, ## args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* allocate and transmit one NS message */</span><br><span style="color: hsl(120, 100%, 40%);">+static int ntg_tx_one(struct ns_traf_gen *ntg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_gprs_ns2_prim nsp = {};</span><br><span style="color: hsl(120, 100%, 40%);">+   struct msgb *msg = msgb_alloc_headroom(3072, 20, "NS traffic gen");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+       msgb_put(msg, ntg->cfg.pkt_size);</span><br><span style="color: hsl(120, 100%, 40%);">+  nsp.bvci = ntg->cfg.bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+  nsp.nsei = ntg->cfg.nsei;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ntg->cfg.lsp_randomize)</span><br><span style="color: hsl(120, 100%, 40%);">+                nsp.u.unitdata.link_selector = rand();</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          nsp.u.unitdata.link_selector = ntg->cfg.lsp;</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_prim_init(&nsp.oph, SAP_NS, GPRS_NS2_PRIM_UNIT_DATA, PRIM_OP_REQUEST, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  return gprs_ns2_recv_prim(g_nsi, &nsp.oph);</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%);">+/* call-back from transmit timer-fd */</span><br><span style="color: hsl(120, 100%, 40%);">+static int ntg_timerfd_cb(struct osmo_fd *ofd, unsigned int what)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    uint64_t expire_count;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ns_traf_gen *ntg = ofd->data;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(what & OSMO_FD_READ);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = read(ofd->fd, (void *) &expire_count, sizeof(expire_count));</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc < 0 && errno == EAGAIN)</span><br><span style="color: hsl(120, 100%, 40%);">+             return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(rc == sizeof(expire_count));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < expire_count; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+         ntg_tx_one(ntg);</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%);">+static struct ns_traf_gen *ns_traf_gen_find(const char *name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ns_traf_gen *ntg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(ntg, &g_ns_traf_gens, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!strcmp(ntg->name, name))</span><br><span style="color: hsl(120, 100%, 40%);">+                      return ntg;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     return NULL;</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 ns_traf_gen *ns_traf_gen_find_or_alloc(const char *name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct ns_traf_gen *ntg;</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ntg = ns_traf_gen_find(name);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ntg)</span><br><span style="color: hsl(120, 100%, 40%);">+              return ntg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ntg = talloc_zero(g_nsi, struct ns_traf_gen);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(ntg);</span><br><span style="color: hsl(120, 100%, 40%);">+     ntg->name = talloc_strdup(ntg, name);</span><br><span style="color: hsl(120, 100%, 40%);">+      ntg->timerfd.fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = osmo_timerfd_setup(&ntg->timerfd, ntg_timerfd_cb, ntg);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(rc >= 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_add_tail(&ntg->list, &g_ns_traf_gens);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return ntg;</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%);">+enum nodes {</span><br><span style="color: hsl(120, 100%, 40%);">+        NTG_NODE = _LAST_OSMOVTY_NODE + 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 cmd_node ntg_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+ NTG_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+     "%s(config-ns-traf-gen)# ",</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 int config_write_ntg(struct vty *vty)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct ns_traf_gen *ntg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(ntg, &g_ns_traf_gens, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "ns-traffic-generator %s%s", ntg->name, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, " nsei %u%s", ntg->cfg.nsei, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, " bvci %u%s", ntg->cfg.bvci, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, " packet-size %u%s", ntg->cfg.pkt_size, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, " interval-us %u%s", ntg->cfg.interval_us, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, " lsp %u%s", ntg->cfg.lsp, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, " lsp-mode %s%s", ntg->cfg.lsp_randomize ? "randomized" : "fixed", 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%);">+   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%);">+DEFUN(ntg_start, ntg_start_stop_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+  "ns-traffic-generator (start|stop) NAME",</span><br><span style="color: hsl(120, 100%, 40%);">+   "Control named NS traffic generator\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Start generating traffic in this traffic generator\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Stop generating traffic in this traffic generator\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Name of NS traffic generator to start\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ns_traf_gen *ntg = ns_traf_gen_find(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!ntg) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "NS Traffic generator '%s' doesn't exist%s", argv[1], VTY_NEWLINE);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!strcmp(argv[0], "start")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            struct timespec interval;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (ntg->running) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_out(vty, "NS Traffic generator was already started%s", VTY_NEWLINE);</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%);">+             interval.tv_sec = ntg->cfg.interval_us / 1000000;</span><br><span style="color: hsl(120, 100%, 40%);">+          interval.tv_nsec = (ntg->cfg.interval_us % 1000000) * 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_timerfd_schedule(&ntg->timerfd, NULL, &interval);</span><br><span style="color: hsl(120, 100%, 40%);">+             ntg->running = true;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!ntg->running) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_out(vty, "NS Traffic generator was already stopped%s", VTY_NEWLINE);</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%);">+             osmo_timerfd_disable(&ntg->timerfd);</span><br><span style="color: hsl(120, 100%, 40%);">+           ntg->running = 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%);">+   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(ntg_nsei, ntg_nsei_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "nsei <0-65535>",</span><br><span style="color: hsl(120, 100%, 40%);">+     "NSEI to use when generating traffic\n"</span><br><span style="color: hsl(120, 100%, 40%);">+     "NSEI to use when generating traffic\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ns_traf_gen *ntg = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      ntg->cfg.nsei = 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(ntg_bvci, ntg_bvci_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "bvci <0-65535>",</span><br><span style="color: hsl(120, 100%, 40%);">+     "BVCI to use when generating traffic\n"</span><br><span style="color: hsl(120, 100%, 40%);">+     "BVCI to use when generating traffic\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ns_traf_gen *ntg = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      ntg->cfg.bvci = 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(ntg_pkt_size, ntg_pkt_size_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "packet-size <0-2048>",</span><br><span style="color: hsl(120, 100%, 40%);">+       "Packet size for generated NS-UNITDATA payload\n"</span><br><span style="color: hsl(120, 100%, 40%);">+   "Packet size for generated NS-UNITDATA payload\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ns_traf_gen *ntg = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      ntg->cfg.pkt_size = 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(ntg_pkt_intv_us, ntg_pkt_intv_us_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "interval-us <0-1000000>",</span><br><span style="color: hsl(120, 100%, 40%);">+    "Interval between packets in microseconds\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Interval between packets in microseconds\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct ns_traf_gen *ntg = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      ntg->cfg.interval_us = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (ntg->running) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* TODO: update timer */</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(ntg_lsp, ntg_lsp_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "lsp <0-4294967295>",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Link Selector Parameter (only used in fixed mode)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Link Selector Parameter (only used in fixed mode)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct ns_traf_gen *ntg = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      ntg->cfg.lsp = strtoul(argv[0], NULL, 10);</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(ntg_lsp_mode, ntg_lsp_mode_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "lsp-mode (fixed|randomized)",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Link Selector Parameter Mode\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "Fixed / Staic LSP\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Randomized LSP\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ns_traf_gen *ntg = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!strcmp(argv[0], "randomized"))</span><br><span style="color: hsl(120, 100%, 40%);">+         ntg->cfg.lsp_randomize = true;</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          ntg->cfg.lsp_randomize = 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(gen_traffic, gen_traffic_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "ns-traffic-generator NAME",</span><br><span style="color: hsl(120, 100%, 40%);">+        "Configure a given NS traffic generator\n" "Name of NS traffic generator\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct ns_traf_gen *ntg = ns_traf_gen_find_or_alloc(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!ntg)</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%);">+ vty->index = ntg;</span><br><span style="color: hsl(120, 100%, 40%);">+  vty->node = NTG_NODE;</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%);">+int nsdummy_vty_init(struct gprs_ns2_inst *nsi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  g_nsi = nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* configuration of traffic generators via CONFIG / NTG node */</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(CONFIG_NODE, &gen_traffic_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_node(&ntg_node, config_write_ntg);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(NTG_NODE, &ntg_nsei_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(NTG_NODE, &ntg_bvci_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(NTG_NODE, &ntg_pkt_size_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(NTG_NODE, &ntg_pkt_intv_us_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(NTG_NODE, &ntg_lsp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(NTG_NODE, &ntg_lsp_mode_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* starting/stopping the traffic generators is in 'enable' mode, not 'config' */</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(ENABLE_NODE, &ntg_start_stop_cmd);</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>diff --git a/utils/osmo-ns-dummy.c b/utils/osmo-ns-dummy.c</span><br><span>index 5625f75..4b93788 100644</span><br><span>--- a/utils/osmo-ns-dummy.c</span><br><span>+++ b/utils/osmo-ns-dummy.c</span><br><span>@@ -199,6 +199,7 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern int nsdummy_vty_init(struct gprs_ns2_inst *nsi);</span><br><span> </span><br><span> int main (int argc, char *argv[])</span><br><span> {</span><br><span>@@ -230,6 +231,7 @@</span><br><span>      }</span><br><span> </span><br><span>        gprs_ns2_vty_init(nsi);</span><br><span style="color: hsl(120, 100%, 40%);">+       nsdummy_vty_init(nsi);</span><br><span>       rc = vty_read_config_file(config_file, NULL);</span><br><span>        if (rc < 0 && config_given) {</span><br><span>             fprintf(stderr, "Failed to parse the config file: '%s'\n",</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/22553">change 22553</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/+/22553"/><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: Iad3b694c85962dbbc6b4a27a0ed5bc841add464f </div>
<div style="display:none"> Gerrit-Change-Number: 22553 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </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-MessageType: merged </div>