pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/43286?usp=email )

Change subject: pgw: Move lots of diameter msg building to library/
......................................................................

pgw: Move lots of diameter msg building to library/

This way it can be easily reused on other testsuites willing to emulate
an OCS, and PCRF, etc.

Change-Id: Ifff21ed39c685406abf734b03aa2d9d17c37c4f6
---
M library/DIAMETER_ts29_212_Templates.ttcn
M library/DIAMETER_ts29_273_Templates.ttcn
M library/DIAMETER_ts32_299_Templates.ttcn
M pgw/PGW_Tests.ttcn
4 files changed, 274 insertions(+), 209 deletions(-)

Approvals:
  Jenkins Builder: Verified
  osmith: Looks good to me, but someone else must approve
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved




diff --git a/library/DIAMETER_ts29_212_Templates.ttcn 
b/library/DIAMETER_ts29_212_Templates.ttcn
index ec0e637..d36bfbb 100644
--- a/library/DIAMETER_ts29_212_Templates.ttcn
+++ b/library/DIAMETER_ts29_212_Templates.ttcn
@@ -102,4 +102,28 @@
                tr_AVP_CcReqNum(?)
        ));

+/* generate a send template successful answer based on received request */
+function f_ts_DIA_Gx_CCA(PDU_DIAMETER rx_gx)
+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;
+
+       avp := f_DIAMETER_get_avp(rx_gx, c_AVP_Code_BASE_NONE_Session_Id);
+       sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);
+
+       avp := f_DIAMETER_get_avp(rx_gx, c_AVP_Code_DCC_NONE_CC_Request_Number);
+       req_num := valueof(avp.avp_data.avp_DCC_NONE_CC_Request_Number);
+
+       avp := f_DIAMETER_get_avp(rx_gx, c_AVP_Code_DCC_NONE_CC_Request_Type);
+       req_type := valueof(avp.avp_data.avp_DCC_NONE_CC_Request_Type);
+
+       tx_dia := ts_DIA_Gx_CCA(rx_gx.hop_by_hop_id, rx_gx.end_to_end_id, 
sess_id,
+                               req_type, req_num);
+       return tx_dia;
+}
+
 } /* module */
diff --git a/library/DIAMETER_ts29_273_Templates.ttcn 
b/library/DIAMETER_ts29_273_Templates.ttcn
index 6ed00ff..a9f1769 100644
--- a/library/DIAMETER_ts29_273_Templates.ttcn
+++ b/library/DIAMETER_ts29_273_Templates.ttcn
@@ -674,4 +674,27 @@
                        ts_AVP_OriginRealm(orig_realm)
        });

+
+/* generate a send template successful answer based on received AAR */
+function f_ts_DIA_S6b_AAA(PDU_DIAMETER rx_s6b,
+                         template (value) charstring orig_host := 
"aaa.localdomain",
+                         template (value) charstring orig_realm := 
"localdomain",
+                         template (value) charstring dest_realm := 
"localdomain")
+return template (value) PDU_DIAMETER
+{
+       var template (value) PDU_DIAMETER tx_dia;
+       var template (omit) AVP avp;
+       var octetstring sess_id;
+
+       avp := f_DIAMETER_get_avp(rx_s6b, c_AVP_Code_BASE_NONE_Session_Id);
+       sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);
+
+       tx_dia := ts_DIA_S6b_AAA(sess_id, orig_host,
+                                orig_realm,
+                                dest_realm,
+                                rx_s6b.hop_by_hop_id,
+                                rx_s6b.end_to_end_id);
+       return tx_dia;
+}
+
 }
diff --git a/library/DIAMETER_ts32_299_Templates.ttcn 
b/library/DIAMETER_ts32_299_Templates.ttcn
index ffbd15f..249e633 100644
--- a/library/DIAMETER_ts32_299_Templates.ttcn
+++ b/library/DIAMETER_ts32_299_Templates.ttcn
@@ -14,6 +14,7 @@
 import from General_Types all;
 import from DIAMETER_Types all;
 import from DIAMETER_Templates all;
+import from DIAMETER_ts29_272_Templates all; /* tr_AVP_GI_3GPP_RatType */
 import from Osmocom_Types all;
 import from Misc_Helpers all;

@@ -181,4 +182,200 @@
        }
 }

