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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pgw: Initial testsuite for a PGW (Packet Gateway in the EPC)<br><br>Change-Id: I1c0ea207c9191479fd8f581377855f78f36bc635<br>---<br>M Makefile<br>A pgw/PGW_Tests.cfg<br>A pgw/PGW_Tests.default<br>A pgw/PGW_Tests.ttcn<br>A pgw/gen_links.sh<br>A pgw/regen_makefile.sh<br>6 files changed, 517 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile b/Makefile</span><br><span>index 90bbcea..03e7a70 100644</span><br><span>--- a/Makefile</span><br><span>+++ b/Makefile</span><br><span>@@ -13,7 +13,7 @@</span><br><span> # See the License for the specific language governing permissions and</span><br><span> # limitations under the License.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS=bsc bsc-nat bts ccid ggsn_tests hlr mgw mme msc pcu remsim sccp selftest sgsn \</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS=bsc bsc-nat bts ccid ggsn_tests hlr mgw mme msc pcu pgw remsim sccp selftest sgsn \</span><br><span>     simtrace sip stp sysinfo</span><br><span> </span><br><span> NPROC=$(shell nproc 2>/dev/null)</span><br><span>diff --git a/pgw/PGW_Tests.cfg b/pgw/PGW_Tests.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..a259c32</span><br><span>--- /dev/null</span><br><span>+++ b/pgw/PGW_Tests.cfg</span><br><span>@@ -0,0 +1,18 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[ORDERED_INCLUDE]</span><br><span style="color: hsl(120, 100%, 40%);">+# Common configuration, shared between test suites</span><br><span style="color: hsl(120, 100%, 40%);">+"../Common.cfg"</span><br><span style="color: hsl(120, 100%, 40%);">+# testsuite specific configuration, not expected to change</span><br><span style="color: hsl(120, 100%, 40%);">+"./PGW_Tests.default"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Local configuration below</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MAIN_CONTROLLER]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span style="color: hsl(120, 100%, 40%);">+PGW_Tests.control</span><br><span>diff --git a/pgw/PGW_Tests.default b/pgw/PGW_Tests.default</span><br><span>new file mode 100644</span><br><span>index 0000000..4c0b502</span><br><span>--- /dev/null</span><br><span>+++ b/pgw/PGW_Tests.default</span><br><span>@@ -0,0 +1,7 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span>diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..22e32da</span><br><span>--- /dev/null</span><br><span>+++ b/pgw/PGW_Tests.ttcn</span><br><span>@@ -0,0 +1,430 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module PGW_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Native_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTPv2_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTPv2_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTPv2_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from UECUPS_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from DNS_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+ charstring mp_pgw_hostname := "127.0.0.3";</span><br><span style="color: hsl(120, 100%, 40%);">+  charstring mp_local_hostname_c := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+      charstring mp_local_hostname_u := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+      charstring mp_run_prog_as_user := "laforge";</span><br><span style="color: hsl(120, 100%, 40%);">+        charstring mp_ping_hostname := "10.45.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%);">+/* main component, we typically have one per testcase */</span><br><span style="color: hsl(120, 100%, 40%);">+type component PGW_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var GTPv2_Emulation_CT vc_GTP2;</span><br><span style="color: hsl(120, 100%, 40%);">+       port GTP2EM_PT TEID0;</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-session component; we typically have 1..N per testcase */</span><br><span style="color: hsl(120, 100%, 40%);">+type component PGW_Session_CT extends GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   var SessionPars g_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* TEI (Data) local side */</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT4        g_teid;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TEI (Control) local side */</span><br><span style="color: hsl(120, 100%, 40%);">+        var OCT4        g_teic;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TEI (Data) remote side */</span><br><span style="color: hsl(120, 100%, 40%);">+  var OCT4        g_teid_remote;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* TEI (Control) remote side */</span><br><span style="color: hsl(120, 100%, 40%);">+       var OCT4        g_teic_remote;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* GTP-U IPv4 address remote sie */</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT4        g_gtpu4_remote;</span><br><span style="color: hsl(120, 100%, 40%);">+       var OCT16       g_gtpu6_remote;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Address allocation */</span><br><span style="color: hsl(120, 100%, 40%);">+      var OCT4        g_ip4_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT16       g_ip6_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer     g_ip6_plen;</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%);">+/* configuration data for a given Session */</span><br><span style="color: hsl(120, 100%, 40%);">+type record SessionPars {</span><br><span style="color: hsl(120, 100%, 40%);">+     hexstring       imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring     msisdn optional,</span><br><span style="color: hsl(120, 100%, 40%);">+      // serving network</span><br><span style="color: hsl(120, 100%, 40%);">+    integer         rat_type,</span><br><span style="color: hsl(120, 100%, 40%);">+     // flags?</span><br><span style="color: hsl(120, 100%, 40%);">+     charstring      apn,</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Apn subscribed or non-subscribed */</span><br><span style="color: hsl(120, 100%, 40%);">+        boolean         selection_mode,</span><br><span style="color: hsl(120, 100%, 40%);">+       BIT3            pdn_type,</span><br><span style="color: hsl(120, 100%, 40%);">+     /* PAA */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Max APN Restriction */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* APN-AMBR */</span><br><span style="color: hsl(120, 100%, 40%);">+        octetstring     pco optional,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring     epco optional,</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Bearer Contexts to be created */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ charstring      tun_dev_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ charstring      tun_netns_name optional</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) SessionPars</span><br><span style="color: hsl(120, 100%, 40%);">+t_SessionPars(hexstring imsi, charstring tundev, integer rat_type := 6, charstring apn := "internet",</span><br><span style="color: hsl(120, 100%, 40%);">+         boolean selection_mode := false, BIT3 pdn_type := '001'B) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  imsi := imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ msisdn := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       rat_type := rat_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ apn := apn,</span><br><span style="color: hsl(120, 100%, 40%);">+   selection_mode := selection_mode,</span><br><span style="color: hsl(120, 100%, 40%);">+     pdn_type := pdn_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ pco := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+  epco := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ tun_dev_name := tundev,</span><br><span style="color: hsl(120, 100%, 40%);">+       tun_netns_name := tundev</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 BearerConfig {</span><br><span style="color: hsl(120, 100%, 40%);">+     integer         eps_bearer_id</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 function void_fn() runs on PGW_Session_CT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_init() runs on PGW_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var Gtp2EmulationCfg cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+         gtpc_bind_ip := mp_local_hostname_c,</span><br><span style="color: hsl(120, 100%, 40%);">+          gtpc_bind_port := GTP2C_PORT,</span><br><span style="color: hsl(120, 100%, 40%);">+         gtpc_remote_ip := mp_pgw_hostname,</span><br><span style="color: hsl(120, 100%, 40%);">+            gtpc_remote_port := GTP2C_PORT,</span><br><span style="color: hsl(120, 100%, 40%);">+               sgw_role := true,</span><br><span style="color: hsl(120, 100%, 40%);">+             use_gtpu_daemon := 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%);">+  vc_GTP2 := GTPv2_Emulation_CT.create("GTP2_EM");</span><br><span style="color: hsl(120, 100%, 40%);">+    map(vc_GTP2:GTP2C, system:GTP2C);</span><br><span style="color: hsl(120, 100%, 40%);">+     connect(vc_GTP2:TEID0, self:TEID0);</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_GTP2.start(GTPv2_Emulation.main(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%);">+function f_start_handler(void_fn fn, template (omit) SessionPars pars := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on PGW_Test_CT return PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var charstring id := testcasename();</span><br><span style="color: hsl(120, 100%, 40%);">+  var PGW_Session_CT vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := PGW_Session_CT.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(vc_conn:GTP2, vc_GTP2:CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+        connect(vc_conn:GTP2_PROC, vc_GTP2:CLIENT_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn.start(f_handler_init(fn, pars));</span><br><span style="color: hsl(120, 100%, 40%);">+      return 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%);">+private function f_handler_init(void_fn fn, template (omit) SessionPars pars := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isvalue(pars)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          g_pars := valueof(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fn.apply();</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%);">+/* find TEID of given interface type (and optionally instance) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_find_teid(FullyQualifiedTEID_List list,</span><br><span style="color: hsl(120, 100%, 40%);">+                          template (present) integer if_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template (present) BIT4 instance := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+return template (omit) FullyQualifiedTEID</span><br><span style="color: hsl(120, 100%, 40%);">+{</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(list); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (match(list[i].interfaceType, if_type) and</span><br><span style="color: hsl(120, 100%, 40%);">+             match(list[i].instance, instance)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return list[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 omit;</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%);">+/* process one to-be-created bearer context */</span><br><span style="color: hsl(120, 100%, 40%);">+private function process_bctx_create(BearerContextGrouped bctx) runs on PGW_Session_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: EPS Bearer ID */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: Cause */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* find F-TEID of the P-GW U side */</span><br><span style="color: hsl(120, 100%, 40%);">+  var FullyQualifiedTEID rx_fteid;</span><br><span style="color: hsl(120, 100%, 40%);">+      rx_fteid := valueof(f_find_teid(bctx.bearerContextIEs.fullyQualifiedTEID, 5, '0010'B));</span><br><span style="color: hsl(120, 100%, 40%);">+       g_teid_remote := rx_fteid.tEID_GRE_Key;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rx_fteid.v4_Flag == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+               g_gtpu4_remote := rx_fteid.iPv4_Address;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rx_fteid.v6_Flag == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+               g_gtpu6_remote := rx_fteid.iPv6_Address;</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%);">+   var UECUPS_CreateTun uecups_create := {</span><br><span style="color: hsl(120, 100%, 40%);">+               tx_teid := oct2int(g_teid_remote),</span><br><span style="color: hsl(120, 100%, 40%);">+            rx_teid := oct2int(g_teid),</span><br><span style="color: hsl(120, 100%, 40%);">+           user_addr_type := IPV4,</span><br><span style="color: hsl(120, 100%, 40%);">+               user_addr := '00000000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+             local_gtp_ep := valueof(ts_UECUPS_SockAddr(f_inet_addr(mp_local_hostname_u))),</span><br><span style="color: hsl(120, 100%, 40%);">+                remote_gtp_ep := valueof(ts_UECUPS_SockAddr(g_gtpu4_remote)),</span><br><span style="color: hsl(120, 100%, 40%);">+         tun_dev_name := g_pars.tun_dev_name,</span><br><span style="color: hsl(120, 100%, 40%);">+          tun_netns_name := g_pars.tun_netns_name</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%);">+  /* create tunnel in daemon */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(g_ip4_addr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            uecups_create.user_addr := g_ip4_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+                f_gtp2_create_tunnel(uecups_create);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (isbound(g_ip6_addr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            uecups_create.user_addr_type := IPV6;</span><br><span style="color: hsl(120, 100%, 40%);">+         uecups_create.user_addr := g_ip6_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+                f_gtp2_create_tunnel(uecups_create);</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%);">+/* create a session on the PGW */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_create_session() runs on PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var PDU_GTPCv2 rx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* allocate + register TEID-C on local side */</span><br><span style="color: hsl(120, 100%, 40%);">+        g_teic := f_gtp2_allocate_teid();</span><br><span style="color: hsl(120, 100%, 40%);">+     g_teid := g_teic;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (value) FullyQualifiedTEID fteid_c_ie, fteid_u_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+       fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPC, g_teic, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       f_inet_addr(mp_local_hostname_c), omit);</span><br><span style="color: hsl(120, 100%, 40%);">+      fteid_u_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPU, g_teid, 2,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       f_inet_addr(mp_local_hostname_u), omit);</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (value) PDU_GTPCv2 g2c :=</span><br><span style="color: hsl(120, 100%, 40%);">+                ts_GTP2C_CreateSessionReq(imsi := g_pars.imsi, msisdn := omit, rat_type := 6,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   sender_fteid := fteid_c_ie,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   apn := f_enc_dns_hostname(g_pars.apn),</span><br><span style="color: hsl(120, 100%, 40%);">+                                        pdn_type := g_pars.pdn_type, teid_list := { fteid_u_ie },</span><br><span style="color: hsl(120, 100%, 40%);">+                                     chg_car := '0000'O, bearer_id := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* open5gs up to 1.2.3 won't accept it without ULI, despite not mandatory */</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (value) TAI tai := { '0'H, '0'H, '1'H, 'F'H, '0'H, '1'H, '0001'O };</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (value) ECGI ecgi := { '0'H, '0'H, '1'H, 'F'H, '0'H, '1'H, '0'H, 23 };</span><br><span style="color: hsl(120, 100%, 40%);">+   g2c.gtpcv2_pdu.createSessionRequest.userLocationInfo := ts_GTP2C_UserLocInfo(tai := tai, ecgi := ecgi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     GTP2.send(g2c);</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_teic, cause:='10'O)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* extract TEIDs */</span><br><span style="color: hsl(120, 100%, 40%);">+           var CreateSessionResponse resp := rx.gtpcv2_pdu.createSessionResponse;</span><br><span style="color: hsl(120, 100%, 40%);">+                g_teic_remote := resp.fullyQualifiedTEID[0].tEID_GRE_Key;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* extract allocated address[es] */</span><br><span style="color: hsl(120, 100%, 40%);">+           var PDN_Address_and_Prefix paa := resp.pDN_AddressAllocation.pDN_Address_and_Prefix;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (ischosen(paa.iPv4_Address)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_ip4_addr := paa.iPv4_Address;</span><br><span style="color: hsl(120, 100%, 40%);">+               } else if (ischosen(paa.iPv6_Address)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      g_ip6_addr := paa.iPv6_Address.iPv6_Address;</span><br><span style="color: hsl(120, 100%, 40%);">+                  g_ip6_plen := paa.iPv6_Address.prefixLength;</span><br><span style="color: hsl(120, 100%, 40%);">+          } else if (ischosen(paa.iPv4_IPv6)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 g_ip4_addr := paa.iPv4_IPv6.iPv4_Address;</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_ip6_addr := paa.iPv4_IPv6.iPv6_Address;</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_ip6_plen := paa.iPv4_IPv6.prefixLength;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</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(resp.bearerContextGrouped); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  var BearerContextGrouped bctx := resp.bearerContextGrouped[i];</span><br><span style="color: hsl(120, 100%, 40%);">+                        select (bctx.instance) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      case ('0000'B) { // created</span><br><span style="color: hsl(120, 100%, 40%);">+                           process_bctx_create(bctx);</span><br><span style="color: hsl(120, 100%, 40%);">+                            }</span><br><span style="color: hsl(120, 100%, 40%);">+                     case ('0001'B) { // removed</span><br><span style="color: hsl(120, 100%, 40%);">+                           setverdict(fail, "We don't expect removed bearer contexts yet");</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%);">+     [] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_teic, cause:=?)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Unexpected  CreateSessionResp(cause=",</span><br><span style="color: hsl(120, 100%, 40%);">+                            rx.gtpcv2_pdu.createSessionResponse.cause.causeValue, ")");</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] GTP2.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Unexpected GTPv2 while waiting for CreateSessionResp");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* delete the session from the PGW */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_delete_session(template (omit) OCT1 tx_cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                               template (present) OCT4 exp_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+                             template (present) OCT1 exp_cause) runs on PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) FullyQualifiedTEID fteid_c_ie</span><br><span style="color: hsl(120, 100%, 40%);">+    fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPC, g_teic, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       f_inet_addr(mp_local_hostname_c), omit);</span><br><span style="color: hsl(120, 100%, 40%);">+      var template PDU_GTPCv2 g2c :=</span><br><span style="color: hsl(120, 100%, 40%);">+                ts_GTP2C_DeleteSessionReq(d_teid := g_teic_remote, cause := tx_cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   sender_fteid := fteid_c_ie,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   teid_list := {}, bearer_id := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2.send(g2c);</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2.receive(tr_GTP2C_DeleteSessionResp(d_teid := exp_teid, cause := exp_cause)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] GTP2.receive(tr_GTP2C_DeleteSessionResp(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Unexpected  DeleteSessionResp");</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] GTP2.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Unexpected GTPv2 while waiting for DeleteSessionResp");</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%);">+   /* destroy tunnel in daemon */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (isbound(g_teid)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var UECUPS_DestroyTun uecups_destroy := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     local_gtp_ep := valueof(ts_UECUPS_SockAddr(f_inet_addr(mp_local_hostname_u))),</span><br><span style="color: hsl(120, 100%, 40%);">+                        rx_teid := oct2int(g_teid)</span><br><span style="color: hsl(120, 100%, 40%);">+            };</span><br><span style="color: hsl(120, 100%, 40%);">+            /* FIXME: what about IPv4/IPv6 differentiation? */</span><br><span style="color: hsl(120, 100%, 40%);">+            f_gtp2_destroy_tunnel(uecups_destroy);</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%);">+/* start a program on the user plane side; return its PID */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_start_prog(charstring command) runs on PGW_Session_CT return integer</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var UECUPS_StartProgram sprog := {</span><br><span style="color: hsl(120, 100%, 40%);">+            command := command,</span><br><span style="color: hsl(120, 100%, 40%);">+           environment := {},</span><br><span style="color: hsl(120, 100%, 40%);">+            run_as_user := mp_run_prog_as_user,</span><br><span style="color: hsl(120, 100%, 40%);">+           tun_netns_name := g_pars.tun_netns_name</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    var UECUPS_StartProgramRes res := f_gtp2_start_program(sprog);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (res.result != OK) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Unable to start program '", command, "'");</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return res.pid;</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%);">+/* wait for termination of a given PID with specified exit_code */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_wait_term(integer pid, template (present) integer exit_code := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                             float tout := 10.0) runs on PGW_Session_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := tout;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2.receive(UECUPS_ProgramTermInd:{pid := pid, exit_code := exit_code}) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] GTP2.receive(UECUPS_ProgramTermInd:?) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected ProgramTermInd");</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "timeout waiting for user-plane program termination");</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%);">+/* execute a program and wait for result */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_start_prog_wait(charstring command, template integer exit_code := 0, float tout := 10.0) runs on PGW_Session_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer pid := f_start_prog(command);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_wait_term(pid, exit_code, tout);</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%);">+/* execute ping command and wait for result */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_ping4(charstring host, integer interval := 1, integer count := 10) runs on PGW_Session_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var charstring ping :="ping -c " & int2str(count) & " -i " & int2str(interval);</span><br><span style="color: hsl(120, 100%, 40%);">+       ping := ping & " -I " & f_inet_ntoa(g_ip4_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+    ping := ping & " " & host;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_start_prog_wait(ping);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* send echo request; expect response */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_tx_echo() runs on PGW_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   TEID0.send(ts_GTP2C_EchoReq(0));</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] TEID0.receive(tr_GTP2C_EchoResp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "timeout waiting for Echo Response");</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%);">+/* create a session, expect it to succeed */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_createSession() runs on PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_create_session();</span><br><span style="color: hsl(120, 100%, 40%);">+   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createSession() runs on PGW_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var PGW_Session_CT vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var SessionPars pars := valueof(t_SessionPars('001010123456789'H, "tun22"));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_TC_createSession), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</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%);">+/* create a session, then execute a ping command on the user plane */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_createSession_ping4() runs on PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_create_session();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ping4(mp_ping_hostname);</span><br><span style="color: hsl(120, 100%, 40%);">+    setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createSession_ping4() runs on PGW_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var PGW_Session_CT vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var SessionPars pars := valueof(t_SessionPars('001010123456789'H, "tun23"));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_TC_createSession_ping4), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn.done;</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%);">+/* create a session, then delete it again */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_createSession_deleteSession() runs on PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_create_session();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_delete_session(omit, g_teic, '10'O);</span><br><span style="color: hsl(120, 100%, 40%);">+        setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createSession_deleteSession() runs on PGW_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var PGW_Session_CT vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var SessionPars pars := valueof(t_SessionPars('001010123456789'H, "tun23"));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_TC_createSession_deleteSession), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn.done;</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%);">+/* send a DeleteSessionReq for an unknown/invalid TEID */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_deleteSession_unknown() runs on PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ g_teic := f_gtp2_allocate_teid();</span><br><span style="color: hsl(120, 100%, 40%);">+     g_teic_remote := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_delete_session(omit, '00000000'O, '40'O /* Context Unknown */);</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_deleteSession_unknown() runs on PGW_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var PGW_Session_CT vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var SessionPars pars := valueof(t_SessionPars('001010123456789'H, "tun23"));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_TC_deleteSession_unknown), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_tx_echo() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_createSession() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_createSession_ping4() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_createSession_deleteSession() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_deleteSession_unknown() );</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>diff --git a/pgw/gen_links.sh b/pgw/gen_links.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..061d78c</span><br><span>--- /dev/null</span><br><span>+++ b/pgw/gen_links.sh</span><br><span>@@ -0,0 +1,55 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BASEDIR=../deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+. ../gen_links.sh.inc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Socket_API_Definitions.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.IPL4asp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="IPL4asp_Functions.ttcn  IPL4asp_PT.cc  IPL4asp_PT.hh IPL4asp_PortType.ttcn  IPL4asp_Types.ttcn  IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.ICMP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="ICMP_EncDec.cc  ICMP_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.ICMPv6/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="ICMPv6_EncDec.cc  ICMPv6_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.IP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="IP_EncDec.cc  IP_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.UDP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="UDP_EncDec.cc  UDP_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.GTP_v13.5.0/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="GTPC_EncDec.cc  GTPC_Types.ttcn  GTPU_EncDec.cc  GTPU_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.GTPv2_v13.7.0/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="GTPv2_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/osmo-uecups/ttcn3</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="UECUPS_CodecPort.ttcn  UECUPS_CodecPort_CtrlFunct.ttcn  UECUPS_CodecPort_CtrlFunctDef.cc UECUPS_Types.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=../library</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPCP_Types.ttcn PAP_Types.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="GTP_CodecPort.ttcn GTP_CodecPort_CtrlFunct.ttcn GTP_CodecPort_CtrlFunctDef.cc GTP_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="GTPv2_PrivateExtensions.ttcn GTPv2_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="GTPv2_CodecPort.ttcn GTPv2_CodecPort_CtrlFunctDef.cc GTPv2_CodecPort_CtrlFunct.ttcn GTPv2_Emulation.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="DNS_Helpers.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ignore_pp_results</span><br><span>diff --git a/pgw/regen_makefile.sh b/pgw/regen_makefile.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..46616da</span><br><span>--- /dev/null</span><br><span>+++ b/pgw/regen_makefile.sh</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn IPL4asp_PT.cc  IPL4asp_discovery.cc  TCCConversion.cc  TCCInterface.cc GTPC_EncDec.cc GTPU_EncDec.cc GTP_CodecPort_CtrlFunctDef.cc GTPv2_CodecPort_CtrlFunctDef.cc ICMPv6_EncDec.cc IP_EncDec.cc Native_FunctionDefs.cc UDP_EncDec.cc ICMP_EncDec.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="UECUPS_CodecPort_CtrlFunctDef.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+../regen-makefile.sh PGW_Tests.ttcn $FILES</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17868">change 17868</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/+/17868"/><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: I1c0ea207c9191479fd8f581377855f78f36bc635 </div>
<div style="display:none"> Gerrit-Change-Number: 17868 </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: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>