Message ID | 1483088953-30333-4-git-send-email-christophe.milard@linaro.org |
---|---|
State | Superseded |
Headers | show |
On 2016-12-30 10:09, Christophe Milard wrote: > The parsing of the odp.conf configuration file is added. > The file is searched first in the local directory (.) and > then is the $prefix/etc directory. > This requires libconfig (sudo apt-get install libconfig-dev) > > Signed-off-by: Christophe Milard <christophe.milard@linaro.org> > --- > .travis.yml | 2 +- > DEPENDENCIES | 8 +-- > platform/linux-generic/Makefile.am | 1 + > platform/linux-generic/include/odp_internal.h | 2 + > platform/linux-generic/m4/configure.m4 | 11 +++++ > platform/linux-generic/odp_init.c | 70 +++++++++++++++++++++++++++ > 6 files changed, 89 insertions(+), 5 deletions(-) > > diff --git a/.travis.yml b/.travis.yml > index adf3307..bb5bdbb 100644 > --- a/.travis.yml > +++ b/.travis.yml > @@ -19,7 +19,7 @@ sudo: required > > before_install: > - sudo apt-get -qq update > - - sudo apt-get install automake autoconf libtool libssl-dev graphviz mscgen doxygen > + - sudo apt-get install automake autoconf libtool libssl-dev graphviz mscgen doxygen libconfig-dev > - sudo apt-get install libpcap-dev linux-headers-`uname -r` > - gem install asciidoctor > > diff --git a/DEPENDENCIES b/DEPENDENCIES > index f1f0edd..a6b5b76 100644 > --- a/DEPENDENCIES > +++ b/DEPENDENCIES > @@ -18,18 +18,18 @@ Prerequisites for building the OpenDataPlane (ODP) API > > 3. Required libraries > > - Libraries currently required to link: openssl > + Libraries currently required to link: openssl, libconfig-dev > > -3.1 OpenSSL native compile > +3.1 OpenSSL and libconf native compile > > For native compilation, simply load the necessary libraries using the appropriate > tool set. > > On Debian/Ubuntu systems: > - $ sudo apt-get install libssl-dev > + $ sudo apt-get install libssl-dev libconfig-dev > > On CentOS/RedHat/Fedora systems: > - $ sudo yum install openssl-devel > + $ sudo yum install openssl-devel libconfig-dev libconfig-devel > > 3.2 OpenSSL cross compilation > > diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am > index 9d219da..9e5e095 100644 > --- a/platform/linux-generic/Makefile.am > +++ b/platform/linux-generic/Makefile.am > @@ -8,6 +8,7 @@ AM_CFLAGS += -I$(srcdir)/include > AM_CFLAGS += -I$(top_srcdir)/include > AM_CFLAGS += -I$(top_builddir)/include > AM_CFLAGS += -Iinclude > +AM_CFLAGS += -DSYSCONFDIR=\"@sysconfdir@\" > > include_HEADERS = \ > $(top_srcdir)/include/odp.h \ > diff --git a/platform/linux-generic/include/odp_internal.h b/platform/linux-generic/include/odp_internal.h > index b313b1f..9d1fc58 100644 > --- a/platform/linux-generic/include/odp_internal.h > +++ b/platform/linux-generic/include/odp_internal.h > @@ -22,6 +22,7 @@ extern "C" { > #include <odp/api/thread.h> > #include <stdio.h> > #include <sys/types.h> > +#include <libconfig.h> > > extern __thread int __odp_errno; > > @@ -50,6 +51,7 @@ struct odp_global_data_s { > odp_cpumask_t control_cpus; > odp_cpumask_t worker_cpus; > int num_cpus_installed; > + config_t configuration; > }; > > enum init_stage { > diff --git a/platform/linux-generic/m4/configure.m4 b/platform/linux-generic/m4/configure.m4 > index d3e5528..5fab0cc 100644 > --- a/platform/linux-generic/m4/configure.m4 > +++ b/platform/linux-generic/m4/configure.m4 > @@ -28,6 +28,17 @@ AC_LINK_IFELSE( > echo "Use newer version. For gcc > 4.7.0" > exit -1) > > +# Check for libconfig (required) > +AC_CHECK_HEADERS([libconfig.h], HEADER_LIBCONFIG="yes") > +PKG_CHECK_MODULES([PKGCONFIG], [libconfig >= 1.3.2], LIBRARY_LIBCONFIG="yes") > +if test "x$LIBRARY_LIBCONFIG" != "x" && test "x$HEADER_LIBCONFIG" != "x" ; then > + CFLAGS="$CFLAGS $PKGCONFIG_CFLAGS" > + LIBS="$LIBS $PKGCONFIG_LIBS" > + AM_CPPFLAGS="$AM_CPPFLAGS `pkg-config --cflags-only-I libconfig`" > +else > + AC_MSG_FAILURE([libconfig not found (required)]) > +fi > + > m4_include([platform/linux-generic/m4/odp_pthread.m4]) > m4_include([platform/linux-generic/m4/odp_openssl.m4]) > m4_include([platform/linux-generic/m4/odp_pcap.m4]) > diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c > index 1b0d8f8..bd43af1 100644 > --- a/platform/linux-generic/odp_init.c > +++ b/platform/linux-generic/odp_init.c > @@ -10,6 +10,8 @@ > #include <odp_internal.h> > #include <odp_schedule_if.h> > #include <string.h> > +#include <libconfig.h> > +#include <stdlib.h> > #include <stdio.h> > #include <linux/limits.h> > #include <dirent.h> > @@ -21,6 +23,15 @@ > #define _ODP_FILES_FMT "odp-%d-" > #define _ODP_TMPDIR "/tmp" > > +/* the name of the ODP configuration file: */ > +#define CONFIGURATION_FILE_ENV_NONE "none" > +#define CONFIGURATION_FILE "odp.conf" > +#define CONFIGURATION_FILE_REL ("./" CONFIGURATION_FILE) > +#define CONFIGURATION_FILE_ABS (SYSCONFDIR "/" CONFIGURATION_FILE) > + > +/* the ODP configuration file name can also be oveerwritten by env. variable: */ > +#define ODP_SYSCONFIG_FILE_ENV "ODP_SYSCONFIG_FILE" > + > struct odp_global_data_s odp_global_data; > > /* remove all files staring with "odp-<pid>" from a directory "dir" */ > @@ -65,6 +76,62 @@ static int cleanup_files(const char *dirpath, int odp_pid) > return 0; > } > > +/* read the odp configuration file > + * > + * the configuration file is read from: > + * 1) Wherever env variable ODP_SYSCONFIG_FILE says (or "none") > + * 2) ./odp.conf 1 and 2 solves the same thing since you can start ODP from different directories. if you want a user specific file place that in $HOME/.odp.conf ? Cheers, Anders > + * 3) the @sysconfig@/odp.conf > + * (checked in reversed order overwritting each-other) > + * So the environment variable setting supperseeds any other file. > + * If the environment variable exists and set to the string "none" > + * the configuration file reading is inibited (used to prevent > + * test which do not need a file to read the user or system files) > + */ > +static int read_configfile(void) > +{ > + char *env_config_filename; > + const char *config_filename; > + config_t *cf; > + > + /* initialize and read the configuration file if any: */ > + cf = &odp_global_data.configuration; > + config_init(cf); > + config_filename = NULL; > + if (access(CONFIGURATION_FILE_ABS, R_OK) != -1) > + config_filename = CONFIGURATION_FILE_ABS; > + if (access(CONFIGURATION_FILE_REL, R_OK) != -1) > + config_filename = CONFIGURATION_FILE_REL; > + env_config_filename = getenv(ODP_SYSCONFIG_FILE_ENV); > + if (env_config_filename) { > + if (!strcmp(env_config_filename, CONFIGURATION_FILE_ENV_NONE)) > + return 0; > + if (access(env_config_filename, R_OK) != -1) { > + config_filename = env_config_filename; > + } else { > + ODP_ERR("Cannot read ODP configurattion file %s " > + "(set by env variable " > + ODP_SYSCONFIG_FILE_ENV ")\n", > + env_config_filename); > + config_filename = NULL; > + return -1; > + } > + } > + if (config_filename) { > + ODP_DBG("Reading configuration file: %s\n", config_filename); > + if (!config_read_file(cf, config_filename)) { > + ODP_ERR("%s:%d - %s\n", > + config_error_file(cf), > + config_error_line(cf), > + config_error_text(cf)); > + config_destroy(cf); > + return(-1); > + } > + } > + > + return 0; > +} > + > int odp_init_global(odp_instance_t *instance, > const odp_init_t *params, > const odp_platform_init_t *platform_params ODP_UNUSED) > @@ -86,6 +153,9 @@ int odp_init_global(odp_instance_t *instance, > odp_global_data.abort_fn = params->abort_fn; > } > > + if (read_configfile()) > + goto init_failed; > + > if (odp_cpumask_init_global(params)) { > ODP_ERR("ODP cpumask init failed.\n"); > goto init_failed; > -- > 2.7.4 > -- Anders Roxell anders.roxell@linaro.org M: +46 709 71 42 85 | IRC: roxell
diff --git a/.travis.yml b/.travis.yml index adf3307..bb5bdbb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ sudo: required before_install: - sudo apt-get -qq update - - sudo apt-get install automake autoconf libtool libssl-dev graphviz mscgen doxygen + - sudo apt-get install automake autoconf libtool libssl-dev graphviz mscgen doxygen libconfig-dev - sudo apt-get install libpcap-dev linux-headers-`uname -r` - gem install asciidoctor diff --git a/DEPENDENCIES b/DEPENDENCIES index f1f0edd..a6b5b76 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -18,18 +18,18 @@ Prerequisites for building the OpenDataPlane (ODP) API 3. Required libraries - Libraries currently required to link: openssl + Libraries currently required to link: openssl, libconfig-dev -3.1 OpenSSL native compile +3.1 OpenSSL and libconf native compile For native compilation, simply load the necessary libraries using the appropriate tool set. On Debian/Ubuntu systems: - $ sudo apt-get install libssl-dev + $ sudo apt-get install libssl-dev libconfig-dev On CentOS/RedHat/Fedora systems: - $ sudo yum install openssl-devel + $ sudo yum install openssl-devel libconfig-dev 3.2 OpenSSL cross compilation diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index 9d219da..9e5e095 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -8,6 +8,7 @@ AM_CFLAGS += -I$(srcdir)/include AM_CFLAGS += -I$(top_srcdir)/include AM_CFLAGS += -I$(top_builddir)/include AM_CFLAGS += -Iinclude +AM_CFLAGS += -DSYSCONFDIR=\"@sysconfdir@\" include_HEADERS = \ $(top_srcdir)/include/odp.h \ diff --git a/platform/linux-generic/include/odp_internal.h b/platform/linux-generic/include/odp_internal.h index b313b1f..9d1fc58 100644 --- a/platform/linux-generic/include/odp_internal.h +++ b/platform/linux-generic/include/odp_internal.h @@ -22,6 +22,7 @@ extern "C" { #include <odp/api/thread.h> #include <stdio.h> #include <sys/types.h> +#include <libconfig.h> extern __thread int __odp_errno; @@ -50,6 +51,7 @@ struct odp_global_data_s { odp_cpumask_t control_cpus; odp_cpumask_t worker_cpus; int num_cpus_installed; + config_t configuration; }; enum init_stage { diff --git a/platform/linux-generic/m4/configure.m4 b/platform/linux-generic/m4/configure.m4 index d3e5528..5fab0cc 100644 --- a/platform/linux-generic/m4/configure.m4 +++ b/platform/linux-generic/m4/configure.m4 @@ -28,6 +28,17 @@ AC_LINK_IFELSE( echo "Use newer version. For gcc > 4.7.0" exit -1) +# Check for libconfig (required) +AC_CHECK_HEADERS([libconfig.h], HEADER_LIBCONFIG="yes") +PKG_CHECK_MODULES([PKGCONFIG], [libconfig >= 1.3.2], LIBRARY_LIBCONFIG="yes") +if test "x$LIBRARY_LIBCONFIG" != "x" && test "x$HEADER_LIBCONFIG" != "x" ; then + CFLAGS="$CFLAGS $PKGCONFIG_CFLAGS" + LIBS="$LIBS $PKGCONFIG_LIBS" + AM_CPPFLAGS="$AM_CPPFLAGS `pkg-config --cflags-only-I libconfig`" +else + AC_MSG_FAILURE([libconfig not found (required)]) +fi + m4_include([platform/linux-generic/m4/odp_pthread.m4]) m4_include([platform/linux-generic/m4/odp_openssl.m4]) m4_include([platform/linux-generic/m4/odp_pcap.m4]) diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c index 1b0d8f8..bd43af1 100644 --- a/platform/linux-generic/odp_init.c +++ b/platform/linux-generic/odp_init.c @@ -10,6 +10,8 @@ #include <odp_internal.h> #include <odp_schedule_if.h> #include <string.h> +#include <libconfig.h> +#include <stdlib.h> #include <stdio.h> #include <linux/limits.h> #include <dirent.h> @@ -21,6 +23,15 @@ #define _ODP_FILES_FMT "odp-%d-" #define _ODP_TMPDIR "/tmp" +/* the name of the ODP configuration file: */ +#define CONFIGURATION_FILE_ENV_NONE "none" +#define CONFIGURATION_FILE "odp.conf" +#define CONFIGURATION_FILE_REL ("./" CONFIGURATION_FILE) +#define CONFIGURATION_FILE_ABS (SYSCONFDIR "/" CONFIGURATION_FILE) + +/* the ODP configuration file name can also be oveerwritten by env. variable: */ +#define ODP_SYSCONFIG_FILE_ENV "ODP_SYSCONFIG_FILE" + struct odp_global_data_s odp_global_data; /* remove all files staring with "odp-<pid>" from a directory "dir" */ @@ -65,6 +76,62 @@ static int cleanup_files(const char *dirpath, int odp_pid) return 0; } +/* read the odp configuration file + * + * the configuration file is read from: + * 1) Wherever env variable ODP_SYSCONFIG_FILE says (or "none") + * 2) ./odp.conf + * 3) the @sysconfig@/odp.conf + * (checked in reversed order overwritting each-other) + * So the environment variable setting supperseeds any other file. + * If the environment variable exists and set to the string "none" + * the configuration file reading is inibited (used to prevent + * test which do not need a file to read the user or system files) + */ +static int read_configfile(void) +{ + char *env_config_filename; + const char *config_filename; + config_t *cf; + + /* initialize and read the configuration file if any: */ + cf = &odp_global_data.configuration; + config_init(cf); + config_filename = NULL; + if (access(CONFIGURATION_FILE_ABS, R_OK) != -1) + config_filename = CONFIGURATION_FILE_ABS; + if (access(CONFIGURATION_FILE_REL, R_OK) != -1) + config_filename = CONFIGURATION_FILE_REL; + env_config_filename = getenv(ODP_SYSCONFIG_FILE_ENV); + if (env_config_filename) { + if (!strcmp(env_config_filename, CONFIGURATION_FILE_ENV_NONE)) + return 0; + if (access(env_config_filename, R_OK) != -1) { + config_filename = env_config_filename; + } else { + ODP_ERR("Cannot read ODP configurattion file %s " + "(set by env variable " + ODP_SYSCONFIG_FILE_ENV ")\n", + env_config_filename); + config_filename = NULL; + return -1; + } + } + if (config_filename) { + ODP_DBG("Reading configuration file: %s\n", config_filename); + if (!config_read_file(cf, config_filename)) { + ODP_ERR("%s:%d - %s\n", + config_error_file(cf), + config_error_line(cf), + config_error_text(cf)); + config_destroy(cf); + return(-1); + } + } + + return 0; +} + int odp_init_global(odp_instance_t *instance, const odp_init_t *params, const odp_platform_init_t *platform_params ODP_UNUSED) @@ -86,6 +153,9 @@ int odp_init_global(odp_instance_t *instance, odp_global_data.abort_fn = params->abort_fn; } + if (read_configfile()) + goto init_failed; + if (odp_cpumask_init_global(params)) { ODP_ERR("ODP cpumask init failed.\n"); goto init_failed;
The parsing of the odp.conf configuration file is added. The file is searched first in the local directory (.) and then is the $prefix/etc directory. This requires libconfig (sudo apt-get install libconfig-dev) Signed-off-by: Christophe Milard <christophe.milard@linaro.org> --- .travis.yml | 2 +- DEPENDENCIES | 8 +-- platform/linux-generic/Makefile.am | 1 + platform/linux-generic/include/odp_internal.h | 2 + platform/linux-generic/m4/configure.m4 | 11 +++++ platform/linux-generic/odp_init.c | 70 +++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 5 deletions(-) -- 2.7.4