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