pespin submitted this change.
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(-)
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 change 43286. To unsubscribe, or for help writing mail filters, visit settings.