From: "Richardson, Bruce" <bruce.richardson@intel.com>
To: Olivier Matz <olivier.matz@6wind.com>, "dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH 01/11] kvargs: add a new library to parse key/value arguments
Date: Wed, 29 Jan 2014 15:45:32 +0000 [thread overview]
Message-ID: <59AF69C657FD0841A61C55336867B5B01A995B21@IRSMSX103.ger.corp.intel.com> (raw)
In-Reply-To: <1390925204-10800-2-git-send-email-olivier.matz@6wind.com>
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Olivier Matz
> Sent: Tuesday, January 28, 2014 4:07 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH 01/11] kvargs: add a new library to parse
> key/value arguments
>
> Copy the code from rte_eth_pcap_arg_parser.[ch], without any functional
> modifications, only:
> - rename functions and structure
> - restyle (indentation)
> - add comments (doxygen style)
> - add "const" or "static" attributes, remove unneeded "inline"
>
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> ---
> config/defconfig_i686-default-linuxapp-gcc | 5 +
> config/defconfig_i686-default-linuxapp-icc | 5 +
> config/defconfig_x86_64-default-linuxapp-gcc | 5 +
> config/defconfig_x86_64-default-linuxapp-icc | 5 +
> lib/Makefile | 1 +
> lib/librte_kvargs/Makefile | 50 ++++++
> lib/librte_kvargs/rte_kvargs.c | 248
> +++++++++++++++++++++++++++
> lib/librte_kvargs/rte_kvargs.h | 159 +++++++++++++++++
> mk/rte.app.mk | 4 +
> 9 files changed, 482 insertions(+)
> create mode 100644 lib/librte_kvargs/Makefile create mode 100644
> lib/librte_kvargs/rte_kvargs.c create mode 100644
> lib/librte_kvargs/rte_kvargs.h
>
> diff --git a/config/defconfig_i686-default-linuxapp-gcc
> b/config/defconfig_i686-default-linuxapp-gcc
> index 4f57242..349ca24 100644
> --- a/config/defconfig_i686-default-linuxapp-gcc
> +++ b/config/defconfig_i686-default-linuxapp-gcc
> @@ -141,6 +141,11 @@ CONFIG_RTE_LIBRTE_EAL_BAREMETAL=n
> CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y
>
> #
> +# Compile the argument parser library
> +#
> +CONFIG_RTE_LIBRTE_KVARGS=y
> +
> +#
> # Compile generic ethernet library
> #
> CONFIG_RTE_LIBRTE_ETHER=y
> diff --git a/config/defconfig_i686-default-linuxapp-icc
> b/config/defconfig_i686-default-linuxapp-icc
> index 90521e1..4e7338f 100644
> --- a/config/defconfig_i686-default-linuxapp-icc
> +++ b/config/defconfig_i686-default-linuxapp-icc
> @@ -141,6 +141,11 @@ CONFIG_RTE_LIBRTE_EAL_BAREMETAL=n
> CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y
>
> #
> +# Compile the argument parser library
> +#
> +CONFIG_RTE_LIBRTE_KVARGS=y
> +
> +#
> # Compile generic ethernet library
> #
> CONFIG_RTE_LIBRTE_ETHER=y
> diff --git a/config/defconfig_x86_64-default-linuxapp-gcc
> b/config/defconfig_x86_64-default-linuxapp-gcc
> index 4c05ffc..ca85b1a 100644
> --- a/config/defconfig_x86_64-default-linuxapp-gcc
> +++ b/config/defconfig_x86_64-default-linuxapp-gcc
> @@ -141,6 +141,11 @@ CONFIG_RTE_LIBRTE_EAL_BAREMETAL=n
> CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y
>
> #
> +# Compile the argument parser library
> +#
> +CONFIG_RTE_LIBRTE_KVARGS=y
> +
> +#
> # Compile generic ethernet library
> #
> CONFIG_RTE_LIBRTE_ETHER=y
> diff --git a/config/defconfig_x86_64-default-linuxapp-icc
> b/config/defconfig_x86_64-default-linuxapp-icc
> index c4d5c73..37dbdd0 100644
> --- a/config/defconfig_x86_64-default-linuxapp-icc
> +++ b/config/defconfig_x86_64-default-linuxapp-icc
> @@ -141,6 +141,11 @@ CONFIG_RTE_LIBRTE_EAL_BAREMETAL=n
> CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y
>
> #
> +# Compile the argument parser library
> +#
> +CONFIG_RTE_LIBRTE_KVARGS=y
> +
> +#
> # Compile generic ethernet library
> #
> CONFIG_RTE_LIBRTE_ETHER=y
> diff --git a/lib/Makefile b/lib/Makefile index b655d4f..31644f2 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -52,6 +52,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_POWER) += librte_power
> DIRS-$(CONFIG_RTE_LIBRTE_METER) += librte_meter
> DIRS-$(CONFIG_RTE_LIBRTE_SCHED) += librte_sched
> DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
> +DIRS-$(CONFIG_RTE_LIBRTE_KVARGS) += librte_kvargs
>
> ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y)
> DIRS-$(CONFIG_RTE_LIBRTE_KNI) += librte_kni diff --git
> a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile new file mode
> 100644 index 0000000..c4c2855
> --- /dev/null
> +++ b/lib/librte_kvargs/Makefile
> @@ -0,0 +1,50 @@
> +# BSD LICENSE
> +#
> +# Copyright(c) 2014 6WIND S.A.
> +# All rights reserved.
> +#
> +# Redistribution and use in source and binary forms, with or without
> +# modification, are permitted provided that the following conditions
> +# are met:
> +#
> +# * Redistributions of source code must retain the above copyright
> +# notice, this list of conditions and the following disclaimer.
> +# * Redistributions in binary form must reproduce the above copyright
> +# notice, this list of conditions and the following disclaimer in
> +# the documentation and/or other materials provided with the
> +# distribution.
> +# * Neither the name of Intel Corporation nor the names of its
> +# contributors may be used to endorse or promote products derived
> +# from this software without specific prior written permission.
> +#
> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
> NOT
> +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS FOR
> +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> NOT
> +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
> OF USE,
> +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> AND ON ANY
> +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> TORT
> +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> THE USE
> +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> +
> +include $(RTE_SDK)/mk/rte.vars.mk
> +
> +# library name
> +LIB = librte_kvargs.a
> +
> +CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
> +
> +# all source are stored in SRCS-y
> +SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
> +
> +# install includes
> +INCS := rte_kvargs.h
> +SYMLINK-$(CONFIG_RTE_LIBRTE_KVARGS)-include := $(INCS)
> +
> +# this lib needs eal and malloc
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_KVARGS) += lib/librte_eal
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_KVARGS) += lib/librte_malloc
> +
> +include $(RTE_SDK)/mk/rte.lib.mk
> diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c
> new file mode 100644 index 0000000..7a950d6
> --- /dev/null
> +++ b/lib/librte_kvargs/rte_kvargs.c
> @@ -0,0 +1,248 @@
> +/*-
> + * BSD LICENSE
> + *
> + * Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
> + * Copyright(c) 2014 6WIND S.A.
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * * Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * * Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in
> + * the documentation and/or other materials provided with the
> + * distribution.
> + * * Neither the name of Intel Corporation nor the names of its
> + * contributors may be used to endorse or promote products derived
> + * from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
> NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
> OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> + */
> +#include <string.h>
> +#include <sys/user.h>
> +#include <linux/binfmts.h>
> +
> +#include <rte_malloc.h>
> +#include <rte_log.h>
> +#include <rte_string_fns.h>
> +
> +#include "rte_kvargs.h"
> +
> +/*
> + * Initialize a rte_kvargs structure to an empty key/value list.
> + */
> +int
> +rte_kvargs_init(struct rte_kvargs *kvlist) {
> + kvlist->count = 0;
> + kvlist->size = RTE_KVARGS_MAX;
> + memset(kvlist->pairs, 0, kvlist->size);
> + return 0;
> +}
> +
> +/*
> + * Add a key-value pair at the end of a given key/value list.
> + * Return an error if the list is full or if the key is duplicated.
> + */
> +static int
> +rte_kvargs_add_pair(struct rte_kvargs *kvlist, char *key, char *val) {
> + unsigned i;
> + struct rte_kvargs_pair* entry;
> +
> + /* is the list full? */
> + if (kvlist->count >= kvlist->size) {
> + RTE_LOG(ERR, PMD, "Couldn't add %s, key/value list is
> full\n", key);
> + return -1;
> + }
> +
> + /* Check if the key is duplicated */
> + for (i = 0; i < kvlist->count; i++) {
> + entry = &kvlist->pairs[i];
> + if (strcmp(entry->key, key) == 0) {
> + RTE_LOG(ERR, PMD, "Couldn't add %s, duplicated
> key\n", key);
> + return -1;
> + }
> + }
> +
> + entry = &kvlist->pairs[kvlist->count];
> + entry->key = key;
> + entry->value = val;
> + kvlist->count++;
> + return 0;
> +}
> +
> +/*
> + * Receive a string with a list of arguments following the pattern
> + * key=value;key=value;... and insert them into the list.
> + * strtok() is used so the params string will be copied to be modified.
> + */
> +static int
> +rte_kvargs_tokenize(struct rte_kvargs *kvlist, const char *name,
> + const char *params)
> +{
> + unsigned i, count;
> + char *args;
> + char *pairs[RTE_KVARGS_MAX];
> + char *pair[2];
> +
> + /* If params are empty, nothing to do */
> + if (params == NULL || params[0] == 0) {
> + RTE_LOG(ERR, PMD, "Couldn't parse %s device, empty
> arguments\n", name);
> + return -1;
> + }
> +
> + /* Copy the const char *params to a modifiable string
> + * to pass to rte_strsplit
> + */
> + args = strdup(params);
> + if(args == NULL){
> + RTE_LOG(ERR, PMD, "Couldn't parse %s device \n", name);
> + return -1;
> + }
> +
> + count = rte_strsplit(args, strnlen(args, MAX_ARG_STRLEN), pairs,
> + RTE_KVARGS_MAX, RTE_KVARGS_PAIRS_DELIM);
> +
> + for (i = 0; i < count; i++) {
> + pair[0] = NULL;
> + pair[1] = NULL;
> +
> + rte_strsplit(pairs[i], strnlen(pairs[i], MAX_ARG_STRLEN),
> pair, 2,
> + RTE_KVARGS_KV_DELIM);
> +
> + if (pair[0] == NULL || pair[1] == NULL || pair[0][0] == 0
> + || pair[1][0] == 0) {
> + RTE_LOG(ERR, PMD,
> + "Couldn't parse %s device, wrong key
> or value \n", name);
> + goto error;
> + }
> +
> + if (rte_kvargs_add_pair(kvlist, pair[0], pair[1]) < 0)
> + goto error;
> + }
> + return 0;
> +
> +error:
> + rte_free(args);
> + return -1;
> +}
> +
> +/*
> + * Determine whether a key is valid or not by looking
> + * into a list of valid keys.
> + */
> +static int
> +is_valid_key(const char *valid[], const char *key_match) {
> + const char **valid_ptr;
> +
> + for (valid_ptr = valid; *valid_ptr != NULL; valid_ptr++)
> + if (strstr(key_match, *valid_ptr) != NULL)
> + return 1;
> + return 0;
> +}
> +
> +/*
> + * Determine whether all keys are valid or not by looking
> + * into a list of valid keys.
> + */
> +static int
> +check_for_valid_keys(struct rte_kvargs *kvlist,
> + const char *valid[])
> +{
> + unsigned i, ret;
> + struct rte_kvargs_pair *pair;
> +
> + for (i = 0; i < kvlist->count; i++) {
> + pair = &kvlist->pairs[i];
> + ret = is_valid_key(valid, pair->key);
> + if (!ret) {
> + RTE_LOG(ERR, PMD,
> + "Error parsing device, invalid key <%s>\n",
> + pair->key);
> + return -1;
> + }
> + }
> + return 0;
> +}
> +
> +/*
> + * Return the number of times a given arg_name exists in the key/value
> list.
> + * E.g. given a list = { rx = 0, rx = 1, tx = 2 } the number of args
> +for
> + * arg "rx" will be 2.
> + */
> +unsigned
> +rte_kvargs_count(const struct rte_kvargs *kvlist, const char
> +*key_match) {
> + const struct rte_kvargs_pair *pair;
> + unsigned i, ret;
> +
> + ret = 0;
> + for (i = 0; i < kvlist->count; i++) {
> + pair = &kvlist->pairs[i];
> + if (strcmp(pair->key, key_match) == 0)
> + ret++;
> + }
> +
> + return ret;
> +}
> +
> +/*
> + * For each matching key, call the given handler function.
> + */
> +int
> +rte_kvargs_process(const struct rte_kvargs *kvlist,
> + const char *key_match,
> + arg_handler_t handler,
> + void *opaque_arg)
> +{
> + const struct rte_kvargs_pair *pair;
> + unsigned i;
> +
> + for (i = 0; i < kvlist->count; i++) {
> + pair = &kvlist->pairs[i];
> + if (strstr(pair->key, key_match) != NULL) {
> + if ((*handler)(pair->value, opaque_arg) < 0)
> + return -1;
> + }
> + }
> + return 0;
> +}
> +
> +/*
> + * Parse the arguments "key=value;key=value;..." string and return
> + * an allocated structure that contains a key/value list. Also
> + * check if only valid keys were used.
> + */
> +int
> +rte_kvargs_parse(struct rte_kvargs *kvlist,
> + const char *name,
> + const char *args,
> + const char *valid_keys[])
> +{
> +
> + int ret;
> +
> + ret = rte_kvargs_tokenize(kvlist, name, args);
> + if (ret < 0)
> + return ret;
> +
> + if (valid_keys == NULL)
> + return 0;
> +
> + return check_for_valid_keys(kvlist, valid_keys); }
> diff --git a/lib/librte_kvargs/rte_kvargs.h b/lib/librte_kvargs/rte_kvargs.h
> new file mode 100644 index 0000000..19485b1
> --- /dev/null
> +++ b/lib/librte_kvargs/rte_kvargs.h
> @@ -0,0 +1,159 @@
> +/*-
> + * BSD LICENSE
> + *
> + * Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
> + * Copyright(c) 2014 6WIND S.A.
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * * Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * * Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in
> + * the documentation and/or other materials provided with the
> + * distribution.
> + * * Neither the name of Intel Corporation nor the names of its
> + * contributors may be used to endorse or promote products derived
> + * from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
> NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
> OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> + */
> +
> +#ifndef _RTE_KVARGS_H_
> +#define _RTE_KVARGS_H_
> +
> +/**
> + * @file
> + * RTE Argument parsing
> + *
> + * This module can be used to parse arguments whose format is
> + * key1=value1;key2=value2;key3=value3;...
> + *
> + * This file provides some helpers that are especially used by virtual
> + * ethernet devices at initialization for arguments parsing.
> + */
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +/** Maximum number of key/value associations */ #define
> RTE_KVARGS_MAX
> +32
> +
> +/** separator character used between each pair */
> +#define RTE_KVARGS_PAIRS_DELIM ';'
> +
> +/** separator character used between key and value */
> +#define RTE_KVARGS_KV_DELIM '='
> +
> +/** Type of callback function used by rte_kvargs_process() */ typedef
> +int (*arg_handler_t)(char *value, void *opaque);
> +
> +/** A key/value association */
> +struct rte_kvargs_pair {
> + char *key; /**< the name (key) of the association */
> + char *value; /**< the value associated to that key */
> +};
> +
> +/** Store a list of key/value associations */ struct rte_kvargs {
> + unsigned count; /**< number of entries in the list */
> + size_t size; /**< maximum number of entries */
> + struct rte_kvargs_pair pairs[RTE_KVARGS_MAX]; /**< list of
> key/values
> +*/ };
> +
> +/**
> + * Initialize an empty rte_kvargs structure
> + *
> + * Set the content of the rte_kvargs structure given as a parameter
> + * to an empty list of key/value.
> + *
> + * @param kvlist
> + * The rte_kvargs structure
> + *
> + * @return
> + * - 0 on success
> + * - Negative on error
> + */
> +int rte_kvargs_init(struct rte_kvargs *kvlist);
> +
> +/**
> + * Append key/value associations in a rte_kvargs structure from a
> +string
> + *
> + * The function fills a rte_kvargs structure from a string whose format
> + * is key1=value1;key2=value2;...
> + * The key/value associations are appended to those which are already
> + * present in the rte_kvargs structure.
> + *
> + * @param kvlist
> + * The rte_kvargs structure
> + * @param name
> + * The name of the driver
> + * @param args
> + * The input string containing the key/value associations
> + * @param valid_keys
> + * A list of valid keys (table of const char *, the last must be NULL).
> + * This argument is ignored if NULL
> + *
> + * @return
> + * - 0 on success
> + * - Negative on error
> + */
> +int rte_kvargs_parse(struct rte_kvargs *kvlist, const char *name,
> + const char *args, const char *valid_keys[]);
> +
> +/**
> + * Call a handler function for each key/value matching the key
> + *
> + * For each key/value association that matches the given key, calls the
> + * handler function with the for a given arg_name passing the value on
> +the
> + * dictionary for that key and a given extra argument.
> + *
> + * @param kvlist
> + * The rte_kvargs structure
> + * @param key_match
> + * The key on which the handler should be called
> + * @param handler
> + * The function to call for each matching key
> + * @param opaque_arg
> + * A pointer passed unchanged to the handler
> + *
> + * @return
> + * - 0 on success
> + * - Negative on error
> + */
> +int rte_kvargs_process(const struct rte_kvargs *kvlist,
> + const char *key_match, arg_handler_t handler, void *opaque_arg);
> +
> +/**
> + * Count the number of associations matching the given key
> + *
> + * @param kvlist
> + * The rte_kvargs structure
> + * @param key_match
> + * The key that should match
> +
> + * @return
> + * The number of entries
> + */
> +unsigned rte_kvargs_count(const struct rte_kvargs *kvlist,
> + const char *key_match);
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif
> diff --git a/mk/rte.app.mk b/mk/rte.app.mk index 786100c..1652029
> 100644
> --- a/mk/rte.app.mk
> +++ b/mk/rte.app.mk
> @@ -112,6 +112,10 @@ endif
>
> LDLIBS += --start-group
>
> +ifeq ($(CONFIG_RTE_LIBRTE_KVARGS),y)
> +LDLIBS += -lrte_kvargs
> +endif
> +
> ifeq ($(CONFIG_RTE_LIBRTE_MBUF),y)
> LDLIBS += -lrte_mbuf
> endif
> --
> 1.8.4.rc3
Acked-by: Bruce Richardson<bruce.richardson@intel.com>
next prev parent reply other threads:[~2014-01-29 15:44 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-28 16:06 [dpdk-dev] [PATCH 00/11] add rte_kvargs library: a key/value args parser Olivier Matz
2014-01-28 16:06 ` [dpdk-dev] [PATCH 01/11] kvargs: add a new library to parse key/value arguments Olivier Matz
2014-01-29 15:45 ` Richardson, Bruce [this message]
2014-01-28 16:06 ` [dpdk-dev] [PATCH 02/11] kvargs: use the new library in pmd_pcap Olivier Matz
2014-01-29 15:46 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 03/11] kvargs: remove driver name in arguments Olivier Matz
2014-01-29 15:47 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 04/11] kvargs: remove useless size field Olivier Matz
2014-01-29 17:14 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 05/11] kvargs: rework API to fix memory leak Olivier Matz
2014-01-30 11:22 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 06/11] kvargs: simpler parsing and allow duplicated keys Olivier Matz
2014-01-29 17:17 ` Richardson, Bruce
2014-01-29 22:17 ` Olivier MATZ
2014-01-30 11:23 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 07/11] kvargs: be strict when matching a key Olivier Matz
2014-01-30 11:23 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 08/11] kvargs: add const attribute in handler parameters Olivier Matz
2014-01-30 11:24 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 09/11] kvargs: add the key in handler pameters Olivier Matz
2014-01-30 11:34 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 10/11] kvargs: make the NULL key to match all entries Olivier Matz
2014-01-30 11:34 ` Richardson, Bruce
2014-01-28 16:06 ` [dpdk-dev] [PATCH 11/11] kvargs: add test case in app/test Olivier Matz
2014-01-30 11:35 ` Richardson, Bruce
2014-02-04 14:53 ` [dpdk-dev] [PATCH 00/11] add rte_kvargs library: a key/value args parser Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=59AF69C657FD0841A61C55336867B5B01A995B21@IRSMSX103.ger.corp.intel.com \
--to=bruce.richardson@intel.com \
--cc=dev@dpdk.org \
--cc=olivier.matz@6wind.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).