diff mbox

[API-NEXT,PATCHv5,3/5] linux-gen: init: adding configuration file parsing

Message ID 1482144625-42188-4-git-send-email-christophe.milard@linaro.org
State Superseded
Headers show

Commit Message

Christophe Milard Dec. 19, 2016, 10:50 a.m. UTC
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>

---
 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(-)

-- 
2.7.4

Comments

Maxim Uvarov Dec. 22, 2016, 8:12 p.m. UTC | #1
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.milard@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;

>
Christophe Milard Dec. 29, 2016, 10:45 a.m. UTC | #2
On 22 December 2016 at 21:12, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
> 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.milard@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.


I don't understand what you mean here. What is missing?

>

> .travis.yml file also needs to be updated.


yes


Christophe
>

> 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;

>>

>
Maxim Uvarov Dec. 29, 2016, 1:01 p.m. UTC | #3
On 12/29/16 13:45, Christophe Milard wrote:
> On 22 December 2016 at 21:12, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

>> 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.milard@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.

> 

> I don't understand what you mean here. What is missing?

> 



I see that there is apt-get install command for all dependencies. So
people can copy paste it. I think we need the same line for libconfig-dev.

Maxim.


>>

>> .travis.yml file also needs to be updated.

> 

> yes

> 

> 

> Christophe

>>

>> 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;

>>>

>>
Christophe Milard Dec. 29, 2016, 1:12 p.m. UTC | #4
I have now updated the travis file (second comment) and had the
DEPENDENCIES file updated since the begining. Are we talking about
another third file?

Christophe

On 29 December 2016 at 14:01, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
> On 12/29/16 13:45, Christophe Milard wrote:

>> On 22 December 2016 at 21:12, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

>>> 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.milard@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.

>>

>> I don't understand what you mean here. What is missing?

>>

>

>

> I see that there is apt-get install command for all dependencies. So

> people can copy paste it. I think we need the same line for libconfig-dev.

>

> Maxim.

>

>

>>>

>>> .travis.yml file also needs to be updated.

>>

>> yes

>>

>>

>> Christophe

>>>

>>> 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;

>>>>

>>>

>
Maxim Uvarov Dec. 29, 2016, 1:39 p.m. UTC | #5
On 12/29/16 16:12, Christophe Milard wrote:
> I have now updated the travis file (second comment) and had the

> DEPENDENCIES file updated since the begining. Are we talking about

> another third file?

> 

> Christophe



about DEPENDENCIES file.

Maxim.


> 

> On 29 December 2016 at 14:01, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

>> On 12/29/16 13:45, Christophe Milard wrote:

>>> On 22 December 2016 at 21:12, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

>>>> 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.milard@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.

>>>

>>> I don't understand what you mean here. What is missing?

>>>

>>

>>

>> I see that there is apt-get install command for all dependencies. So

>> people can copy paste it. I think we need the same line for libconfig-dev.

>>

>> Maxim.

>>

>>

>>>>

>>>> .travis.yml file also needs to be updated.

>>>

>>> yes

>>>

>>>

>>> Christophe

>>>>

>>>> 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;

>>>>>

>>>>

>>
Christophe Milard Dec. 30, 2016, 8:12 a.m. UTC | #6
Hopefully, I understood what you meant :-) Sent a v7 with this updtade
as well...

/Christophe.

On 29 December 2016 at 14:39, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
> On 12/29/16 16:12, Christophe Milard wrote:

>> I have now updated the travis file (second comment) and had the

>> DEPENDENCIES file updated since the begining. Are we talking about

>> another third file?

>>

>> Christophe

>

>

> about DEPENDENCIES file.

>

> Maxim.

>

>

>>

>> On 29 December 2016 at 14:01, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

>>> On 12/29/16 13:45, Christophe Milard wrote:

>>>> On 22 December 2016 at 21:12, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

>>>>> 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.milard@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.

>>>>

>>>> I don't understand what you mean here. What is missing?

>>>>

>>>

>>>

>>> I see that there is apt-get install command for all dependencies. So

>>> people can copy paste it. I think we need the same line for libconfig-dev.

>>>

>>> Maxim.

>>>

>>>

>>>>>

>>>>> .travis.yml file also needs to be updated.

>>>>

>>>> yes

>>>>

>>>>

>>>> Christophe

>>>>>

>>>>> 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;

>>>>>>

>>>>>

>>>

>
diff mbox

Patch

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
 
 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;