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