<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17950">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pgw: Add support for PCRF emulation (CCR/CCA)<br><br>If mp_pcrf_local_ip is set to a non-empty string, the PGW testsuite<br>now emulates a PCRF and expects the PGW to perform the related<br>transactions - so far Credit-Control-Request INITIAL_REQUEST<br>at session creation, and TERMINATION_REQUST at session deletion.<br><br>Change-Id: I5f0c7a66d38e5c8b5f36b45717d49648a14ed7b2<br>---<br>M library/DIAMETER_Templates.ttcn<br>M pgw/PGW_Tests.ttcn<br>M pgw/gen_links.sh<br>M pgw/regen_makefile.sh<br>4 files changed, 176 insertions(+), 1 deletion(-)<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/50/17950/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/DIAMETER_Templates.ttcn b/library/DIAMETER_Templates.ttcn</span><br><span>index 450e013..2cc2986 100644</span><br><span>--- a/library/DIAMETER_Templates.ttcn</span><br><span>+++ b/library/DIAMETER_Templates.ttcn</span><br><span>@@ -326,6 +326,51 @@</span><br><span>                }</span><br><span>    }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) GenericAVP tr_AVP_AuthAppId(template (present) OCTET4 auth_app_id := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       avp := {</span><br><span style="color: hsl(120, 100%, 40%);">+              avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Application_Id),</span><br><span style="color: hsl(120, 100%, 40%);">+           avp_data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 avp_BASE_NONE_Auth_Application_Id := auth_app_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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GenericAVP ts_AVP_CcReqType(template (value) DCC_NONE_CC_Request_Type r) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        avp := {</span><br><span style="color: hsl(120, 100%, 40%);">+              avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Request_Type),</span><br><span style="color: hsl(120, 100%, 40%);">+                avp_data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 avp_DCC_NONE_CC_Request_Type := r</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%);">+template (present) GenericAVP tr_AVP_CcReqType(template (present) DCC_NONE_CC_Request_Type r := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ avp := {</span><br><span style="color: hsl(120, 100%, 40%);">+              avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Request_Type),</span><br><span style="color: hsl(120, 100%, 40%);">+                avp_data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 avp_DCC_NONE_CC_Request_Type := r</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%);">+template (value) GenericAVP ts_AVP_CcReqNum(template (value) AVP_Unsigned32 n) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   avp := {</span><br><span style="color: hsl(120, 100%, 40%);">+              avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Request_Number),</span><br><span style="color: hsl(120, 100%, 40%);">+              avp_data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 avp_DCC_NONE_CC_Request_Number := n</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%);">+template (present) GenericAVP tr_AVP_CcReqNum(template (present) AVP_Unsigned32 n := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    avp := {</span><br><span style="color: hsl(120, 100%, 40%);">+              avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_CC_Request_Number),</span><br><span style="color: hsl(120, 100%, 40%);">+              avp_data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 avp_DCC_NONE_CC_Request_Number := n</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%);">+</span><br><span> </span><br><span> template (value) GenericAVP ts_AVP_SuppVendorIdRaw(uint32_t vendor_id) := {</span><br><span>        avp := {</span><br><span>@@ -879,4 +924,43 @@</span><br><span> </span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* RFC 4006 3.1.  Credit-Control-Request (CCR) Command */</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) PDU_DIAMETER</span><br><span style="color: hsl(120, 100%, 40%);">+tr_DIA_CCR(template (present) DCC_NONE_CC_Request_Type req_type := INITIAL_REQUEST)</span><br><span style="color: hsl(120, 100%, 40%);">+:= tr_DIAMETER(flags:='11000000'B, cmd_code:=Credit_Control,</span><br><span style="color: hsl(120, 100%, 40%);">+                        app_id:=int2oct(c_DIAMETER_3GPP_Gx_AID, 4),</span><br><span style="color: hsl(120, 100%, 40%);">+       avps := superset(</span><br><span style="color: hsl(120, 100%, 40%);">+             tr_AVP_SessionId,</span><br><span style="color: hsl(120, 100%, 40%);">+             tr_AVP_OriginHost,</span><br><span style="color: hsl(120, 100%, 40%);">+            tr_AVP_OriginRealm,</span><br><span style="color: hsl(120, 100%, 40%);">+           tr_AVP_DestinationRealm,</span><br><span style="color: hsl(120, 100%, 40%);">+              tr_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_Gx_AID, 4)),</span><br><span style="color: hsl(120, 100%, 40%);">+         tr_AVP_CcReqType(req_type),</span><br><span style="color: hsl(120, 100%, 40%);">+           tr_AVP_CcReqNum(?)</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%);">+/* RFC 4006 3.2.  Credit-Control-Answer (CCA) Command */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_DIAMETER</span><br><span style="color: hsl(120, 100%, 40%);">+ts_DIA_CCA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,</span><br><span style="color: hsl(120, 100%, 40%);">+     template (value) octetstring sess_id,</span><br><span style="color: hsl(120, 100%, 40%);">+         template (value) DCC_NONE_CC_Request_Type req_type,</span><br><span style="color: hsl(120, 100%, 40%);">+           template (value) AVP_Unsigned32 req_num)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,</span><br><span style="color: hsl(120, 100%, 40%);">+           app_id:=int2oct(c_DIAMETER_3GPP_Gx_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,</span><br><span style="color: hsl(120, 100%, 40%);">+   avps := {</span><br><span style="color: hsl(120, 100%, 40%);">+             ts_AVP_SessionId(sess_id),</span><br><span style="color: hsl(120, 100%, 40%);">+            ts_AVP_ResultCode(DIAMETER_SUCCESS),</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_AVP_OriginHost("pcrf.localdomain"),</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_AVP_OriginRealm("localdomain"),</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_Gx_AID, 4)),</span><br><span style="color: hsl(120, 100%, 40%);">+         ts_AVP_CcReqType(req_type),</span><br><span style="color: hsl(120, 100%, 40%);">+           ts_AVP_CcReqNum(req_num)//,</span><br><span style="color: hsl(120, 100%, 40%);">+           // qos</span><br><span style="color: hsl(120, 100%, 40%);">+                // default eps bearer qos</span><br><span style="color: hsl(120, 100%, 40%);">+             // supported features</span><br><span style="color: hsl(120, 100%, 40%);">+         // origin</span><br><span style="color: hsl(120, 100%, 40%);">+     });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> }</span><br><span>diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn</span><br><span>index c99302c..875f852 100644</span><br><span>--- a/pgw/PGW_Tests.ttcn</span><br><span>+++ b/pgw/PGW_Tests.ttcn</span><br><span>@@ -12,22 +12,37 @@</span><br><span> </span><br><span> import from DNS_Helpers all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from DIAMETER_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DIAMETER_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DIAMETER_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> modulepar {</span><br><span>        charstring mp_pgw_hostname := "127.0.0.3";</span><br><span>         charstring mp_local_hostname_c := "127.0.0.1";</span><br><span>     charstring mp_local_hostname_u := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   charstring mp_run_prog_as_user := "laforge";</span><br><span>       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%);">+       charstring mp_pcrf_local_ip := "127.0.0.5";</span><br><span style="color: hsl(120, 100%, 40%);">+ integer mp_pcrf_local_port := 3868;</span><br><span> }</span><br><span> </span><br><span> /* main component, we typically have one per testcase */</span><br><span> type component PGW_Test_CT {</span><br><span>     var GTPv2_Emulation_CT vc_GTP2;</span><br><span>      port GTP2EM_PT TEID0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* emulated PCRF */</span><br><span style="color: hsl(120, 100%, 40%);">+   var DIAMETER_Emulation_CT vc_DIAMETER;</span><br><span style="color: hsl(120, 100%, 40%);">+        port DIAMETER_PT DIAMETER_UNIT;</span><br><span style="color: hsl(120, 100%, 40%);">+       port DIAMETEREM_PROC_PT DIAMETER_PROC;</span><br><span> }</span><br><span> </span><br><span> /* per-session component; we typically have 1..N per testcase */</span><br><span style="color: hsl(0, 100%, 40%);">-type component PGW_Session_CT extends GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+type component PGW_Session_CT extends GTP2_ConnHdlr, DIAMETER_ConnHdlr {</span><br><span>   var SessionPars g_pars;</span><br><span> </span><br><span>  /* TEI (Data) local side */</span><br><span>@@ -91,6 +106,35 @@</span><br><span> </span><br><span> type function void_fn() runs on PGW_Session_CT;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+friend function DiameterForwardUnitdataCallback(PDU_DIAMETER msg)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on DIAMETER_Emulation_CT return template PDU_DIAMETER {</span><br><span style="color: hsl(120, 100%, 40%);">+ DIAMETER_UNIT.send(msg);</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%);">+friend function f_init_diameter(charstring id) runs on PGW_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var DIAMETEROps ops := {</span><br><span style="color: hsl(120, 100%, 40%);">+              create_cb := refers(DIAMETER_Emulation.ExpectedCreateCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+               unitdata_cb := refers(DiameterForwardUnitdataCallback)</span><br><span style="color: hsl(120, 100%, 40%);">+        };</span><br><span style="color: hsl(120, 100%, 40%);">+    var DIAMETER_conn_parameters pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+                remote_ip := mp_pgw_hostname,</span><br><span style="color: hsl(120, 100%, 40%);">+         remote_sctp_port := -1,</span><br><span style="color: hsl(120, 100%, 40%);">+               local_ip := mp_pcrf_local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+         local_sctp_port := mp_pcrf_local_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                origin_host := "pcrf.localdomain",</span><br><span style="color: hsl(120, 100%, 40%);">+          origin_realm := "localdomain",</span><br><span style="color: hsl(120, 100%, 40%);">+              vendor_app_id := c_DIAMETER_3GPP_Gx_AID</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_DIAMETER := DIAMETER_Emulation_CT.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+      map(vc_DIAMETER:DIAMETER, system:DIAMETER_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+  connect(vc_DIAMETER:DIAMETER_UNIT, self:DIAMETER_UNIT);</span><br><span style="color: hsl(120, 100%, 40%);">+       connect(vc_DIAMETER:DIAMETER_PROC, self:DIAMETER_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_DIAMETER.start(DIAMETER_Emulation.main(ops, pars, id));</span><br><span style="color: hsl(120, 100%, 40%);">+    /* HACK: this is supposed to wait for the PGW to perform the CER/CEA dance */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(10.0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private function f_init() runs on PGW_Test_CT {</span><br><span>       var Gtp2EmulationCfg cfg := {</span><br><span>                gtpc_bind_ip := mp_local_hostname_c,</span><br><span>@@ -105,6 +149,10 @@</span><br><span>  map(vc_GTP2:GTP2C, system:GTP2C);</span><br><span>    connect(vc_GTP2:TEID0, self:TEID0);</span><br><span>  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%);">+   if (mp_pcrf_local_ip != "") {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_init_diameter(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> }</span><br><span> </span><br><span> function f_start_handler(void_fn fn, template (omit) SessionPars pars := omit)</span><br><span>@@ -114,6 +162,12 @@</span><br><span>  vc_conn := PGW_Session_CT.create(id);</span><br><span>        connect(vc_conn:GTP2, vc_GTP2:CLIENT);</span><br><span>       connect(vc_conn:GTP2_PROC, vc_GTP2:CLIENT_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (isbound(vc_DIAMETER)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           connect(vc_conn:DIAMETER, vc_DIAMETER:DIAMETER_CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+               connect(vc_conn:DIAMETER_PROC, vc_DIAMETER:DIAMETER_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  vc_conn.start(f_handler_init(fn, pars));</span><br><span>     return vc_conn;</span><br><span> }</span><br><span>@@ -123,6 +177,9 @@</span><br><span>   if (isvalue(pars)) {</span><br><span>                 g_pars := valueof(pars);</span><br><span>     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (DIAMETER_PROC.checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                f_diameter_expect(g_pars.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    fn.apply();</span><br><span> }</span><br><span> </span><br><span>@@ -146,6 +203,28 @@</span><br><span>  return f_concat_pad(12, '49123'H, suffix);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_DIA_CCR(DCC_NONE_CC_Request_Type req_type) runs on PGW_Session_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var PDU_DIAMETER rx_dia;</span><br><span style="color: hsl(120, 100%, 40%);">+      [] DIAMETER.receive(tr_DIA_CCR(req_type := req_type)) -> value rx_dia {</span><br><span style="color: hsl(120, 100%, 40%);">+            var template (omit) AVP avp;</span><br><span style="color: hsl(120, 100%, 40%);">+          var octetstring sess_id;</span><br><span style="color: hsl(120, 100%, 40%);">+              var AVP_Unsigned32 req_num;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         avp := f_DIAMETER_get_avp(rx_dia, c_AVP_Code_BASE_NONE_Session_Id);</span><br><span style="color: hsl(120, 100%, 40%);">+           sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          avp := f_DIAMETER_get_avp(rx_dia, c_AVP_Code_DCC_NONE_CC_Request_Number);</span><br><span style="color: hsl(120, 100%, 40%);">+             req_num := valueof(avp.avp_data.avp_DCC_NONE_CC_Request_Number);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            DIAMETER.send(ts_DIA_CCA(rx_dia.hop_by_hop_id, rx_dia.end_to_end_id, sess_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  req_type, req_num));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] DIAMETER.receive(PDU_DIAMETER:?) -> value rx_dia {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received unexpected DIAMETER ", rx_dia);</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> /* find TEID of given interface type (and optionally instance) */</span><br><span> private function f_find_teid(FullyQualifiedTEID_List list,</span><br><span>@@ -228,6 +307,9 @@</span><br><span>  g2c.gtpcv2_pdu.createSessionRequest.userLocationInfo := ts_GTP2C_UserLocInfo(tai := tai, ecgi := ecgi);</span><br><span> </span><br><span>  GTP2.send(g2c);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (DIAMETER_PROC.checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                as_DIA_CCR(INITIAL_REQUEST);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span>    alt {</span><br><span>        [] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_teic, cause:='10'O)) -> value rx {</span><br><span>           /* extract TEIDs */</span><br><span>@@ -283,6 +365,9 @@</span><br><span>                                      teid_list := {}, bearer_id := 1);</span><br><span> </span><br><span>      GTP2.send(g2c);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (DIAMETER_PROC.checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                as_DIA_CCR(TERMINATION_REQUEST);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span>    alt {</span><br><span>        [] GTP2.receive(tr_GTP2C_DeleteSessionResp(d_teid := exp_teid, cause := exp_cause)) {</span><br><span>                setverdict(pass);</span><br><span>diff --git a/pgw/gen_links.sh b/pgw/gen_links.sh</span><br><span>index 061d78c..a0f1281 100755</span><br><span>--- a/pgw/gen_links.sh</span><br><span>+++ b/pgw/gen_links.sh</span><br><span>@@ -44,12 +44,17 @@</span><br><span> FILES="UECUPS_CodecPort.ttcn  UECUPS_CodecPort_CtrlFunct.ttcn  UECUPS_CodecPort_CtrlFunctDef.cc UECUPS_Types.ttcn "</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.DIAMETER_ProtocolModule_Generator/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="DIAMETER_EncDec.cc"</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> DIR=../library</span><br><span> 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> FILES+="GTP_CodecPort.ttcn GTP_CodecPort_CtrlFunct.ttcn GTP_CodecPort_CtrlFunctDef.cc GTP_Templates.ttcn "</span><br><span> FILES+="GTPv2_PrivateExtensions.ttcn GTPv2_Templates.ttcn "</span><br><span> FILES+="GTPv2_CodecPort.ttcn GTPv2_CodecPort_CtrlFunctDef.cc GTPv2_CodecPort_CtrlFunct.ttcn GTPv2_Emulation.ttcn "</span><br><span> FILES+="DNS_Helpers.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="DIAMETER_Types.ttcn DIAMETER_CodecPort.ttcn DIAMETER_CodecPort_CtrlFunct.ttcn DIAMETER_CodecPort_CtrlFunctDef.cc DIAMETER_Emulation.ttcn DIAMETER_Templates.ttcn "</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> ignore_pp_results</span><br><span>diff --git a/pgw/regen_makefile.sh b/pgw/regen_makefile.sh</span><br><span>index f53150c..adb5820 100755</span><br><span>--- a/pgw/regen_makefile.sh</span><br><span>+++ b/pgw/regen_makefile.sh</span><br><span>@@ -2,5 +2,6 @@</span><br><span> </span><br><span> 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> FILES+="UECUPS_CodecPort_CtrlFunctDef.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="DIAMETER_EncDec.cc DIAMETER_CodecPort_CtrlFunctDef.cc "</span><br><span> </span><br><span> ../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/+/17950">change 17950</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/+/17950"/><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: I5f0c7a66d38e5c8b5f36b45717d49648a14ed7b2 </div>
<div style="display:none"> Gerrit-Change-Number: 17950 </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>