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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2: inform the NS user (BSSGP) about the MTU of a NSE<br><br>The BSSGP layer needs to know the MTU of the NS UNIDATA payload.<br>The MTU can be 0 if the NSE doesn't contain any NSVC.<br>Every status indication will contain the mtu value.<br>The MTU in the status indication contains the maximum transfer<br>unit of a BSSGP message. From NS side the maximum SDU.<br><br>Related: OS#4889<br>Change-Id: I5016b295db6185ec131d83089cf6c806e34ef1b6<br>---<br>M include/osmocom/gprs/frame_relay.h<br>M include/osmocom/gprs/gprs_ns2.h<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/gb/gprs_ns2_test.c<br>M tests/gb/gprs_ns2_test.ok<br>9 files changed, 130 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gprs/frame_relay.h b/include/osmocom/gprs/frame_relay.h</span><br><span>index 1be37ee..e316707 100644</span><br><span>--- a/include/osmocom/gprs/frame_relay.h</span><br><span>+++ b/include/osmocom/gprs/frame_relay.h</span><br><span>@@ -39,6 +39,11 @@</span><br><span>       FR_ROLE_NETWORK_EQUIPMENT,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* 48.016 ยง 6.1.4.2 default maximum information field size of 1600 octets */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FRAME_RELAY_MTU 1600</span><br><span style="color: hsl(120, 100%, 40%);">+/* FR DLC header is 2 byte */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FRAME_RELAY_SDU (FRAME_RELAY_MTU - 2)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> extern const struct value_string osmo_fr_role_names[];</span><br><span> </span><br><span> static inline const char *osmo_fr_role_str(enum osmo_fr_role role) {</span><br><span>diff --git a/include/osmocom/gprs/gprs_ns2.h b/include/osmocom/gprs/gprs_ns2.h</span><br><span>index 07e6c45..b406bb0 100644</span><br><span>--- a/include/osmocom/gprs/gprs_ns2.h</span><br><span>+++ b/include/osmocom/gprs/gprs_ns2.h</span><br><span>@@ -84,6 +84,7 @@</span><br><span>         GPRS_NS2_AFF_CAUSE_SNS_CONFIGURED,</span><br><span>   GPRS_NS2_AFF_CAUSE_SNS_FAILURE,</span><br><span>      GPRS_NS2_AFF_CAUSE_SNS_NO_ENDPOINTS,</span><br><span style="color: hsl(120, 100%, 40%);">+  GPRS_NS2_AFF_CAUSE_MTU_CHANGE,</span><br><span> };</span><br><span> </span><br><span> extern const struct value_string gprs_ns2_aff_cause_prim_strs[];</span><br><span>@@ -135,6 +136,8 @@</span><br><span>                   /* Only true on the first time it's available.</span><br><span>                    * Allow the BSSGP layer to reset persistent NSE */</span><br><span>                  bool first;</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* MTU of a NS SDU. It's the lowest MTU of all (alive & dead) NSVCs */</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint16_t mtu;</span><br><span>                } status;</span><br><span>    } u;</span><br><span> };</span><br><span>diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c</span><br><span>index 99a7415..9302a16 100644</span><br><span>--- a/src/gb/gprs_ns2.c</span><br><span>+++ b/src/gb/gprs_ns2.c</span><br><span>@@ -217,6 +217,7 @@</span><br><span>    { GPRS_NS2_AFF_CAUSE_RECOVERY,          "NSE recovery" },</span><br><span>  { GPRS_NS2_AFF_CAUSE_SNS_CONFIGURED,    "NSE SNS configured" },</span><br><span>    { GPRS_NS2_AFF_CAUSE_SNS_FAILURE,       "NSE SNS failure" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { GPRS_NS2_AFF_CAUSE_MTU_CHANGE,        "NSE MTU changed" },</span><br><span>       { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -496,15 +497,20 @@</span><br><span>        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 style="color: hsl(120, 100%, 40%);">+ if (nse->mtu < 4)</span><br><span style="color: hsl(120, 100%, 40%);">+               nsp.u.status.mtu = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          nsp.u.status.mtu = nse->mtu - 4; /* 1 Byte NS PDU type, 1 Byte NS SDU control, 2 Byte BVCI */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   if (nsvc) {</span><br><span>          nsp.u.status.nsvc = gprs_ns2_ll_str_buf(nsvc_str, sizeof(nsvc_str), nsvc);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGNSVC(nsvc, LOGL_NOTICE, "NS-STATUS.ind(bvci=%05u): cause=%s, transfer=%d, first=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGNSVC(nsvc, LOGL_NOTICE, "NS-STATUS.ind(bvci=%05u): cause=%s, transfer=%d, first=%d, mtu=%d\n",</span><br><span>                  nsp.bvci, gprs_ns2_aff_cause_prim_str(nsp.u.status.cause),</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsp.u.status.transfer, nsp.u.status.first);</span><br><span style="color: hsl(120, 100%, 40%);">+                   nsp.u.status.transfer, nsp.u.status.first, nse->mtu);</span><br><span>     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGNSE(nse, LOGL_NOTICE, "NS-STATUS.ind(bvci=%05u): cause=%s, transfer=%d, first=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGNSE(nse, LOGL_NOTICE, "NS-STATUS.ind(bvci=%05u): cause=%s, transfer=%d, first=%d, mtu=%d\n",</span><br><span>                    nsp.bvci, gprs_ns2_aff_cause_prim_str(nsp.u.status.cause),</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsp.u.status.transfer, nsp.u.status.first);</span><br><span style="color: hsl(120, 100%, 40%);">+                   nsp.u.status.transfer, nsp.u.status.first, nse->mtu);</span><br><span>     }</span><br><span> </span><br><span>        osmo_prim_init(&nsp.oph, SAP_NS, GPRS_NS2_PRIM_STATUS, PRIM_OP_INDICATION, NULL);</span><br><span>@@ -548,6 +554,7 @@</span><br><span> </span><br><span>      llist_add(&nsvc->list, &nse->nsvc);</span><br><span>    llist_add(&nsvc->blist, &bind->nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+   ns2_nse_update_mtu(nse);</span><br><span> </span><br><span>         return nsvc;</span><br><span> </span><br><span>@@ -746,6 +753,7 @@</span><br><span>       nse->nsei = nsei;</span><br><span>         nse->nsi = nsi;</span><br><span>   nse->first = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ nse->mtu = 0;</span><br><span>     llist_add(&nse->list, &nsi->nse);</span><br><span>      INIT_LLIST_HEAD(&nse->nsvc);</span><br><span> </span><br><span>@@ -1334,6 +1342,31 @@</span><br><span>     array[i] = bind;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void ns2_nse_update_mtu(struct gprs_ns2_nse *nse)</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%);">+     int mtu = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (llist_empty(&nse->nsvc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         nse->mtu = 0;</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%);">+   llist_for_each_entry(nsvc, &nse->nsvc, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (mtu == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                 mtu = nsvc->bind->mtu;</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (mtu > nsvc->bind->mtu)</span><br><span style="color: hsl(120, 100%, 40%);">+                      mtu = nsvc->bind->mtu;</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 (nse->mtu == mtu)</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%);">+     nse->mtu = mtu;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (nse->alive)</span><br><span style="color: hsl(120, 100%, 40%);">+            ns2_prim_status_ind(nsvc->nse, NULL, 0, GPRS_NS2_AFF_CAUSE_MTU_CHANGE);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! calculate the transfer capabilities for a nse</span><br><span>  *  \param nse the nse to count the transfer capability</span><br><span>  *  \param bvci a bvci - unused</span><br><span>diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c</span><br><span>index 7e6db2a..445f00a 100644</span><br><span>--- a/src/gb/gprs_ns2_fr.c</span><br><span>+++ b/src/gb/gprs_ns2_fr.c</span><br><span>@@ -801,6 +801,7 @@</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 style="color: hsl(120, 100%, 40%);">+ bind->mtu = FRAME_RELAY_SDU;</span><br><span>      priv = bind->priv = talloc_zero(bind, struct priv_bind);</span><br><span>  if (!priv) {</span><br><span>                 rc = -ENOMEM;</span><br><span>diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c</span><br><span>index 177aeb2..62d87a4 100644</span><br><span>--- a/src/gb/gprs_ns2_frgre.c</span><br><span>+++ b/src/gb/gprs_ns2_frgre.c</span><br><span>@@ -572,6 +572,10 @@</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 style="color: hsl(120, 100%, 40%);">+   /* TODO: allow to set the MTU via vty. It can not be automatic detected because it goes over an</span><br><span style="color: hsl(120, 100%, 40%);">+        * ethernet device and the MTU here must match the FR side of the FR-to-GRE gateway.</span><br><span style="color: hsl(120, 100%, 40%);">+   */</span><br><span style="color: hsl(120, 100%, 40%);">+   bind->mtu = FRAME_RELAY_SDU;</span><br><span> </span><br><span>  priv = bind->priv = talloc_zero(bind, struct priv_bind);</span><br><span>  if (!priv) {</span><br><span>diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h</span><br><span>index d4764f6..7e235be 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -179,6 +179,9 @@</span><br><span> </span><br><span>  /*! sum of all the signalling weight of _alive_ NS-VCs */</span><br><span>    uint32_t sum_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /*! MTU of a NS PDU. This is the lowest MTU of all NSVCs */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t mtu;</span><br><span> };</span><br><span> </span><br><span> /*! Structure representing a single NS-VC */</span><br><span>@@ -244,6 +247,9 @@</span><br><span>        /*! transfer capability in mbit */</span><br><span>   int transfer_capability;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /*! MTU of a NS PDU on this bind. */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t mtu;</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>@@ -298,6 +304,7 @@</span><br><span>                        uint16_t bvci,</span><br><span>                       enum gprs_ns2_affecting_cause cause);</span><br><span> void ns2_nse_notify_alive(struct gprs_ns2_vc *nsvc, bool alive);</span><br><span style="color: hsl(120, 100%, 40%);">+void ns2_nse_update_mtu(struct gprs_ns2_nse *nse);</span><br><span> </span><br><span> /* message */</span><br><span> int ns2_validate(struct gprs_ns2_vc *nsvc,</span><br><span>diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c</span><br><span>index 0f22458..36f6a97 100644</span><br><span>--- a/src/gb/gprs_ns2_udp.c</span><br><span>+++ b/src/gb/gprs_ns2_udp.c</span><br><span>@@ -368,6 +368,10 @@</span><br><span>                            dscp, rc, errno);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* IPv4: max fragmented payload can be (13 bit) * 8 byte => 65535.</span><br><span style="color: hsl(120, 100%, 40%);">+  * IPv6: max payload can be 65535 (RFC 2460).</span><br><span style="color: hsl(120, 100%, 40%);">+  * UDP header = 8 byte */</span><br><span style="color: hsl(120, 100%, 40%);">+     bind->mtu = 65535 - 8;</span><br><span>    if (result)</span><br><span>          *result = bind;</span><br><span> </span><br><span>diff --git a/tests/gb/gprs_ns2_test.c b/tests/gb/gprs_ns2_test.c</span><br><span>index 2027e63..6d71a8c 100644</span><br><span>--- a/tests/gb/gprs_ns2_test.c</span><br><span>+++ b/tests/gb/gprs_ns2_test.c</span><br><span>@@ -40,10 +40,13 @@</span><br><span> </span><br><span> static struct log_info info = {};</span><br><span> static struct osmo_wqueue *unitdata = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_gprs_ns2_prim last_nse_recovery = {};</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%);">+      struct osmo_gprs_ns2_prim *nsp;</span><br><span>      OSMO_ASSERT(oph->sap == SAP_NS);</span><br><span style="color: hsl(120, 100%, 40%);">+   nsp = container_of(oph, struct osmo_gprs_ns2_prim, oph);</span><br><span>     if (oph->msg) {</span><br><span>           if (oph->primitive == GPRS_NS2_PRIM_UNIT_DATA) {</span><br><span>                  osmo_wqueue_enqueue(unitdata, oph->msg);</span><br><span>@@ -51,6 +54,9 @@</span><br><span>                      msgb_free(oph->msg);</span><br><span>              }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (oph->primitive == GPRS_NS2_PRIM_STATUS && nsp->u.status.cause == GPRS_NS2_AFF_CAUSE_RECOVERY) {</span><br><span style="color: hsl(120, 100%, 40%);">+             last_nse_recovery = *nsp;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -113,6 +119,7 @@</span><br><span>     bind->transfer_capability = 42;</span><br><span>   bind->send_vc = vc_sendmsg;</span><br><span>       bind->priv = talloc_zero(bind, struct osmo_wqueue);</span><br><span style="color: hsl(120, 100%, 40%);">+        bind->mtu = 123;</span><br><span>  struct osmo_wqueue *queue = bind->priv;</span><br><span> </span><br><span>       osmo_wqueue_init(queue, 100);</span><br><span>@@ -154,6 +161,7 @@</span><br><span>  bind->ll = GPRS_NS2_LL_UDP;</span><br><span>       bind->transfer_capability = 99;</span><br><span>   bind->send_vc = loopback_sendmsg;</span><br><span style="color: hsl(120, 100%, 40%);">+  bind->mtu = 123;</span><br><span>  return bind;</span><br><span> }</span><br><span> </span><br><span>@@ -362,6 +370,59 @@</span><br><span>         printf("--- Finish unitdata test\n");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void test_mtu(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 mtu 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, GPRS_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, GPRS_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%);">+         ns2_vc_fsm_start(nsvc[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+            OSMO_ASSERT(!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(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 a small 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%);">+   msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("---- Check if got mtu reported\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 1b NS PDU type, 1b NS SDU control, 2b BVCI */</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(last_nse_recovery.u.status.mtu == 123 - 4);</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> </span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>@@ -379,6 +440,7 @@</span><br><span>         test_nse_transfer_cap(ctx);</span><br><span>  test_block_unblock_nsvc(ctx);</span><br><span>        test_unitdata(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+   test_mtu(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 7d12325..f40579f 100644</span><br><span>--- a/tests/gb/gprs_ns2_test.ok</span><br><span>+++ b/tests/gb/gprs_ns2_test.ok</span><br><span>@@ -20,5 +20,12 @@</span><br><span> ---- Try to receive over blocked NSVC[0]</span><br><span> ---- Receive over NSVC[1]</span><br><span> --- Finish unitdata test</span><br><span style="color: hsl(120, 100%, 40%);">+--- Testing mtu 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 a small UNITDATA to NSVC[0]</span><br><span style="color: hsl(120, 100%, 40%);">+---- Check if got mtu reported</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/+/22343">change 22343</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/+/22343"/><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: I5016b295db6185ec131d83089cf6c806e34ef1b6 </div>
<div style="display:none"> Gerrit-Change-Number: 22343 </div>
<div style="display:none"> Gerrit-PatchSet: 13 </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>