<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>