pgw: Introduce test TC_s2b_createSession_v4_apco

Make sure APCO IE is properly handled and answered back.

Change-Id: Ib01fe0512866924a5afc4d6719ceacb0b4b54df2
diff --git a/library/GTPv2_Templates.ttcn b/library/GTPv2_Templates.ttcn
index c842230..a86145d 100644
--- a/library/GTPv2_Templates.ttcn
+++ b/library/GTPv2_Templates.ttcn
@@ -902,7 +902,8 @@
 			  template (omit) FullyQualifiedTEID_List teid_list,
 			  template (value) OCT2 chg_car, template (value) uint4_t bearer_id,
 			  template (omit) UserLocationInfo uli := omit,
-			  template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) :=
+			  template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0),
+			  template (omit) APCO apco := omit) :=
 ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, {
 	createSessionRequest := {
 		iMSI := ts_GTP2C_Imsi(imsi),
@@ -948,7 +949,7 @@
 		signallingPriorityIndication := omit,
 		iP_Addr := omit,
 		portNumber := omit,
-		aPCO := omit,
+		aPCO := apco,
 		trustedWLANAccessNetworkIdentifier := omit,
 		cNOperatorSelectionEntity := omit,
 		presenceReportingAreaInformation := omit,
@@ -1061,7 +1062,8 @@
 			   template FullyQualifiedTEID_List fteids := *,
 			   template PDN_AddressAllocation addr := *,
 			   template APN_Restriction apn_restriction := *,
-			   template BearerContextGrouped_List bctxg := *) :=
+			   template BearerContextGrouped_List bctxg := *,
+			   template APCO exp_apco := *) :=
 tr_PDU_GTP2C(d_teid, seq, {
 	createSessionResponse := {
 		cause := tr_GTP2C_Cause(cause),
@@ -1081,7 +1083,7 @@
 		csid := *,
 		lDN := *,
 		pGW_Back_OffTime := *,
-		aPCO := *,
+		aPCO := exp_apco,
 		trustedWLANIPv4Parameters := *,
 		indicationFlags := *,
 		presenceReportingAreaAction := *,
diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn
index e39bd62..ea9f056 100644
--- a/pgw/PGW_Tests.ttcn
+++ b/pgw/PGW_Tests.ttcn
@@ -676,7 +676,9 @@
 /* create a session on the PGW */
 private function f_create_session(template (value) FullyQualifiedTEID fteid_c_ie,
 				  template (value) FullyQualifiedTEID fteid_u_ie,
-				  template (omit) UserLocationInfo uli_ie := omit) runs on PGW_Session_CT {
+				  template (omit) UserLocationInfo uli_ie := omit,
+				  template (omit) APCO apco := omit,
+				  template APCO exp_apco := *) runs on PGW_Session_CT {
 	var PDU_GTPCv2 rx;
 
 	/* Defaults used for s5/s8: */
@@ -698,7 +700,8 @@
 					  teid_list := { fteid_u_ie },
 					  chg_car := '0000'O,
 					  bearer_id := g_pars.bearer.ebi,
-					  uli := uli_ie);
+					  uli := uli_ie,
+					  apco := apco);
 	g2c.gtpcv2_pdu.createSessionRequest.servingNetwork := ts_GTP2C_ServingNetwork('001'H, '01F'H);
 
 	GTP2.send(g2c);
@@ -715,7 +718,8 @@
 	alt {
 	[] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid := g_pars.teic_local,
 						   cause := Request_accepted,
-						   apn_restriction := apn_restriction)) -> value rx {
+						   apn_restriction := apn_restriction,
+						   exp_apco := exp_apco)) -> value rx {
 		/* extract TEIDs */
 		var CreateSessionResponse resp := rx.gtpcv2_pdu.createSessionResponse;
 		g_pars.teic_remote := resp.fullyQualifiedTEID[0].tEID_GRE_Key;
@@ -780,7 +784,8 @@
 }
 
 /* create a session on the PGW on a S2b interface (from ePDG)*/
