<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23572">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">NS_Emulation: Implement minimal PCU-side SNS functionality<br><br>Using this code, we can run a TTCN3 test using NS_Emulation in<br>IP-SNS mode.  It only covers the most basic cases but works for simple<br>scenarios.<br><br>Change-Id: Id1fb0fcb7a497a9614e82beb8a2c64b5af88150d<br>---<br>M library/NS_Emulation.ttcnpp<br>1 file changed, 79 insertions(+), 0 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/72/23572/1</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 d58dc45..b5fc807 100644</span><br><span>--- a/library/NS_Emulation.ttcnpp</span><br><span>+++ b/library/NS_Emulation.ttcnpp</span><br><span>@@ -413,6 +413,9 @@</span><br><span>                     f_nsvc_add(nsvc_cfg);</span><br><span>                }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         if (g_config.handle_sns and not g_config.role_sgsn) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_sns_outbound_size_config();</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span>            while (true) {</span><br><span>                       alt {</span><br><span>                        [] as_ns_common() {}</span><br><span>@@ -473,6 +476,7 @@</span><br><span>                   }</span><br><span> </span><br><span>                [g_config.handle_sns and g_config.role_sgsn] as_vcg_sns_sgsn();</span><br><span style="color: hsl(120, 100%, 40%);">+               [g_config.handle_sns and not g_config.role_sgsn] as_vcg_sns_pcu();</span><br><span> </span><br><span>               [] NSVC.receive(tr_NsUdInd(?, ?, ?)) -> value rx_nsudi {</span><br><span>                  Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span>@@ -545,6 +549,81 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* perform an outbound SNS-SIZE + SNS-CONFIG */</span><br><span style="color: hsl(120, 100%, 40%);">+       private function f_sns_outbound_size_config(integer idx := 0) runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+         var NSVCConfiguration nsvc_cfg := g_config.nsvc[idx];</span><br><span style="color: hsl(120, 100%, 40%);">+         var NSVC_CT vc;</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%);">+                 NSVC.send(SnsRequest:{nsvc_cfg.nsvci, ts_SNS_SIZE(g_config.nsei, rst_flag := true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      max_nsvcs := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       num_v4 := 1, num_v6 := omit)});</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      NSVC.send(SnsRequest:{nsvc_cfg.nsvci, ts_SNS_SIZE(g_config.nsei, rst_flag := true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      max_nsvcs := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       num_v4 := omit, num_v6 := 1)});</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* expect SIZE-ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+         alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] NSVC.receive(SnsIndication:{?, tr_SNS_SIZE_ACK(g_config.nsei, omit)}) -> sender vc;</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSVC.receive(NsStatusIndication:?) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</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:{nsvc_cfg.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%);">+         [] as_ns_common_status() {</span><br><span style="color: hsl(120, 100%, 40%);">+                    repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSVC.receive(SnsIndication:{?,</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("Outbound SNS Config succeeded.");</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSVC.receive(SnsIndication:{?,</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* simple IP Sub-Network Service responder for the PCU/BSS side. This is not a full implementation</span><br><span style="color: hsl(120, 100%, 40%);">+     * of the protocol, merely sufficient to make the SGSN side happy to proceed */</span><br><span style="color: hsl(120, 100%, 40%);">+       private altstep as_vcg_sns_pcu() 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%);">+</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 SGSN 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%);">+                     log("Inbound SNS Config succeeded.");</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* switch to "alive" state already before sending the SNS-CONFIG, as otherwise</span><br><span style="color: hsl(120, 100%, 40%);">+                       * there would be a race condition between internally performing the state change</span><br><span style="color: hsl(120, 100%, 40%);">+                      * of all related NS-VCs and the first incoming NS-PDU after SNS-CONFIG-ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+                        f_broadcast_ns_ctrl(NsCtrlRequest:ForceAliveState);</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%);">+                     f_broadcast_ns_ctrl(NsCtrlRequest:StartAliveProcedure);</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 style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* simple IP Sub-Network Service responder for the SGSN side. This is not a full implementation</span><br><span>       * of the protocol, merely sufficient to make the PCU/BSS side happy to proceed */</span><br><span>   private altstep as_vcg_sns_sgsn() runs on NS_CT {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23572">change 23572</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/+/23572"/><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: Id1fb0fcb7a497a9614e82beb8a2c64b5af88150d </div>
<div style="display:none"> Gerrit-Change-Number: 23572 </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>