From e4bec187fd6b3d619c72109b41ac56d26fde4136 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Wed, 3 Jan 2018 21:45:14 +0900 Subject: [PATCH] add Diameter Rx Interface (PCRF - P-CSCF) --- lib/fd/Makefile.am | 7 ++-- lib/fd/gx/dict_init.c | 27 ++++++++++++++++ lib/fd/gx/gx_dict.h | 13 ++++++++ lib/fd/rx/dict_init.c | 67 ++++++++++++++++++++++++++++++++++++++ lib/fd/rx/rx_dict.h | 73 ++++++++++++++++++++++++++++++++++++++++++ lib/fd/rx/rx_message.h | 36 +++++++++++++++++++++ 6 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 lib/fd/rx/dict_init.c create mode 100644 lib/fd/rx/rx_dict.h create mode 100644 lib/fd/rx/rx_message.h diff --git a/lib/fd/Makefile.am b/lib/fd/Makefile.am index 0fc72258c4..7a5a7debef 100644 --- a/lib/fd/Makefile.am +++ b/lib/fd/Makefile.am @@ -6,11 +6,14 @@ libfd_la_SOURCES = \ fd_message.h fd_logger.h fd_lib.h \ libapp_sip.c fd_message.c fd_logger.c fd_init.c \ \ + s6a/s6a_dict.h s6a/s6a_message.h \ + s6a/dict_init.c \ + \ gx/gx_dict.h gx/gx_message.h \ gx/dict_init.c gx/gx_message.c \ \ - s6a/s6a_dict.h s6a/s6a_message.h \ - s6a/dict_init.c \ + rx/rx_dict.h rx/rx_message.h \ + rx/dict_init.c \ $(NULL) libfd_la_DEPENDENCIES = \ diff --git a/lib/fd/gx/dict_init.c b/lib/fd/gx/dict_init.c index ea518b750a..60bfeaa3de 100644 --- a/lib/fd/gx/dict_init.c +++ b/lib/fd/gx/dict_init.c @@ -9,6 +9,8 @@ struct dict_object *gx_application = NULL; struct dict_object *gx_cmd_ccr = NULL; struct dict_object *gx_cmd_cca = NULL; +struct dict_object *gx_cmd_rar = NULL; +struct dict_object *gx_cmd_raa = NULL; struct dict_object *gx_cc_request_type = NULL; struct dict_object *gx_cc_request_number = NULL; @@ -51,6 +53,17 @@ struct dict_object *gx_flow_description = NULL; struct dict_object *gx_flow_status = NULL; struct dict_object *gx_precedence = NULL; struct dict_object *gx_flows = NULL; +struct dict_object *gx_specific_action = NULL; +struct dict_object *gx_abort_cause = NULL; +struct dict_object *gx_media_component_description = NULL; +struct dict_object *gx_media_component_number = NULL; +struct dict_object *gx_media_type = NULL; +struct dict_object *gx_rr_bandwidth = NULL; +struct dict_object *gx_rs_bandwidth = NULL; +struct dict_object *gx_codec_data = NULL; +struct dict_object *gx_media_sub_component = NULL; +struct dict_object *gx_flow_number = NULL; +struct dict_object *gx_flow_usage = NULL; int gx_dict_init(void) { @@ -60,6 +73,8 @@ int gx_dict_init(void) CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Request", &gx_cmd_ccr); CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Answer", &gx_cmd_cca); + CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Request", &gx_cmd_rar); + CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Answer", &gx_cmd_raa); CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Request-Type", &gx_cc_request_type); CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Request-Number", &gx_cc_request_number); @@ -105,5 +120,17 @@ int gx_dict_init(void) CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Precedence", &gx_precedence); CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flows", &gx_flows); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-Action", &gx_specific_action); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Abort-Cause", &gx_abort_cause); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Description", &gx_media_component_description); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Number", &gx_media_component_number); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Type", &gx_media_type); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RR-Bandwidth" , &gx_rr_bandwidth); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RS-Bandwidth" , &gx_rs_bandwidth); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Codec-Data", &gx_codec_data); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Sub-Component", &gx_media_sub_component); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Number", &gx_flow_number); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Usage", &gx_flow_usage); + return 0; } diff --git a/lib/fd/gx/gx_dict.h b/lib/fd/gx/gx_dict.h index d5c99d1e64..20ecca32b8 100644 --- a/lib/fd/gx/gx_dict.h +++ b/lib/fd/gx/gx_dict.h @@ -21,6 +21,8 @@ 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_cmd_rar; +extern struct dict_object *gx_cmd_raa; extern struct dict_object *gx_cc_request_type; extern struct dict_object *gx_cc_request_number; @@ -91,6 +93,17 @@ 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; +extern struct dict_object *gx_specific_action; +extern struct dict_object *gx_abort_cause; +extern struct dict_object *gx_media_component_description; +extern struct dict_object *gx_media_component_number; +extern struct dict_object *gx_media_type; +extern struct dict_object *gx_rr_bandwidth; +extern struct dict_object *gx_rs_bandwidth; +extern struct dict_object *gx_codec_data; +extern struct dict_object *gx_media_sub_component; +extern struct dict_object *gx_flow_number; +extern struct dict_object *gx_flow_usage; int gx_dict_init(void); diff --git a/lib/fd/rx/dict_init.c b/lib/fd/rx/dict_init.c new file mode 100644 index 0000000000..48baab6e04 --- /dev/null +++ b/lib/fd/rx/dict_init.c @@ -0,0 +1,67 @@ +#define TRACE_MODULE _rx_dict + +#include "rx_dict.h" + +#define CHECK_dict_search( _type, _criteria, _what, _result ) \ + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) ); + +struct dict_object *rx_application = NULL; + +struct dict_object *rx_cmd_aar = NULL; +struct dict_object *rx_cmd_aaa = NULL; + +struct dict_object *rx_media_component_description = NULL; +struct dict_object *rx_media_component_number = NULL; +struct dict_object *rx_media_type = NULL; +struct dict_object *rx_max_requested_bandwidth_ul = NULL; +struct dict_object *rx_max_requested_bandwidth_dl = NULL; +struct dict_object *rx_rr_bandwidth = NULL; +struct dict_object *rx_rs_bandwidth = NULL; +struct dict_object *rx_flow_status = NULL; +struct dict_object *rx_codec_data = NULL; +struct dict_object *rx_media_sub_component = NULL; +struct dict_object *rx_flow_number = NULL; +struct dict_object *rx_flow_usage = NULL; +struct dict_object *rx_flow_description = NULL; +struct dict_object *rx_subscription_id = NULL; +struct dict_object *rx_subscription_id_type = NULL; +struct dict_object *rx_subscription_id_data = NULL; +struct dict_object *rx_specific_action = NULL; +struct dict_object *rx_framed_ip_address = NULL; +struct dict_object *rx_framed_ipv6_prefix = NULL; +struct dict_object *rx_ip_can_type = NULL; +struct dict_object *rx_rat_type = NULL; + +int rx_dict_init(void) +{ + application_id_t id = RX_APPLICATION_ID; + + CHECK_dict_search(DICT_APPLICATION, APPLICATION_BY_ID, (void *)&id, &rx_application); + + CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "AA-Request", &rx_cmd_aar); + CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "AA-Answer", &rx_cmd_aaa); + + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Description", &rx_media_component_description); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Number", &rx_media_component_number); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Type", &rx_media_type); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-UL" , &rx_max_requested_bandwidth_ul); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-DL" , &rx_max_requested_bandwidth_dl); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RR-Bandwidth" , &rx_rr_bandwidth); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RS-Bandwidth" , &rx_rs_bandwidth); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Status", &rx_flow_status); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Codec-Data", &rx_codec_data); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Sub-Component", &rx_media_sub_component); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Number", &rx_flow_number); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Usage", &rx_flow_usage); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Description", &rx_flow_description); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Id", &rx_subscription_id); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Id-Type", &rx_subscription_id_type); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Id-Data", &rx_subscription_id_data); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-Action", &rx_specific_action); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Framed-IP-Address", &rx_framed_ip_address); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Framed-IPv6-Prefix", &rx_framed_ipv6_prefix); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "IP-CAN-Type", &rx_ip_can_type); + CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAT-Type", &rx_rat_type); + + return 0; +} diff --git a/lib/fd/rx/rx_dict.h b/lib/fd/rx/rx_dict.h new file mode 100644 index 0000000000..d70f263068 --- /dev/null +++ b/lib/fd/rx/rx_dict.h @@ -0,0 +1,73 @@ +#ifndef __RX_DICT_H__ +#define __RX_DICT_H__ + +#include "freeDiameter/freeDiameter-host.h" +#include "freeDiameter/libfdcore.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define RX_APPLICATION_ID 16777236 + +extern struct dict_object *rx_application; + +extern struct dict_object *rx_cmd_aar; +extern struct dict_object *rx_cmd_aaa; + +extern struct dict_object *rx_media_component_description; +extern struct dict_object *rx_media_component_number; +extern struct dict_object *rx_media_type; +extern struct dict_object *rx_max_requested_bandwidth_ul; +extern struct dict_object *rx_max_requested_bandwidth_dl; +extern struct dict_object *rx_rr_bandwidth; +extern struct dict_object *rx_rs_bandwidth; +#define RX_FLOW_STATUS_ENABLED_UPLINK 0 +#define RX_FLOW_STATUS_ENABLED_DOWNLINK 1 +#define RX_FLOW_STATUS_ENABLED 2 +#define RX_FLOW_STATUS_DISABLED 3 +extern struct dict_object *rx_flow_status; +extern struct dict_object *rx_codec_data; +extern struct dict_object *rx_media_sub_component; +extern struct dict_object *rx_flow_number; +extern struct dict_object *rx_flow_usage; +extern struct dict_object *rx_flow_description; +extern struct dict_object *rx_subscription_id; +#define RX_SUBSCRIPTION_ID_TYPE_END_USER_E164 0 +#define RX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI 1 +#define RX_SUBSCRIPTION_ID_TYPE_END_USER_SIP_URI 2 +#define RX_SUBSCRIPTION_ID_TYPE_END_USER_NAI 3 +extern struct dict_object *rx_subscription_id_type; +extern struct dict_object *rx_subscription_id_data; +extern struct dict_object *rx_specific_action; +extern struct dict_object *rx_framed_ip_address; +extern struct dict_object *rx_framed_ipv6_prefix; +#define RX_IP_CAN_TYPE_3GPP_GPRS 0 +#define RX_IP_CAN_TYPE_DOCSIS 1 +#define RX_IP_CAN_TYPE_xDSL 2 +#define RX_IP_CAN_TYPE_WiMAX 3 +#define RX_IP_CAN_TYPE_3GPP2 4 +#define RX_IP_CAN_TYPE_3GPP_EPS 5 +#define RX_IP_CAN_TYPE_Non_3GPP_EPS 6 +extern struct dict_object *rx_ip_can_type; +#define RX_RAT_TYPE_WLAN 0 +#define RX_RAT_TYPE_VIRTUAL 1 +#define RX_RAT_TYPE_UTRAN 1000 +#define RX_RAT_TYPE_GERAN 1001 +#define RX_RAT_TYPE_GAN 1002 +#define RX_RAT_TYPE_HSPA_EVOLUTION 1003 +#define RX_RAT_TYPE_EUTRAN 1004 +#define RX_RAT_TYPE_EUTRAN_NB_IoT 1005 +#define RX_RAT_TYPE_CDMA2000_1X 2000 +#define RX_RAT_TYPE_HRPD 2001 +#define RX_RAT_TYPE_UMB 2002 +#define RX_RAT_TYPE_EHRPD 2003 +extern struct dict_object *rx_rat_type; + +int rx_dict_init(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __RX_DICT_H__ */ diff --git a/lib/fd/rx/rx_message.h b/lib/fd/rx/rx_message.h new file mode 100644 index 0000000000..83ca2d2b71 --- /dev/null +++ b/lib/fd/rx/rx_message.h @@ -0,0 +1,36 @@ +#ifndef __RX_MESSAGE_H__ +#define __RX_MESSAGE_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "3gpp_types.h" + +typedef struct _rx_message_t { +#define RX_CMD_CODE_AA 265 + c_uint16_t cmd_code; + +/* Result-Code AVP */ +#define RX_DIAMETER_ERROR_USER_UNKNOWN 5030 + +/* Experimental-Result-Codes */ +#define RX_DIAMETER_ERROR_LATE_OVERLAPPING_REQUEST 5453 +#define RX_DIAMETER_ERROR_TIMED_OUT_REQUEST 5454 +#define RX_DIAMETER_ERROR_INITIAL_PARAMETERS 5140 +#define RX_DIAMETER_ERROR_TRIGGER_EVENT 5141 +#define RX_DIAMETER_PCC_RULE_EVENT 5142 +#define RX_DIAMETER_ERROR_BEARER_NOT_AUTHORIZED 5143 +#define RX_DIAMETER_ERROR_TRAFFIC_MAPPING_INFO_REJECTED 5144 +#define RX_DIAMETER_ERROR_CONFLICTING_REQUEST 5147 +#define RX_DIAMETER_ADC_RULE_EVENT 5148 +#define RX_DIAMETER_ERROR_NBIFOM_NOT_AUTHORIZED 5149 + c_uint32_t result_code; + +} rx_message_t; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __RX_MESSAGE_H__ */