On 12/19/16 13:50, 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.mil...@linaro.org>
> ---
>  DEPENDENCIES                                  |  2 +-
>  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 
> +++++++++++++++++++++++++++
>  5 files changed, 85 insertions(+), 1 deletion(-)
> 
> diff --git a/DEPENDENCIES b/DEPENDENCIES
> index f1f0edd..a24b1c8 100644
> --- a/DEPENDENCIES
> +++ b/DEPENDENCIES
> @@ -18,7 +18,7 @@ Prerequisites for building the OpenDataPlane (ODP) API
>  
>  3. Required libraries
>  
> -   Libraries currently required to link: openssl
> +   Libraries currently required to link: openssl, libconfig-dev
>  

apt-get install libconfig-dev
is needed, or at least we specify it everywhere.

.travis.yml file also needs to be updated.

Maxim.


>  3.1 OpenSSL native compile
>  
> 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;
> 

Reply via email to