pgw: Set Gy CCA Result-Code based on settings
This allows the test to change the Result-Code being transmitted during
Gy CCA at any time.
Related: SYS#6845
Change-Id: I2c3b1057908c1c76a55c41a7f45728a0fdee3cf0
diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn
index fb893fc..997c42d 100644
--- a/pgw/PGW_Tests.ttcn
+++ b/pgw/PGW_Tests.ttcn
@@ -132,6 +132,14 @@
OCT4 teid_remote optional
};
+type record SessionParsGy {
+ /* In seconds. 0 => disabled, !0 => grant over CC-Time period */
+ integer validity_time,
+
+ /* Result-Code to use when sending Gy CCA, usually DIAMETER_SUCCESS */
+ DIAMETER_Resultcode cca_res_code
+};
+
/* configuration data for a given Session */
type record SessionPars {
hexstring imsi,
@@ -159,8 +167,7 @@
charstring tun_dev_name,
charstring tun_netns_name optional,
- /* In seconds. 0 => disabled, !0 => grant over CC-Time period */
- integer gy_validity_time
+ SessionParsGy gy
}
template (value) SessionPars
@@ -188,7 +195,10 @@
},
tun_dev_name := tundev,
tun_netns_name := tundev,
- gy_validity_time := 0
+ gy := {
+ validity_time := 0,
+ cca_res_code := DIAMETER_SUCCESS
+ }
}
@@ -575,26 +585,43 @@
return tpl;
}
+function f_ts_DIA_Gy_CCA(PDU_DIAMETER rx_gy)
+runs on PGW_Session_CT return template (value) PDU_DIAMETER
+{
+ var template (value) PDU_DIAMETER tx_dia;
+ var template (omit) AVP avp;
+ var octetstring sess_id;
+ var AVP_Unsigned32 req_num;
+ var DCC_NONE_CC_Request_Type req_type;
+ var DIAMETER_Resultcode cca_res_code_success := DIAMETER_SUCCESS;
+
+ avp := f_DIAMETER_get_avp(rx_gy, c_AVP_Code_BASE_NONE_Session_Id);
+ sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);
+
+ avp := f_DIAMETER_get_avp(rx_gy, c_AVP_Code_DCC_NONE_CC_Request_Type);
+ req_type := valueof(avp.avp_data.avp_DCC_NONE_CC_Request_Type);
+
+ avp := f_DIAMETER_get_avp(rx_gy, c_AVP_Code_DCC_NONE_CC_Request_Number);
+ req_num := valueof(avp.avp_data.avp_DCC_NONE_CC_Request_Number);
+
+ if (g_pars.gy.cca_res_code != cca_res_code_success) {
+ tx_dia := ts_DIA_Gy_CCA(rx_gy.hop_by_hop_id, rx_gy.end_to_end_id, sess_id,
+ g_pars.gy.cca_res_code, req_type, req_num);
+ } else if (g_pars.gy.validity_time > 0) {
+ tx_dia := ts_DIA_Gy_CCA_ValidityTime(rx_gy.hop_by_hop_id, rx_gy.end_to_end_id, sess_id,
+ req_type, req_num, g_pars.gy.validity_time);
+ } else {
+ tx_dia := ts_DIA_Gy_CCA(rx_gy.hop_by_hop_id, rx_gy.end_to_end_id, sess_id,
+ g_pars.gy.cca_res_code, req_type, req_num);
+ }
+ return tx_dia;
+}
+
private altstep as_DIA_Gy_CCR(DCC_NONE_CC_Request_Type req_type)
runs on PGW_Session_CT {
[] Gy.receive(f_tr_DIA_Gy_CCR(req_type := req_type)) -> value g_rx_gy {
var template (value) PDU_DIAMETER tx_dia;
- var template (omit) AVP avp;
- var octetstring sess_id;
- var AVP_Unsigned32 req_num;
-
- avp := f_DIAMETER_get_avp(g_rx_gy, c_AVP_Code_BASE_NONE_Session_Id);
- sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);
-
- avp := f_DIAMETER_get_avp(g_rx_gy, c_AVP_Code_DCC_NONE_CC_Request_Number);
- req_num := valueof(avp.avp_data.avp_DCC_NONE_CC_Request_Number);
- if (g_pars.gy_validity_time > 0) {
- tx_dia := ts_DIA_Gy_CCA_ValidityTime(g_rx_gy.hop_by_hop_id, g_rx_gy.end_to_end_id, sess_id,
- req_type, req_num, g_pars.gy_validity_time);
- } else {
- tx_dia := ts_DIA_Gy_CCA(g_rx_gy.hop_by_hop_id, g_rx_gy.end_to_end_id, sess_id,
- req_type, req_num);
- }
+ tx_dia := f_ts_DIA_Gy_CCA(g_rx_gy);
Gy.send(tx_dia);
}
[] Gy.receive(PDU_DIAMETER:?) -> value g_rx_gy {
@@ -1046,7 +1073,7 @@
testcase TC_gy_charging_cc_time() runs on PGW_Test_CT {
var PGW_Session_CT vc_conn;
var SessionPars pars := valueof(t_SessionPars('001010123456789'H, "tun23"));
- pars.gy_validity_time := 3; /* Grant access for 3 seconds, needs to be re-validated afterwards */
+ pars.gy.validity_time := 3; /* Grant access for 3 seconds, needs to be re-validated afterwards */
f_init();
vc_conn := f_start_handler(refers(f_TC_gy_charging_cc_time), pars);
vc_conn.done;