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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">NS_Emulation: Support multiple NS-VC within one NSE (NS-VCG)<br><br>This is something we need to simulate more complex scenarios,<br>particularly in the context of frame relay.<br><br>Change-Id: If1220852785853f8a5d8de183d5053ddd6ccb958<br>---<br>M fr-net/FRNET_Tests.ttcn<br>M fr/FR_Tests.ttcn<br>M gbproxy/GBProxy_Tests.cfg<br>M gbproxy/GBProxy_Tests.ttcn<br>M library/BSSGP_Emulation.ttcnpp<br>M library/NS_Emulation.ttcnpp<br>M library/NS_Provider_FR.ttcn<br>M library/NS_Provider_IPL4.ttcn<br>M library/RAW_NS.ttcn<br>M pcu/PCU_Tests.cfg<br>M pcu/PCU_Tests.ttcn<br>M pcu/PCU_Tests_NS.ttcn<br>M pcu/PCU_Tests_SNS.cfg<br>M pcu/PCU_Tests_SNS.ttcn<br>M pcu/PCU_Tests_SNSv6.cfg<br>M pcu/SGSN_Components.ttcn<br>M sgsn/SGSN_Tests.cfg<br>M sgsn/SGSN_Tests.ttcn<br>18 files changed, 598 insertions(+), 351 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/fr-net/FRNET_Tests.ttcn b/fr-net/FRNET_Tests.ttcn</span><br><span>index 010ca50..593ca77 100644</span><br><span>--- a/fr-net/FRNET_Tests.ttcn</span><br><span>+++ b/fr-net/FRNET_Tests.ttcn</span><br><span>@@ -10,16 +10,20 @@</span><br><span> modulepar {</span><br><span>         NSConfigurations mp_nsconfig := {</span><br><span>            {</span><br><span style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           fr := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 netdev := "hdlc2",</span><br><span style="color: hsl(0, 100%, 40%);">-                                    dlci := 123</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%);">-                      nsvci := 123,</span><br><span>                        nsei := 123,</span><br><span>                         role_sgsn := true,</span><br><span style="color: hsl(0, 100%, 40%);">-                      handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         fr := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       netdev := "hdlc2",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  dlci := 123</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%);">+                                    nsvci := 123</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/fr/FR_Tests.ttcn b/fr/FR_Tests.ttcn</span><br><span>index a7b8a97..d2d184f 100644</span><br><span>--- a/fr/FR_Tests.ttcn</span><br><span>+++ b/fr/FR_Tests.ttcn</span><br><span>@@ -10,16 +10,20 @@</span><br><span> modulepar {</span><br><span>    NSConfigurations mp_nsconfig := {</span><br><span>            {</span><br><span style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           fr := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 netdev := "hdlc1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                    dlci := 123</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%);">-                      nsvci := 123,</span><br><span>                        nsei := 123,</span><br><span>                         role_sgsn := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         fr := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       netdev := "hdlc1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  dlci := 123</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%);">+                                    nsvci := 123</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/gbproxy/GBProxy_Tests.cfg b/gbproxy/GBProxy_Tests.cfg</span><br><span>index bbadf2b..a9e209c 100644</span><br><span>--- a/gbproxy/GBProxy_Tests.cfg</span><br><span>+++ b/gbproxy/GBProxy_Tests.cfg</span><br><span>@@ -20,31 +20,43 @@</span><br><span> </span><br><span> GBProxy_Tests.mp_nsconfig_pcu := {</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-               provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                         local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                              remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+            handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               local_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%);">+                                    }</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span>                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               },</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>    },</span><br><span>   {</span><br><span style="color: hsl(0, 100%, 40%);">-               provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                         local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                              remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+            handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               local_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%);">+                                    }</span><br><span style="color: hsl(120, 100%, 40%);">+                             },</span><br><span>                   }</span><br><span style="color: hsl(0, 100%, 40%);">-               },</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>    },</span><br><span>   {</span><br><span style="color: hsl(0, 100%, 40%);">-               provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                         local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                              remote_ip := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+            handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               local_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%);">+                                    }</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span>                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               },</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span>diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn</span><br><span>index 10728b2..580d567 100644</span><br><span>--- a/gbproxy/GBProxy_Tests.ttcn</span><br><span>+++ b/gbproxy/GBProxy_Tests.ttcn</span><br><span>@@ -41,66 +41,82 @@</span><br><span>        /* IP/port on which we run our internal GSUP/HLR emulation */</span><br><span>        NSConfigurations_SGSN mp_nsconfig_sgsn := {</span><br><span>          {</span><br><span style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      local_udp_port := 7777,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      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(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       },</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsvci := 101,</span><br><span>                        nsei := 101,</span><br><span>                         role_sgsn := true,</span><br><span style="color: hsl(0, 100%, 40%);">-                      handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    local_udp_port := 7777,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     remote_ip := "127.0.0.1"</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%);">+                                    nsvci := 101</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>   NSConfigurations_PCU mp_nsconfig_pcu := {</span><br><span>            {</span><br><span style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      local_udp_port := 21010,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      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(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       },</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsvci := 97,</span><br><span>                         nsei := 96,</span><br><span>                  role_sgsn := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    local_udp_port := 21010,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     remote_ip := "127.0.0.1"</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%);">+                                    nsvci := 97</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 style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      local_udp_port := 21011,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      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(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       },</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsvci := 98,</span><br><span>                         nsei := 97,</span><br><span>                  role_sgsn := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    local_udp_port := 21011,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     remote_ip := "127.0.0.1"</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%);">+                                    nsvci := 98</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 style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      local_udp_port := 21012,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      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(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       },</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsvci := 99,</span><br><span>                         nsei := 98,</span><br><span>                  role_sgsn := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    local_udp_port := 21012,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     remote_ip := "127.0.0.1"</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%);">+                                    nsvci := 99</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/library/BSSGP_Emulation.ttcnpp b/library/BSSGP_Emulation.ttcnpp</span><br><span>index 81b3c5b..87b35ac 100644</span><br><span>--- a/library/BSSGP_Emulation.ttcnpp</span><br><span>+++ b/library/BSSGP_Emulation.ttcnpp</span><br><span>@@ -359,7 +359,7 @@</span><br><span> /* We are in BVC_S_WAIT_NS_ALIVE_UNBLOCKED (only happens in BSS role) */</span><br><span> altstep as_sig_wait_ns_alive_unblocked() runs on BSSGP_CT {</span><br><span>       var NsStatusIndication nsi;</span><br><span style="color: hsl(0, 100%, 40%);">-     [] BSCP.receive(NsStatusIndication:{?,?, complement (NSE_S_ALIVE_UNBLOCKED), NSE_S_ALIVE_UNBLOCKED}) -> value nsi {</span><br><span style="color: hsl(120, 100%, 40%);">+        [] BSCP.receive(NsStatusIndication:{?,?, complement (NSVC_S_ALIVE_UNBLOCKED), NSVC_S_ALIVE_UNBLOCKED}) -> value nsi {</span><br><span>             /* if we just became NS-unblocked, send a BCC-RESET */</span><br><span>               if (g_cfg.sgsn_role == false) {</span><br><span>                      BSCP.send(f_BnsUdReq(ts_BVC_RESET(BSSGP_CAUSE_OM_INTERVENTION, 0, omit), 0));</span><br><span>diff --git a/library/NS_Emulation.ttcnpp b/library/NS_Emulation.ttcnpp</span><br><span>index 4d3db4c..e286945 100644</span><br><span>--- a/library/NS_Emulation.ttcnpp</span><br><span>+++ b/library/NS_Emulation.ttcnpp</span><br><span>@@ -10,6 +10,7 @@</span><br><span>  */</span><br><span> </span><br><span> module NS_Emulation {</span><br><span style="color: hsl(120, 100%, 40%);">+        import from Misc_Helpers all;</span><br><span>        import from NS_Types all;</span><br><span>    import from BSSGP_Types all;</span><br><span>         import from Osmocom_Types all;</span><br><span>@@ -27,8 +28,18 @@</span><br><span>          PDU_BSSGP       bssgp optional</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   template NsUnitdataRequest t_NsUdReq(template Nsei nsei, template BssgpBvci bvci, template octetstring sdu,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          template PDU_BSSGP bssgp) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   template NsUnitdataRequest tr_NsUdReq(template Nsei nsei, template BssgpBvci bvci, template octetstring sdu,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        template PDU_BSSGP bssgp) := {</span><br><span style="color: hsl(120, 100%, 40%);">+          bvci := bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+         nsei := nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+         sdu := sdu,</span><br><span style="color: hsl(120, 100%, 40%);">+           bssgp := bssgp</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%);">+   template (value) NsUnitdataRequest ts_NsUdReq(template (value) Nsei nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (value) BssgpBvci bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      template (omit) octetstring sdu,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      template (omit) PDU_BSSGP bssgp) := {</span><br><span>          bvci := bvci,</span><br><span>                nsei := nsei,</span><br><span>                sdu := sdu,</span><br><span>@@ -42,7 +53,16 @@</span><br><span>             PDU_BSSGP       bssgp optional</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   template NsUnitdataIndication t_NsUdInd(Nsei nsei, BssgpBvci bvci, octetstring sdu) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      template (present) NsUnitdataIndication tr_NsUdInd(template (present) Nsei nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         template (present) BssgpBvci bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    template octetstring sdu) := {</span><br><span style="color: hsl(120, 100%, 40%);">+             bvci := bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+         nsei := nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+         sdu := sdu,</span><br><span style="color: hsl(120, 100%, 40%);">+           bssgp := ?</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%);">+   template (value) NsUnitdataIndication ts_NsUdInd(Nsei nsei, BssgpBvci bvci, octetstring sdu) := {</span><br><span>            bvci := bvci,</span><br><span>                nsei := nsei,</span><br><span>                sdu := sdu,</span><br><span>@@ -52,22 +72,33 @@</span><br><span>    type record NsStatusIndication {</span><br><span>             Nsei            nsei,</span><br><span>                Nsvci           nsvci,</span><br><span style="color: hsl(0, 100%, 40%);">-          NseState        old_state,</span><br><span style="color: hsl(0, 100%, 40%);">-              NseState        new_state</span><br><span style="color: hsl(120, 100%, 40%);">+             NsvcState       old_state,</span><br><span style="color: hsl(120, 100%, 40%);">+            NsvcState       new_state</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   template NsStatusIndication t_NsStsInd(Nsei nsei, Nsvci nsvci, NseState old_state, NseState state) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       template (present) NsStatusIndication tr_NsStsInd(template (present) Nsei nsei := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    template (present) Nsvci nsvci := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          template (present) NsvcState old_state := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          template (present) NsvcState state := ?) := {</span><br><span>              nsei := nsei,</span><br><span>                nsvci := nsvci,</span><br><span>              old_state := old_state,</span><br><span>              new_state := state</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   type enumerated NseState {</span><br><span style="color: hsl(0, 100%, 40%);">-              NSE_S_DEAD_BLOCKED,</span><br><span style="color: hsl(0, 100%, 40%);">-             NSE_S_WAIT_RESET,</span><br><span style="color: hsl(0, 100%, 40%);">-               NSE_S_ALIVE_BLOCKED,</span><br><span style="color: hsl(0, 100%, 40%);">-            NSE_S_ALIVE_UNBLOCKED</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       template (value) NsStatusIndication ts_NsStsInd(Nsei nsei, Nsvci nsvci, NsvcState old_state, NsvcState state) := {</span><br><span style="color: hsl(120, 100%, 40%);">+            nsei := nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+         nsvci := nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+               old_state := old_state,</span><br><span style="color: hsl(120, 100%, 40%);">+               new_state := state</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 NsvcState {</span><br><span style="color: hsl(120, 100%, 40%);">+           NSVC_S_DEAD_BLOCKED,</span><br><span style="color: hsl(120, 100%, 40%);">+          NSVC_S_WAIT_RESET,</span><br><span style="color: hsl(120, 100%, 40%);">+            NSVC_S_ALIVE_BLOCKED,</span><br><span style="color: hsl(120, 100%, 40%);">+         NSVC_S_ALIVE_UNBLOCKED</span><br><span>       }</span><br><span> </span><br><span>        /* port from our (internal) point of view */</span><br><span>@@ -85,31 +116,6 @@</span><br><span>           out     NsUnitdataRequest;</span><br><span>   } with { extension "internal" };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  function NSStart(NSConfiguration init_config, charstring id := testcasename()) runs on NS_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-          config := init_config;</span><br><span style="color: hsl(0, 100%, 40%);">-          f_init(id & "-NSemu");</span><br><span style="color: hsl(0, 100%, 40%);">-            f_ScanEvents();</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%);">-       private function f_init(charstring id) runs on NS_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-          var Result res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         if (ischosen(config.provider.ip)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     /* Connect the UDP socket */</span><br><span style="color: hsl(0, 100%, 40%);">-                    vc_NSP_IP := NS_Provider_IPL4_CT.create(id & "-provIP");</span><br><span style="color: hsl(0, 100%, 40%);">-                  connect(self:NSCP, vc_NSP_IP:NSE);</span><br><span style="color: hsl(0, 100%, 40%);">-                      vc_NSP_IP.start(NS_Provider_IPL4.main(config, id));</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef NS_EMULATION_FR</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (ischosen(config.provider.fr)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      vc_NSP_FR := NS_Provider_FR_CT.create(id & "-provFR");</span><br><span style="color: hsl(0, 100%, 40%);">-                    connect(self:NSCP, vc_NSP_FR:NSE);</span><br><span style="color: hsl(0, 100%, 40%);">-                      vc_NSP_FR.start(NS_Provider_FR.main(config, id));</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</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%);">-               f_change_state(NSE_S_DEAD_BLOCKED);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    type component NS_Provider_CT {</span><br><span>              /* upper port, facing to NS_Emulation:NSCP */</span><br><span>                port NS_PROVIDER_PT NSE;</span><br><span>@@ -129,7 +135,154 @@</span><br><span>             inout PDU_NS, NS_Provider_Evt;</span><br><span>       } with { extension "internal" };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        type record NSVCConfigurationIP {</span><br><span style="color: hsl(120, 100%, 40%);">+             AddressFamily address_family,</span><br><span style="color: hsl(120, 100%, 40%);">+         PortNumber local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+            charstring local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+          PortNumber remote_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+           charstring remote_ip</span><br><span style="color: hsl(120, 100%, 40%);">+  };</span><br><span style="color: hsl(120, 100%, 40%);">+    type record NSVCConfigurationFR {</span><br><span style="color: hsl(120, 100%, 40%);">+             charstring netdev,      /* HDLC net-device for AF_PACKET socket */</span><br><span style="color: hsl(120, 100%, 40%);">+            integer dlci</span><br><span style="color: hsl(120, 100%, 40%);">+  };</span><br><span style="color: hsl(120, 100%, 40%);">+    type union NSVCConfigurationP {</span><br><span style="color: hsl(120, 100%, 40%);">+               NSVCConfigurationIP ip,</span><br><span style="color: hsl(120, 100%, 40%);">+               NSVCConfigurationFR fr</span><br><span style="color: hsl(120, 100%, 40%);">+        };</span><br><span style="color: hsl(120, 100%, 40%);">+    type record NSVCConfiguration {</span><br><span style="color: hsl(120, 100%, 40%);">+               NSVCConfigurationP provider,</span><br><span style="color: hsl(120, 100%, 40%);">+          Nsvci nsvci</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+    type record of NSVCConfiguration NSVCConfigurations;</span><br><span style="color: hsl(120, 100%, 40%);">+  type record NSConfiguration {</span><br><span style="color: hsl(120, 100%, 40%);">+         Nsvci nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+           boolean role_sgsn,</span><br><span style="color: hsl(120, 100%, 40%);">+            boolean handle_sns,</span><br><span style="color: hsl(120, 100%, 40%);">+           NSVCConfigurations nsvc</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+       * per NS-VCG component. Exists once per [peer of] NSE</span><br><span style="color: hsl(120, 100%, 40%);">+         ***********************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  type component NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* NS-User SAP towards the user */</span><br><span style="color: hsl(120, 100%, 40%);">+            port NS_SP_PT NS_SP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* port towards the per-NSVC components */</span><br><span style="color: hsl(120, 100%, 40%);">+            port NS_PT NSVC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* all of the NS configuration a user passes to us */</span><br><span style="color: hsl(120, 100%, 40%);">+         var NSConfiguration g_config;</span><br><span style="color: hsl(120, 100%, 40%);">+         var charstring g_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* references to the per-NSVC components */</span><br><span style="color: hsl(120, 100%, 40%);">+           var NsvcTable g_nsvcs := {};</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 record NsvcTableEntry {</span><br><span style="color: hsl(120, 100%, 40%);">+          Nsvci nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+          NSVC_CT vc_conn,</span><br><span style="color: hsl(120, 100%, 40%);">+              NsvcState state</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    type record of NsvcTableEntry NsvcTable;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* add one NSVC (component and table entry */</span><br><span style="color: hsl(120, 100%, 40%);">+ function f_nsvc_add(NSVCConfiguration nsvc_cfg) runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+               var charstring nsvc_id := g_id & "-NSVCI" & int2str(nsvc_cfg.nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+                var NsvcTableEntry te;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              te.nsvci := nsvc_cfg.nsvci;</span><br><span style="color: hsl(120, 100%, 40%);">+           te.vc_conn := NSVC_CT.create(nsvc_id);</span><br><span style="color: hsl(120, 100%, 40%);">+                te.state := NSVC_S_DEAD_BLOCKED;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            connect(self:NSVC, te.vc_conn:NS_SP);</span><br><span style="color: hsl(120, 100%, 40%);">+         te.vc_conn.start(NSVCStart(nsvc_cfg, g_config, nsvc_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           g_nsvcs := g_nsvcs & { te };</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%);">+   function f_nsvc_find_idx(Nsvci nsvci) runs on NS_CT return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+          var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+                for (i := 0; i < lengthof(g_nsvcs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (g_nsvcs[i].nsvci == nsvci) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              return 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%);">+             return -1;</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%);">+   function f_nsvc_find(Nsvci nsvci) runs on NS_CT return NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+              var integer i := f_nsvc_find_idx(nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (i < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       return null;</span><br><span style="color: hsl(120, 100%, 40%);">+          } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   function f_nsvc_update_state(Nsvci nsvci, NsvcState state) runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+            var integer i := f_nsvc_find_idx(nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (i < 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%);">+             g_nsvcs[i].state := state;</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%);">+   function NSStart(NSConfiguration init_config, charstring id := testcasename()) runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+                g_config := init_config;</span><br><span style="color: hsl(120, 100%, 40%);">+              g_id := id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* iterate over list of NS-VCs and start per-NSVC components */</span><br><span style="color: hsl(120, 100%, 40%);">+               for (var integer 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%);">+                   f_nsvc_add(nsvc_cfg);</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%);">+           while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        alt {</span><br><span style="color: hsl(120, 100%, 40%);">+                 [] as_ns_common() {}</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%);">+   private altstep as_ns_common() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+                var NsStatusIndication rx_nssi;</span><br><span style="color: hsl(120, 100%, 40%);">+               var NsUnitdataIndication rx_nsudi;</span><br><span style="color: hsl(120, 100%, 40%);">+            var NsUnitdataRequest rx_nsudr;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* pass from NS-VCs up to user */</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSVC.receive(tr_NsStsInd(g_config.nsei)) -> value rx_nssi {</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_nsvc_update_state(rx_nssi.nsvci, rx_nssi.new_state);</span><br><span style="color: hsl(120, 100%, 40%);">+                        NS_SP.send(rx_nssi);</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSVC.receive(tr_NsStsInd) -> value rx_nssi {</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("Received NsStatusInd for invalid NSEI: ", rx_nssi));</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSVC.receive(tr_NsUdInd(g_config.nsei, ?, ?)) -> value rx_nsudi {</span><br><span style="color: hsl(120, 100%, 40%);">+                       NS_SP.send(rx_nsudi);</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSVC.receive(tr_NsUdInd(?, ?, ?)) -> value rx_nsudi {</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("Received UnitDataInd for invalid NSEI: ", rx_nsudi));</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* from user down to NS-VC */</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%);">+                   /* FIXME: load distribution function */</span><br><span style="color: hsl(120, 100%, 40%);">+                       NSVC.send(rx_nsudr) to g_nsvcs[0].vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NS_SP.receive(tr_NsUdReq(?, ?, ?, *)) -> value rx_nsudr {</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("Received NsUnitdataReq for invalid NSEI: ", rx_nsudr));</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%);">+       per-NSVC component. Exists once for each NS-VC in the NS-VCG</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 component NSVC_CT {</span><br><span>             /* UDP port towards the bottom (IUT) */</span><br><span>              port NS_PROVIDER_PT NSCP;</span><br><span>            var NS_Provider_IPL4_CT vc_NSP_IP;</span><br><span>@@ -137,12 +290,15 @@</span><br><span>           var NS_Provider_FR_CT vc_NSP_FR;</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          /* NS-User SAP towards the user */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* port towards the NS_CT */</span><br><span>                 port NS_SP_PT NS_SP;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                var NSConfiguration config;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* configuration passed by the user */</span><br><span style="color: hsl(120, 100%, 40%);">+                var NSVCConfiguration   g_nsvc_config;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* we cannot access the NS_CT.config and hence need to copy those */</span><br><span style="color: hsl(120, 100%, 40%);">+          var NSConfiguration     g_config;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           var NseState            g_state := NSE_S_DEAD_BLOCKED;</span><br><span style="color: hsl(120, 100%, 40%);">+                var NsvcState           vc_state := NSVC_S_DEAD_BLOCKED;</span><br><span> </span><br><span>                 timer Tns_alive := 3.0;</span><br><span>              timer Tns_test := 10.0;</span><br><span>@@ -150,65 +306,68 @@</span><br><span>              timer Tns_reset := 10.0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   type record NSConfigurationIP {</span><br><span style="color: hsl(0, 100%, 40%);">-         AddressFamily address_family,</span><br><span style="color: hsl(0, 100%, 40%);">-           PortNumber local_udp_port,</span><br><span style="color: hsl(0, 100%, 40%);">-              charstring local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-            PortNumber remote_udp_port,</span><br><span style="color: hsl(0, 100%, 40%);">-             charstring remote_ip</span><br><span style="color: hsl(0, 100%, 40%);">-    };</span><br><span style="color: hsl(0, 100%, 40%);">-      type record NSConfigurationFR {</span><br><span style="color: hsl(0, 100%, 40%);">-         charstring netdev,      /* HDLC net-device for AF_PACKET socket */</span><br><span style="color: hsl(0, 100%, 40%);">-              integer dlci</span><br><span style="color: hsl(0, 100%, 40%);">-    };</span><br><span style="color: hsl(0, 100%, 40%);">-      type union NSConfigurationP {</span><br><span style="color: hsl(0, 100%, 40%);">-           NSConfigurationIP ip,</span><br><span style="color: hsl(0, 100%, 40%);">-           NSConfigurationFR fr</span><br><span style="color: hsl(0, 100%, 40%);">-    };</span><br><span style="color: hsl(0, 100%, 40%);">-      type record NSConfiguration {</span><br><span style="color: hsl(0, 100%, 40%);">-           NSConfigurationP provider,</span><br><span style="color: hsl(0, 100%, 40%);">-              Nsvci nsvci,</span><br><span style="color: hsl(0, 100%, 40%);">-            Nsvci nsei,</span><br><span style="color: hsl(0, 100%, 40%);">-             boolean role_sgsn,</span><br><span style="color: hsl(0, 100%, 40%);">-              boolean handle_sns</span><br><span style="color: hsl(120, 100%, 40%);">+    function NSVCStart(NSVCConfiguration init_config, NSConfiguration init_g_config, charstring id := testcasename()) runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+           g_nsvc_config := init_config;</span><br><span style="color: hsl(120, 100%, 40%);">+         g_config := init_g_config;</span><br><span style="color: hsl(120, 100%, 40%);">+            f_init(id & "-NSVCemu" & int2str(g_nsvc_config.nsvci));</span><br><span style="color: hsl(120, 100%, 40%);">+             f_ScanEvents();</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private function f_change_state(NseState new_state) runs on NS_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-             var NseState old_state := g_state;</span><br><span style="color: hsl(0, 100%, 40%);">-              g_state := new_state;</span><br><span style="color: hsl(0, 100%, 40%);">-           log("NS State Transition: ", old_state, " -> ", new_state);</span><br><span style="color: hsl(0, 100%, 40%);">-              NS_SP.send(t_NsStsInd(config.nsei, config.nsvci, old_state, new_state));</span><br><span style="color: hsl(120, 100%, 40%);">+      private function f_init(charstring id) runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+              var Result res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             if (ischosen(g_nsvc_config.provider.ip)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* Connect the UDP socket */</span><br><span style="color: hsl(120, 100%, 40%);">+                  vc_NSP_IP := NS_Provider_IPL4_CT.create(id & "-provIP");</span><br><span style="color: hsl(120, 100%, 40%);">+                        connect(self:NSCP, vc_NSP_IP:NSE);</span><br><span style="color: hsl(120, 100%, 40%);">+                    vc_NSP_IP.start(NS_Provider_IPL4.main(g_nsvc_config, g_config, id));</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef NS_EMULATION_FR</span><br><span style="color: hsl(120, 100%, 40%);">+          } else if (ischosen(g_nsvc_config.provider.fr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     vc_NSP_FR := NS_Provider_FR_CT.create(id & "-provFR");</span><br><span style="color: hsl(120, 100%, 40%);">+                  connect(self:NSCP, vc_NSP_FR:NSE);</span><br><span style="color: hsl(120, 100%, 40%);">+                    vc_NSP_FR.start(NS_Provider_FR.main(g_nsvc_config, g_config, id));</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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%);">+           f_change_state(NSVC_S_DEAD_BLOCKED);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private function f_sendReset() runs on NS_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-          NSCP.send(ts_NS_RESET(NS_CAUSE_OM_INTERVENTION, config.nsvci, config.nsei));</span><br><span style="color: hsl(120, 100%, 40%);">+  private function f_change_state(NsvcState new_state) runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+                var NsvcState old_state := vc_state;</span><br><span style="color: hsl(120, 100%, 40%);">+          vc_state := new_state;</span><br><span style="color: hsl(120, 100%, 40%);">+                log("NSVC ", g_nsvc_config.nsvci, " State Transition: ", old_state, " -> ", new_state);</span><br><span style="color: hsl(120, 100%, 40%);">+              NS_SP.send(ts_NsStsInd(g_config.nsei, g_nsvc_config.nsvci, old_state, new_state));</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%);">+   private function f_sendReset() runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+              NSCP.send(ts_NS_RESET(NS_CAUSE_OM_INTERVENTION, g_nsvc_config.nsvci, g_config.nsei));</span><br><span>                Tns_reset.start;</span><br><span style="color: hsl(0, 100%, 40%);">-                g_state := NSE_S_WAIT_RESET;</span><br><span style="color: hsl(120, 100%, 40%);">+          vc_state := NSVC_S_WAIT_RESET;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private function f_sendAlive() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        private function f_sendAlive() runs on NSVC_CT {</span><br><span>             NSCP.send(t_NS_ALIVE);</span><br><span>               Tns_alive.start;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private function f_sendUnblock() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      private function f_sendUnblock() runs on NSVC_CT {</span><br><span>           NSCP.send(t_NS_UNBLOCK);</span><br><span>             Tns_block.start;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private function f_sendBlock(NsCause cause) runs on NS_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-             NSCP.send(ts_NS_BLOCK(cause, config.nsvci));</span><br><span style="color: hsl(120, 100%, 40%);">+  private function f_sendBlock(NsCause cause) runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+         NSCP.send(ts_NS_BLOCK(cause, g_nsvc_config.nsvci));</span><br><span>          Tns_block.start;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private altstep as_allstate() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ private altstep as_allstate() runs on NSVC_CT {</span><br><span>              var PDU_NS rf;</span><br><span>               var ASP_Event evt;</span><br><span> </span><br><span>               /* transition to DEAD if t_alive times out */</span><br><span>                [] Tns_alive.timeout {</span><br><span>                       log("Tns-alive expired: changing to DEAD_BLOCKED + starting Tns-test");</span><br><span style="color: hsl(0, 100%, 40%);">-                       f_change_state(NSE_S_DEAD_BLOCKED);</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_change_state(NSVC_S_DEAD_BLOCKED);</span><br><span>                         Tns_test.start;</span><br><span>              }</span><br><span> </span><br><span>@@ -235,33 +394,33 @@</span><br><span>                        /* FIXME */</span><br><span>          }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           [not config.handle_sns] as_handle_reset();</span><br><span style="color: hsl(120, 100%, 40%);">+            [not g_config.handle_sns] as_handle_reset();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                [config.role_sgsn and config.handle_sns and ischosen(config.provider.ip)] as_sns_sgsn();</span><br><span style="color: hsl(120, 100%, 40%);">+              [g_config.role_sgsn and g_config.handle_sns and ischosen(g_nsvc_config.provider.ip)] as_sns_sgsn();</span><br><span> </span><br><span>              /* default case of handling unknown PDUs */</span><br><span>          [] NSCP.receive(PDU_NS: ?) -> value rf {</span><br><span style="color: hsl(0, 100%, 40%);">-                     log("Rx Unexpected NS PDU ", rf," in state ", g_state);</span><br><span style="color: hsl(120, 100%, 40%);">+                   log("Rx Unexpected NS PDU ", rf," in state ", vc_state);</span><br><span>                         NSCP.send(ts_NS_STATUS(NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE, rf));</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private altstep as_handle_reset() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     private altstep as_handle_reset() runs on NSVC_CT {</span><br><span>          var PDU_NS rf;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              [config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span style="color: hsl(120, 100%, 40%);">+              [g_config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span>                   log("Provider Link came up: waiting for NS-RESET");</span><br><span>                        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           [not config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span style="color: hsl(120, 100%, 40%);">+          [not g_config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span>                       log("Provider Link came up: sending NS-RESET");</span><br><span>                    f_sendReset();</span><br><span>                       }</span><br><span> </span><br><span>                /* Respond to RESET with correct NSEI/NSVCI */</span><br><span style="color: hsl(0, 100%, 40%);">-          [] NSCP.receive(tr_NS_RESET(?, config.nsvci, config.nsei)) -> value rf {</span><br><span style="color: hsl(0, 100%, 40%);">-                     f_change_state(NSE_S_ALIVE_BLOCKED);</span><br><span style="color: hsl(0, 100%, 40%);">-                    NSCP.send(ts_NS_RESET_ACK(config.nsvci, config.nsei));</span><br><span style="color: hsl(120, 100%, 40%);">+                [] NSCP.receive(tr_NS_RESET(?, g_nsvc_config.nsvci, g_config.nsei)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_change_state(NSVC_S_ALIVE_BLOCKED);</span><br><span style="color: hsl(120, 100%, 40%);">+                 NSCP.send(ts_NS_RESET_ACK(g_nsvc_config.nsvci, g_config.nsei));</span><br><span>                      log("Rx NS-RESET: Sending NS-ALIVE");</span><br><span>                      f_sendAlive();</span><br><span>                       Tns_test.start;</span><br><span>@@ -276,46 +435,47 @@</span><br><span> </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 style="color: hsl(0, 100%, 40%);">-      private altstep as_sns_sgsn() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ private altstep as_sns_sgsn() runs on NSVC_CT {</span><br><span>              var PDU_NS rf;</span><br><span style="color: hsl(0, 100%, 40%);">-          [config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span style="color: hsl(120, 100%, 40%);">+              [g_config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span>                   log("Provider Link came up: sending NS-ALIVE");</span><br><span>                    f_sendAlive();</span><br><span>                       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           [not config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span style="color: hsl(120, 100%, 40%);">+          [not g_config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {</span><br><span>                       log("Provider Link came up: sending NS-ALIVE");</span><br><span>                    f_sendAlive();</span><br><span>                       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           [] NSCP.receive(tr_SNS_SIZE(config.nsei)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+            [] NSCP.receive(tr_SNS_SIZE(g_config.nsei)) -> value rf {</span><br><span>                         /* blindly acknowledge whatever the PCU sends */</span><br><span style="color: hsl(0, 100%, 40%);">-                        NSCP.send(ts_SNS_SIZE_ACK(config.nsei, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+                        NSCP.send(ts_SNS_SIZE_ACK(g_config.nsei, omit));</span><br><span>             }</span><br><span>            [] NSCP.receive(tr_SNS_SIZE(?)) {</span><br><span>                    setverdict(fail, "SNS-SIZE from unexpected NSEI");</span><br><span>                         self.stop;</span><br><span>           }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NSCP.receive(tr_SNS_CONFIG(config.nsei, true,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    {tr_SNS_IPv4(config.provider.ip.remote_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           config.provider.ip.remote_udp_port)})) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+              [] NSCP.receive(tr_SNS_CONFIG(g_config.nsei, true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                {tr_SNS_IPv4(g_nsvc_config.provider.ip.remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          g_nsvc_config.provider.ip.remote_udp_port)})) -> value rf {</span><br><span>                      /* blindly acknowledge whatever the PCU sends */</span><br><span style="color: hsl(0, 100%, 40%);">-                        NSCP.send(ts_SNS_CONFIG_ACK(config.nsei, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+                      NSCP.send(ts_SNS_CONFIG_ACK(g_config.nsei, omit));</span><br><span>                   /* send a SNS-CONFIG in response and expect a SNS-CONFIG-ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-                 var IP4_Elements v4 := { valueof(ts_SNS_IPv4(config.provider.ip.local_ip, config.provider.ip.local_udp_port)) };</span><br><span style="color: hsl(0, 100%, 40%);">-                        NSCP.send(ts_SNS_CONFIG(config.nsei, true, v4));</span><br><span style="color: hsl(120, 100%, 40%);">+                      var IP4_Elements v4 := { valueof(ts_SNS_IPv4(g_nsvc_config.provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsvc_config.provider.ip.local_udp_port)) };</span><br><span style="color: hsl(120, 100%, 40%);">+                    NSCP.send(ts_SNS_CONFIG(g_config.nsei, true, v4));</span><br><span>                   alt {</span><br><span style="color: hsl(0, 100%, 40%);">-                   [] NSCP.receive(tr_SNS_CONFIG_ACK(config.nsei, omit)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       [] NSCP.receive(tr_SNS_CONFIG_ACK(g_config.nsei, omit)) {</span><br><span>                            /* success */</span><br><span>                                }</span><br><span style="color: hsl(0, 100%, 40%);">-                       [] NSCP.receive(tr_SNS_CONFIG_ACK(config.nsei, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  [] NSCP.receive(tr_SNS_CONFIG_ACK(g_config.nsei, ?)) {</span><br><span>                               setverdict(fail, "Unexpected SNS-CONFIG-NACK");</span><br><span>                            self.stop;</span><br><span>                           }</span><br><span>                    }</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NSCP.receive(tr_SNS_CONFIG(config.nsei, false, ?)) { /* ignore */}</span><br><span style="color: hsl(0, 100%, 40%);">-           [] NSCP.receive(tr_SNS_CONFIG(config.nsei, true, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                [] NSCP.receive(tr_SNS_CONFIG(g_config.nsei, false, ?)) { /* ignore */}</span><br><span style="color: hsl(120, 100%, 40%);">+               [] NSCP.receive(tr_SNS_CONFIG(g_config.nsei, true, ?)) {</span><br><span>                     setverdict(fail, "Unexpected SNS-CONFIG content");</span><br><span>                         self.stop;</span><br><span>           }</span><br><span>@@ -325,21 +485,21 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private altstep as_alive_blocked() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    private altstep as_alive_blocked() runs on NSVC_CT {</span><br><span>                 var PDU_NS rf;</span><br><span>               /* bogus block, just respond with ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-                [] NSCP.receive(tr_NS_BLOCK(?, config.nsvci)) -> value rf {</span><br><span style="color: hsl(0, 100%, 40%);">-                  NSCP.send(ts_NS_BLOCK_ACK(config.nsvci));</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSCP.receive(tr_NS_BLOCK(?, g_nsvc_config.nsvci)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+                 NSCP.send(ts_NS_BLOCK_ACK(g_nsvc_config.nsvci));</span><br><span>             }</span><br><span>            /* Respond to UNBLOCK with UNBLOCK-ACK + change state */</span><br><span>             [] NSCP.receive(t_NS_UNBLOCK) -> value rf {</span><br><span>                       NSCP.send(t_NS_UNBLOCK_ACK);</span><br><span>                         Tns_block.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-                 f_change_state(NSE_S_ALIVE_UNBLOCKED);</span><br><span style="color: hsl(120, 100%, 40%);">+                        f_change_state(NSVC_S_ALIVE_UNBLOCKED);</span><br><span>              }</span><br><span>            [] NSCP.receive(t_NS_UNBLOCK_ACK) -> value rf {</span><br><span>                   Tns_block.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-                 f_change_state(NSE_S_ALIVE_UNBLOCKED);</span><br><span style="color: hsl(120, 100%, 40%);">+                        f_change_state(NSVC_S_ALIVE_UNBLOCKED);</span><br><span>              }</span><br><span>            [] Tns_block.timeout {</span><br><span>                       /* repeat unblock transmission */</span><br><span>@@ -347,7 +507,7 @@</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private altstep as_alive_unblocked() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  private altstep as_alive_unblocked() runs on NSVC_CT {</span><br><span>               var NsUnitdataRequest ud_req;</span><br><span>                var PDU_NS rf;</span><br><span>               /* bogus unblock, just respond with ACK */</span><br><span>@@ -355,33 +515,33 @@</span><br><span>                   NSCP.send(t_NS_UNBLOCK_ACK);</span><br><span>                 }</span><br><span>            /* Respond to BLOCK with BLOCK-ACK + change state */</span><br><span style="color: hsl(0, 100%, 40%);">-            [] NSCP.receive(tr_NS_BLOCK(?, config.nsvci)) -> value rf {</span><br><span style="color: hsl(0, 100%, 40%);">-                  NSCP.send(ts_NS_BLOCK_ACK(config.nsvci));</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NSCP.receive(tr_NS_BLOCK(?, g_nsvc_config.nsvci)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+                 NSCP.send(ts_NS_BLOCK_ACK(g_nsvc_config.nsvci));</span><br><span>                     Tns_block.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-                 f_change_state(NSE_S_ALIVE_BLOCKED);</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_change_state(NSVC_S_ALIVE_BLOCKED);</span><br><span>                }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NSCP.receive(tr_NS_BLOCK_ACK(config.nsvci)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+               [] NSCP.receive(tr_NS_BLOCK_ACK(g_nsvc_config.nsvci)) -> value rf {</span><br><span>                       Tns_block.stop;</span><br><span>              }</span><br><span>            /* NS-UNITDATA PDU from network to NS-UNITDATA.ind to user */</span><br><span>                [] NSCP.receive(tr_NS_UNITDATA(?, ?, ?)) -> value rf {</span><br><span style="color: hsl(0, 100%, 40%);">-                       NS_SP.send(t_NsUdInd(config.nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+                     NS_SP.send(ts_NsUdInd(g_config.nsei,</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(t_NsUdReq(config.nsei, ?, ?, omit)) -> value ud_req {</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NS_SP.receive(tr_NsUdReq(g_config.nsei, ?, ?, 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(t_NsUdReq(config.nsei, ?, omit, ?)) -> value ud_req {</span><br><span style="color: hsl(120, 100%, 40%);">+             [] NS_SP.receive(tr_NsUdReq(g_config.nsei, ?, 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>             }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private altstep as_wait_reset() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       private altstep as_wait_reset() runs on NSVC_CT {</span><br><span>            var PDU_NS rf;</span><br><span>               [] Tns_reset.timeout {</span><br><span>                       /* If the sending entity of an NS-RESET PDU receives no NS-RESET-ACK PDU before timer</span><br><span>@@ -389,21 +549,21 @@</span><br><span>                         * entire reset procedure shall be repeated */</span><br><span>                       f_sendReset();</span><br><span>                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] NSCP.receive(tr_NS_RESET_ACK(config.nsvci, config.nsei)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+          [] NSCP.receive(tr_NS_RESET_ACK(g_nsvc_config.nsvci, g_config.nsei)) -> value rf {</span><br><span>                        Tns_reset.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-                 f_change_state(NSE_S_ALIVE_BLOCKED);</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_change_state(NSVC_S_ALIVE_BLOCKED);</span><br><span>                        f_sendAlive();</span><br><span>                       f_sendUnblock();</span><br><span>             }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   private function f_ScanEvents() runs on NS_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       private function f_ScanEvents() runs on NSVC_CT {</span><br><span>            var PDU_NS rf;</span><br><span>               while (true) {</span><br><span>                       alt {</span><br><span style="color: hsl(0, 100%, 40%);">-                   [g_state == NSE_S_WAIT_RESET] as_wait_reset();</span><br><span style="color: hsl(0, 100%, 40%);">-                  [g_state == NSE_S_ALIVE_BLOCKED] as_alive_blocked();</span><br><span style="color: hsl(0, 100%, 40%);">-                    [g_state == NSE_S_ALIVE_UNBLOCKED] as_alive_unblocked();</span><br><span style="color: hsl(120, 100%, 40%);">+                      [vc_state == NSVC_S_WAIT_RESET] as_wait_reset();</span><br><span style="color: hsl(120, 100%, 40%);">+                      [vc_state == NSVC_S_ALIVE_BLOCKED] as_alive_blocked();</span><br><span style="color: hsl(120, 100%, 40%);">+                        [vc_state == NSVC_S_ALIVE_UNBLOCKED] as_alive_unblocked();</span><br><span>                   [] as_allstate();</span><br><span>                    }</span><br><span>            }</span><br><span>diff --git a/library/NS_Provider_FR.ttcn b/library/NS_Provider_FR.ttcn</span><br><span>index 5387b0f..1cb02dd 100644</span><br><span>--- a/library/NS_Provider_FR.ttcn</span><br><span>+++ b/library/NS_Provider_FR.ttcn</span><br><span>@@ -27,11 +27,11 @@</span><br><span>     var boolean pvc_active := false;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function main(NSConfiguration config, charstring id) runs on NS_Provider_FR_CT system af_packet {</span><br><span style="color: hsl(120, 100%, 40%);">+function main(NSVCConfiguration config, NSConfiguration nsconfig, charstring id) runs on NS_Provider_FR_CT system af_packet {</span><br><span> </span><br><span>       /* start Frame Relay Emulation */</span><br><span>    vc_FREMU := FR_Emulation_CT.create(id & "-FRemu");</span><br><span style="color: hsl(0, 100%, 40%);">-        var Q933em_Config q933_cfg := valueof(ts_Q933em_Config(ats_is_user := not config.role_sgsn, bidirectional := false));</span><br><span style="color: hsl(120, 100%, 40%);">+ var Q933em_Config q933_cfg := valueof(ts_Q933em_Config(ats_is_user := not nsconfig.role_sgsn, bidirectional := false));</span><br><span>      q933_cfg.T391 := 1.0;</span><br><span>        map(vc_FREMU:FR, system:AF_PACKET) param (config.provider.fr.netdev);</span><br><span>        vc_FREMU.start(FrameRelay_Emulation.main(q933_cfg));</span><br><span>diff --git a/library/NS_Provider_IPL4.ttcn b/library/NS_Provider_IPL4.ttcn</span><br><span>index 3b9fcaf..6d45fd0 100644</span><br><span>--- a/library/NS_Provider_IPL4.ttcn</span><br><span>+++ b/library/NS_Provider_IPL4.ttcn</span><br><span>@@ -23,7 +23,7 @@</span><br><span>    var integer g_conn_id := -1;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function main(NSConfiguration config, charstring id) runs on NS_Provider_IPL4_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+function main(NSVCConfiguration config, NSConfiguration nsconfig, charstring id) runs on NS_Provider_IPL4_CT {</span><br><span> </span><br><span>         /* connect socket */</span><br><span>         map(self:IPL4, system:IPL4);</span><br><span>diff --git a/library/RAW_NS.ttcn b/library/RAW_NS.ttcn</span><br><span>index 314bf31..8540f38 100644</span><br><span>--- a/library/RAW_NS.ttcn</span><br><span>+++ b/library/RAW_NS.ttcn</span><br><span>@@ -49,16 +49,17 @@</span><br><span>          /* copy most parts from mp_nsconfig */</span><br><span>               g_nsconfig[idx] := ns_config;</span><br><span>                /* adjust those parts different for each NS-VC */</span><br><span style="color: hsl(0, 100%, 40%);">-               g_nsconfig[idx].nsvci := ns_config.nsvci + idx;</span><br><span style="color: hsl(0, 100%, 40%);">-         g_nsconfig[idx].provider.ip.local_udp_port := ns_config.provider.ip.local_udp_port + idx + tc_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+         g_nsconfig[idx].nsvc[0].nsvci := ns_config.nsvc[0].nsvci + idx;</span><br><span style="color: hsl(120, 100%, 40%);">+               g_nsconfig[idx].nsvc[0].provider.ip.local_udp_port := ns_config.nsvc[0].provider.ip.local_udp_port + idx + tc_offset;</span><br><span>        }</span><br><span> </span><br><span>        map(self:NSCP[idx], system:NSCP);</span><br><span>    /* Connect the UDP socket */</span><br><span>         var NSConfiguration nscfg := g_nsconfig[idx];</span><br><span style="color: hsl(120, 100%, 40%);">+ var NSVCConfiguration nsvc_cfg := nscfg.nsvc[0];</span><br><span>     log("connecting NSCP[", idx, "] to ", nscfg);</span><br><span style="color: hsl(0, 100%, 40%);">-       res := f_IPL4_connect(NSCP[idx], nscfg.provider.ip.remote_ip, nscfg.provider.ip.remote_udp_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                                nscfg.provider.ip.local_ip, nscfg.provider.ip.local_udp_port, 0, { udp := {}});</span><br><span style="color: hsl(120, 100%, 40%);">+       res := f_IPL4_connect(NSCP[idx], nsvc_cfg.provider.ip.remote_ip, nsvc_cfg.provider.ip.remote_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                nsvc_cfg.provider.ip.local_ip, nsvc_cfg.provider.ip.local_udp_port, 0, { udp := {}});</span><br><span>        if (not ispresent(res.connId)) {</span><br><span>             setverdict(fail, "Could not connect NS UDP socket, check your configuration ", g_nsconfig[idx]);</span><br><span>           mtc.stop;</span><br><span>@@ -107,11 +108,11 @@</span><br><span> </span><br><span> function f_outgoing_ns_reset(integer idx := 0, float tout := 10.0) runs on RAW_NS_CT {</span><br><span>      timer T := tout;</span><br><span style="color: hsl(0, 100%, 40%);">-        var template PDU_NS reset := ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig[idx].nsvci, g_nsconfig[idx].nsei)</span><br><span style="color: hsl(120, 100%, 40%);">+     var template PDU_NS reset := ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig[idx].nsvc[0].nsvci, g_nsconfig[idx].nsei)</span><br><span>    NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], reset));</span><br><span>         T.start;</span><br><span>     alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] NSCP[idx].receive(t_NS_RecvFrom(ts_NS_RESET_ACK(g_nsconfig[idx].nsvci, g_nsconfig[idx].nsei))) {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] NSCP[idx].receive(t_NS_RecvFrom(ts_NS_RESET_ACK(g_nsconfig[idx].nsvc[0].nsvci, g_nsconfig[idx].nsei))) {</span><br><span>          setverdict(pass);</span><br><span>            }</span><br><span>    [] NSCP[idx].receive { repeat; }</span><br><span>@@ -123,9 +124,9 @@</span><br><span> </span><br><span> /* perform outbound NS-BLOCK procedure */</span><br><span> function f_outgoing_ns_block(NsCause cause, integer idx := 0) runs on RAW_NS_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_NS_BLOCK(cause, g_nsconfig[idx].nsvci)));</span><br><span style="color: hsl(120, 100%, 40%);">+      NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_NS_BLOCK(cause, g_nsconfig[idx].nsvc[0].nsvci)));</span><br><span>     alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] NSCP[idx].receive(t_NS_RecvFrom(tr_NS_BLOCK_ACK(g_nsconfig[idx].nsvci)));</span><br><span style="color: hsl(120, 100%, 40%);">+  [] NSCP[idx].receive(t_NS_RecvFrom(tr_NS_BLOCK_ACK(g_nsconfig[idx].nsvc[0].nsvci)));</span><br><span>         [] NSCP[idx].receive { repeat; }</span><br><span>     }</span><br><span> }</span><br><span>@@ -211,9 +212,9 @@</span><br><span> /* Receive a NS-RESET and ACK it */</span><br><span> public altstep as_rx_ns_reset_ack(boolean oneshot := false, integer idx := 0) runs on RAW_NS_CT {</span><br><span>     var NS_RecvFrom ns_rf;</span><br><span style="color: hsl(0, 100%, 40%);">-  [] NSCP[idx].receive(t_NS_RecvFrom(tr_NS_RESET(NS_CAUSE_OM_INTERVENTION, g_nsconfig[idx].nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+       [] NSCP[idx].receive(t_NS_RecvFrom(tr_NS_RESET(NS_CAUSE_OM_INTERVENTION, g_nsconfig[idx].nsvc[0].nsvci,</span><br><span>                                                g_nsconfig[idx].nsei))) -> value ns_rf {</span><br><span style="color: hsl(0, 100%, 40%);">-           NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_NS_RESET_ACK(g_nsconfig[idx].nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+            NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_NS_RESET_ACK(g_nsconfig[idx].nsvc[0].nsvci,</span><br><span>                                                                       g_nsconfig[idx].nsei)));</span><br><span>                 if (not oneshot) { repeat; }</span><br><span>                 }</span><br><span>diff --git a/pcu/PCU_Tests.cfg b/pcu/PCU_Tests.cfg</span><br><span>index 98f8676..dd6b111 100644</span><br><span>--- a/pcu/PCU_Tests.cfg</span><br><span>+++ b/pcu/PCU_Tests.cfg</span><br><span>@@ -8,18 +8,22 @@</span><br><span> </span><br><span> [MODULE_PARAMETERS]</span><br><span> SGSN_Components.mp_nsconfig := {</span><br><span style="color: hsl(0, 100%, 40%);">-   provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                      local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                      local_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                        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(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       },</span><br><span style="color: hsl(0, 100%, 40%);">-      nsvci := 1234,</span><br><span>       nsei := 1234,</span><br><span style="color: hsl(0, 100%, 40%);">-   handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+             {</span><br><span style="color: hsl(120, 100%, 40%);">+                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    local_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   remote_udp_port := 22000</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%);">+                    nsvci := 1234</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> [TESTPORT_PARAMETERS]</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 4df040e..8f424ab 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -98,11 +98,11 @@</span><br><span>       ul_tbf_ext := 250 * 10, /* ms */</span><br><span>     initial_cs := 2,</span><br><span>     initial_mcs := 6,</span><br><span style="color: hsl(0, 100%, 40%);">-       nsvci := { mp_nsconfig.nsvci, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-      local_port := { mp_nsconfig.provider.ip.remote_udp_port, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-   remote_port := { mp_nsconfig.provider.ip.local_udp_port, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvci := { mp_nsconfig.nsvc[0].nsvci, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    local_port := { mp_nsconfig.nsvc[0].provider.ip.remote_udp_port, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ remote_port := { mp_nsconfig.nsvc[0].provider.ip.local_udp_port, 0 },</span><br><span>        remote_addr := f_PCUIF_ver_INFO_RemoteAddr(</span><br><span style="color: hsl(0, 100%, 40%);">-             f_PCUIF_AF2addr_type(mp_nsconfig.provider.ip.address_family), mp_nsconfig.provider.ip.local_ip)</span><br><span style="color: hsl(120, 100%, 40%);">+               f_PCUIF_AF2addr_type(mp_nsconfig.nsvc[0].provider.ip.address_family), mp_nsconfig.nsvc[0].provider.ip.local_ip)</span><br><span> }</span><br><span> </span><br><span> type record lqual_range {</span><br><span>diff --git a/pcu/PCU_Tests_NS.ttcn b/pcu/PCU_Tests_NS.ttcn</span><br><span>index 4db78d8..e782b6e 100644</span><br><span>--- a/pcu/PCU_Tests_NS.ttcn</span><br><span>+++ b/pcu/PCU_Tests_NS.ttcn</span><br><span>@@ -98,7 +98,7 @@</span><br><span>   var integer i;</span><br><span>       for (i := 0; i < 3; i := i+1) {</span><br><span>           NSCP[0].receive(t_NS_RecvFrom(tr_NS_RESET(NS_CAUSE_OM_INTERVENTION,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     g_nsconfig[0].nsvci, g_nsconfig[0].nsei)));</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   g_nsconfig[0].nsvc[0].nsvci, g_nsconfig[0].nsei)));</span><br><span>  }</span><br><span> </span><br><span>        /* Expect inbound NS-RESET procedure */</span><br><span>diff --git a/pcu/PCU_Tests_SNS.cfg b/pcu/PCU_Tests_SNS.cfg</span><br><span>index 6a64626..e5a08fe 100644</span><br><span>--- a/pcu/PCU_Tests_SNS.cfg</span><br><span>+++ b/pcu/PCU_Tests_SNS.cfg</span><br><span>@@ -8,17 +8,21 @@</span><br><span> </span><br><span> [MODULE_PARAMETERS]</span><br><span> SGSN_Components.mp_nsconfig := {</span><br><span style="color: hsl(0, 100%, 40%);">-     provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                      local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                      local_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                        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%);">+      nsei := 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+             {</span><br><span style="color: hsl(120, 100%, 40%);">+                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    local_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   remote_udp_port := 22000</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%);">+                    nsvci := 1234</span><br><span>                }</span><br><span style="color: hsl(0, 100%, 40%);">-       },</span><br><span style="color: hsl(0, 100%, 40%);">-      nsvci := 1234,</span><br><span style="color: hsl(0, 100%, 40%);">-  nsei := 1234</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> }</span><br><span> PCUIF_Types.mp_pcuif_version := 10</span><br><span> </span><br><span>diff --git a/pcu/PCU_Tests_SNS.ttcn b/pcu/PCU_Tests_SNS.ttcn</span><br><span>index 86b83c2..cd0cc67 100644</span><br><span>--- a/pcu/PCU_Tests_SNS.ttcn</span><br><span>+++ b/pcu/PCU_Tests_SNS.ttcn</span><br><span>@@ -14,6 +14,7 @@</span><br><span> import from PCU_Tests_NS all;</span><br><span> import from SGSN_Components all;</span><br><span> import from Osmocom_Gb_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from NS_Emulation all;</span><br><span> import from NS_CodecPort all;</span><br><span> import from NS_Types all;</span><br><span> import from RAW_NS all;</span><br><span>@@ -27,8 +28,9 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>       log("f_incoming_sns_size(idx=", idx, ")");</span><br><span>       var PDU_NS rx;</span><br><span style="color: hsl(120, 100%, 40%);">+        var NSVCConfiguration nsvc_cfg := g_nsconfig[idx].nsvc[0];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (nsvc_cfg.provider.ip.address_family == AF_INET) {</span><br><span>                /* expect one single SNS-SIZE with RESET flag; 4x v4 EP; no v6 EP */</span><br><span>                 rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig[idx].nsei, rst_flag := true, max_nsvcs := 8,</span><br><span>                                      num_v4 := 4, num_v6 := omit), idx);</span><br><span>@@ -45,7 +47,9 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>    log("f_outgoing_sns_size(idx=", idx, ")");</span><br><span>       var PDU_NS rx;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(120, 100%, 40%);">+      var NSVCConfiguration nsvc_cfg := g_nsconfig[idx].nsvc[0];</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>                NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_SIZE(g_nsconfig[idx].nsei, rst_flag := true, max_nsvcs := 1,</span><br><span>                                                              num_v4 := 1, num_v6 := omit)</span><br><span>                                         ));</span><br><span>@@ -63,17 +67,17 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>     log("f_incoming_sns_config(idx=", idx, ")");</span><br><span>     var PDU_NS rx;</span><br><span style="color: hsl(120, 100%, 40%);">+        var NSVCConfiguration nsvc_cfg := g_nsconfig[idx].nsvc[0];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template IP4_Elements v4_elem := { tr_SNS_IPv4(mp_nsconfig.provider.ip.remote_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              mp_nsconfig.provider.ip.remote_udp_port) };</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%);">+         var template IP4_Elements v4_elem := { tr_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               nsvc_cfg.provider.ip.remote_udp_port) };</span><br><span>          rx := f_ns_exp(tr_SNS_CONFIG(g_nsconfig[idx].nsei, end_flag := true, v4 := v4_elem), idx);</span><br><span>   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template IP6_Elements v6_elem := { tr_SNS_IPv6(mp_nsconfig.provider.ip.remote_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              mp_nsconfig.provider.ip.remote_udp_port) };</span><br><span style="color: hsl(120, 100%, 40%);">+                var template IP6_Elements v6_elem := { tr_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               nsvc_cfg.provider.ip.remote_udp_port) };</span><br><span>          rx := f_ns_exp(tr_SNS_CONFIG(g_nsconfig[idx].nsei, end_flag := true, v6 := v6_elem), idx);</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG_ACK(g_nsconfig[idx].nsei, cause)));</span><br><span> }</span><br><span> </span><br><span>@@ -82,13 +86,15 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>  log("f_outgoing_sns_config(idx=", idx, ")");</span><br><span>     var PDU_NS rx;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   g_nsconfig[idx].provider.ip.local_udp_port) }</span><br><span style="color: hsl(120, 100%, 40%);">+    var NSVCConfiguration nsvc_cfg := g_nsconfig[idx].nsvc[0];</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%);">+         var template (omit) IP4_Elements v4 := { 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>          NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));</span><br><span>         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[idx].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   g_nsconfig[idx].provider.ip.local_udp_port) }</span><br><span style="color: hsl(120, 100%, 40%);">+            var template (omit) IP6_Elements v6 := { 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>          NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, omit, v6)));</span><br><span>   }</span><br><span>    rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig[idx].nsei, cause), idx);</span><br><span>@@ -99,17 +105,18 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>   log("f_outgoing_sns_config_1c1u(idx=", idx, ")");</span><br><span>        var PDU_NS rx;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[0].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     g_nsconfig[0].provider.ip.local_udp_port, 1, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    ts_SNS_IPv4(g_nsconfig[1].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     g_nsconfig[1].provider.ip.local_udp_port, 0, 1) };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (mp_nsconfig.nsvc[0].provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[0].nsvc[0].provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsconfig[0].nsvc[0].provider.ip.local_udp_port, 1, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  ts_SNS_IPv4(g_nsconfig[1].nsvc[0].provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsconfig[1].nsvc[0].provider.ip.local_udp_port, 0, 1) };</span><br><span>              NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));</span><br><span>         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[0].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     g_nsconfig[0].provider.ip.local_udp_port, 1, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    ts_SNS_IPv6(g_nsconfig[1].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     g_nsconfig[1].provider.ip.local_udp_port, 0, 1) };</span><br><span style="color: hsl(120, 100%, 40%);">+               var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[0].nsvc[0].provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsconfig[0].nsvc[0].provider.ip.local_udp_port, 1, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  ts_SNS_IPv6(g_nsconfig[1].nsvc[0].provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsconfig[1].nsvc[0].provider.ip.local_udp_port, 0, 1) };</span><br><span>              NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, omit, v6)));</span><br><span>   }</span><br><span>    rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig[idx].nsei, cause), idx);</span><br><span>@@ -120,17 +127,17 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>  log("f_outgoing_sns_config_1c1u_separate(idx=", idx, ")");</span><br><span>       var PDU_NS rx;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[1].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     g_nsconfig[1].provider.ip.local_udp_port, 1, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    ts_SNS_IPv4(g_nsconfig[2].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     g_nsconfig[2].provider.ip.local_udp_port, 0, 1) };</span><br><span style="color: hsl(120, 100%, 40%);">+       if (mp_nsconfig.nsvc[0].provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[1].nsvc[0].provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsconfig[1].nsvc[0].provider.ip.local_udp_port, 1, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  ts_SNS_IPv4(g_nsconfig[2].nsvc[0].provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsconfig[2].nsvc[0].provider.ip.local_udp_port, 0, 1) };</span><br><span>              NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, v4)));</span><br><span>         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[1].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     g_nsconfig[1].provider.ip.local_udp_port, 1, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    ts_SNS_IPv6(g_nsconfig[2].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     g_nsconfig[2].provider.ip.local_udp_port, 0, 1) };</span><br><span style="color: hsl(120, 100%, 40%);">+               var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[1].nsvc[0].provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsconfig[1].nsvc[0].provider.ip.local_udp_port, 1, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  ts_SNS_IPv6(g_nsconfig[2].nsvc[0].provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   g_nsconfig[2].nsvc[0].provider.ip.local_udp_port, 0, 1) };</span><br><span>              NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CONFIG(g_nsconfig[idx].nsei, true, omit, v6)));</span><br><span>   }</span><br><span>    rx := f_ns_exp(tr_SNS_CONFIG_ACK(g_nsconfig[idx].nsei, cause), idx);</span><br><span>@@ -140,15 +147,16 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>  log("f_outgoing_sns_add(idx_add=", idx_add, ")");</span><br><span>        var PDU_NS rx;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_add].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               g_nsconfig[idx_add].provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+  var NSVCConfiguration nsvc_cfg := g_nsconfig[idx].nsvc[0];</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%);">+         var template (omit) IP4_Elements v4 := { 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>                                                                 w_sig, w_user) };</span><br><span>               NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_ADD(g_nsconfig[idx].nsei, 23, v4)));</span><br><span>              rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 23, omit, v4));</span><br><span>      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[idx_add].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               g_nsconfig[idx_add].provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+          var template (omit) IP6_Elements v6 := { 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>                                                                 w_sig, w_user) };</span><br><span>               NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_ADD(g_nsconfig[idx].nsei, 23, omit, v6)));</span><br><span>                rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 23, omit, omit, v6));</span><br><span>@@ -159,15 +167,16 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>         log("f_outgoing_sns_del(idx_del=", idx_del, ")");</span><br><span>        var PDU_NS rx;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_del].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               g_nsconfig[idx_del].provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+  var NSVCConfiguration nsvc_cfg := g_nsconfig[idx_del].nsvc[0];</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%);">+         var template (omit) IP4_Elements v4 := { 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>                                                                 w_sig, w_user) };</span><br><span>               NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_DEL(g_nsconfig[idx].nsei, 24, omit, v4)));</span><br><span>                rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 24, omit, v4));</span><br><span>      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[idx_del].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               g_nsconfig[idx_del].provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+          var template (omit) IP6_Elements v6 := { 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>                                                                 w_sig, w_user) };</span><br><span>               NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_DEL(g_nsconfig[idx].nsei, 24, omit, omit, v6)));</span><br><span>          rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 24, omit, omit, v6));</span><br><span>@@ -178,15 +187,16 @@</span><br><span> runs on RAW_NS_CT {</span><br><span>         log("f_outgoing_sns_chg_weight(idx_chg=", idx_chg, ")");</span><br><span>         var PDU_NS rx;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mp_nsconfig.provider.ip.address_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(g_nsconfig[idx_chg].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               g_nsconfig[idx_chg].provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+  var NSVCConfiguration nsvc_cfg := g_nsconfig[idx_chg].nsvc[0];</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%);">+         var template (omit) IP4_Elements v4 := { 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>                                                                 w_sig, w_user) };</span><br><span>               NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CHG_WEIGHT(g_nsconfig[idx].nsei, 25, v4)));</span><br><span>               rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 25, omit, v4));</span><br><span>      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template (omit) IP6_Elements v6 := { ts_SNS_IPv6(g_nsconfig[idx_chg].provider.ip.local_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               g_nsconfig[idx_chg].provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+          var template (omit) IP6_Elements v6 := { 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>                                                                 w_sig, w_user) };</span><br><span>               NSCP[idx].send(t_NS_Send(g_ns_conn_id[idx], ts_SNS_CHG_WEIGHT(g_nsconfig[idx].nsei, 25, omit, v6)));</span><br><span>                 rx := f_ns_exp(tr_SNS_ACK(g_nsconfig[idx].nsei, 25, omit, omit, v6));</span><br><span>diff --git a/pcu/PCU_Tests_SNSv6.cfg b/pcu/PCU_Tests_SNSv6.cfg</span><br><span>index af986bf..cae9a75 100644</span><br><span>--- a/pcu/PCU_Tests_SNSv6.cfg</span><br><span>+++ b/pcu/PCU_Tests_SNSv6.cfg</span><br><span>@@ -8,17 +8,21 @@</span><br><span> </span><br><span> [MODULE_PARAMETERS]</span><br><span> SGSN_Components.mp_nsconfig := {</span><br><span style="color: hsl(0, 100%, 40%);">-       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 address_family := AF_INET6,</span><br><span style="color: hsl(0, 100%, 40%);">-                     local_ip := "::1",</span><br><span style="color: hsl(0, 100%, 40%);">-                    local_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                        remote_ip := "::1",</span><br><span style="color: hsl(0, 100%, 40%);">-                   remote_udp_port := 22000,</span><br><span style="color: hsl(120, 100%, 40%);">+     nsei := 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc : {</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       address_family := AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   local_ip := "::1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                  local_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_ip := "::1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 remote_udp_port := 22000,</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%);">+                    nsvci := 1234</span><br><span>                }</span><br><span style="color: hsl(0, 100%, 40%);">-       },</span><br><span style="color: hsl(0, 100%, 40%);">-      nsvci := 1234,</span><br><span style="color: hsl(0, 100%, 40%);">-  nsei := 1234</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> }</span><br><span> PCUIF_Types.mp_pcuif_version := 10</span><br><span> </span><br><span>diff --git a/pcu/SGSN_Components.ttcn b/pcu/SGSN_Components.ttcn</span><br><span>index 2f1fa75..5f05595 100644</span><br><span>--- a/pcu/SGSN_Components.ttcn</span><br><span>+++ b/pcu/SGSN_Components.ttcn</span><br><span>@@ -39,19 +39,23 @@</span><br><span>  };</span><br><span> </span><br><span>       NSConfiguration mp_nsconfig := {</span><br><span style="color: hsl(0, 100%, 40%);">-                provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                         address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                              local_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                              remote_udp_port := 21000,</span><br><span style="color: hsl(0, 100%, 40%);">-                               remote_ip := "127.0.0.1"</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%);">-              nsvci := 0,</span><br><span>          nsei := 2342,</span><br><span>                role_sgsn := true,</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_sns := true</span><br><span style="color: hsl(120, 100%, 40%);">+            handle_sns := true,</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            local_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                            remote_udp_port := 21000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             remote_ip := "127.0.0.1"</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%);">+                            nsvci := 0</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/sgsn/SGSN_Tests.cfg b/sgsn/SGSN_Tests.cfg</span><br><span>index c4e1a33..4f92ac2 100644</span><br><span>--- a/sgsn/SGSN_Tests.cfg</span><br><span>+++ b/sgsn/SGSN_Tests.cfg</span><br><span>@@ -14,29 +14,41 @@</span><br><span> [MODULE_PARAMETERS]</span><br><span> SGSN_Tests.mp_nsconfig := {</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-               provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                         address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                              local_ip := "127.0.0.103",</span><br><span style="color: hsl(0, 100%, 40%);">-                            remote_ip := "127.0.0.10"</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            local_ip := "127.0.0.103",</span><br><span style="color: hsl(120, 100%, 40%);">+                                          remote_ip := "127.0.0.10"</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>   {</span><br><span style="color: hsl(0, 100%, 40%);">-               provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                         address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                              local_ip := "127.0.0.103",</span><br><span style="color: hsl(0, 100%, 40%);">-                            remote_ip := "127.0.0.10"</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            local_ip := "127.0.0.103",</span><br><span style="color: hsl(120, 100%, 40%);">+                                          remote_ip := "127.0.0.10"</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>   {</span><br><span style="color: hsl(0, 100%, 40%);">-               provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                         address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                              local_ip := "127.0.0.103",</span><br><span style="color: hsl(0, 100%, 40%);">-                            remote_ip := "127.0.0.10"</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            local_ip := "127.0.0.103",</span><br><span style="color: hsl(120, 100%, 40%);">+                                          remote_ip := "127.0.0.10"</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/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn</span><br><span>index 53ecdff..a602b21 100644</span><br><span>--- a/sgsn/SGSN_Tests.ttcn</span><br><span>+++ b/sgsn/SGSN_Tests.ttcn</span><br><span>@@ -69,49 +69,61 @@</span><br><span> </span><br><span>     NSConfigurations mp_nsconfig := {</span><br><span>            {</span><br><span style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      local_udp_port := 21010,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      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(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       },</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsvci := 97,</span><br><span>                         nsei := 96,</span><br><span>                  role_sgsn := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    local_udp_port := 21010,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     remote_ip := "127.0.0.1"</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%);">+                                    nsvci := 97</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 style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      local_udp_port := 21011,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      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(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       },</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsvci := 98,</span><br><span>                         nsei := 97,</span><br><span>                  role_sgsn := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    local_udp_port := 21011,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     remote_ip := "127.0.0.1"</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%);">+                                    nsvci := 98</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 style="color: hsl(0, 100%, 40%);">-                       provider := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ip := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 address_family := AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      local_udp_port := 21012,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-                                      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(0, 100%, 40%);">-                              }</span><br><span style="color: hsl(0, 100%, 40%);">-                       },</span><br><span style="color: hsl(0, 100%, 40%);">-                      nsvci := 99,</span><br><span>                         nsei := 98,</span><br><span>                  role_sgsn := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     handle_sns := false</span><br><span style="color: hsl(120, 100%, 40%);">+                   handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    local_udp_port := 21012,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     remote_ip := "127.0.0.1"</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%);">+                                    nsvci := 99</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></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21087">change 21087</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/+/21087"/><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: If1220852785853f8a5d8de183d5053ddd6ccb958 </div>
<div style="display:none"> Gerrit-Change-Number: 21087 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>