<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/22305">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">NS_Emulation: Respect data_weight==0 or signalling_weight==0<br><br>* allow configuration of signalling + data weight for each NS-VC<br>* advertise per-NSVC signalling/data weight in SNS-CONFIG<br>* keep track of unblocked NS-VCS separately for data / signalling<br>* transmit BVCI=0 traffic only over signalling NS-VC<br>* transmit BVCI>0 traffic only over data NS-VC<br>* accept incoming BVCI=0 traffic only if signalling_weight > 0<br>* accept incoming BVCI>0 traffic only if data_weight > 0<br><br>Related: OS#4953<br>Change-Id: I9798e639b4bc8658482945970775b012b5840779<br>---<br>M gbproxy/GBProxy_Tests.ttcn<br>M library/NS_Emulation.ttcnpp<br>M library/Osmocom_Gb_Types.ttcn<br>M pcu/PCU_Tests.cfg<br>M pcu/PCU_Tests_SNS.cfg<br>M pcu/PCU_Tests_SNSv6.cfg<br>M sgsn/SGSN_Tests.ttcn<br>7 files changed, 153 insertions(+), 33 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/05/22305/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn</span><br><span>index 013dc93..39d7432 100644</span><br><span>--- a/gbproxy/GBProxy_Tests.ttcn</span><br><span>+++ b/gbproxy/GBProxy_Tests.ttcn</span><br><span>@@ -67,11 +67,14 @@</span><br><span>                                                  local_udp_port := 7777,</span><br><span>                                                      local_ip := "127.0.0.10",</span><br><span>                                                  remote_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data_weight := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     signalling_weight := 1</span><br><span>                                               }</span><br><span>                                    },</span><br><span>                                   nsvci := 101</span><br><span>                                 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                  }</span><br><span>            }, {</span><br><span>                         nsei := 102,</span><br><span>@@ -85,7 +88,9 @@</span><br><span>                                                     local_udp_port := 8888,</span><br><span>                                                      local_ip := "127.0.0.11",</span><br><span>                                                  remote_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data_weight := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     signalling_weight := 1</span><br><span>                                               }</span><br><span>                                    },</span><br><span>                                   nsvci := 102</span><br><span>@@ -109,7 +114,9 @@</span><br><span>                                                   local_udp_port := 21010,</span><br><span>                                                     local_ip := "127.0.1.1",</span><br><span>                                                   remote_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     signalling_weight := 1</span><br><span>                                               }</span><br><span>                                    },</span><br><span>                                   nsvci := 2101</span><br><span>@@ -128,7 +135,9 @@</span><br><span>                                                  local_udp_port := 21020,</span><br><span>                                                     local_ip := "127.0.2.1",</span><br><span>                                                   remote_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     signalling_weight := 1</span><br><span>                                               }</span><br><span>                                    },</span><br><span>                                   nsvci := 2102</span><br><span>@@ -147,7 +156,9 @@</span><br><span>                                                  local_udp_port := 21030,</span><br><span>                                                     local_ip := "127.0.3.1",</span><br><span>                                                   remote_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     signalling_weight := 1</span><br><span>                                               }</span><br><span>                                    },</span><br><span>                                   nsvci := 2103</span><br><span>diff --git a/library/NS_Emulation.ttcnpp b/library/NS_Emulation.ttcnpp</span><br><span>index 03aeb6a..61ebe95 100644</span><br><span>--- a/library/NS_Emulation.ttcnpp</span><br><span>+++ b/library/NS_Emulation.ttcnpp</span><br><span>@@ -1,5 +1,5 @@</span><br><span> /* GPRS-NS Emulation in TTCN-3</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2018-2020 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018-2021 Harald Welte <laforge@gnumonks.org></span><br><span>  * contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  * All rights reserved.</span><br><span>  *</span><br><span>@@ -152,7 +152,9 @@</span><br><span>              PortNumber local_udp_port,</span><br><span>           charstring local_ip,</span><br><span>                 PortNumber remote_udp_port,</span><br><span style="color: hsl(0, 100%, 40%);">-             charstring remote_ip</span><br><span style="color: hsl(120, 100%, 40%);">+          charstring remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t data_weight,</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t signalling_weight</span><br><span>    };</span><br><span>   type record NSVCConfigurationFR {</span><br><span>            charstring netdev,      /* HDLC net-device for AF_PACKET socket */</span><br><span>@@ -192,10 +194,11 @@</span><br><span>           /* references to the per-NSVC components */</span><br><span>          var NsvcTable g_nsvcs := {};</span><br><span>                 /* list of indexes to g_nsvcs[] of currently unblocked NSVCs */</span><br><span style="color: hsl(0, 100%, 40%);">-         var ro_integer g_unblocked_nsvcs := {};</span><br><span style="color: hsl(120, 100%, 40%);">+               var ro_integer g_unblocked_nsvcs_sig := {};</span><br><span style="color: hsl(120, 100%, 40%);">+           var ro_integer g_unblocked_nsvcs_data := {};</span><br><span>         };</span><br><span>   type record NsvcTableEntry {</span><br><span style="color: hsl(0, 100%, 40%);">-            Nsvci nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+          NSVCConfiguration cfg,</span><br><span>               NSVC_CT vc_conn,</span><br><span>             NsvcState state</span><br><span>      };</span><br><span>@@ -244,7 +247,7 @@</span><br><span>             var charstring nsvc_id := g_id & "-NSVCI" & int2str(nsvc_cfg.nsvci);</span><br><span>               var NsvcTableEntry te;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              te.nsvci := nsvc_cfg.nsvci;</span><br><span style="color: hsl(120, 100%, 40%);">+           te.cfg := nsvc_cfg;</span><br><span>          te.vc_conn := NSVC_CT.create(nsvc_id);</span><br><span>               te.state := NSVC_S_DEAD_BLOCKED;</span><br><span> </span><br><span>@@ -258,7 +261,7 @@</span><br><span>   function f_nsvc_find_idx(Nsvci nsvci) runs on NS_CT return integer {</span><br><span>                 var integer i;</span><br><span>               for (i := 0; i < lengthof(g_nsvcs); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (g_nsvcs[i].nsvci == nsvci) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (g_nsvcs[i].cfg.nsvci == nsvci) {</span><br><span>                                 return i;</span><br><span>                    }</span><br><span>            }</span><br><span>@@ -281,16 +284,32 @@</span><br><span>            }</span><br><span>            if (g_nsvcs[i].state != NSVC_S_ALIVE_UNBLOCKED and state == NSVC_S_ALIVE_UNBLOCKED) {</span><br><span>                        /* add index to list of unblocked NSVCs */</span><br><span style="color: hsl(0, 100%, 40%);">-                      g_unblocked_nsvcs := g_unblocked_nsvcs & {i};</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (not ischosen(g_nsvcs[i].cfg.provider.ip) or</span><br><span style="color: hsl(120, 100%, 40%);">+                           g_nsvcs[i].cfg.provider.ip.signalling_weight > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            g_unblocked_nsvcs_sig := g_unblocked_nsvcs_sig & {i};</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (not ischosen(g_nsvcs[i].cfg.provider.ip) or</span><br><span style="color: hsl(120, 100%, 40%);">+                           g_nsvcs[i].cfg.provider.ip.data_weight > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          g_unblocked_nsvcs_data := g_unblocked_nsvcs_data & {i};</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span>            } else if (g_nsvcs[i].state == NSVC_S_ALIVE_UNBLOCKED and state != NSVC_S_ALIVE_UNBLOCKED) {</span><br><span>                         /* remove index to list of unblocked NSVCs */</span><br><span style="color: hsl(0, 100%, 40%);">-                   var ro_integer new_unblocked_nsvcs := {};</span><br><span style="color: hsl(0, 100%, 40%);">-                       for (var integer j := 0; j < lengthof(g_unblocked_nsvcs); j := j+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                if (g_unblocked_nsvcs[j] != i) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        new_unblocked_nsvcs := new_unblocked_nsvcs & {j};</span><br><span style="color: hsl(120, 100%, 40%);">+                 var ro_integer new_unblocked_nsvcs_sig := {};</span><br><span style="color: hsl(120, 100%, 40%);">+                 for (var integer j := 0; j < lengthof(g_unblocked_nsvcs_sig); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          if (g_unblocked_nsvcs_sig[j] != i) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                  new_unblocked_nsvcs_sig := new_unblocked_nsvcs_sig & {j};</span><br><span>                                }</span><br><span>                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       g_unblocked_nsvcs := new_unblocked_nsvcs;</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_unblocked_nsvcs_sig := new_unblocked_nsvcs_sig;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   var ro_integer new_unblocked_nsvcs_data := {};</span><br><span style="color: hsl(120, 100%, 40%);">+                        for (var integer j := 0; j < lengthof(g_unblocked_nsvcs_data); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         if (g_unblocked_nsvcs_data[j] != i) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 new_unblocked_nsvcs_data := new_unblocked_nsvcs_data & {j};</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%);">+                     g_unblocked_nsvcs_data := new_unblocked_nsvcs_data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                }</span><br><span>            g_nsvcs[i].state := state;</span><br><span>   }</span><br><span>@@ -365,11 +384,17 @@</span><br><span>                                    log2str("Received UnitDataInd for invalid NSEI: ", rx_nsudi));</span><br><span>                     }</span><br><span>            /* from user down to NS-VC */</span><br><span style="color: hsl(0, 100%, 40%);">-           [] NS_SP.receive(tr_NsUdReq(g_config.nsei, ?, ?, ?, *)) -> value rx_nsudr {</span><br><span style="color: hsl(120, 100%, 40%);">+                [] NS_SP.receive(tr_NsUdReq(g_config.nsei, 0, ?, ?, *)) -> value rx_nsudr {</span><br><span>                       /* load distribution function */</span><br><span style="color: hsl(0, 100%, 40%);">-                        var integer nsvc_idx := g_unblocked_nsvcs[rx_nsudr.lsp mod lengthof(g_unblocked_nsvcs)];</span><br><span style="color: hsl(120, 100%, 40%);">+                      var integer nsvc_idx := g_unblocked_nsvcs_sig[rx_nsudr.lsp mod lengthof(g_unblocked_nsvcs_sig)];</span><br><span>                     NSVC.send(rx_nsudr) to g_nsvcs[nsvc_idx].vc_conn;</span><br><span>                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NS_SP.receive(tr_NsUdReq(g_config.nsei, ?, ?, ?, *)) -> value rx_nsudr {</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* load distribution function */</span><br><span style="color: hsl(120, 100%, 40%);">+                      var integer nsvc_idx := g_unblocked_nsvcs_data[rx_nsudr.lsp mod lengthof(g_unblocked_nsvcs_data)];</span><br><span style="color: hsl(120, 100%, 40%);">+                    NSVC.send(rx_nsudr) to g_nsvcs[nsvc_idx].vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          [] NS_SP.receive(tr_NsUdReq(?, ?, ?, ?, *)) -> value rx_nsudr {</span><br><span>                   Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span>                                   log2str("Received NsUnitdataReq for invalid NSEI: ", rx_nsudr));</span><br><span>@@ -392,10 +417,14 @@</span><br><span>                   }</span><br><span>                    if (nsvc_cfg.provider.ip.address_family == AF_INET) {</span><br><span>                                v4 := v4 & { valueof(ts_SNS_IPv4(nsvc_cfg.provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              nsvc_cfg.provider.ip.local_udp_port)) };</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              nsvc_cfg.provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          nsvc_cfg.provider.ip.signalling_weight,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               nsvc_cfg.provider.ip.data_weight)) };</span><br><span>                       } else if (nsvc_cfg.provider.ip.address_family == AF_INET6) {</span><br><span>                                v6 := v6 & { valueof(ts_SNS_IPv6(nsvc_cfg.provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              nsvc_cfg.provider.ip.local_udp_port)) };</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              nsvc_cfg.provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          nsvc_cfg.provider.ip.signalling_weight,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               nsvc_cfg.provider.ip.data_weight)) };</span><br><span>                       }</span><br><span>            }</span><br><span> </span><br><span>@@ -690,18 +719,66 @@</span><br><span>                /* tolerate a late NS-UNBLOCK-ACK from peer */</span><br><span>               [] NSCP.receive(t_NS_UNBLOCK_ACK) -> value rf {</span><br><span>           }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           [not ischosen(g_nsvc_config.provider.ip) or</span><br><span style="color: hsl(120, 100%, 40%);">+            g_nsvc_config.provider.ip.data_weight > 0] as_alive_unblocked_data();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           [not ischosen(g_nsvc_config.provider.ip) or</span><br><span style="color: hsl(120, 100%, 40%);">+            g_nsvc_config.provider.ip.signalling_weight > 0] as_alive_unblocked_sig();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* catch any violations of above rule */</span><br><span style="color: hsl(120, 100%, 40%);">+              [ischosen(g_nsvc_config.provider.ip)] NSCP.receive(tr_NS_UNITDATA(?, ?, ?)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+                  Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    log2str("Unexpected Rx NS-UNITDATA on NSVC with data_weight=",</span><br><span style="color: hsl(120, 100%, 40%);">+                                              g_nsvc_config.provider.ip.data_weight, ", sig_weight=",</span><br><span style="color: hsl(120, 100%, 40%);">+                                             g_nsvc_config.provider.ip.signalling_weight, ": ", rf));</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             [ischosen(g_nsvc_config.provider.ip)] NS_SP.receive(tr_NsUdReq(g_config.nsei, ?, ?, *, *)) -> value ud_req {</span><br><span style="color: hsl(120, 100%, 40%);">+                       Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    log2str("Unexpected Rx TX-UNITDATA on NSVC with data_weight=",</span><br><span style="color: hsl(120, 100%, 40%);">+                                              g_nsvc_config.provider.ip.data_weight, ", sig_weight=",</span><br><span style="color: hsl(120, 100%, 40%);">+                                             g_nsvc_config.provider.ip.signalling_weight, ": ", ud_req));</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%);">+   /* user data transfer; only permitted for some NS-VC */</span><br><span style="color: hsl(120, 100%, 40%);">+       private altstep as_alive_unblocked_data() runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+           var NsUnitdataRequest ud_req;</span><br><span style="color: hsl(120, 100%, 40%);">+         var PDU_NS rf;</span><br><span>               /* NS-UNITDATA PDU from network to NS-UNITDATA.ind to user */</span><br><span style="color: hsl(0, 100%, 40%);">-           [] NSCP.receive(tr_NS_UNITDATA(?, ?, ?)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSCP.receive(tr_NS_UNITDATA_User(?, ?)) -> value rf {</span><br><span>                  NS_SP.send(ts_NsUdInd(g_config.nsei, g_nsvc_config.nsvci,</span><br><span>                                         oct2int(rf.pDU_NS_Unitdata.bVCI),</span><br><span>                                            rf.pDU_NS_Unitdata.nS_SDU));</span><br><span>            }</span><br><span>            /* NS-UNITDATA.req from user to NS-UNITDATA PDU on network */</span><br><span style="color: hsl(0, 100%, 40%);">-           [] NS_SP.receive(tr_NsUdReq(g_config.nsei, ?, ?, ?, omit)) -> value ud_req {</span><br><span style="color: hsl(120, 100%, 40%);">+               [] NS_SP.receive(tr_NsUdReq(g_config.nsei, t_BssgpBvciUser, ?, ?, omit)) -> value ud_req {</span><br><span>                        /* using raw octetstring PDU */</span><br><span>                      NSCP.send(ts_NS_UNITDATA(t_SduCtrlB, ud_req.bvci, ud_req.sdu));</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NS_SP.receive(tr_NsUdReq(g_config.nsei, ?, ?, omit, ?)) -> value ud_req {</span><br><span style="color: hsl(120, 100%, 40%);">+               [] NS_SP.receive(tr_NsUdReq(g_config.nsei, t_BssgpBvciUser, ?, omit, ?)) -> value ud_req {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* using decoded BSSGP PDU that we need to encode first */</span><br><span style="color: hsl(120, 100%, 40%);">+                    var octetstring enc := enc_PDU_BSSGP(ud_req.bssgp);</span><br><span style="color: hsl(120, 100%, 40%);">+                   NSCP.send(ts_NS_UNITDATA(t_SduCtrlB, ud_req.bvci, enc));</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%);">+   /* signalling (BVCI=0) transfer; only permitted for some NS-VC */</span><br><span style="color: hsl(120, 100%, 40%);">+     private altstep as_alive_unblocked_sig() runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+            var NsUnitdataRequest ud_req;</span><br><span style="color: hsl(120, 100%, 40%);">+         var PDU_NS rf;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* NS-UNITDATA PDU from network to NS-UNITDATA.ind to user */</span><br><span style="color: hsl(120, 100%, 40%);">+         [] NSCP.receive(tr_NS_UNITDATA(?, 0, ?)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+                     NS_SP.send(ts_NsUdInd(g_config.nsei, g_nsvc_config.nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          oct2int(rf.pDU_NS_Unitdata.bVCI),</span><br><span style="color: hsl(120, 100%, 40%);">+                                             rf.pDU_NS_Unitdata.nS_SDU));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* NS-UNITDATA.req from user to NS-UNITDATA PDU on network */</span><br><span style="color: hsl(120, 100%, 40%);">+         [] NS_SP.receive(tr_NsUdReq(g_config.nsei, 0, ?, ?, omit)) -> value ud_req {</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* using raw octetstring PDU */</span><br><span style="color: hsl(120, 100%, 40%);">+                       NSCP.send(ts_NS_UNITDATA(t_SduCtrlB, ud_req.bvci, ud_req.sdu));</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NS_SP.receive(tr_NsUdReq(g_config.nsei, 0, ?, omit, ?)) -> value ud_req {</span><br><span>                      /* using decoded BSSGP PDU that we need to encode first */</span><br><span>                   var octetstring enc := enc_PDU_BSSGP(ud_req.bssgp);</span><br><span>                  NSCP.send(ts_NS_UNITDATA(t_SduCtrlB, ud_req.bvci, enc));</span><br><span>diff --git a/library/Osmocom_Gb_Types.ttcn b/library/Osmocom_Gb_Types.ttcn</span><br><span>index 9065097..9e4d702 100644</span><br><span>--- a/library/Osmocom_Gb_Types.ttcn</span><br><span>+++ b/library/Osmocom_Gb_Types.ttcn</span><br><span>@@ -14,6 +14,8 @@</span><br><span>        type uint16_t Nsei;</span><br><span>  type uint16_t BssgpBvci;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  template (present) BssgpBvci t_BssgpBvciUser := complement (0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* TS 48.016 10.3.7 */</span><br><span>       type enumerated NsPduType {</span><br><span>          NS_PDUT_NS_UNITDATA     ('00000000'B),</span><br><span>@@ -407,6 +409,14 @@</span><br><span>                        nS_SDU := sdu</span><br><span>                }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     template PDU_NS tr_NS_UNITDATA_User(template NS_SDU_ControlBits bits, template octetstring sdu) := {</span><br><span style="color: hsl(120, 100%, 40%);">+          pDU_NS_Unitdata := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsPduType := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                   nS_SDU_ControlBits := bits,</span><br><span style="color: hsl(120, 100%, 40%);">+                   bVCI := complement ('0000'O),</span><br><span style="color: hsl(120, 100%, 40%);">+                 nS_SDU := sdu</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span> </span><br><span> </span><br><span>diff --git a/pcu/PCU_Tests.cfg b/pcu/PCU_Tests.cfg</span><br><span>index 13bedec..dfebb40 100644</span><br><span>--- a/pcu/PCU_Tests.cfg</span><br><span>+++ b/pcu/PCU_Tests.cfg</span><br><span>@@ -18,7 +18,9 @@</span><br><span>                                   local_ip := "127.0.0.1",</span><br><span>                                   local_udp_port := 23000,</span><br><span>                                     remote_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     remote_udp_port := 22000</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_udp_port := 22000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     signalling_weight := 1</span><br><span>                               }</span><br><span>                    },</span><br><span>                   nsvci := 1234</span><br><span>@@ -30,7 +32,10 @@</span><br><span>                                   local_ip := "127.0.0.1",</span><br><span>                                   local_udp_port := 23001,</span><br><span>                                     remote_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     remote_udp_port := 22000</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_udp_port := 22000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     signalling_weight := 1</span><br><span style="color: hsl(120, 100%, 40%);">+                                }</span><br><span>                            }</span><br><span>                    },</span><br><span>                   nsvci := 1234</span><br><span>@@ -42,7 +47,10 @@</span><br><span>                                   local_ip := "127.0.0.1",</span><br><span>                                   local_udp_port := 23002,</span><br><span>                                     remote_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     remote_udp_port := 22000</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_udp_port := 22000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     signalling_weight := 1</span><br><span style="color: hsl(120, 100%, 40%);">+                                }</span><br><span>                            }</span><br><span>                    },</span><br><span>                   nsvci := 1234</span><br><span>diff --git a/pcu/PCU_Tests_SNS.cfg b/pcu/PCU_Tests_SNS.cfg</span><br><span>index ab589c5..c36edac 100644</span><br><span>--- a/pcu/PCU_Tests_SNS.cfg</span><br><span>+++ b/pcu/PCU_Tests_SNS.cfg</span><br><span>@@ -17,7 +17,9 @@</span><br><span>                                   local_ip := "127.0.0.1",</span><br><span>                                   local_udp_port := 23000,</span><br><span>                                     remote_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     remote_udp_port := 22000</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_udp_port := 22000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     signalling_weight := 1</span><br><span>                               }</span><br><span>                    },</span><br><span>                   nsvci := 1234</span><br><span>@@ -29,7 +31,9 @@</span><br><span>                                    local_ip := "127.0.0.1",</span><br><span>                                   local_udp_port := 23001,</span><br><span>                                     remote_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     remote_udp_port := 22000</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_udp_port := 22000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     signalling_weight := 1</span><br><span>                               }</span><br><span>                    },</span><br><span>                   nsvci := 1234</span><br><span>@@ -41,7 +45,9 @@</span><br><span>                                    local_ip := "127.0.0.1",</span><br><span>                                   local_udp_port := 23002,</span><br><span>                                     remote_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     remote_udp_port := 22000</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_udp_port := 22000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     signalling_weight := 1</span><br><span>                               }</span><br><span>                    },</span><br><span>                   nsvci := 1234</span><br><span>diff --git a/pcu/PCU_Tests_SNSv6.cfg b/pcu/PCU_Tests_SNSv6.cfg</span><br><span>index cae9a75..3747f0a 100644</span><br><span>--- a/pcu/PCU_Tests_SNSv6.cfg</span><br><span>+++ b/pcu/PCU_Tests_SNSv6.cfg</span><br><span>@@ -18,6 +18,8 @@</span><br><span>                                   local_udp_port := 23000,</span><br><span>                                     remote_ip := "::1",</span><br><span>                                        remote_udp_port := 22000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     signalling_weight := 1</span><br><span>                               }</span><br><span>                    },</span><br><span>                   nsvci := 1234</span><br><span>diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn</span><br><span>index fe31ffc..7d47a1f 100644</span><br><span>--- a/sgsn/SGSN_Tests.ttcn</span><br><span>+++ b/sgsn/SGSN_Tests.ttcn</span><br><span>@@ -80,7 +80,9 @@</span><br><span>                                                       local_udp_port := 21010,</span><br><span>                                                     local_ip := "127.0.0.1",</span><br><span>                                                   remote_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     signalling_weight := 1</span><br><span>                                               }</span><br><span>                                    },</span><br><span>                                   nsvci := 97</span><br><span>@@ -99,7 +101,9 @@</span><br><span>                                                     local_udp_port := 21011,</span><br><span>                                                     local_ip := "127.0.0.1",</span><br><span>                                                   remote_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     signalling_weight := 1</span><br><span>                                               }</span><br><span>                                    },</span><br><span>                                   nsvci := 98</span><br><span>@@ -118,7 +122,9 @@</span><br><span>                                                    local_udp_port := 21012,</span><br><span>                                                     local_ip := "127.0.0.1",</span><br><span>                                                   remote_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data_weight := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     signalling_weight := 1</span><br><span>                                               }</span><br><span>                                    },</span><br><span>                                   nsvci := 99</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/22305">change 22305</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/22305"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I9798e639b4bc8658482945970775b012b5840779 </div>
<div style="display:none"> Gerrit-Change-Number: 22305 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>