diff --git a/lib/fd/extensions/dict_dcca/dict_dcca.c b/lib/fd/extensions/dict_dcca/dict_dcca.c index 0b548ac9f0..cb8b95a114 100644 --- a/lib/fd/extensions/dict_dcca/dict_dcca.c +++ b/lib/fd/extensions/dict_dcca/dict_dcca.c @@ -69,11 +69,25 @@ static int dict_dcca_entry(char * conffile) /* Applications section */ { +#if 0 /* modified by acetcom */ /* DCCA */ { struct dict_application_data data = { 4, "Diameter Credit Control Application" }; CHECK_dict_new( DICT_APPLICATION, &data, NULL, &dcca); } +#else + /* Create the vendors */ + { + struct dict_vendor_data vendor_data = { 10415, "3GPP" }; + CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_VENDOR, &vendor_data, NULL, NULL)); + } + { + struct dict_object * vendor; + CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_VENDOR, VENDOR_BY_NAME, "3GPP", &vendor, ENOENT)); + struct dict_application_data app_data = { 16777238, "Gx" }; + CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_APPLICATION, &app_data, vendor, &dcca)); + } +#endif /* end of modification */ } /* Result codes */ diff --git a/lib/fd/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c b/lib/fd/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c index 844a582cd0..672dcd47aa 100644 --- a/lib/fd/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c +++ b/lib/fd/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c @@ -147,10 +147,12 @@ static int dict_dcca_3gpp_entry(char * conffile) /* Applications section */ { /* Create the vendors */ +#if 0 /* modified by acetcom */ { struct dict_vendor_data vendor_data = { 10415, "3GPP" }; CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_VENDOR, &vendor_data, NULL, NULL)); } +#endif /* end of modification */ { struct dict_vendor_data vendor_data = { 5535, "3GPP2" }; CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_VENDOR, &vendor_data, NULL, NULL)); @@ -174,12 +176,14 @@ static int dict_dcca_3gpp_entry(char * conffile) CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_APPLICATION, &app_data, vendor, NULL)); } +#if 0 /* modified by acetcom */ { struct dict_object * vendor; CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_VENDOR, VENDOR_BY_NAME, "3GPP", &vendor, ENOENT)); struct dict_application_data app_data = { 16777238, "Gx" }; CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_APPLICATION, &app_data, vendor, NULL)); } +#endif /* end of modification */ } diff --git a/lib/fd/gx/gx_lib.h b/lib/fd/gx/gx_lib.h index 6542c70b5e..bd5a13a6b5 100644 --- a/lib/fd/gx/gx_lib.h +++ b/lib/fd/gx/gx_lib.h @@ -15,32 +15,36 @@ extern struct dict_object *gx_application; extern struct dict_object *gx_cmd_ccr; extern struct dict_object *gx_cmd_cca; -extern struct dict_object *gx_cc_request_typeg; -extern struct dict_object *gx_cc_request_numberg; -extern struct dict_object *gx_network_request_supportg; -extern struct dict_object *gx_subscription_idg; -extern struct dict_object *gx_supported_featuresg; -extern struct dict_object *gx_framed_ip_addressg; -extern struct dict_object *gx_framed_ipv6_prefixg; -extern struct dict_object *gx_ip_can_typeg; -extern struct dict_object *gx_rat_typeg; -extern struct dict_object *gx_qos_informationg; -extern struct dict_object *gx_3gpp_user_location_infog; -extern struct dict_object *gx_called_station_idg; -extern struct dict_object *gx_default_eps_bearer_qosg; -extern struct dict_object *gx_3gpp_ms_timezoneg; -extern struct dict_object *gx_event_triggerg; -extern struct dict_object *gx_bearer_control_modeg; -extern struct dict_object *gx_charging_rule_installg; -extern struct dict_object *gx_charging_rule_definitiong; -extern struct dict_object *gx_charging_rule_base_nameg; -extern struct dict_object *gx_charging_rule_nameg; -extern struct dict_object *gx_flow_informationg; -extern struct dict_object *gx_flow_directiong; -extern struct dict_object *gx_flow_descriptiong; -extern struct dict_object *gx_flow_statusg; -extern struct dict_object *gx_precedenceg; -extern struct dict_object *gx_flowsg; +#define GX_CC_REQUEST_TYPE_INITIAL_REQUEST 1 +#define GX_CC_REQUEST_TYPE_UPDATE_REQUEST 2 +#define GX_CC_REQUEST_TYPE_TERMINATION_REQUEST 3 +#define GX_CC_REQUEST_TYPE_EVENT_REQUEST 4 +extern struct dict_object *gx_cc_request_type; +extern struct dict_object *gx_cc_request_number; +extern struct dict_object *gx_network_request_support; +extern struct dict_object *gx_subscription_id; +extern struct dict_object *gx_supported_features; +extern struct dict_object *gx_framed_ip_address; +extern struct dict_object *gx_framed_ipv6_prefix; +extern struct dict_object *gx_ip_can_type; +extern struct dict_object *gx_rat_type; +extern struct dict_object *gx_qos_information; +extern struct dict_object *gx_3gpp_user_location_info; +extern struct dict_object *gx_called_station_id; +extern struct dict_object *gx_default_eps_bearer_qos; +extern struct dict_object *gx_3gpp_ms_timezone; +extern struct dict_object *gx_event_trigger; +extern struct dict_object *gx_bearer_control_mode; +extern struct dict_object *gx_charging_rule_install; +extern struct dict_object *gx_charging_rule_definition; +extern struct dict_object *gx_charging_rule_base_name; +extern struct dict_object *gx_charging_rule_name; +extern struct dict_object *gx_flow_information; +extern struct dict_object *gx_flow_direction; +extern struct dict_object *gx_flow_description; +extern struct dict_object *gx_flow_status; +extern struct dict_object *gx_precedence; +extern struct dict_object *gx_flows; int gx_dict_init(void); diff --git a/src/pcrf/pcrf_gx_handler.c b/src/pcrf/pcrf_gx_handler.c index 244fa7edb0..7cb419451b 100644 --- a/src/pcrf/pcrf_gx_handler.c +++ b/src/pcrf/pcrf_gx_handler.c @@ -26,6 +26,64 @@ static int pcrf_fb_cb(struct msg **msg, struct avp *avp, static int pcrf_ccr_cb( struct msg **msg, struct avp *avp, struct session *sess, void *opaque, enum disp_action *act) { + struct msg *ans, *qry; +#if 0 + struct avp_hdr *hdr; +#endif + union avp_value val; + + c_uint32_t result_code = 0; + + d_assert(msg, return EINVAL,); + + printf("pcrf received message\n"); + + /* Create answer header */ + qry = *msg; + CHECK_FCT( fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0) ); + ans = *msg; + + /* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */ + CHECK_FCT( fd_msg_rescode_set(ans, "DIAMETER_SUCCESS", NULL, NULL, 1) ); + + /* Set the Auth-Application-Id AVP */ + CHECK_FCT_DO( fd_msg_avp_new(fd_auth_application_id, 0, &avp), goto out ); + val.i32 = GX_APPLICATION_ID; + CHECK_FCT_DO( fd_msg_avp_setvalue(avp, &val), goto out ); + CHECK_FCT_DO( fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp), goto out ); + + /* Set CCR AVP */ + CHECK_FCT_DO( fd_msg_avp_new(gx_cc_request_type, 0, &avp), goto out ); + val.i32 = GX_CC_REQUEST_TYPE_INITIAL_REQUEST; + CHECK_FCT_DO( fd_msg_avp_setvalue(avp, &val), goto out ); + CHECK_FCT_DO( fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp), goto out ); + + CHECK_FCT_DO( fd_msg_avp_new(gx_cc_request_number, 0, &avp), goto out ); + val.i32 = 0; + CHECK_FCT_DO( fd_msg_avp_setvalue(avp, &val), goto out ); + CHECK_FCT_DO( fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp), goto out ); + + /* Send the answer */ + CHECK_FCT( fd_msg_send(msg, NULL, NULL) ); + + /* Add this value to the stats */ + CHECK_POSIX_DO( pthread_mutex_lock(&fd_logger_self()->stats_lock), ); + fd_logger_self()->stats.nb_echoed++; + CHECK_POSIX_DO( pthread_mutex_unlock(&fd_logger_self()->stats_lock), ); + + return 0; + +out: + CHECK_FCT( fd_message_experimental_rescode_set(ans, result_code) ); + + /* Set the Auth-Application-Id AVP */ + CHECK_FCT_DO( fd_msg_avp_new(fd_auth_application_id, 0, &avp), goto out ); + val.i32 = GX_APPLICATION_ID; + CHECK_FCT_DO( fd_msg_avp_setvalue(avp, &val), goto out ); + CHECK_FCT_DO( fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp), goto out ); + + CHECK_FCT( fd_msg_send(msg, NULL, NULL) ); + return 0; } diff --git a/src/pgw/pgw_gx_handler.c b/src/pgw/pgw_gx_handler.c index e8adccf584..be8762e92c 100644 --- a/src/pgw/pgw_gx_handler.c +++ b/src/pgw/pgw_gx_handler.c @@ -65,6 +65,17 @@ void pgw_gx_send_ccr(pgw_sess_t *sess) val.i32 = GX_APPLICATION_ID; CHECK_FCT_DO( fd_msg_avp_setvalue(avp, &val), goto out ); CHECK_FCT_DO( fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp), goto out ); + + /* Set CCR AVP */ + CHECK_FCT_DO( fd_msg_avp_new(gx_cc_request_type, 0, &avp), goto out ); + val.i32 = GX_CC_REQUEST_TYPE_INITIAL_REQUEST; + CHECK_FCT_DO( fd_msg_avp_setvalue(avp, &val), goto out ); + CHECK_FCT_DO( fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp), goto out ); + + CHECK_FCT_DO( fd_msg_avp_new(gx_cc_request_number, 0, &avp), goto out ); + val.i32 = 0; + CHECK_FCT_DO( fd_msg_avp_setvalue(avp, &val), goto out ); + CHECK_FCT_DO( fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp), goto out ); CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &mi->ts), goto out ); diff --git a/src/pgw/pgw_gx_handler.h b/src/pgw/pgw_gx_handler.h index 22fd580648..5039d1417e 100644 --- a/src/pgw/pgw_gx_handler.h +++ b/src/pgw/pgw_gx_handler.h @@ -12,10 +12,7 @@ extern "C" { CORE_DECLARE(int) pgw_gx_init(void); CORE_DECLARE(void) pgw_gx_final(void); -/* PGW Sends Credit Control Request to PCRF */ -#if 0 -CORE_DECLARE(void) pgw_gx_send_ccr(mme_ue_t *mme_ue); -#endif +CORE_DECLARE(void) pgw_gx_send_ccr(pgw_sess_t *sess); #ifdef __cplusplus } diff --git a/src/pgw/pgw_s5c_handler.c b/src/pgw/pgw_s5c_handler.c index 301a93d6e9..fbb0d6913f 100644 --- a/src/pgw/pgw_s5c_handler.c +++ b/src/pgw/pgw_s5c_handler.c @@ -8,6 +8,7 @@ #include "pgw_context.h" #include "pgw_gtp_path.h" #include "pgw_s5c_handler.h" +#include "pgw_gx_handler.h" c_int16_t pgw_pco_build(c_uint8_t *pco_buf, tlv_pco_t *tlv_pco) { @@ -226,6 +227,10 @@ void pgw_handle_create_session_request( rsp->bearer_contexts_created.s5_s8_u_sgw_f_teid.len = GTP_F_TEID_IPV4_LEN; +#if 0 + pgw_gx_send_ccr(sess); +#endif + rv = gtp_build_msg(&pkbuf, type, >p_message); d_assert(rv == CORE_OK, pgw_sess_remove(sess); return, "gtp build failed");