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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">NS_Emulation: Move SNS handling from NS-VC to NS-VCG<br><br>We need to move the IP-SNS handling up one layer, as only the NS-VCG<br>knows all the other NS-VCs, and after the SNS-CONFIG-ACK, we must<br>mark all of our NS-VCs as alive and start the alive procedure.<br><br>Related: OS#4953<br>Change-Id: Ie0f4342a0346952d7c50ac36900148e311d4c782<br>---<br>M library/NS_Emulation.ttcnpp<br>M library/Osmocom_Gb_Types.ttcn<br>2 files changed, 159 insertions(+), 77 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/NS_Emulation.ttcnpp b/library/NS_Emulation.ttcnpp</span><br><span>index 7bede94..03aeb6a 100644</span><br><span>--- a/library/NS_Emulation.ttcnpp</span><br><span>+++ b/library/NS_Emulation.ttcnpp</span><br><span>@@ -183,7 +183,7 @@</span><br><span>          port NS_SP_PT NS_SP;</span><br><span> </span><br><span>             /* port towards the per-NSVC components */</span><br><span style="color: hsl(0, 100%, 40%);">-              port NS_PT NSVC;</span><br><span style="color: hsl(120, 100%, 40%);">+              port NSint_PT NSVC;</span><br><span> </span><br><span>              /* all of the NS configuration a user passes to us */</span><br><span>                var NSConfiguration g_config;</span><br><span>@@ -202,6 +202,43 @@</span><br><span>         type record of NsvcTableEntry NsvcTable;</span><br><span>     type record of integer ro_integer;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* internal port from the NS-VC point of view */</span><br><span style="color: hsl(120, 100%, 40%);">+      type port NSint_SP_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+               in      NsUnitdataRequest,</span><br><span style="color: hsl(120, 100%, 40%);">+                    SnsRequest,</span><br><span style="color: hsl(120, 100%, 40%);">+                   NsCtrlRequest;</span><br><span style="color: hsl(120, 100%, 40%);">+                out     NsUnitdataIndication,</span><br><span style="color: hsl(120, 100%, 40%);">+                 SnsIndication,</span><br><span style="color: hsl(120, 100%, 40%);">+                        NsStatusIndication;</span><br><span style="color: hsl(120, 100%, 40%);">+   } with { extension "internal" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* internal port from the NS-VCG point of view */</span><br><span style="color: hsl(120, 100%, 40%);">+     type port NSint_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+          in      ASP_Event,</span><br><span style="color: hsl(120, 100%, 40%);">+                    NsStatusIndication,</span><br><span style="color: hsl(120, 100%, 40%);">+                   SnsIndication,</span><br><span style="color: hsl(120, 100%, 40%);">+                        NsUnitdataIndication;</span><br><span style="color: hsl(120, 100%, 40%);">+         out     NsUnitdataRequest,</span><br><span style="color: hsl(120, 100%, 40%);">+                    SnsRequest,</span><br><span style="color: hsl(120, 100%, 40%);">+                   NsCtrlRequest;</span><br><span style="color: hsl(120, 100%, 40%);">+        } with { extension "internal" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Used by NS-VC to report reception of a SNS PDU to NS-VCG */</span><br><span style="color: hsl(120, 100%, 40%);">+        type record SnsIndication {</span><br><span style="color: hsl(120, 100%, 40%);">+           Nsvci           nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                PDU_NS          ns</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%);">+  /* Used by NS-VCG to request transmission of a SNS PDU via a NS-VC */</span><br><span style="color: hsl(120, 100%, 40%);">+ type record SnsRequest {</span><br><span style="color: hsl(120, 100%, 40%);">+              Nsvci           nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                PDU_NS          ns</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%);">+  type enumerated NsCtrlRequest {</span><br><span style="color: hsl(120, 100%, 40%);">+               StartAliveProcedure     (0)</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* add one NSVC (component and table entry */</span><br><span>        function f_nsvc_add(NSVCConfiguration nsvc_cfg) runs on NS_CT {</span><br><span>              var charstring nsvc_id := g_id & "-NSVCI" & int2str(nsvc_cfg.nsvci);</span><br><span>@@ -320,6 +357,9 @@</span><br><span>                 [] NSVC.receive(tr_NsUdInd(g_config.nsei, ?, ?)) -> value rx_nsudi {</span><br><span>                      NS_SP.send(rx_nsudi);</span><br><span>                        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           [g_config.handle_sns and g_config.role_sgsn] as_vcg_sns_sgsn();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>            [] NSVC.receive(tr_NsUdInd(?, ?, ?)) -> value rx_nsudi {</span><br><span>                  Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span>                                   log2str("Received UnitDataInd for invalid NSEI: ", rx_nsudi));</span><br><span>@@ -336,6 +376,92 @@</span><br><span>                      }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* generate a list of v4 + v6 endpoints based on the NSVConfigurations. This is not strictly</span><br><span style="color: hsl(120, 100%, 40%);">+   * accurate, as we should create a list of _endpoints_, while we actually create a list of</span><br><span style="color: hsl(120, 100%, 40%);">+     * NSVCs.  Those are only identical as long as our peer only implements one endpoint */</span><br><span style="color: hsl(120, 100%, 40%);">+       private function gen_sns_ip_elems(out template (omit) IP4_Elements v4_out,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      out template (omit) IP6_Elements v6_out) runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+            var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+                var IP4_Elements v4 := {};</span><br><span style="color: hsl(120, 100%, 40%);">+            var IP6_Elements v6 := {};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          for (i := 0; i < lengthof(g_config.nsvc); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    var NSVCConfiguration nsvc_cfg := g_config.nsvc[i];</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (not ischosen(nsvc_cfg.provider.ip)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (nsvc_cfg.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         v4 := v4 & { valueof(ts_SNS_IPv4(nsvc_cfg.provider.ip.local_ip,</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%);">+                     } else if (nsvc_cfg.provider.ip.address_family == AF_INET6) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         v6 := v6 & { valueof(ts_SNS_IPv6(nsvc_cfg.provider.ip.local_ip,</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%);">+                     }</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%);">+           /* we must not return empty lists, but 'omit' as otherwise we get wrong SNS IEs */</span><br><span style="color: hsl(120, 100%, 40%);">+            if (lengthof(v4) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      v4_out := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      v4_out := v4;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (lengthof(v6) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      v6_out := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      v6_out := v6;</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%);">+   /* simple IP Sub-Network Service responder for the SGSN side. This is not a full implementation</span><br><span style="color: hsl(120, 100%, 40%);">+        * of the protocol, merely sufficient to make the PCU/BSS side happy to proceed */</span><br><span style="color: hsl(120, 100%, 40%);">+    private altstep as_vcg_sns_sgsn() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+             var SnsIndication sind;</span><br><span style="color: hsl(120, 100%, 40%);">+               var NSVC_CT vc;</span><br><span style="color: hsl(120, 100%, 40%);">+               [] NSVC.receive(SnsIndication:{?, tr_SNS_SIZE(g_config.nsei)}) -> value sind sender vc {</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* blindly acknowledge whatever the PCU sends */</span><br><span style="color: hsl(120, 100%, 40%);">+                      NSVC.send(SnsRequest:{sind.nsvci, ts_SNS_SIZE_ACK(g_config.nsei, omit)}) to vc;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* FIXME: We assume our peer has only one endpoint */</span><br><span style="color: hsl(120, 100%, 40%);">+         [] NSVC.receive(SnsIndication:{?, tr_SNS_CONFIG(g_config.nsei, true,</span><br><span style="color: hsl(120, 100%, 40%);">+                              {tr_SNS_IPv4(g_config.nsvc[0].provider.ip.remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               g_config.nsvc[0].provider.ip.remote_udp_port)})})</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                            -> value sind sender vc {</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* blindly acknowledge whatever the PCU sends */</span><br><span style="color: hsl(120, 100%, 40%);">+                      NSVC.send(SnsRequest:{sind.nsvci, ts_SNS_CONFIG_ACK(g_config.nsei, omit)}) to vc;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* send a SNS-CONFIG in response and expect a SNS-CONFIG-ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+                       var template (omit) IP4_Elements v4;</span><br><span style="color: hsl(120, 100%, 40%);">+                  var template (omit) IP6_Elements v6;</span><br><span style="color: hsl(120, 100%, 40%);">+                  gen_sns_ip_elems(v4, v6);</span><br><span style="color: hsl(120, 100%, 40%);">+                     NSVC.send(SnsRequest:{sind.nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           ts_SNS_CONFIG(g_config.nsei, true, v4, v6)}) to vc;</span><br><span style="color: hsl(120, 100%, 40%);">+                     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+                 [] NSVC.receive(SnsIndication:{sind.nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    tr_SNS_CONFIG_ACK(g_config.nsei, omit)}) from vc {</span><br><span style="color: hsl(120, 100%, 40%);">+                            /* success */</span><br><span style="color: hsl(120, 100%, 40%);">+                         log("SNS Config succeeded. Sending Alive");</span><br><span style="color: hsl(120, 100%, 40%);">+                         /* inform all NS-VC that they are now considered alive */</span><br><span style="color: hsl(120, 100%, 40%);">+                             for (var integer i := 0; i < lengthof(g_nsvcs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        NSVC.send(NsCtrlRequest:StartAliveProcedure) to g_nsvcs[i].vc_conn;</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%);">+                     [] NSVC.receive(SnsIndication:{sind.nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    tr_SNS_CONFIG_ACK(g_config.nsei, ?)}) from vc {</span><br><span style="color: hsl(120, 100%, 40%);">+                               setverdict(fail, "Unexpected SNS-CONFIG-NACK");</span><br><span style="color: hsl(120, 100%, 40%);">+                             self.stop;</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%);">+             [] NSVC.receive(SnsIndication:{?, tr_SNS_CONFIG(g_config.nsei, false, ?)}) { /* ignore */}</span><br><span style="color: hsl(120, 100%, 40%);">+            [] NSVC.receive(SnsIndication:{?, tr_SNS_CONFIG(g_config.nsei, true, ?)}) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Unexpected SNS-CONFIG content");</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSVC.receive(SnsIndication:{?, tr_SNS_CONFIG(?, ?, ?)}) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(fail, "SNS-CONFIG from unexpected NSEI");</span><br><span style="color: hsl(120, 100%, 40%);">+                        self.stop;</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>  /***********************************************************************</span><br><span>      per-NSVC component. Exists once for each NS-VC in the NS-VCG</span><br><span>         ***********************************************************************/</span><br><span>@@ -349,7 +475,7 @@</span><br><span> #endif</span><br><span> </span><br><span>                /* port towards the NS_CT */</span><br><span style="color: hsl(0, 100%, 40%);">-            port NS_SP_PT NS_SP;</span><br><span style="color: hsl(120, 100%, 40%);">+          port NSint_SP_PT NS_SP;</span><br><span> </span><br><span>          /* configuration passed by the user */</span><br><span>               var NSVCConfiguration   g_nsvc_config;</span><br><span>@@ -454,7 +580,7 @@</span><br><span> </span><br><span>             [not g_config.handle_sns] as_handle_reset();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                [g_config.role_sgsn and g_config.handle_sns and ischosen(g_nsvc_config.provider.ip)] as_sns_sgsn();</span><br><span style="color: hsl(120, 100%, 40%);">+           [g_config.handle_sns and ischosen(g_nsvc_config.provider.ip)] as_nsvc_sns();</span><br><span> </span><br><span>             /* default case of handling unknown PDUs */</span><br><span>          [] NSCP.receive(PDU_NS: ?) -> value rf {</span><br><span>@@ -491,90 +617,32 @@</span><br><span>          }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* generate a list of v4 + v6 endpoints based on the NSVConfigurations. This is not strictly</span><br><span style="color: hsl(0, 100%, 40%);">-     * accurate, as we should create a list of _endpoints_, while we actually create a list of</span><br><span style="color: hsl(0, 100%, 40%);">-       * NSVCs.  Those are only identical as long as our peer only implements one endpoint */</span><br><span style="color: hsl(0, 100%, 40%);">- private function gen_sns_ip_elems(out template (omit) IP4_Elements v4_out,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        out template (omit) IP6_Elements v6_out) runs on NSVC_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-            var integer i;</span><br><span style="color: hsl(0, 100%, 40%);">-          var IP4_Elements v4 := {};</span><br><span style="color: hsl(0, 100%, 40%);">-              var IP6_Elements v6 := {};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              for (i := 0; i < lengthof(g_config.nsvc); i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      var NSVCConfiguration nsvc_cfg := g_config.nsvc[i];</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (not ischosen(nsvc_cfg.provider.ip)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (nsvc_cfg.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           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(0, 100%, 40%);">-                       } else if (nsvc_cfg.provider.ip.address_family == AF_INET6) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           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(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* we must not return empty lists, but 'omit' as otherwise we get wrong SNS IEs */</span><br><span style="color: hsl(0, 100%, 40%);">-              if (lengthof(v4) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        v4_out := omit;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        v4_out := v4;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (lengthof(v6) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        v6_out := omit;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        v6_out := v6;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* simple IP Sub-Network Service responder for the SGSN side. This is not a full implementation</span><br><span style="color: hsl(0, 100%, 40%);">-  * of the protocol, merely sufficient to make the PCU/BSS side happy to proceed */</span><br><span style="color: hsl(0, 100%, 40%);">-      private altstep as_sns_sgsn() runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       private altstep as_nsvc_sns() runs on NSVC_CT {</span><br><span>              var PDU_NS rf;</span><br><span style="color: hsl(120, 100%, 40%);">+                var SnsRequest sreq;</span><br><span>                 [] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span>                     log("Provider Link came up. Waiting for SNS Size");</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           [] NSCP.receive(tr_SNS_SIZE(g_config.nsei)) -> value rf {</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* blindly acknowledge whatever the PCU sends */</span><br><span style="color: hsl(0, 100%, 40%);">-                        NSCP.send(ts_SNS_SIZE_ACK(g_config.nsei, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+              /* pass up to NS-VCG */</span><br><span style="color: hsl(120, 100%, 40%);">+               [] NSCP.receive(tr_SNS(g_config.nsei)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+                       NS_SP.send(SnsIndication:{g_nsvc_config.nsvci, rf});</span><br><span>                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NSCP.receive(tr_SNS_SIZE(?)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       setverdict(fail, "SNS-SIZE from unexpected NSEI");</span><br><span style="color: hsl(120, 100%, 40%);">+          [] NSCP.receive(tr_SNS(?)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "SNS from unexpected NSEI: ", rf);</span><br><span>                        self.stop;</span><br><span>           }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NSCP.receive(tr_SNS_CONFIG(g_config.nsei, true,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  {tr_SNS_IPv4(g_nsvc_config.provider.ip.remote_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                            g_nsvc_config.provider.ip.remote_udp_port)})) -> value rf {</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* blindly acknowledge whatever the PCU sends */</span><br><span style="color: hsl(0, 100%, 40%);">-                        NSCP.send(ts_SNS_CONFIG_ACK(g_config.nsei, omit));</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* send a SNS-CONFIG in response and expect a SNS-CONFIG-ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-                 var template (omit) IP4_Elements v4;</span><br><span style="color: hsl(0, 100%, 40%);">-                    var template (omit) IP6_Elements v6;</span><br><span style="color: hsl(0, 100%, 40%);">-                    gen_sns_ip_elems(v4, v6);</span><br><span style="color: hsl(0, 100%, 40%);">-                       NSCP.send(ts_SNS_CONFIG(g_config.nsei, true, v4, v6));</span><br><span style="color: hsl(0, 100%, 40%);">-                  alt {</span><br><span style="color: hsl(0, 100%, 40%);">-                   [] NSCP.receive(tr_SNS_CONFIG_ACK(g_config.nsei, omit)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               /* success */</span><br><span style="color: hsl(0, 100%, 40%);">-                           log("SNS Config succeeded. Sending Alive");</span><br><span style="color: hsl(0, 100%, 40%);">-                           f_change_state(NSVC_S_ALIVE_UNBLOCKED);</span><br><span style="color: hsl(0, 100%, 40%);">-                         f_sendAlive();</span><br><span style="color: hsl(0, 100%, 40%);">-                          Tns_test.start;</span><br><span style="color: hsl(0, 100%, 40%);">-                         }</span><br><span style="color: hsl(0, 100%, 40%);">-                       [] NSCP.receive(tr_SNS_CONFIG_ACK(g_config.nsei, ?)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          setverdict(fail, "Unexpected SNS-CONFIG-NACK");</span><br><span style="color: hsl(0, 100%, 40%);">-                               self.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NS_SP.receive(SnsRequest:{g_nsvc_config.nsvci, ?}) -> value sreq {</span><br><span style="color: hsl(120, 100%, 40%);">+                      NSCP.send(sreq.ns);</span><br><span>          }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NSCP.receive(tr_SNS_CONFIG(g_config.nsei, false, ?)) { /* ignore */}</span><br><span style="color: hsl(0, 100%, 40%);">-         [] NSCP.receive(tr_SNS_CONFIG(g_config.nsei, true, ?)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        setverdict(fail, "Unexpected SNS-CONFIG content");</span><br><span style="color: hsl(120, 100%, 40%);">+          [] NS_SP.receive(SnsRequest:?) -> value sreq {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "Unexpected SNS from NSVC: ", sreq);</span><br><span>                      self.stop;</span><br><span>           }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NSCP.receive(tr_SNS_CONFIG(?, ?, ?)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       setverdict(fail, "SNS-CONFIG from unexpected NSEI");</span><br><span style="color: hsl(0, 100%, 40%);">-                  self.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+            [] NS_SP.receive(NsCtrlRequest:StartAliveProcedure) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_change_state(NSVC_S_ALIVE_UNBLOCKED);</span><br><span style="color: hsl(120, 100%, 40%);">+                       f_sendAlive();</span><br><span style="color: hsl(120, 100%, 40%);">+                        Tns_test.start;</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span>diff --git a/library/Osmocom_Gb_Types.ttcn b/library/Osmocom_Gb_Types.ttcn</span><br><span>index f97b9b0..9065097 100644</span><br><span>--- a/library/Osmocom_Gb_Types.ttcn</span><br><span>+++ b/library/Osmocom_Gb_Types.ttcn</span><br><span>@@ -531,6 +531,10 @@</span><br><span>                var template ListofIP4Elements r;</span><br><span>            if (istemplatekind(elem, "omit")) {</span><br><span>                        return omit;</span><br><span style="color: hsl(120, 100%, 40%);">+          } else if (istemplatekind(elem, "*")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     return *;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (istemplatekind(elem, "?")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     return ?;</span><br><span>            } else {</span><br><span>                     r := {</span><br><span>                               iEI := '05'O,</span><br><span>@@ -568,6 +572,8 @@</span><br><span>                  return omit;</span><br><span>                 } else if (istemplatekind(elem, "*")) {</span><br><span>                    return *;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (istemplatekind(elem, "?")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     return ?;</span><br><span>            } else {</span><br><span>                     r := {</span><br><span>                               iEI := '06'O,</span><br><span>@@ -722,6 +728,14 @@</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template PDU_NS tr_SNS(template Nsei nsei) := ( tr_SNS_SIZE(nsei),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    tr_SNS_SIZE_ACK(nsei, *),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     tr_SNS_CONFIG(nsei, ?, *, *),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 tr_SNS_CONFIG_ACK(nsei, *),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   tr_SNS_ADD(nsei, ?, *, *),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    tr_SNS_DEL(nsei, ?, *, *),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    tr_SNS_CHG_WEIGHT(nsei, ?, *, *),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     tr_SNS_ACK(nsei, ?, *, *, *) )</span><br><span> </span><br><span> </span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/22304">change 22304</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/+/22304"/><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: Ie0f4342a0346952d7c50ac36900148e311d4c782 </div>
<div style="display:none"> Gerrit-Change-Number: 22304 </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>