+function f_tr_DIA_Gy_CCR(DCC_NONE_CC_Request_Type req_type,
+                        template (present) octetstring imsi := ?,
+                        template (present) octetstring msisdn := ?,
+                        template (present) octetstring rat_type := ?,
+                        template (present) OCT1 nsapi := ?,
+                        template (present) OCT4 charging_char := ?,
+                        template (present) charstring origin_host := ?,
+                        template (present) charstring diam_realm := ?,
+                        template (present) octetstring sgsn_addr := ?,
+                        template (present) octetstring ggsn_addr := ?)
+return template (present) PDU_DIAMETER
+{
+       var template (present) PDU_DIAMETER tpl;
+       select (req_type) {
+               case (INITIAL_REQUEST) {
+                       tpl := tr_DIAMETER(flags:='11000000'B, 
cmd_code:=Credit_Control,
+                               avps := superset(
+                                       tr_AVP_SessionId,
+                                       tr_AVP_OriginHost(origin_host),
+                                       tr_AVP_OriginRealm(diam_realm),
+                                       tr_AVP_DestinationRealm(diam_realm),
+                                       
tr_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
+                                       tr_AVP_ServiceContextId,
+                                       tr_AVP_CcReqType(req_type),
+                                       tr_AVP_CcReqNum(?),
+                                       tr_AVP_EventTimestamp(?),
+                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_IMSI), tr_AVP_SubcrIdData(imsi)}),
+                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_E164), tr_AVP_SubcrIdData(msisdn)}),
+                                       tr_AVP_RequestedAction(DIRECT_DEBITING),
+                                       tr_AVP_3GPP_AoCRequestType,
+                                       tr_AVP_MultipleServicesIndicator,
+                                       
tr_AVP_Multiple_Services_Credit_Control(content := superset(
+                                               tr_AVP_Requested_Service_Unit,
+                                               tr_AVP_PCC_3GPP_QoS_Information
+                                       )),
+                                       tr_AVP_3GPP_ServiceInformation(content 
:= superset(
+                                               
tr_AVP_3GPP_PSInformation(content := superset(
+                                                       tr_AVP_3GPP_ChargingId,
+                                                       
tr_AVP_3GPP_PDPType((IPv4,IPv6,IPv4v6)),
+                                                       
tr_AVP_3GPP_PDPAddress(tr_AVP_Address((IP,IP6), ?)),
+                                                       
tr_AVP_3GPP_SGSNAddress(tr_AVP_Address(IP, sgsn_addr)),
+                                                       
tr_AVP_3GPP_GGSNAddress(tr_AVP_Address(IP, ggsn_addr)),
+                                                       
tr_AVP_3GPP_CalledStationId,
+                                                       
tr_AVP_3GPP_SelectionMode,
+                                                       
tr_AVP_3GPP_ChargingCharacteristics(charging_char),
+                                                       tr_AVP_3GPP_SGSNMCCMNC,
+                                                       
tr_AVP_3GPP_NSAPI(nsapi),
+                                                       /*We don't yet send 
MS_Tz in CreateSessionReq:
+                                                       
tr_AVP_3GPP_MS_TimeZone,*/
+                                                       tr_AVP_3GPP_ULI,
+                                                       
tr_AVP_GI_3GPP_RatType(rat_type)/*,
+                                                       We don't yet send IMEI 
in CreateSessionReq:
+                                                       
tr_AVP_UserEquipmentInfo({
+                                                               
tr_AVP_UserEquipmentInfoType(IMEISV),
+                                                               
tr_AVP_UserEquipmentInfoValue(imeisv)
+                                                       })*/
+                                               ))
+                                       ))
+                               ));
+               }
+               case (UPDATE_REQUEST) {
+                       tpl := tr_DIAMETER(flags:='11000000'B, 
cmd_code:=Credit_Control,
+                               avps := superset(
+                                       tr_AVP_SessionId,
+                                       tr_AVP_OriginHost(origin_host),
+                                       tr_AVP_OriginRealm(diam_realm),
+                                       tr_AVP_DestinationRealm(diam_realm),
+                                       
tr_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
+                                       tr_AVP_ServiceContextId,
+                                       tr_AVP_CcReqType(req_type),
+                                       tr_AVP_CcReqNum(?),
+                                       tr_AVP_DestinationHost(?),
+                                       tr_AVP_EventTimestamp(?),
+                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_IMSI), tr_AVP_SubcrIdData(imsi)}),
+                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_E164), tr_AVP_SubcrIdData(msisdn)}),
+                                       tr_AVP_RequestedAction(DIRECT_DEBITING),
+                                       tr_AVP_3GPP_AoCRequestType,
+                                       
tr_AVP_Multiple_Services_Credit_Control(content := superset(
+                                               tr_AVP_Requested_Service_Unit,
+                                               tr_AVP_Used_Service_Unit,
+                                               /* 
tr_AVP_3GPP_Reporting_Reason, can be sometimes inside UsedServiceUnit */
+                                               tr_AVP_PCC_3GPP_QoS_Information
+                                       )),
+                                       tr_AVP_3GPP_ServiceInformation(content 
:= superset(
+                                               
tr_AVP_3GPP_PSInformation(content := superset(
+                                                       tr_AVP_3GPP_ChargingId,
+                                                       /* tr_AVP_3GPP_PDPType, 
Only in INIT */
+                                                       
tr_AVP_3GPP_PDPAddress(tr_AVP_Address((IP,IP6), ?)),
+                                                       
tr_AVP_3GPP_SGSNAddress(tr_AVP_Address(IP, sgsn_addr)),
+                                                       
tr_AVP_3GPP_GGSNAddress(tr_AVP_Address(IP, ggsn_addr)),
+                                                       
tr_AVP_3GPP_CalledStationId,
+                                                       
tr_AVP_3GPP_SelectionMode,
+                                                       
tr_AVP_3GPP_ChargingCharacteristics(charging_char),
+                                                       tr_AVP_3GPP_SGSNMCCMNC,
+                                                       
tr_AVP_3GPP_NSAPI(nsapi),
+                                                       /*We don't yet send 
MS_Tz in CreateSessionReq:
+                                                       
tr_AVP_3GPP_MS_TimeZone,*/
+                                                       tr_AVP_3GPP_ULI,
+                                                       
tr_AVP_GI_3GPP_RatType(rat_type)/*,
+                                                       We don't yet send IMEI 
in CreateSessionReq:
+                                                       
tr_AVP_UserEquipmentInfo({
+                                                               
tr_AVP_UserEquipmentInfoType(IMEISV),
+                                                               
tr_AVP_UserEquipmentInfoValue(imeisv)
+                                                       })*/
+                                               ))
+                                       ))
+                               ));
+               }
+               case (TERMINATION_REQUEST) {
+                       tpl := tr_DIAMETER(flags:='11000000'B, 
cmd_code:=Credit_Control,
+                               avps := superset(
+                                       tr_AVP_SessionId,
+                                       tr_AVP_OriginHost(origin_host),
+                                       tr_AVP_OriginRealm(diam_realm),
+                                       tr_AVP_DestinationRealm(diam_realm),
+                                       
tr_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
+                                       tr_AVP_ServiceContextId,
+                                       tr_AVP_CcReqType(req_type),
+                                       tr_AVP_CcReqNum(?),
+                                       tr_AVP_DestinationHost(?),
+                                       tr_AVP_EventTimestamp(?),
+                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_IMSI), tr_AVP_SubcrIdData(imsi)}),
+                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_E164), tr_AVP_SubcrIdData(msisdn)}),
+                                       tr_AVP_TerminationCause(?),
+                                       tr_AVP_RequestedAction(DIRECT_DEBITING),
+                                       tr_AVP_3GPP_AoCRequestType,
+                                       
tr_AVP_Multiple_Services_Credit_Control(content := superset(
+                                               /* 
tr_AVP_Requested_Service_Unit, Only in INIT and UPDATE */
+                                               tr_AVP_Used_Service_Unit,
+                                               
tr_AVP_3GPP_Reporting_Reason(FINAL),
+                                               tr_AVP_PCC_3GPP_QoS_Information
+                                       )),
+                                       tr_AVP_3GPP_ServiceInformation(content 
:= superset(
+                                               
tr_AVP_3GPP_PSInformation(content := superset(
+                                                       tr_AVP_3GPP_ChargingId,
+                                                       /* tr_AVP_3GPP_PDPType, 
Only in INIT */
+                                                       
tr_AVP_3GPP_PDPAddress(tr_AVP_Address((IP,IP6), ?)),
+                                                       
tr_AVP_3GPP_SGSNAddress(tr_AVP_Address(IP, sgsn_addr)),
+                                                       
tr_AVP_3GPP_GGSNAddress(tr_AVP_Address(IP, ggsn_addr)),
+                                                       
tr_AVP_3GPP_CalledStationId,
+                                                       
tr_AVP_3GPP_SelectionMode,
+                                                       
tr_AVP_3GPP_ChargingCharacteristics(charging_char),
+                                                       tr_AVP_3GPP_SGSNMCCMNC,
+                                                       
tr_AVP_3GPP_NSAPI(nsapi),
+                                                       /*We don't yet send 
MS_Tz in CreateSessionReq:
+                                                       
tr_AVP_3GPP_MS_TimeZone,*/
+                                                       tr_AVP_3GPP_ULI,
+                                                       
tr_AVP_GI_3GPP_RatType(rat_type)/*,
+                                                       We don't yet send IMEI 
in CreateSessionReq:
+                                                       
tr_AVP_UserEquipmentInfo({
+                                                               
tr_AVP_UserEquipmentInfoType(IMEISV),
+                                                               
tr_AVP_UserEquipmentInfoValue(imeisv)
+                                                       })*/
+                                               ))
+                                       ))
+                               ));
+               }
+       }
+       return tpl;
+}
+
+/* generate a send template successful/reject answer based on received request 
*/
+function f_ts_DIA_Gy_CCA(PDU_DIAMETER rx_gy,
+                        DIAMETER_Resultcode cca_res_code,
+                        template (omit) uint32_t validity_time := omit)
+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 (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,
+                                       cca_res_code, req_type, req_num);
+       } else if (isvalue(validity_time)) {
+               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, 
valueof(validity_time));
+       } else {
+               tx_dia := ts_DIA_Gy_CCA(rx_gy.hop_by_hop_id, 
rx_gy.end_to_end_id, sess_id,
+                                       cca_res_code, req_type, req_num);
+       }
+       return tx_dia;
+}
+
 } /* module */
diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn
index 9dd759b..612073b 100644
--- a/pgw/PGW_Tests.ttcn
+++ b/pgw/PGW_Tests.ttcn
@@ -383,15 +383,12 @@
 private altstep as_DIA_S6b_AAR() runs on PGW_Session_CT {
        var PDU_DIAMETER rx_dia;
        [] DIAMETER[DIA_S6b].receive(tr_DIA_S6b_AAR()) -> value rx_dia {
-               var template (omit) AVP avp;
-               var octetstring sess_id;
-
-               avp := f_DIAMETER_get_avp(rx_dia, 
c_AVP_Code_BASE_NONE_Session_Id);
-               sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);
-
-               DIAMETER[DIA_S6b].send(ts_DIA_S6b_AAA(sess_id, "aaa." & 
mp_diam_realm,
-                                                     mp_diam_realm, 
mp_diam_realm,
-                                                     rx_dia.hop_by_hop_id, 
rx_dia.end_to_end_id));
+               var template (value) PDU_DIAMETER tx_dia;
+               tx_dia := f_ts_DIA_S6b_AAA(rx_dia,
+                                          "aaa." & mp_diam_realm,
+                                          mp_diam_realm,
+                                          mp_diam_realm);
+               DIAMETER[DIA_S6b].send(tx_dia);
                setverdict(pass);
        }
        [] DIAMETER[DIA_S6b].receive(PDU_DIAMETER:?) -> value rx_dia {
@@ -404,18 +401,8 @@
 private altstep as_DIA_Gx_CCR(DCC_NONE_CC_Request_Type req_type) runs on 
PGW_Session_CT {
        var PDU_DIAMETER rx_dia;
        [] DIAMETER[DIA_Gx].receive(tr_DIA_Gx_CCR(req_type := req_type)) -> 
value rx_dia {
-               var template (omit) AVP avp;
-               var octetstring sess_id;
-               var AVP_Unsigned32 req_num;
-
-               avp := f_DIAMETER_get_avp(rx_dia, 
c_AVP_Code_BASE_NONE_Session_Id);
-               sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);
-
-               avp := f_DIAMETER_get_avp(rx_dia, 
c_AVP_Code_DCC_NONE_CC_Request_Number);
-               req_num := valueof(avp.avp_data.avp_DCC_NONE_CC_Request_Number);
-
-               DIAMETER[DIA_Gx].send(ts_DIA_Gx_CCA(rx_dia.hop_by_hop_id, 
rx_dia.end_to_end_id, sess_id,
-                                                   req_type, req_num));
+               var template (value) PDU_DIAMETER tx_dia := 
f_ts_DIA_Gx_CCA(rx_dia);
+               DIAMETER[DIA_Gx].send(tx_dia);
        }
        [] DIAMETER[DIA_Gx].receive(PDU_DIAMETER:?) -> value rx_dia {
                Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
@@ -427,203 +414,37 @@
 function f_tr_DIA_Gy_CCR(DCC_NONE_CC_Request_Type req_type)
 runs on PGW_Session_CT return template (present) PDU_DIAMETER
 {
-       var template (present) PDU_DIAMETER tpl;
-       var charstring smf_origin_host := "smf." & mp_diam_realm;
-       var template (present) octetstring imsi := ?;
+       var octetstring imsi := char2oct(f_dec_TBCD(imsi_hex2oct(g_pars.imsi)));
+       var octetstring rat_type := int2oct(enum2int(g_pars.rat_type), 1);
+       var OCT1 nsapi := int2oct(g_pars.bearer.ebi, 1);
+       var OCT4 charging_char := char2oct(oct2str('0000'O));  // 
f_s5s8_create_session() uses hardcoded chg_car := '0000'O
        var template (present) octetstring msisdn := ?;
-       var template (present) octetstring rat_type := ?;
-       var template (present) OCT4 charging_char := ?;
-       var template (present) OCT1 nsapi := ?;
-       imsi := char2oct(f_dec_TBCD(imsi_hex2oct(g_pars.imsi)));
-       //msisdn := char2oct(f_dec_TBCD(substr(ctx_val.msisdn, 1, 
lengthof(ctx_val.msisdn) -1)));
-       rat_type := int2oct(enum2int(g_pars.rat_type), 1);
-       charging_char := char2oct(oct2str('0000'O));  // 
f_s5s8_create_session() uses hardcoded chg_car := '0000'O
-       nsapi := int2oct(g_pars.bearer.ebi, 1);
-       select (req_type) {
-               case (INITIAL_REQUEST) {
-                       tpl := tr_DIAMETER(flags:='11000000'B, 
cmd_code:=Credit_Control,
-                               avps := superset(
-                                       tr_AVP_SessionId,
-                                       tr_AVP_OriginHost(smf_origin_host),
-                                       tr_AVP_OriginRealm(mp_diam_realm),
-                                       tr_AVP_DestinationRealm(mp_diam_realm),
-                                       
tr_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
-                                       tr_AVP_ServiceContextId,
-                                       tr_AVP_CcReqType(req_type),
-                                       tr_AVP_CcReqNum(?),
-                                       tr_AVP_EventTimestamp(?),
-                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_IMSI), tr_AVP_SubcrIdData(imsi)}),
-                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_E164), tr_AVP_SubcrIdData(msisdn)}),
-                                       tr_AVP_RequestedAction(DIRECT_DEBITING),
-                                       tr_AVP_3GPP_AoCRequestType,
-                                       tr_AVP_MultipleServicesIndicator,
-                                       
tr_AVP_Multiple_Services_Credit_Control(content := superset(
-                                               tr_AVP_Requested_Service_Unit,
-                                               tr_AVP_PCC_3GPP_QoS_Information
-                                       )),
-                                       tr_AVP_3GPP_ServiceInformation(content 
:= superset(
-                                               
tr_AVP_3GPP_PSInformation(content := superset(
-                                                       tr_AVP_3GPP_ChargingId,
-                                                       
tr_AVP_3GPP_PDPType((IPv4,IPv6,IPv4v6)),
-                                                       
tr_AVP_3GPP_PDPAddress(tr_AVP_Address((IP,IP6), ?)),
-                                                       
tr_AVP_3GPP_SGSNAddress(tr_AVP_Address(IP, f_inet_addr(mp_pcrf_local_ip))),
-                                                       
tr_AVP_3GPP_GGSNAddress(tr_AVP_Address(IP, f_inet_addr(mp_pgw_hostname))),
-                                                       
tr_AVP_3GPP_CalledStationId,
-                                                       
tr_AVP_3GPP_SelectionMode,
-                                                       
tr_AVP_3GPP_ChargingCharacteristics(charging_char),
-                                                       tr_AVP_3GPP_SGSNMCCMNC,
-                                                       
tr_AVP_3GPP_NSAPI(nsapi),
-                                                       /*We don't yet send 
MS_Tz in CreateSessionReq:
-                                                       
tr_AVP_3GPP_MS_TimeZone,*/
-                                                       tr_AVP_3GPP_ULI,
-                                                       
tr_AVP_GI_3GPP_RatType(rat_type)/*,
-                                                       We don't yet send IMEI 
in CreateSessionReq:
-                                                       
tr_AVP_UserEquipmentInfo({
-                                                               
tr_AVP_UserEquipmentInfoType(IMEISV),
-                                                               
tr_AVP_UserEquipmentInfoValue(imeisv)
-                                                       })*/
-                                               ))
-                                       ))
-                               ));
-               }
-               case (UPDATE_REQUEST) {
-                       tpl := tr_DIAMETER(flags:='11000000'B, 
cmd_code:=Credit_Control,
-                               avps := superset(
-                                       tr_AVP_SessionId,
-                                       tr_AVP_OriginHost(smf_origin_host),
-                                       tr_AVP_OriginRealm(mp_diam_realm),
-                                       tr_AVP_DestinationRealm(mp_diam_realm),
-                                       
tr_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
-                                       tr_AVP_ServiceContextId,
-                                       tr_AVP_CcReqType(req_type),
-                                       tr_AVP_CcReqNum(?),
-                                       tr_AVP_DestinationHost(?),
-                                       tr_AVP_EventTimestamp(?),
-                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_IMSI), tr_AVP_SubcrIdData(imsi)}),
-                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_E164), tr_AVP_SubcrIdData(msisdn)}),
-                                       tr_AVP_RequestedAction(DIRECT_DEBITING),
-                                       tr_AVP_3GPP_AoCRequestType,
-                                       
tr_AVP_Multiple_Services_Credit_Control(content := superset(
-                                               tr_AVP_Requested_Service_Unit,
-                                               tr_AVP_Used_Service_Unit,
-                                               /* 
tr_AVP_3GPP_Reporting_Reason, can be sometimes inside UsedServiceUnit */
-                                               tr_AVP_PCC_3GPP_QoS_Information
-                                       )),
-                                       tr_AVP_3GPP_ServiceInformation(content 
:= superset(
-                                               
tr_AVP_3GPP_PSInformation(content := superset(
-                                                       tr_AVP_3GPP_ChargingId,
-                                                       /* tr_AVP_3GPP_PDPType, 
Only in INIT */
-                                                       
tr_AVP_3GPP_PDPAddress(tr_AVP_Address((IP,IP6), ?)),
-                                                       
tr_AVP_3GPP_SGSNAddress(tr_AVP_Address(IP, f_inet_addr(mp_pcrf_local_ip))),
-                                                       
tr_AVP_3GPP_GGSNAddress(tr_AVP_Address(IP, f_inet_addr(mp_pgw_hostname))),
-                                                       
tr_AVP_3GPP_CalledStationId,
-                                                       
tr_AVP_3GPP_SelectionMode,
-                                                       
tr_AVP_3GPP_ChargingCharacteristics(charging_char),
-                                                       tr_AVP_3GPP_SGSNMCCMNC,
-                                                       
tr_AVP_3GPP_NSAPI(nsapi),
-                                                       /*We don't yet send 
MS_Tz in CreateSessionReq:
-                                                       
tr_AVP_3GPP_MS_TimeZone,*/
-                                                       tr_AVP_3GPP_ULI,
-                                                       
tr_AVP_GI_3GPP_RatType(rat_type)/*,
-                                                       We don't yet send IMEI 
in CreateSessionReq:
-                                                       
tr_AVP_UserEquipmentInfo({
-                                                               
tr_AVP_UserEquipmentInfoType(IMEISV),
-                                                               
tr_AVP_UserEquipmentInfoValue(imeisv)
-                                                       })*/
-                                               ))
-                                       ))
-                               ));
-               }
-               case (TERMINATION_REQUEST) {
-                       tpl := tr_DIAMETER(flags:='11000000'B, 
cmd_code:=Credit_Control,
-                               avps := superset(
-                                       tr_AVP_SessionId,
-                                       tr_AVP_OriginHost(smf_origin_host),
-                                       tr_AVP_OriginRealm(mp_diam_realm),
-                                       tr_AVP_DestinationRealm(mp_diam_realm),
-                                       
tr_AVP_AuthAppId(int2oct(c_DIAMETER_CREDIT_CONTROL_AID, 4)),
-                                       tr_AVP_ServiceContextId,
-                                       tr_AVP_CcReqType(req_type),
-                                       tr_AVP_CcReqNum(?),
-                                       tr_AVP_DestinationHost(?),
-                                       tr_AVP_EventTimestamp(?),
-                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_IMSI), tr_AVP_SubcrIdData(imsi)}),
-                                       
tr_AVP_SubcrId({tr_AVP_SubcrIdType(END_USER_E164), tr_AVP_SubcrIdData(msisdn)}),
-                                       tr_AVP_TerminationCause(?),
-                                       tr_AVP_RequestedAction(DIRECT_DEBITING),
-                                       tr_AVP_3GPP_AoCRequestType,
-                                       
tr_AVP_Multiple_Services_Credit_Control(content := superset(
-                                               /* 
tr_AVP_Requested_Service_Unit, Only in INIT and UPDATE */
-                                               tr_AVP_Used_Service_Unit,
-                                               
tr_AVP_3GPP_Reporting_Reason(FINAL),
-                                               tr_AVP_PCC_3GPP_QoS_Information
-                                       )),
-                                       tr_AVP_3GPP_ServiceInformation(content 
:= superset(
-                                               
tr_AVP_3GPP_PSInformation(content := superset(
-                                                       tr_AVP_3GPP_ChargingId,
-                                                       /* tr_AVP_3GPP_PDPType, 
Only in INIT */
-                                                       
tr_AVP_3GPP_PDPAddress(tr_AVP_Address((IP,IP6), ?)),
-                                                       
tr_AVP_3GPP_SGSNAddress(tr_AVP_Address(IP, f_inet_addr(mp_pcrf_local_ip))),
-                                                       
tr_AVP_3GPP_GGSNAddress(tr_AVP_Address(IP, f_inet_addr(mp_pgw_hostname))),
-                                                       
tr_AVP_3GPP_CalledStationId,
-                                                       
tr_AVP_3GPP_SelectionMode,
-                                                       
tr_AVP_3GPP_ChargingCharacteristics(charging_char),
-                                                       tr_AVP_3GPP_SGSNMCCMNC,
-                                                       
tr_AVP_3GPP_NSAPI(nsapi),
-                                                       /*We don't yet send 
MS_Tz in CreateSessionReq:
-                                                       
tr_AVP_3GPP_MS_TimeZone,*/
-                                                       tr_AVP_3GPP_ULI,
-                                                       
tr_AVP_GI_3GPP_RatType(rat_type)/*,
-                                                       We don't yet send IMEI 
in CreateSessionReq:
-                                                       
tr_AVP_UserEquipmentInfo({
-                                                               
tr_AVP_UserEquipmentInfoType(IMEISV),
-                                                               
tr_AVP_UserEquipmentInfoValue(imeisv)
-                                                       })*/
-                                               ))
-                                       ))
-                               ));
-               }
-       }
-       return tpl;
-}
+       var charstring smf_origin_host := "smf." & mp_diam_realm;
+       var octetstring sgsn_addr := f_inet_addr(mp_pcrf_local_ip);
+       var octetstring ggsn_addr := f_inet_addr(mp_pgw_hostname);

