<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23543">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">NS_Emulation: Use the "endpoint" mode of NS_Provider_IPL4<br><br>Thew newly-introduced "endpoint" mode of NS_Provider_IPL4 allows us<br>to have multiple NS-VC within one endpoint. NS_CT takes care of<br>creating the NS_Provider_IPL4 components on-the-fly, and then<br>associating the per-NSVC components with it.<br><br>For the user nothing changes, other than that he can now configure<br>multiple NSVCs with identical local IP + port, which was not possible<br>before.<br><br>Change-Id: Id7360f17e528706e8145d33a14550789d50cded9<br>---<br>M library/NS_Emulation.ttcnpp<br>1 file changed, 85 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/43/23543/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/NS_Emulation.ttcnpp b/library/NS_Emulation.ttcnpp</span><br><span>index 38f132a..85869da 100644</span><br><span>--- a/library/NS_Emulation.ttcnpp</span><br><span>+++ b/library/NS_Emulation.ttcnpp</span><br><span>@@ -214,6 +214,11 @@</span><br><span> var NSConfiguration g_config;</span><br><span> var charstring g_id;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* references to the endpoint provider components */</span><br><span style="color: hsl(120, 100%, 40%);">+ var IpEndpointTable g_ip_endpoints := {};</span><br><span style="color: hsl(120, 100%, 40%);">+ /* control port for NS-IP provider */</span><br><span style="color: hsl(120, 100%, 40%);">+ port NSPIP_PROC_PT NSPIP_PROC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* references to the per-NSVC components */</span><br><span> var NsvcTable g_nsvcs := {};</span><br><span> /* list of indexes to g_nsvcs[] of currently unblocked NSVCs */</span><br><span>@@ -226,6 +231,17 @@</span><br><span> NsvcState state</span><br><span> };</span><br><span> type record of NsvcTableEntry NsvcTable;</span><br><span style="color: hsl(120, 100%, 40%);">+ type record IpEndpointTableEntry {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* configuration */</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%);">+ uint8_t data_weight,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t signalling_weight,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* state */</span><br><span style="color: hsl(120, 100%, 40%);">+ NS_Provider_IPL4_CT provider_ct</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+ type record of IpEndpointTableEntry IpEndpointTable;</span><br><span> </span><br><span> /* internal port from the NS-VC point of view */</span><br><span> type port NSint_SP_PT message {</span><br><span>@@ -267,20 +283,82 @@</span><br><span> ForceAliveState (3)</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ function f_ipep_find(AddressFamily af, PortNumber local_udp_port, charstring local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ out IpEndpointTableEntry ret)</span><br><span style="color: hsl(120, 100%, 40%);">+ runs on NS_CT return boolean {</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_ip_endpoints); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var IpEndpointTableEntry ipep := g_ip_endpoints[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ipep.address_family == af and ipep.local_udp_port == local_udp_port and</span><br><span style="color: hsl(120, 100%, 40%);">+ ipep.local_ip == local_ip) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ret := ipep;</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</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 false</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%);">+ /* find or create IP endpoint component for [local part of] nsvc_cfg */</span><br><span style="color: hsl(120, 100%, 40%);">+ function f_ipep_find_or_create(NSVCConfiguration nsvc_cfg)</span><br><span style="color: hsl(120, 100%, 40%);">+ runs on NS_CT return NS_Provider_IPL4_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var IpEndpointTableEntry ipep;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (f_ipep_find(nsvc_cfg.provider.ip.address_family,</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%);">+ nsvc_cfg.provider.ip.local_ip, ipep)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return ipep.provider_ct;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</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%);">+ ipep := {</span><br><span style="color: hsl(120, 100%, 40%);">+ address_family := nsvc_cfg.provider.ip.address_family,</span><br><span style="color: hsl(120, 100%, 40%);">+ local_udp_port := nsvc_cfg.provider.ip.local_udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+ local_ip := nsvc_cfg.provider.ip.local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ data_weight := nsvc_cfg.provider.ip.data_weight,</span><br><span style="color: hsl(120, 100%, 40%);">+ signalling_weight := nsvc_cfg.provider.ip.signalling_weight,</span><br><span style="color: hsl(120, 100%, 40%);">+ provider_ct := -</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Create ipep and add it to the list */</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Creating NSIP provider for ", ipep.local_ip, ":",</span><br><span style="color: hsl(120, 100%, 40%);">+ ipep.local_udp_port);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipep.provider_ct := NS_Provider_IPL4_CT.create(nsvc_id & "-provIP");</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(self:NSPIP_PROC, ipep.provider_ct:PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipep.provider_ct.start(NS_Provider_IPL4.main(nsvc_cfg, g_config, nsvc_id));</span><br><span style="color: hsl(120, 100%, 40%);">+ g_ip_endpoints := g_ip_endpoints & { ipep };</span><br><span style="color: hsl(120, 100%, 40%);">+ return ipep.provider_ct;</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> /* 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> var NsvcTableEntry te;</span><br><span style="color: hsl(120, 100%, 40%);">+ var NS_Provider_IPL4_CT vc_ipep := null;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* For the IP provider, we have one provider component per local endpoint,</span><br><span style="color: hsl(120, 100%, 40%);">+ * which we must create before adding the NSVcs (for each remote endpoint)</span><br><span style="color: hsl(120, 100%, 40%);">+ * to it */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ischosen(nsvc_cfg.provider.ip)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_ipep := f_ipep_find_or_create(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%);">+ /* Start the actual NSVC component */</span><br><span> </span><br><span> te.cfg := nsvc_cfg;</span><br><span> te.vc_conn := NSVC_CT.create(nsvc_id);</span><br><span> te.state := NSVC_S_DEAD_BLOCKED;</span><br><span> </span><br><span> connect(self:NSVC, te.vc_conn:NS_SP);</span><br><span style="color: hsl(0, 100%, 40%);">- te.vc_conn.start(NSVCStart(nsvc_cfg, g_config, nsvc_id));</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Starting NSVC component for ", nsvc_cfg);</span><br><span style="color: hsl(120, 100%, 40%);">+ te.vc_conn.start(NSVCStart(nsvc_cfg, g_config, nsvc_id, vc_ipep));</span><br><span> </span><br><span> g_nsvcs := g_nsvcs & { te };</span><br><span> /* no need to add to g_unblocked_nsvcs, as state is always DEAD_BLOCKED above */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* For the IP provider, we must explicitly associate each NSVC with it */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ischosen(nsvc_cfg.provider.ip)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* this causes NS_Provider_IPL4.f_nsvc_add() to be executed */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_nspip_add_nsvc(vc_ipep, nsvc_cfg.provider.ip.remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc_cfg.provider.ip.remote_udp_port, te.vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> function f_nsvc_find_idx(Nsvci nsvci) runs on NS_CT return integer {</span><br><span>@@ -555,19 +633,18 @@</span><br><span> timer Tns_reset := 10.0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 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%);">+ function NSVCStart(NSVCConfiguration init_config, NSConfiguration init_g_config, charstring id :=</span><br><span style="color: hsl(120, 100%, 40%);">+testcasename(), NS_Provider_IPL4_CT nsp_ip := null) runs on NSVC_CT {</span><br><span> g_nsvc_config := init_config;</span><br><span> g_config := init_g_config;</span><br><span style="color: hsl(0, 100%, 40%);">- f_init(id & "-NSVCemu" & int2str(g_nsvc_config.nsvci));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init(id & "-NSVCemu" & int2str(g_nsvc_config.nsvci), nsp_ip);</span><br><span> f_ScanEvents();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- private function f_init(charstring id) runs on NSVC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ private function f_init(charstring id, NS_Provider_IPL4_CT nsp_ip) runs on NSVC_CT {</span><br><span> if (ischosen(g_nsvc_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(g_nsvc_config, g_config, id));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* the provider already exists; we just associate with it */</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_NSP_IP := nsp_ip</span><br><span> #ifdef NS_EMULATION_FR</span><br><span> } else if (ischosen(g_nsvc_config.provider.fr)) {</span><br><span> vc_NSP_FR := NS_Provider_FR_CT.create(id & "-provFR");</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23543">change 23543</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/+/23543"/><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: Id7360f17e528706e8145d33a14550789d50cded9 </div>
<div style="display:none"> Gerrit-Change-Number: 23543 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>