add initial code for PCRF
This commit is contained in:
parent
64d03a8cf1
commit
f6636453b6
|
@ -4,7 +4,7 @@ ACLOCAL_AMFLAGS = -I m4
|
|||
|
||||
SUBDIRS = lib src test
|
||||
|
||||
bin_PROGRAMS = mmed hssd sgwd pgwd epcd
|
||||
bin_PROGRAMS = mmed hssd sgwd pgwd pcrfd epcd
|
||||
|
||||
dist_mmed_SOURCES = main.c
|
||||
mmed_LDADD = $(top_srcdir)/src/libmme.la
|
||||
|
@ -18,6 +18,9 @@ sgwd_LDADD = $(top_srcdir)/src/libsgw.la
|
|||
dist_pgwd_SOURCES = main.c
|
||||
pgwd_LDADD = $(top_srcdir)/src/libpgw.la
|
||||
|
||||
dist_pcrfd_SOURCES = main.c
|
||||
pcrfd_LDADD = $(top_srcdir)/src/libpcrf.la
|
||||
|
||||
dist_epcd_SOURCES = main.c
|
||||
epcd_LDADD = $(top_srcdir)/src/libepc.la
|
||||
|
||||
|
|
|
@ -329,6 +329,7 @@ AC_CONFIG_FILES([src/mme/Makefile])
|
|||
AC_CONFIG_FILES([src/hss/Makefile])
|
||||
AC_CONFIG_FILES([src/sgw/Makefile])
|
||||
AC_CONFIG_FILES([src/pgw/Makefile])
|
||||
AC_CONFIG_FILES([src/pcrf/Makefile])
|
||||
AC_CONFIG_FILES([src/Makefile])
|
||||
AC_CONFIG_FILES([test/Makefile])
|
||||
AC_CONFIG_FILES([support/nextepc.conf])
|
||||
|
|
|
@ -3,9 +3,7 @@
|
|||
noinst_LTLIBRARIES = libbase.la
|
||||
|
||||
libbase_la_SOURCES = \
|
||||
types.h context.h
|
||||
|
||||
nodist_libbase_la_SOURCES = \
|
||||
types.h context.h \
|
||||
types.c context.c
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
|
@ -19,5 +17,3 @@ DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -180,6 +180,10 @@ status_t context_parse_config()
|
|||
{
|
||||
if (v) self.hidden.disable_pgw = atoi(v);
|
||||
}
|
||||
else if (jsmntok_equal(json, t+m, "DISABLE_PCRF") == 0)
|
||||
{
|
||||
if (v) self.hidden.disable_pcrf = atoi(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ typedef struct _context_t {
|
|||
int disable_hss;
|
||||
int disable_sgw;
|
||||
int disable_pgw;
|
||||
int disable_pcrf;
|
||||
} hidden;
|
||||
|
||||
} context_t;
|
||||
|
|
|
@ -5,7 +5,6 @@ SUBDIRS = @OSDIR@
|
|||
noinst_LTLIBRARIES = libcore.la
|
||||
|
||||
libcore_la_SOURCES = \
|
||||
version.c \
|
||||
../include/core_aes_cmac.h ../include/core_aes.h ../include/core_cond.h \
|
||||
../include/core_debug.h ../include/core_errno.h ../include/core_file.h \
|
||||
../include/core_fsm.h ../include/core_general.h ../include/core.h \
|
||||
|
@ -19,10 +18,8 @@ libcore_la_SOURCES = \
|
|||
../include/core_timer.h ../include/core_tlv.h ../include/core_tlv_msg.h \
|
||||
../include/core_atomic.h ../include/core_portable.h \
|
||||
../include/core_version.h ../include/core_event.h ../include/core_hash.h \
|
||||
../include/core_jsmn.h
|
||||
|
||||
nodist_libcore_la_SOURCES = \
|
||||
debug.c fsm.c msgq.c ringbuf.c timer.c tlv.c tlv_msg.c \
|
||||
../include/core_jsmn.h \
|
||||
version.c debug.c fsm.c msgq.c ringbuf.c timer.c tlv.c tlv_msg.c \
|
||||
aes.c aes_cmac.c sha1.c sha1_hmac.c sha2.c sha2_hmac.c misc.c event.c \
|
||||
hash.c jsmn.c
|
||||
|
||||
|
@ -41,5 +38,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -7,9 +7,7 @@ libcoreunix_la_SOURCES = \
|
|||
../../include/arch/unix/core_arch_file.h \
|
||||
../../include/arch/unix/core_arch_mutex.h \
|
||||
../../include/arch/unix/core_arch_semaphore.h \
|
||||
../../include/arch/unix/core_arch_thread.h
|
||||
|
||||
nodist_libcoreunix_la_SOURCES = \
|
||||
../../include/arch/unix/core_arch_thread.h \
|
||||
cond.c file.c net_lib.c thread.c errorcodes.c mutex.c rwlock.c \
|
||||
start.c time.c semaphore.c signal.c pkbuf.c rand.c atomic.c
|
||||
|
||||
|
@ -23,5 +21,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -5,9 +5,7 @@ SUBDIRS = extensions gx s6a
|
|||
noinst_LTLIBRARIES = libfd.la
|
||||
|
||||
libfd_la_SOURCES = \
|
||||
fd_message.h fd_logger.h fd_init.h fd_lib.h
|
||||
|
||||
nodist_libfd_la_SOURCES = \
|
||||
fd_message.h fd_logger.h fd_lib.h \
|
||||
libapp_sip.c fd_message.c fd_logger.c fd_init.c
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
|
@ -18,5 +16,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -13,5 +13,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(pkglib_LTLIBRARIES)
|
||||
|
|
|
@ -13,5 +13,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(pkglib_LTLIBRARIES)
|
||||
|
|
|
@ -21,5 +21,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(pkglib_LTLIBRARIES)
|
||||
|
|
|
@ -13,5 +13,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(pkglib_LTLIBRARIES)
|
||||
|
|
|
@ -13,5 +13,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(pkglib_LTLIBRARIES)
|
||||
|
|
|
@ -340,7 +340,7 @@ int dict_s6a_init(char * conffile)
|
|||
struct dict_object * cmd;
|
||||
struct dict_cmd_data data = {
|
||||
316, /* Code */
|
||||
"3GPP/Update-Location-Request", /* Name */
|
||||
"Update-Location-Request", /* Name */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||
};
|
||||
|
@ -377,7 +377,7 @@ int dict_s6a_init(char * conffile)
|
|||
struct dict_object * cmd;
|
||||
struct dict_cmd_data data = {
|
||||
316, /* Code */
|
||||
"3GPP/Update-Location-Answer", /* Name */
|
||||
"Update-Location-Answer", /* Name */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||
};
|
||||
|
@ -407,7 +407,7 @@ int dict_s6a_init(char * conffile)
|
|||
struct dict_object * cmd;
|
||||
struct dict_cmd_data data = {
|
||||
318, /* Code */
|
||||
"3GPP/Authentication-Information-Request", /* Name */
|
||||
"Authentication-Information-Request", /* Name */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||
};
|
||||
|
@ -439,7 +439,7 @@ int dict_s6a_init(char * conffile)
|
|||
struct dict_object * cmd;
|
||||
struct dict_cmd_data data = {
|
||||
318, /* Code */
|
||||
"3GPP/Authentication-Information-Answer", /* Name */
|
||||
"Authentication-Information-Answer", /* Name */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||
};
|
||||
|
@ -468,10 +468,10 @@ int dict_s6a_init(char * conffile)
|
|||
{
|
||||
struct dict_object * cmd;
|
||||
struct dict_cmd_data data = {
|
||||
321, /* Code */
|
||||
"3GPP/Purge-UE-Request", /* Name */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||
321, /* Code */
|
||||
"Purge-UE-Request", /* Name */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||
};
|
||||
struct local_rules_definition rules[] =
|
||||
{
|
||||
|
@ -497,10 +497,10 @@ int dict_s6a_init(char * conffile)
|
|||
{
|
||||
struct dict_object * cmd;
|
||||
struct dict_cmd_data data = {
|
||||
321, /* Code */
|
||||
"3GPP/Purge-UE-Answer", /* Name */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||
321, /* Code */
|
||||
"Purge-UE-Answer", /* Name */
|
||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||
};
|
||||
struct local_rules_definition rules[] =
|
||||
{
|
||||
|
|
|
@ -2,13 +2,11 @@
|
|||
|
||||
noinst_LTLIBRARIES = libfdgx.la
|
||||
|
||||
nodist_libfdgx_la_SOURCES = \
|
||||
dict_init.c
|
||||
libfdgx_la_SOURCES = \
|
||||
gx_lib.h dict_init.c
|
||||
|
||||
AM_CFLAGS = \
|
||||
-Wall -Werror
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -2,13 +2,11 @@
|
|||
|
||||
noinst_LTLIBRARIES = libfds6a.la
|
||||
|
||||
nodist_libfds6a_la_SOURCES = \
|
||||
dict_init.c
|
||||
libfds6a_la_SOURCES = \
|
||||
s6a_lib.h dict_init.c
|
||||
|
||||
AM_CFLAGS = \
|
||||
-Wall -Werror
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -54,12 +54,12 @@ int s6a_dict_init(void)
|
|||
|
||||
CHECK_dict_search( DICT_APPLICATION, APPLICATION_BY_ID, (void *)&id, &s6a_application);
|
||||
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "3GPP/Authentication-Information-Request", &s6a_cmd_air);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "3GPP/Authentication-Information-Answer", &s6a_cmd_aia);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "3GPP/Update-Location-Request", &s6a_cmd_ulr);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "3GPP/Update-Location-Answer", &s6a_cmd_ula);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "3GPP/Purge-UE-Request", &s6a_cmd_pur);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "3GPP/Purge-UE-Answer", &s6a_cmd_pua);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Authentication-Information-Request", &s6a_cmd_air);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Authentication-Information-Answer", &s6a_cmd_aia);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Update-Location-Request", &s6a_cmd_ulr);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Update-Location-Answer", &s6a_cmd_ula);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Request", &s6a_cmd_pur);
|
||||
CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Answer", &s6a_cmd_pua);
|
||||
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Visited-PLMN-Id", &s6a_visited_plmn_id);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAT-Type", &s6a_rat_type);
|
||||
|
|
|
@ -3,9 +3,7 @@
|
|||
noinst_LTLIBRARIES = libgtp.la
|
||||
|
||||
libgtp_la_SOURCES = \
|
||||
gtp_tlv.h gtp_types.h gtp_path.h gtp_xact.h
|
||||
|
||||
nodist_libgtp_la_SOURCES = \
|
||||
gtp_tlv.h gtp_types.h gtp_path.h gtp_xact.h \
|
||||
gtp_tlv.c gtp_types.c gtp_path.c gtp_xact.c
|
||||
|
||||
libgtp_la_DEPENDENCIES = \
|
||||
|
@ -23,5 +21,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -2,9 +2,8 @@
|
|||
|
||||
noinst_LTLIBRARIES = liblogger.la
|
||||
|
||||
liblogger_la_SOURCES = logger.h
|
||||
|
||||
nodist_liblogger_la_SOURCES = logger.c
|
||||
liblogger_la_SOURCES = \
|
||||
logger.h logger.c
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir)/lib/core/include
|
||||
|
@ -14,5 +13,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -3,9 +3,7 @@
|
|||
noinst_LTLIBRARIES = libnas.la
|
||||
|
||||
libnas_la_SOURCES = \
|
||||
nas_message.h nas_ies.h nas_types.h
|
||||
|
||||
nodist_libnas_la_SOURCES = \
|
||||
nas_message.h nas_ies.h nas_types.h \
|
||||
nas_decoder.c nas_encoder.c nas_ies.c
|
||||
|
||||
libnas_la_DEPENDENCIES = \
|
||||
|
@ -23,5 +21,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -5,9 +5,7 @@ SUBDIRS = asn1c
|
|||
noinst_LTLIBRARIES = libs1ap.la
|
||||
|
||||
libs1ap_la_SOURCES = \
|
||||
s1ap_asn1c.h s1ap_ies_defs.h s1ap_message.h
|
||||
|
||||
nodist_libs1ap_la_SOURCES = \
|
||||
s1ap_asn1c.h s1ap_ies_defs.h s1ap_message.h \
|
||||
s1ap_encoder.c s1ap_decoder.c s1ap_free.c \
|
||||
s1ap_ies_encoder.c s1ap_ies_decoder.c s1ap_ies_free.c s1ap_ies_xer_print.c
|
||||
|
||||
|
@ -29,5 +27,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -803,8 +803,7 @@ ASN_MODULE_INCLUDES+=per_opentype.h
|
|||
ASN_MODULE_SOURCES+=per_opentype.c
|
||||
|
||||
noinst_LTLIBRARIES=libs1apasn1c.la
|
||||
libs1apasn1c_la_SOURCES=$(ASN_MODULE_INCLUDES)
|
||||
nodist_libs1apasn1c_la_SOURCES=$(ASN_MODULE_SOURCES)
|
||||
libs1apasn1c_la_SOURCES=$(ASN_MODULE_INCLUDES) $(ASN_MODULE_SOURCES)
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir)/lib/core/include
|
||||
|
@ -815,8 +814,6 @@ AM_CFLAGS = \
|
|||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump Makefile.am.sample converter-sample.c
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
||||
regen: regenerate-from-asn1-source
|
||||
|
||||
regenerate-from-asn1-source:
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
## Process this file with automake to produce Makefile.in.
|
||||
|
||||
SUBDIRS = mme hss sgw pgw
|
||||
SUBDIRS = mme hss sgw pgw pcrf
|
||||
|
||||
noinst_LTLIBRARIES = libmme.la libhss.la libsgw.la libpgw.la libepc.la
|
||||
noinst_LTLIBRARIES = libmme.la libhss.la libsgw.la libpgw.la libpcrf.la libepc.la
|
||||
|
||||
COMMON_SOURCES = init.c
|
||||
COMMON_INCLUDES = app.h
|
||||
|
||||
libmme_la_SOURCES = $(COMMON_INCLUDES)
|
||||
nodist_libmme_la_SOURCES = mme.c $(COMMON_SOURCES)
|
||||
libmme_la_SOURCES = $(COMMON_INCLUDES) mme.c $(COMMON_SOURCES)
|
||||
libmme_la_DEPENDENCIES = \
|
||||
$(top_srcdir)/lib/base/libbase.la \
|
||||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
|
@ -18,8 +17,7 @@ libmme_la_LIBADD = \
|
|||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
$(top_srcdir)/src/mme/libmme.la
|
||||
|
||||
libhss_la_SOURCES = $(COMMON_INCLUDES)
|
||||
nodist_libhss_la_SOURCES = hss.c $(COMMON_SOURCES)
|
||||
libhss_la_SOURCES = $(COMMON_INCLUDES) hss.c $(COMMON_SOURCES)
|
||||
libhss_la_DEPENDENCIES = \
|
||||
$(top_srcdir)/lib/base/libbase.la \
|
||||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
|
@ -29,8 +27,7 @@ libhss_la_LIBADD = \
|
|||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
$(top_srcdir)/src/hss/libhss.la
|
||||
|
||||
libsgw_la_SOURCES = $(COMMON_INCLUDES)
|
||||
nodist_libsgw_la_SOURCES = sgw.c $(COMMON_SOURCES)
|
||||
libsgw_la_SOURCES = $(COMMON_INCLUDES) sgw.c $(COMMON_SOURCES)
|
||||
libsgw_la_DEPENDENCIES = \
|
||||
$(top_srcdir)/lib/base/libbase.la \
|
||||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
|
@ -40,8 +37,7 @@ libsgw_la_LIBADD = \
|
|||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
$(top_srcdir)/src/sgw/libsgw.la
|
||||
|
||||
libpgw_la_SOURCES = $(COMMON_INCLUDES)
|
||||
nodist_libpgw_la_SOURCES = pgw.c $(COMMON_SOURCES)
|
||||
libpgw_la_SOURCES = $(COMMON_INCLUDES) pgw.c $(COMMON_SOURCES)
|
||||
libpgw_la_DEPENDENCIES = \
|
||||
$(top_srcdir)/lib/base/libbase.la \
|
||||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
|
@ -51,22 +47,33 @@ libpgw_la_LIBADD = \
|
|||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
$(top_srcdir)/src/pgw/libpgw.la
|
||||
|
||||
libepc_la_SOURCES = $(COMMON_INCLUDES)
|
||||
nodist_libepc_la_SOURCES = epc.c $(COMMON_SOURCES)
|
||||
libpcrf_la_SOURCES = $(COMMON_INCLUDES) pcrf.c $(COMMON_SOURCES)
|
||||
libpcrf_la_DEPENDENCIES = \
|
||||
$(top_srcdir)/lib/base/libbase.la \
|
||||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
$(top_srcdir)/src/pcrf/libpcrf.la
|
||||
libpcrf_la_LIBADD = \
|
||||
$(top_srcdir)/lib/base/libbase.la \
|
||||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
$(top_srcdir)/src/pcrf/libpcrf.la
|
||||
|
||||
libepc_la_SOURCES = $(COMMON_INCLUDES) epc.c $(COMMON_SOURCES)
|
||||
libepc_la_DEPENDENCIES = \
|
||||
$(top_srcdir)/lib/base/libbase.la \
|
||||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
$(top_srcdir)/src/mme/libmme.la \
|
||||
$(top_srcdir)/src/hss/libhss.la \
|
||||
$(top_srcdir)/src/sgw/libsgw.la \
|
||||
$(top_srcdir)/src/pgw/libpgw.la
|
||||
$(top_srcdir)/src/pgw/libpgw.la \
|
||||
$(top_srcdir)/src/pcrf/libpcrf.la
|
||||
libepc_la_LIBADD = \
|
||||
$(top_srcdir)/lib/base/libbase.la \
|
||||
$(top_srcdir)/lib/logger/liblogger.la \
|
||||
$(top_srcdir)/src/mme/libmme.la \
|
||||
$(top_srcdir)/src/hss/libhss.la \
|
||||
$(top_srcdir)/src/sgw/libsgw.la \
|
||||
$(top_srcdir)/src/pgw/libpgw.la
|
||||
$(top_srcdir)/src/pgw/libpgw.la \
|
||||
$(top_srcdir)/src/pcrf/libpcrf.la
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir)/lib/core/include \
|
||||
|
@ -80,5 +87,3 @@ DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -31,6 +31,9 @@ CORE_DECLARE(void) sgw_terminate(void);
|
|||
CORE_DECLARE(status_t) pgw_initialize();
|
||||
CORE_DECLARE(void) pgw_terminate(void);
|
||||
|
||||
CORE_DECLARE(status_t) pcrf_initialize();
|
||||
CORE_DECLARE(void) pcrf_terminate(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
|
62
src/epc.c
62
src/epc.c
|
@ -7,6 +7,9 @@
|
|||
#include "context.h"
|
||||
#include "app.h"
|
||||
|
||||
static semaphore_id pcrf_sem1 = 0;
|
||||
static semaphore_id pcrf_sem2 = 0;
|
||||
|
||||
static semaphore_id pgw_sem1 = 0;
|
||||
static semaphore_id pgw_sem2 = 0;
|
||||
|
||||
|
@ -32,6 +35,49 @@ status_t app_initialize(char *config_path, char *log_path)
|
|||
}
|
||||
|
||||
|
||||
/************************* PCRF Process **********************/
|
||||
semaphore_create(&pcrf_sem1, 0); /* copied to PCRF/PGW/SGW/HSS process */
|
||||
semaphore_create(&pcrf_sem2, 0); /* copied to PCRF/PGW/SGW/HSS process */
|
||||
|
||||
if (context_self()->hidden.disable_pcrf == 0)
|
||||
{
|
||||
pid = fork();
|
||||
d_assert(pid >= 0, _exit(EXIT_FAILURE), "fork() failed");
|
||||
|
||||
if (pid == 0)
|
||||
{
|
||||
d_trace(1, "PCRF try to initialize\n");
|
||||
rv = pcrf_initialize();
|
||||
d_assert(rv == CORE_OK,, "Failed to intialize PCRF");
|
||||
d_trace(1, "PCRF initialize...done\n");
|
||||
|
||||
if (pcrf_sem1) semaphore_post(pcrf_sem1);
|
||||
if (pcrf_sem2) semaphore_wait(pcrf_sem2);
|
||||
|
||||
if (rv == CORE_OK)
|
||||
{
|
||||
d_trace(1, "PCRF try to terminate\n");
|
||||
pcrf_terminate();
|
||||
d_trace(1, "PCRF terminate...done\n");
|
||||
}
|
||||
|
||||
if (pcrf_sem1) semaphore_post(pcrf_sem1);
|
||||
|
||||
/* allocated from parent process */
|
||||
if (pcrf_sem1) semaphore_delete(pcrf_sem1);
|
||||
if (pcrf_sem2) semaphore_delete(pcrf_sem2);
|
||||
|
||||
app_did_terminate();
|
||||
|
||||
core_terminate();
|
||||
|
||||
_exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
if (pcrf_sem1) semaphore_wait(pcrf_sem1);
|
||||
}
|
||||
|
||||
|
||||
/************************* PGW Process **********************/
|
||||
|
||||
semaphore_create(&pgw_sem1, 0); /* copied to PGW/SGW/HSS process */
|
||||
|
@ -44,6 +90,10 @@ status_t app_initialize(char *config_path, char *log_path)
|
|||
|
||||
if (pid == 0)
|
||||
{
|
||||
/* allocated from parent process */
|
||||
if (pcrf_sem1) semaphore_delete(pcrf_sem1);
|
||||
if (pcrf_sem2) semaphore_delete(pcrf_sem2);
|
||||
|
||||
d_trace(1, "PGW try to initialize\n");
|
||||
rv = pgw_initialize();
|
||||
d_assert(rv == CORE_OK,, "Failed to intialize PGW");
|
||||
|
@ -89,6 +139,8 @@ status_t app_initialize(char *config_path, char *log_path)
|
|||
if (pid == 0)
|
||||
{
|
||||
/* allocated from parent process */
|
||||
if (pcrf_sem1) semaphore_delete(pcrf_sem1);
|
||||
if (pcrf_sem2) semaphore_delete(pcrf_sem2);
|
||||
if (pgw_sem1) semaphore_delete(pgw_sem1);
|
||||
if (pgw_sem2) semaphore_delete(pgw_sem2);
|
||||
|
||||
|
@ -137,6 +189,8 @@ status_t app_initialize(char *config_path, char *log_path)
|
|||
if (pid == 0)
|
||||
{
|
||||
/* allocated from parent process */
|
||||
if (pcrf_sem1) semaphore_delete(pcrf_sem1);
|
||||
if (pcrf_sem2) semaphore_delete(pcrf_sem2);
|
||||
if (pgw_sem1) semaphore_delete(pgw_sem1);
|
||||
if (pgw_sem2) semaphore_delete(pgw_sem2);
|
||||
if (sgw_sem1) semaphore_delete(sgw_sem1);
|
||||
|
@ -215,5 +269,13 @@ void app_terminate(void)
|
|||
if (pgw_sem1) semaphore_delete(pgw_sem1);
|
||||
if (pgw_sem2) semaphore_delete(pgw_sem2);
|
||||
|
||||
if (context_self()->hidden.disable_pcrf == 0)
|
||||
{
|
||||
if (pcrf_sem2) semaphore_post(pcrf_sem2);
|
||||
if (pcrf_sem1) semaphore_wait(pcrf_sem1);
|
||||
}
|
||||
if (pcrf_sem1) semaphore_delete(pcrf_sem1);
|
||||
if (pcrf_sem2) semaphore_delete(pcrf_sem2);
|
||||
|
||||
app_did_terminate();
|
||||
}
|
||||
|
|
|
@ -3,9 +3,7 @@
|
|||
noinst_LTLIBRARIES = libhss.la
|
||||
|
||||
libhss_la_SOURCES = \
|
||||
milenage.h hss_kdf.h hss_context.h hss_s6a_handler.h
|
||||
|
||||
nodist_libhss_la_SOURCES = \
|
||||
milenage.h hss_kdf.h hss_context.h hss_s6a_handler.h \
|
||||
milenage.c hss_kdf.c hss_init.c hss_context.c hss_s6a_handler.c
|
||||
|
||||
libhss_la_DEPENDENCIES = \
|
||||
|
@ -30,5 +28,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -47,16 +47,10 @@ typedef struct _hss_db_subscription_data_t {
|
|||
} hss_db_subscription_data_t;
|
||||
|
||||
typedef struct _hss_context_t {
|
||||
char* fd_conf_path; /* HSS freeDiameter conf path */
|
||||
char* hss_s6a_addr; /* HSS S6A local address (STIRNG)*/
|
||||
c_uint16_t hss_s6a_port; /* HSS S6A local port */
|
||||
c_uint16_t hss_s6a_tls_port; /* HSS S6A local TLS port */
|
||||
char* mme_s6a_addr; /* MME S6A address (STIRNG)*/
|
||||
c_uint16_t mme_s6a_port; /* MME S6A port */
|
||||
c_uint16_t mme_s6a_tls_port; /* MME S6A TLS port */
|
||||
char *fd_conf_path; /* HSS freeDiameter conf path */
|
||||
|
||||
void *subscriberCollection;
|
||||
mutex_id db_lock;
|
||||
void *subscriberCollection;
|
||||
mutex_id db_lock;
|
||||
} hss_context_t;
|
||||
|
||||
CORE_DECLARE(status_t) hss_context_init(void);
|
||||
|
|
|
@ -11,9 +11,7 @@ libmme_la_SOURCES = \
|
|||
emm_handler.h emm_build.h \
|
||||
esm_handler.h esm_build.h \
|
||||
mme_s11_path.h mme_s11_build.h mme_s11_handler.h \
|
||||
mme_sm.h
|
||||
|
||||
nodist_libmme_la_SOURCES = \
|
||||
mme_sm.h \
|
||||
mme_kdf.c kasumi.c snow_3g.c zuc.c \
|
||||
mme_init.c mme_event.c mme_context.c \
|
||||
s1ap_sm.c s1ap_build.c s1ap_handler.c s1ap_conv.c s1ap_path.c \
|
||||
|
@ -55,5 +53,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -105,10 +105,6 @@ static status_t mme_context_prepare()
|
|||
{
|
||||
self.relative_capacity = 0xff;
|
||||
|
||||
self.mme_s6a_port = DIAMETER_PORT;
|
||||
self.mme_s6a_tls_port = DIAMETER_SECURE_PORT;
|
||||
self.hss_s6a_port = DIAMETER_PORT;
|
||||
self.hss_s6a_tls_port = DIAMETER_SECURE_PORT;
|
||||
self.s1ap_port = S1AP_SCTP_PORT;
|
||||
self.s11_port = GTPV2_C_UDP_PORT;
|
||||
|
||||
|
|
|
@ -43,29 +43,23 @@ typedef struct _served_gummei {
|
|||
} served_gummei_t;
|
||||
|
||||
typedef struct _mme_context_t {
|
||||
char* fd_conf_path; /* MME freeDiameter conf path */
|
||||
char* mme_s6a_addr; /* MME S6A local address (STIRNG)*/
|
||||
c_uint16_t mme_s6a_port; /* MME S6A local port */
|
||||
c_uint16_t mme_s6a_tls_port; /* MME S6A local TLS port */
|
||||
char* hss_s6a_addr; /* HSS S6A address (STIRNG)*/
|
||||
c_uint16_t hss_s6a_port; /* HSS S6A port */
|
||||
c_uint16_t hss_s6a_tls_port; /* HSS S6A TLS port */
|
||||
char *fd_conf_path; /* MME freeDiameter conf path */
|
||||
|
||||
c_uint32_t s1ap_addr; /* MME S1AP local address */
|
||||
c_uint16_t s1ap_port; /* MME S1AP local port */
|
||||
net_sock_t *s1ap_sock; /* MME S1AP local listen socket */
|
||||
c_uint32_t s1ap_addr; /* MME S1AP local address */
|
||||
c_uint16_t s1ap_port; /* MME S1AP local port */
|
||||
net_sock_t *s1ap_sock; /* MME S1AP local listen socket */
|
||||
|
||||
c_uint32_t s11_addr; /* MME S11 local address */
|
||||
c_uint16_t s11_port; /* MME S11 local port */
|
||||
net_sock_t *s11_sock; /* MME S11 local listen socket */
|
||||
c_uint32_t s11_addr; /* MME S11 local address */
|
||||
c_uint16_t s11_port; /* MME S11 local port */
|
||||
net_sock_t *s11_sock; /* MME S11 local listen socket */
|
||||
|
||||
msgq_id queue_id; /* Queue for processing MME control plane */
|
||||
tm_service_t tm_service; /* Timer Service */
|
||||
gtp_xact_ctx_t gtp_xact_ctx; /* GTP Transaction Context for MME */
|
||||
|
||||
/* Generator for unique identification */
|
||||
c_uint32_t mme_ue_s1ap_id; /** mme_ue_s1ap_id generator */
|
||||
c_uint32_t m_tmsi; /** m_tmsi generator */
|
||||
c_uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */
|
||||
c_uint32_t m_tmsi; /* m_tmsi generator */
|
||||
|
||||
/* defined in 'nas_ies.h'
|
||||
* #define NAS_SECURITY_ALGORITHMS_EIA0 0
|
||||
|
@ -91,28 +85,28 @@ typedef struct _mme_context_t {
|
|||
served_gummei_t served_gummei[MAX_NUM_OF_SERVED_GUMMEI];
|
||||
c_uint8_t relative_capacity;
|
||||
|
||||
/* Timer value*/
|
||||
/* Timer value */
|
||||
c_uint32_t t3413_value; /* Paging retry timer */
|
||||
|
||||
list_t sgw_list;
|
||||
list_t enb_list;
|
||||
|
||||
hash_t *mme_ue_s1ap_id_hash; /* hash table for MME-UE-S1AP-ID */
|
||||
hash_t *imsi_ue_hash; /* hash table (IMSI : MME_UE) */
|
||||
hash_t *guti_ue_hash; /* hash table (GUTI : MME_UE) */
|
||||
hash_t *mme_ue_s1ap_id_hash; /* hash table for MME-UE-S1AP-ID */
|
||||
hash_t *imsi_ue_hash; /* hash table (IMSI : MME_UE) */
|
||||
hash_t *guti_ue_hash; /* hash table (GUTI : MME_UE) */
|
||||
} mme_context_t;
|
||||
|
||||
typedef struct _mme_sgw_t {
|
||||
gtp_node_t gnode; /* SGW S11 remote GTPv2-C node */
|
||||
gtp_node_t gnode; /* SGW S11 remote GTPv2-C node */
|
||||
|
||||
} mme_sgw_t;
|
||||
|
||||
typedef struct _mme_enb_t {
|
||||
lnode_t node; /**< A node of list_t */
|
||||
index_t index; /**< An index of this node */
|
||||
fsm_t sm;
|
||||
lnode_t node; /* A node of list_t */
|
||||
index_t index; /* An index of this node */
|
||||
fsm_t sm; /* A state machine */
|
||||
|
||||
c_uint32_t enb_id; /** eNB_ID received from eNB */
|
||||
c_uint32_t enb_id; /* eNB_ID received from eNB */
|
||||
net_sock_t *s1ap_sock;
|
||||
|
||||
c_uint8_t num_of_tai;
|
||||
|
@ -126,15 +120,13 @@ typedef struct _enb_ue_t enb_ue_t;
|
|||
typedef struct _mme_ue_t mme_ue_t;
|
||||
|
||||
struct _enb_ue_t {
|
||||
lnode_t node; /**< A node of list_t */
|
||||
index_t index; /**< An index of this node */
|
||||
fsm_t sm;
|
||||
|
||||
/* State Machine */
|
||||
lnode_t node; /* A node of list_t */
|
||||
index_t index; /* An index of this node */
|
||||
fsm_t sm; /* A state machine */
|
||||
|
||||
/* UE identity */
|
||||
c_uint32_t enb_ue_s1ap_id; /** eNB-UE-S1AP-ID received from eNB */
|
||||
c_uint32_t mme_ue_s1ap_id; /** MME-UE-S1AP-ID received from MME */
|
||||
c_uint32_t enb_ue_s1ap_id; /* eNB-UE-S1AP-ID received from eNB */
|
||||
c_uint32_t mme_ue_s1ap_id; /* MME-UE-S1AP-ID received from MME */
|
||||
|
||||
/* UE Info */
|
||||
tai_t tai;
|
||||
|
@ -148,11 +140,9 @@ struct _enb_ue_t {
|
|||
};
|
||||
|
||||
struct _mme_ue_t {
|
||||
lnode_t node; /**< A node of list_t */
|
||||
index_t index; /**< An index of this node */
|
||||
fsm_t sm;
|
||||
|
||||
/* State Machine */
|
||||
lnode_t node; /* A node of list_t */
|
||||
index_t index; /* An index of this node */
|
||||
fsm_t sm; /* A state machine */
|
||||
|
||||
/* UE identity */
|
||||
#define MME_UE_HAVE_IMSI(mme) \
|
||||
|
@ -215,10 +205,10 @@ struct _mme_ue_t {
|
|||
|
||||
/* HSS Info */
|
||||
c_uint32_t ula_flags;
|
||||
c_uint32_t max_bandwidth_ul; /* bits per seconds */
|
||||
c_uint32_t max_bandwidth_dl; /* bits per seconds */
|
||||
c_uint32_t subscribed_rau_tau_timer; /* seconds */
|
||||
pdn_t pdn[MAX_NUM_OF_PDN]; /* APN Profile */
|
||||
c_uint32_t max_bandwidth_ul; /* bits per seconds */
|
||||
c_uint32_t max_bandwidth_dl; /* bits per seconds */
|
||||
c_uint32_t subscribed_rau_tau_timer; /* seconds */
|
||||
pdn_t pdn[MAX_NUM_OF_PDN]; /* APN Profile */
|
||||
int num_of_pdn;
|
||||
|
||||
/* ESM Info */
|
||||
|
@ -243,8 +233,8 @@ struct _mme_ue_t {
|
|||
};
|
||||
|
||||
typedef struct _mme_sess_t {
|
||||
lnode_t node; /**< A node of list_t */
|
||||
index_t index; /**< An index of this node */
|
||||
lnode_t node; /* A node of list_t */
|
||||
index_t index; /* An index of this node */
|
||||
|
||||
/* IMPORTANT!
|
||||
* MME-S11-TEID is same with an index */
|
||||
|
@ -275,12 +265,12 @@ typedef struct _mme_sess_t {
|
|||
} mme_sess_t;
|
||||
|
||||
typedef struct _mme_bearer_t {
|
||||
lnode_t node; /**< A node of list_t */
|
||||
index_t index; /**< An index of this node */
|
||||
fsm_t sm;
|
||||
lnode_t node; /* A node of list_t */
|
||||
index_t index; /* An index of this node */
|
||||
fsm_t sm; /* State Machine */
|
||||
|
||||
c_uint8_t pti; /** Procedure Trasaction Identity */
|
||||
c_uint8_t ebi; /** EPS Bearer ID */
|
||||
c_uint8_t pti; /* Procedure Trasaction Identity */
|
||||
c_uint8_t ebi; /* EPS Bearer ID */
|
||||
|
||||
c_uint32_t enb_s1u_teid;
|
||||
c_uint32_t enb_s1u_addr;
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
#define TRACE_MODULE _pcrf_main
|
||||
|
||||
#include "core_debug.h"
|
||||
#include "core_signal.h"
|
||||
#include "core_semaphore.h"
|
||||
|
||||
#include "context.h"
|
||||
#include "app.h"
|
||||
|
||||
status_t app_initialize(char *config_path, char *log_path)
|
||||
{
|
||||
status_t rv;
|
||||
int others = 0;
|
||||
|
||||
rv = app_will_initialize(config_path, log_path);
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
others = context_self()->trace_level.others;
|
||||
if (others)
|
||||
{
|
||||
d_trace_level(&_pcrf_main, others);
|
||||
}
|
||||
|
||||
d_trace(1, "PCRF try to initialize\n");
|
||||
rv = pcrf_initialize();
|
||||
d_assert(rv == CORE_OK, return rv, "Failed to intialize PCRF");
|
||||
d_trace(1, "PCRF initialize...done\n");
|
||||
|
||||
rv = app_did_initialize(config_path, log_path);
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
void app_terminate(void)
|
||||
{
|
||||
app_will_terminate();
|
||||
|
||||
d_trace(1, "PCRF try to terminate\n");
|
||||
pcrf_terminate();
|
||||
d_trace(1, "PCRF terminate...done\n");
|
||||
|
||||
app_did_terminate();
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
## Process this file with automake to produce Makefile.in.
|
||||
|
||||
noinst_LTLIBRARIES = libpcrf.la
|
||||
|
||||
libpcrf_la_SOURCES = \
|
||||
pcrf_context.h pcrf_gx_handler.h \
|
||||
pcrf_init.c pcrf_context.c pcrf_gx_handler.c
|
||||
|
||||
libpcrf_la_DEPENDENCIES = \
|
||||
$(top_srcdir)/lib/core/src/libcore.la \
|
||||
$(top_srcdir)/lib/fd/gx/libfdgx.la \
|
||||
$(top_srcdir)/lib/fd/libfd.la
|
||||
|
||||
libpcrf_la_LIBADD = \
|
||||
$(top_srcdir)/lib/core/src/libcore.la \
|
||||
$(top_srcdir)/lib/fd/gx/libfdgx.la \
|
||||
$(top_srcdir)/lib/fd/libfd.la
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir)/lib/core/include \
|
||||
-I$(top_srcdir)/lib/base \
|
||||
-I$(top_srcdir)/lib/fd/gx \
|
||||
-I$(top_srcdir)/lib/fd \
|
||||
@MONGOC_CFLAGS@
|
||||
|
||||
AM_CFLAGS = \
|
||||
-Wall -Werror
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
|
@ -0,0 +1,235 @@
|
|||
#define TRACE_MODULE _pcrf_context
|
||||
|
||||
#include "core_debug.h"
|
||||
#include "core_lib.h"
|
||||
|
||||
#include <mongoc.h>
|
||||
|
||||
#include "fd_lib.h"
|
||||
|
||||
#include "context.h"
|
||||
#include "pcrf_context.h"
|
||||
|
||||
static pcrf_context_t self;
|
||||
static int context_initialized = 0;
|
||||
|
||||
pcrf_context_t* pcrf_self()
|
||||
{
|
||||
return &self;
|
||||
}
|
||||
|
||||
status_t pcrf_context_init(void)
|
||||
{
|
||||
d_assert(context_initialized == 0, return CORE_ERROR,
|
||||
"PCRF context already has been context_initialized");
|
||||
|
||||
/* Initialize PCRF context */
|
||||
memset(&self, 0, sizeof(pcrf_context_t));
|
||||
|
||||
if (mutex_create(&self.db_lock, MUTEX_DEFAULT) != CORE_OK)
|
||||
{
|
||||
d_error("Mutex creation failed");
|
||||
return CORE_ERROR;
|
||||
}
|
||||
|
||||
context_initialized = 1;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t pcrf_context_final(void)
|
||||
{
|
||||
d_assert(context_initialized == 1, return CORE_ERROR,
|
||||
"PCRF context already has been finalized");
|
||||
|
||||
mutex_delete(self.db_lock);
|
||||
|
||||
context_initialized = 0;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
static status_t pcrf_context_prepare()
|
||||
{
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
static status_t pcrf_context_validation()
|
||||
{
|
||||
if (self.fd_conf_path == NULL)
|
||||
{
|
||||
d_error("No PCRF.FD_CONF_PATH in '%s'",
|
||||
context_self()->config.path);
|
||||
return CORE_ERROR;
|
||||
}
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t pcrf_context_parse_config()
|
||||
{
|
||||
status_t rv;
|
||||
config_t *config = &context_self()->config;
|
||||
|
||||
char *json = config->json;
|
||||
jsmntok_t *token = config->token;
|
||||
|
||||
typedef enum {
|
||||
START, ROOT,
|
||||
PCRF_START, PCRF_ROOT,
|
||||
SKIP, STOP
|
||||
} parse_state;
|
||||
parse_state state = START;
|
||||
parse_state stack = STOP;
|
||||
|
||||
size_t root_tokens = 0;
|
||||
size_t pcrf_tokens = 0;
|
||||
size_t skip_tokens = 0;
|
||||
int i, j;
|
||||
|
||||
rv = pcrf_context_prepare();
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
for (i = 0, j = 1; j > 0; i++, j--)
|
||||
{
|
||||
jsmntok_t *t = &token[i];
|
||||
|
||||
j += t->size;
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case START:
|
||||
{
|
||||
state = ROOT;
|
||||
root_tokens = t->size;
|
||||
|
||||
break;
|
||||
}
|
||||
case ROOT:
|
||||
{
|
||||
if (jsmntok_equal(json, t, "PCRF") == 0)
|
||||
{
|
||||
state = PCRF_START;
|
||||
}
|
||||
else
|
||||
{
|
||||
state = SKIP;
|
||||
stack = ROOT;
|
||||
skip_tokens = t->size;
|
||||
|
||||
root_tokens--;
|
||||
if (root_tokens == 0) state = STOP;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case PCRF_START:
|
||||
{
|
||||
state = PCRF_ROOT;
|
||||
pcrf_tokens = t->size;
|
||||
|
||||
break;
|
||||
}
|
||||
case PCRF_ROOT:
|
||||
{
|
||||
if (jsmntok_equal(json, t, "FD_CONF_PATH") == 0)
|
||||
{
|
||||
self.fd_conf_path = jsmntok_to_string(json, t+1);
|
||||
}
|
||||
|
||||
state = SKIP;
|
||||
stack = PCRF_ROOT;
|
||||
skip_tokens = t->size;
|
||||
|
||||
pcrf_tokens--;
|
||||
if (pcrf_tokens == 0) stack = ROOT;
|
||||
break;
|
||||
}
|
||||
case SKIP:
|
||||
{
|
||||
skip_tokens += t->size;
|
||||
|
||||
skip_tokens--;
|
||||
if (skip_tokens == 0) state = stack;
|
||||
break;
|
||||
}
|
||||
case STOP:
|
||||
{
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
d_error("Failed to parse configuration in the state(%u)",
|
||||
state);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
rv = pcrf_context_validation();
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t pcrf_context_setup_trace_module()
|
||||
{
|
||||
int fd = context_self()->trace_level.fd;
|
||||
int others = context_self()->trace_level.others;
|
||||
|
||||
if (fd)
|
||||
{
|
||||
if (fd <= 1) fd_g_debug_lvl = FD_LOG_ERROR;
|
||||
else if (fd <= 3) fd_g_debug_lvl = FD_LOG_NOTICE;
|
||||
else if (fd <= 5) fd_g_debug_lvl = FD_LOG_DEBUG;
|
||||
else fd_g_debug_lvl = FD_LOG_ANNOYING;
|
||||
|
||||
extern int _pcrf_gx_handler;
|
||||
d_trace_level(&_pcrf_gx_handler, fd);
|
||||
extern int _fd_init;
|
||||
d_trace_level(&_fd_init, fd);
|
||||
extern int _fd_logger;
|
||||
d_trace_level(&_fd_logger, fd);
|
||||
}
|
||||
|
||||
if (others)
|
||||
{
|
||||
extern int _mutex;
|
||||
d_trace_level(&_mutex, others);
|
||||
extern int _pkbuf;
|
||||
d_trace_level(&_pkbuf, others);
|
||||
|
||||
extern int _context;
|
||||
d_trace_level(&_context, others);
|
||||
extern int _pcrf_context;
|
||||
d_trace_level(&_pcrf_context, others);
|
||||
}
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t pcrf_db_init()
|
||||
{
|
||||
if (context_self()->db_client && context_self()->db_name)
|
||||
{
|
||||
self.subscriberCollection = mongoc_client_get_collection(
|
||||
context_self()->db_client,
|
||||
context_self()->db_name, "subscribers");
|
||||
d_assert(self.subscriberCollection, return CORE_ERROR,
|
||||
"Couldn't find Subscriber Collection in '%s'",
|
||||
context_self()->db_name)
|
||||
}
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t pcrf_db_final()
|
||||
{
|
||||
if (self.subscriberCollection)
|
||||
{
|
||||
mongoc_collection_destroy(self.subscriberCollection);
|
||||
}
|
||||
|
||||
return CORE_OK;
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
#ifndef __PCRF_CONTEXT_H__
|
||||
#define __PCRF_CONTEXT_H__
|
||||
|
||||
#include "core_errno.h"
|
||||
#include "core_mutex.h"
|
||||
#include "types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef struct _pcrf_context_t {
|
||||
char *fd_conf_path; /* PCRF freeDiameter conf path */
|
||||
|
||||
void *subscriberCollection;
|
||||
mutex_id db_lock;
|
||||
} pcrf_context_t;
|
||||
|
||||
CORE_DECLARE(status_t) pcrf_context_init(void);
|
||||
CORE_DECLARE(status_t) pcrf_context_final(void);
|
||||
CORE_DECLARE(pcrf_context_t*) pcrf_self(void);
|
||||
|
||||
CORE_DECLARE(status_t) pcrf_context_parse_config(void);
|
||||
CORE_DECLARE(status_t) pcrf_context_setup_trace_module(void);
|
||||
|
||||
CORE_DECLARE(status_t) pcrf_db_init(void);
|
||||
CORE_DECLARE(status_t) pcrf_db_final(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __PCRF_CONTEXT_H__ */
|
|
@ -0,0 +1,69 @@
|
|||
#define TRACE_MODULE _pcrf_gx_handler
|
||||
|
||||
#include "core_debug.h"
|
||||
|
||||
#include "fd_lib.h"
|
||||
#include "gx_lib.h"
|
||||
|
||||
#include "pcrf_context.h"
|
||||
|
||||
/* handler for fallback cb */
|
||||
static struct disp_hdl *hdl_fb = NULL;
|
||||
/* handler for Credit-Control-Request cb */
|
||||
static struct disp_hdl *hdl_ccr = NULL;
|
||||
|
||||
/* Default callback for the application. */
|
||||
static int pcrf_fb_cb(struct msg **msg, struct avp *avp,
|
||||
struct session *sess, void *opaque, enum disp_action *act)
|
||||
{
|
||||
/* This CB should never be called */
|
||||
d_warn("Unexpected message received!");
|
||||
|
||||
return ENOTSUP;
|
||||
}
|
||||
|
||||
/* Callback for incoming Credit-Control-Request messages */
|
||||
static int pcrf_ccr_cb( struct msg **msg, struct avp *avp,
|
||||
struct session *sess, void *opaque, enum disp_action *act)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pcrf_gx_init(void)
|
||||
{
|
||||
struct disp_when data;
|
||||
|
||||
CHECK_FCT( fd_init(FD_MODE_SERVER, pcrf_self()->fd_conf_path) );
|
||||
|
||||
/* Install objects definitions for this application */
|
||||
CHECK_FCT( gx_dict_init() );
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.app = gx_application;
|
||||
|
||||
/* fallback CB if command != unexpected message received */
|
||||
CHECK_FCT( fd_disp_register(pcrf_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||
&hdl_fb) );
|
||||
|
||||
/* specific handler for Credit-Control-Request */
|
||||
data.command = gx_cmd_ccr;
|
||||
CHECK_FCT( fd_disp_register(pcrf_ccr_cb, DISP_HOW_CC, &data, NULL,
|
||||
&hdl_ccr) );
|
||||
|
||||
/* Advertise the support for the application in the peer */
|
||||
CHECK_FCT( fd_disp_app_support(gx_application, fd_vendor, 1, 0) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pcrf_gx_final(void)
|
||||
{
|
||||
if (hdl_fb) {
|
||||
(void) fd_disp_unregister(&hdl_fb, NULL);
|
||||
}
|
||||
if (hdl_ccr) {
|
||||
(void) fd_disp_unregister(&hdl_ccr, NULL);
|
||||
}
|
||||
|
||||
fd_final();
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
#ifndef __PCRF_GX_HANDLER_H__
|
||||
#define __PCRF_GX_HANDLER_H__
|
||||
|
||||
#include "core_errno.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
CORE_DECLARE(int) pcrf_gx_init(void);
|
||||
CORE_DECLARE(void) pcrf_gx_final(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __PCRF_GX_HANDLER_H__ */
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
#define TRACE_MODULE _pcrf_init
|
||||
|
||||
#include "pcrf_context.h"
|
||||
#include "pcrf_gx_handler.h"
|
||||
|
||||
static int initialized = 0;
|
||||
|
||||
status_t pcrf_initialize(void)
|
||||
{
|
||||
status_t rv;
|
||||
int ret;
|
||||
|
||||
rv = pcrf_context_init();
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
rv = pcrf_context_parse_config();
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
rv = pcrf_context_setup_trace_module();
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
rv = pcrf_db_init();
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
ret = pcrf_gx_init();
|
||||
if (ret != CORE_OK) return CORE_ERROR;
|
||||
|
||||
initialized = 1;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
void pcrf_terminate(void)
|
||||
{
|
||||
if (!initialized) return;
|
||||
|
||||
pcrf_gx_final();
|
||||
|
||||
pcrf_db_final();
|
||||
pcrf_context_final();
|
||||
|
||||
return;
|
||||
}
|
|
@ -5,9 +5,7 @@ noinst_LTLIBRARIES = libpgw.la
|
|||
libpgw_la_SOURCES = \
|
||||
pgw_event.h pgw_context.h pgw_sm.h \
|
||||
pgw_gtp_path.h pgw_s5c_handler.h \
|
||||
pgw_gx_handler.h
|
||||
|
||||
nodist_libpgw_la_SOURCES = \
|
||||
pgw_gx_handler.h \
|
||||
pgw_init.c pgw_event.c pgw_context.c pgw_sm.c \
|
||||
pgw_gtp_path.c pgw_s5c_handler.c \
|
||||
pgw_gx_handler.c
|
||||
|
@ -36,5 +34,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
|
@ -4,9 +4,7 @@ noinst_LTLIBRARIES = libsgw.la
|
|||
|
||||
libsgw_la_SOURCES = \
|
||||
sgw_event.h sgw_context.h \
|
||||
sgw_path.h sgw_sm.h sgw_handler.h
|
||||
|
||||
nodist_libsgw_la_SOURCES = \
|
||||
sgw_path.h sgw_sm.h sgw_handler.h \
|
||||
sgw_init.c sgw_event.c sgw_context.c \
|
||||
sgw_path.c sgw_sm.c sgw_handler.c
|
||||
|
||||
|
@ -28,5 +26,3 @@ AM_CFLAGS = \
|
|||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
|
||||
EXTRA_DIST = .libs $(noinst_LTLIBRARIES)
|
||||
|
|
Loading…
Reference in New Issue