-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;
+       return DIAMETER_ts32_299_Templates.f_tr_DIA_Gy_CCR(req_type,
+                                                          imsi,
+                                                          msisdn,
+                                                          rat_type,
+                                                          nsapi,
+                                                          charging_char,
+                                                          smf_origin_host,
+                                                          mp_diam_realm,
+                                                          sgsn_addr,
+                                                          ggsn_addr);

-       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 {
        [] DIAMETER[DIA_Gy].receive(f_tr_DIA_Gy_CCR(req_type := req_type)) -> 
value g_rx_gy {
                var template (value) PDU_DIAMETER tx_dia;
-               tx_dia := f_ts_DIA_Gy_CCA(g_rx_gy);
+               var template (omit) integer validity_time := omit;
+               if (g_pars.gy.validity_time > 0) {
+                       validity_time := g_pars.gy.validity_time;
+               }
+               tx_dia := DIAMETER_ts32_299_Templates.f_ts_DIA_Gy_CCA(g_rx_gy, 
g_pars.gy.cca_res_code, validity_time);
                DIAMETER[DIA_Gy].send(tx_dia);
        }
        [] DIAMETER[DIA_Gy].receive(PDU_DIAMETER:?) -> value g_rx_gy {

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/43286?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ifff21ed39c685406abf734b03aa2d9d17c37c4f6
Gerrit-Change-Number: 43286
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to