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 {