-private function f_s2b_create_session() runs on PGW_Session_CT {
+private function f_s2b_create_session(template (omit) APCO apco := omit,
+				      template APCO exp_apco := *) runs on PGW_Session_CT {
 	var template (value) FullyQualifiedTEID fteid_c_ie, fteid_u_ie;
 	var template (value) UserLocationInfo uli_ie;
 
@@ -788,13 +793,12 @@
 					f_inet_addr(mp_local_hostname_c), omit);
 	fteid_u_ie := ts_GTP2C_FTEID(FTEID_IF_S2bU_ePDG_GTPU, g_pars.bearer.teid_local, 5,
 					f_inet_addr(mp_local_hostname_u), omit);
-	f_create_session(fteid_c_ie, fteid_u_ie);
-	/* open5gs up to 1.2.3 won't accept it without ULI, despite not mandatory */
+
 	var template (value) TAI tai := { '0'H, '0'H, '1'H, 'F'H, '0'H, '1'H, '0001'O };
 	var template (value) ECGI ecgi := { '0'H, '0'H, '1'H, 'F'H, '0'H, '1'H, '0'H, 23 };
 	uli_ie := ts_GTP2C_UserLocInfo(tai := tai, ecgi := ecgi);
 
-	f_create_session(fteid_c_ie, fteid_u_ie, uli_ie);
+	f_create_session(fteid_c_ie, fteid_u_ie, uli_ie := uli_ie, apco := apco, exp_apco := exp_apco);
 
 }
 
@@ -1048,7 +1052,9 @@
 
 /* create a session, expect it to succeed */
 private function f_TC_s2b_createSession_v4_noapco() runs on PGW_Session_CT {
-	f_s2b_create_session();
+	var template (omit) APCO apco := omit;
+	var template APCO exp_apco := omit;
+	f_s2b_create_session(apco, exp_apco);
 	setverdict(pass);
 }
 testcase TC_s2b_createSession_v4_noapco() runs on PGW_Test_CT {
@@ -1061,6 +1067,27 @@
 	vc_conn.done;
 }
 
+private function f_TC_s2b_createSession_v4_apco() runs on PGW_Session_CT {
+	var template (omit) APCO apco := ts_GTP2C_APCO('0000'B,
+						{ts_GTP2C_PCO_P_DNS_IPv4(''O),
+						 ts_GTP2C_PCO_P_PCSCF_IPv4(''O)});
+	var template APCO exp_apco := tr_GTP2C_APCO('0000'B,
+						{tr_GTP2C_PCO_P_DNS_IPv4(?),
+						 *, /* open5gs-smfd can contain several DNS servers */
+						 tr_GTP2C_PCO_P_PCSCF_IPv4(?)});
+	f_s2b_create_session(apco, exp_apco);
+	setverdict(pass);
+}
+testcase TC_s2b_createSession_v4_apco() runs on PGW_Test_CT {
+	var PGW_Session_CT vc_conn;
+	var SessionPars pars := valueof(t_SessionPars('001010123456789'H,
+						      "tun22",
+						      rat_type := GTP2C_RAT_WLAN));
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_s2b_createSession_v4_apco), pars);
+	vc_conn.done;
+}
+
 control {
 	execute( TC_tx_echo() );
 	execute( TC_createSession() );
@@ -1070,6 +1097,7 @@
 	execute( TC_deleteSession_unknown() );
 	execute( TC_gy_charging_cc_time() );
 	execute( TC_s2b_createSession_v4_noapco() );
+	execute( TC_s2b_createSession_v4_apco() );
 }
 
 
diff --git a/pgw/expected-results.xml b/pgw/expected-results.xml
index 0e252af..35d0ce9 100644
--- a/pgw/expected-results.xml
+++ b/pgw/expected-results.xml
@@ -8,4 +8,5 @@
   <testcase classname='PGW_Tests' name='TC_deleteSession_unknown' time='MASKED'/>
   <testcase classname='PGW_Tests' name='TC_gy_charging_cc_time' time='MASKED'/>
   <testcase classname='PGW_Tests' name='TC_s2b_createSession_v4_noapco' time='MASKED'/>
+  <testcase classname='PGW_Tests' name='TC_s2b_createSession_v4_apco' time='MASKED'/>
 </testsuite>