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 <[email protected]>
> ---
> .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
[email protected]
M: +46 709 71 42 85 | IRC: roxell