<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/22422">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  daniel: 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;">tests: gprs_ns2: add unitdata unit test<br><br>test sending unitdata over a alive and blocked NSVC.<br><br>Change-Id: I2c44b711d004d2ca08e05d4f54519ad8dbd77c27<br>---<br>M tests/gb/gprs_ns2_test.c<br>M tests/gb/gprs_ns2_test.ok<br>2 files changed, 148 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/gb/gprs_ns2_test.c b/tests/gb/gprs_ns2_test.c</span><br><span>index 44c9ce4..10f430d 100644</span><br><span>--- a/tests/gb/gprs_ns2_test.c</span><br><span>+++ b/tests/gb/gprs_ns2_test.c</span><br><span>@@ -39,9 +39,18 @@</span><br><span> }</span><br><span> </span><br><span> static struct log_info info = {};</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_wqueue *unitdata = NULL;</span><br><span> </span><br><span> static int ns_prim_cb(struct osmo_prim_hdr *oph, void *ctx)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(oph->sap == SAP_NS);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (oph->msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (oph->primitive == PRIM_NS_UNIT_DATA) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_wqueue_enqueue(unitdata, oph->msg);</span><br><span style="color: hsl(120, 100%, 40%);">+           } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      msgb_free(oph->msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -114,6 +123,46 @@</span><br><span>    return bind;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void free_loopback(struct gprs_ns2_vc_bind *bind) {}</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_loopback = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .name = "loopback dummy",</span><br><span style="color: hsl(120, 100%, 40%);">+   .free_bind = free_loopback,</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%);">+/* loopback the msg */</span><br><span style="color: hsl(120, 100%, 40%);">+static int loopback_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 *target = nsvc->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+   return ns2_recv_vc(target, msg);</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%);">+/* create a loopback nsvc object which can be used with ns2_tx_* functions. it's not fully registered etc. */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gprs_ns2_vc *loopback_nsvc(struct gprs_ns2_vc_bind *bind, struct gprs_ns2_vc *target)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gprs_ns2_vc *nsvc = talloc_zero(bind, struct gprs_ns2_vc);</span><br><span style="color: hsl(120, 100%, 40%);">+     memcpy(nsvc, target, sizeof(struct gprs_ns2_vc));</span><br><span style="color: hsl(120, 100%, 40%);">+     nsvc->bind = bind;</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc->priv = target;</span><br><span style="color: hsl(120, 100%, 40%);">+       return nsvc;</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%);">+/* a loop back bind to use the tx_ functions from gprs_ns2_message.c */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gprs_ns2_vc_bind *loopback_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%);">+    bind->name = talloc_strdup(bind, name);</span><br><span style="color: hsl(120, 100%, 40%);">+    bind->driver = &vc_driver_loopback;</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 = 99;</span><br><span style="color: hsl(120, 100%, 40%);">+    bind->nsi = nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+   bind->send_vc = loopback_sendmsg;</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%);">+  return bind;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void test_nse_transfer_cap(void *ctx)</span><br><span> {</span><br><span>      struct gprs_ns2_inst *nsi;</span><br><span>@@ -233,6 +282,93 @@</span><br><span>    printf("--- Finish NSE block unblock nsvc\n");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *generate_unitdata(const char *msgname)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gprs_ns_hdr *nsh;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct msgb *msg = msgb_alloc_headroom(NS_ALLOC_SIZE, NS_ALLOC_HEADROOM, msgname);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msg->l2h = msgb_put(msg, sizeof(*nsh) + 6);</span><br><span style="color: hsl(120, 100%, 40%);">+        nsh = (struct gprs_ns_hdr *) msg->l2h;</span><br><span style="color: hsl(120, 100%, 40%);">+     nsh->pdu_type = NS_PDUT_UNITDATA;</span><br><span style="color: hsl(120, 100%, 40%);">+  nsh->data[0] = 0; /* sdu control */</span><br><span style="color: hsl(120, 100%, 40%);">+        nsh->data[1] = 0; /* msb bvci */</span><br><span style="color: hsl(120, 100%, 40%);">+   nsh->data[2] = 12; /* lsb bvci */</span><br><span style="color: hsl(120, 100%, 40%);">+  nsh->data[3] = 0xab; /* first data byte */</span><br><span style="color: hsl(120, 100%, 40%);">+ nsh->data[4] = 0xcd;</span><br><span style="color: hsl(120, 100%, 40%);">+       nsh->data[5] = 0xef;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return msg;</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_unitdata(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_vc_bind *loopbind;</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[2];</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gprs_ns2_vc *loop[2];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        struct msgb *msg, *other;</span><br><span style="color: hsl(120, 100%, 40%);">+     char idbuf[32];</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%);">+      printf("--- Testing unitdata test\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_wqueue_clear(unitdata);</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, "bblock1");</span><br><span style="color: hsl(120, 100%, 40%);">+       bind[1] = dummy_bind(nsi, "bblock2");</span><br><span style="color: hsl(120, 100%, 40%);">+       loopbind = loopback_bind(nsi, "loopback");</span><br><span style="color: hsl(120, 100%, 40%);">+  nse = gprs_ns2_create_nse(nsi, 1004, GPRS_NS2_LL_UDP, NS2_DIALECT_STATIC_RESETBLOCK);</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%);">+   for (i=0; i<2; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("---- Create NSVC[%d]\n", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                snprintf(idbuf, sizeof(idbuf), "NSE%05u-dummy-%i", nse->nsei, i);</span><br><span style="color: hsl(120, 100%, 40%);">+                nsvc[i] = ns2_vc_alloc(bind[i], nse, false, NS2_VC_MODE_BLOCKRESET, idbuf);</span><br><span style="color: hsl(120, 100%, 40%);">+           loop[i] = loopback_nsvc(loopbind, nsvc[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+           OSMO_ASSERT(nsvc[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+         gprs_ns2_vc_fsm_start(nsvc[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+               OSMO_ASSERT(!gprs_ns2_vc_is_unblocked(nsvc[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+              ns2_tx_reset(loop[i], NS_CAUSE_OM_INTERVENTION);</span><br><span style="color: hsl(120, 100%, 40%);">+              ns2_tx_unblock(loop[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(gprs_ns2_vc_is_unblocked(nsvc[i]));</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%);">+   /* both nsvcs are unblocked and alive */</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("---- Send UNITDATA to NSVC[0]\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  msg = generate_unitdata("test_unitdata");</span><br><span style="color: hsl(120, 100%, 40%);">+   ns2_recv_vc(nsvc[0], msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    other = msgb_dequeue(&unitdata->msg_queue);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(msg == other);</span><br><span style="color: hsl(120, 100%, 40%);">+    other = msgb_dequeue(&unitdata->msg_queue);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(NULL == other);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("---- Send Block NSVC[0]\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        ns2_vc_block(nsvc[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        ns2_tx_block_ack(loop[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* try to receive a unitdata - this should be dropped & freed by NS */</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("---- Try to receive over blocked NSVC[0]\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       ns2_recv_vc(nsvc[0], msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    other = msgb_dequeue(&unitdata->msg_queue);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(NULL == other);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* nsvc[1] should be still good */</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("---- Receive over NSVC[1]\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      msg = generate_unitdata("test_unitdata2");</span><br><span style="color: hsl(120, 100%, 40%);">+  ns2_recv_vc(nsvc[1], msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    other = msgb_dequeue(&unitdata->msg_queue);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(msg == other);</span><br><span style="color: hsl(120, 100%, 40%);">+    msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     gprs_ns2_free(nsi);</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("--- Finish unitdata test\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> int main(int argc, char **argv)</span><br><span> {</span><br><span>       void *ctx = talloc_named_const(NULL, 0, "gprs_ns2_test");</span><br><span>@@ -241,11 +377,14 @@</span><br><span>  log_set_print_filename(osmo_stderr_target, 0);</span><br><span>       log_set_print_filename(osmo_stderr_target, 0);</span><br><span>       log_set_log_level(osmo_stderr_target, LOGL_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+     unitdata = talloc_zero(ctx, struct osmo_wqueue);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_wqueue_init(unitdata, 100);</span><br><span>     setlinebuf(stdout);</span><br><span> </span><br><span>      printf("===== NS2 protocol test START\n");</span><br><span>         test_nse_transfer_cap(ctx);</span><br><span>  test_block_unblock_nsvc(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_unitdata(ctx);</span><br><span>  printf("===== NS2 protocol test END\n\n");</span><br><span> </span><br><span>     talloc_free(ctx);</span><br><span>diff --git a/tests/gb/gprs_ns2_test.ok b/tests/gb/gprs_ns2_test.ok</span><br><span>index 27c72fa..7d12325 100644</span><br><span>--- a/tests/gb/gprs_ns2_test.ok</span><br><span>+++ b/tests/gb/gprs_ns2_test.ok</span><br><span>@@ -11,5 +11,14 @@</span><br><span> ---- Create NSVC[i]</span><br><span> ---- Create NSVC[i]</span><br><span> --- Finish NSE block unblock nsvc</span><br><span style="color: hsl(120, 100%, 40%);">+--- Testing unitdata test</span><br><span style="color: hsl(120, 100%, 40%);">+---- Create NSE + Binds</span><br><span style="color: hsl(120, 100%, 40%);">+---- Create NSVC[0]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Create NSVC[1]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Send UNITDATA to NSVC[0]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Send Block NSVC[0]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Try to receive over blocked NSVC[0]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Receive over NSVC[1]</span><br><span style="color: hsl(120, 100%, 40%);">+--- Finish unitdata test</span><br><span> ===== NS2 protocol test END</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/22422">change 22422</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/+/22422"/><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: I2c44b711d004d2ca08e05d4f54519ad8dbd77c27 </div>
<div style="display:none"> Gerrit-Change-Number: 22422 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </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-MessageType: merged </div>