[dpdk-dev] [PATCH 02/11] kvargs: use the new library in pmd_pcap
Richardson, Bruce
bruce.richardson at intel.com
Wed Jan 29 16:46:30 CET 2014
> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Olivier Matz
> Sent: Tuesday, January 28, 2014 4:07 PM
> To: dev at dpdk.org
> Subject: [dpdk-dev] [PATCH 02/11] kvargs: use the new library in pmd_pcap
>
> The rte_kvargs library is a reworked copy of rte_eth_pcap_arg_parser, so it
> provides the same service. Therefore we can use it and remove the code of
> rte_eth_pcap_arg_parser.
>
> Signed-off-by: Olivier Matz <olivier.matz at 6wind.com>
> ---
> lib/librte_pmd_pcap/Makefile | 8 +-
> lib/librte_pmd_pcap/rte_eth_pcap.c | 29 +--
> lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.c | 255 --------------------------
> lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.h | 71 -------
> 4 files changed, 19 insertions(+), 344 deletions(-) delete mode 100644
> lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.c
> delete mode 100644 lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.h
>
> diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
> index 33174c0..741dafc 100644
> --- a/lib/librte_pmd_pcap/Makefile
> +++ b/lib/librte_pmd_pcap/Makefile
> @@ -1,6 +1,7 @@
> # 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
> @@ -43,16 +44,15 @@ CFLAGS += $(WERROR_FLAGS) # all source are
> stored in SRCS-y #
> SRCS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += rte_eth_pcap.c
> -SRCS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += rte_eth_pcap_arg_parser.c
> -
>
> #
> # Export include files
> #
> SYMLINK-y-include += rte_eth_pcap.h
> -SYMLINK-y-include += rte_eth_pcap_arg_parser.h
>
> # this lib depends upon:
> -DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_mbuf
> lib/librte_ether
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_mbuf
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_ether
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_kvargs
>
> include $(RTE_SDK)/mk/rte.lib.mk
> diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c
> b/lib/librte_pmd_pcap/rte_eth_pcap.c
> index 208e316..e47afcb 100644
> --- a/lib/librte_pmd_pcap/rte_eth_pcap.c
> +++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
> @@ -2,6 +2,7 @@
> * 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
> @@ -39,9 +40,9 @@
> #include <rte_string_fns.h>
> #include <rte_cycles.h>
> #include <net/if.h>
> +#include <rte_kvargs.h>
>
> #include "rte_eth_pcap.h"
> -#include "rte_eth_pcap_arg_parser.h"
>
> #define RTE_ETH_PCAP_SNAPSHOT_LEN 65535 #define
> RTE_ETH_PCAP_SNAPLEN 4096 @@ -701,11 +702,11 @@
> rte_pmd_pcap_init(const char *name, const char *params) {
> unsigned numa_node, using_dumpers = 0;
> int ret;
> - struct args_dict dict;
> + struct rte_kvargs kvlist;
> struct rx_pcaps pcaps;
> struct tx_pcaps dumpers;
>
> - rte_eth_pcap_init_args_dict(&dict);
> + rte_kvargs_init(&kvlist);
>
> numa_node = rte_socket_id();
>
> @@ -713,16 +714,16 @@ rte_pmd_pcap_init(const char *name, const
> char *params)
> start_cycles = rte_get_timer_cycles();
> hz = rte_get_timer_hz();
>
> - if (rte_eth_pcap_parse_args(&dict, name, params,
> valid_arguments) < 0)
> + if (rte_kvargs_parse(&kvlist, name, params, valid_arguments) < 0)
> return -1;
>
> /*
> * If iface argument is passed we open the NICs and use them for
> * reading / writing
> */
> - if (rte_eth_pcap_num_of_args(&dict, ETH_PCAP_IFACE_ARG) == 1)
> {
> + if (rte_kvargs_count(&kvlist, ETH_PCAP_IFACE_ARG) == 1) {
>
> - ret = rte_eth_pcap_post_process_arguments(&dict,
> ETH_PCAP_IFACE_ARG,
> + ret = rte_kvargs_process(&kvlist, ETH_PCAP_IFACE_ARG,
> &open_rx_tx_iface, &pcaps.pcaps[0]);
> if (ret < 0)
> return -1;
> @@ -734,13 +735,13 @@ rte_pmd_pcap_init(const char *name, const
> char *params)
> * We check whether we want to open a RX stream from a real NIC
> or a
> * pcap file
> */
> - if ((pcaps.num_of_rx = rte_eth_pcap_num_of_args(&dict,
> ETH_PCAP_RX_PCAP_ARG))) {
> - ret = rte_eth_pcap_post_process_arguments(&dict,
> ETH_PCAP_RX_PCAP_ARG,
> + if ((pcaps.num_of_rx = rte_kvargs_count(&kvlist,
> ETH_PCAP_RX_PCAP_ARG))) {
> + ret = rte_kvargs_process(&kvlist,
> ETH_PCAP_RX_PCAP_ARG,
> &open_rx_pcap, &pcaps);
> } else {
> - pcaps.num_of_rx = rte_eth_pcap_num_of_args(&dict,
> + pcaps.num_of_rx = rte_kvargs_count(&kvlist,
> ETH_PCAP_RX_IFACE_ARG);
> - ret = rte_eth_pcap_post_process_arguments(&dict,
> ETH_PCAP_RX_IFACE_ARG,
> + ret = rte_kvargs_process(&kvlist,
> ETH_PCAP_RX_IFACE_ARG,
> &open_rx_iface, &pcaps);
> }
>
> @@ -751,15 +752,15 @@ rte_pmd_pcap_init(const char *name, const
> char *params)
> * We check whether we want to open a TX stream to a real NIC or a
> * pcap file
> */
> - if ((dumpers.num_of_tx = rte_eth_pcap_num_of_args(&dict,
> + if ((dumpers.num_of_tx = rte_kvargs_count(&kvlist,
> ETH_PCAP_TX_PCAP_ARG))) {
> - ret = rte_eth_pcap_post_process_arguments(&dict,
> ETH_PCAP_TX_PCAP_ARG,
> + ret = rte_kvargs_process(&kvlist,
> ETH_PCAP_TX_PCAP_ARG,
> &open_tx_pcap, &dumpers);
> using_dumpers = 1;
> } else {
> - dumpers.num_of_tx = rte_eth_pcap_num_of_args(&dict,
> + dumpers.num_of_tx = rte_kvargs_count(&kvlist,
> ETH_PCAP_TX_IFACE_ARG);
> - ret = rte_eth_pcap_post_process_arguments(&dict,
> ETH_PCAP_TX_IFACE_ARG,
> + ret = rte_kvargs_process(&kvlist,
> ETH_PCAP_TX_IFACE_ARG,
> &open_tx_iface, &dumpers);
> }
>
> diff --git a/lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.c
> b/lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.c
> deleted file mode 100644
> index c881f3b..0000000
> --- a/lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.c
> +++ /dev/null
> @@ -1,255 +0,0 @@
> -/*-
> - * BSD LICENSE
> - *
> - * Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
> - * 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_eth_pcap_arg_parser.h"
> -
> -/*
> - * Initializes a non NULL dictionary reference to be used later on.
> - */
> -inline int
> -rte_eth_pcap_init_args_dict(struct args_dict *dict) -{
> - dict->index = 0;
> - dict->size = RTE_ETH_PCAP_ARG_PARSER_MAX_ARGS;
> - memset(dict->pairs, 0, dict->size);
> - return 0;
> -}
> -
> -/*
> - * Adds a key-value pair to a given non-NULL dictionary reference.
> - * The final key will be the name+key.
> - * Returns error in case the dictionary is full or if the key is duplicated.
> - */
> -inline int
> -rte_eth_pcap_add_pair_to_dict(struct args_dict *dict,
> - char *key,
> - char *val)
> -{
> - unsigned i;
> - struct key_value* entry;
> -
> - /* is the dictionary full? */
> - if (dict->index >= dict->size) {
> - RTE_LOG(ERR, PMD, "Couldn't add %s, dictionary is full\n",
> key);
> - return -1;
> - }
> -
> - /* Check if the key is duplicated */
> - for (i = 0; i < dict->index; i++) {
> - entry = &dict->pairs[i];
> - if (strcmp(entry->key, key) == 0) {
> - RTE_LOG(ERR, PMD, "Couldn't add %s, duplicated
> key\n", key);
> - return -1;
> - }
> - }
> -
> - entry = &dict->pairs[dict->index];
> - entry->key = key;
> - entry->value = val;
> - dict->index++;
> - return 0;
> -
> -}
> -
> -#define RTE_ETH_PCAP_PAIRS_DELIM ';'
> -#define RTE_ETH_PCAP_KEY_VALUE_DELIM '='
> -/*
> - * Receives a string with a list of arguments following the pattern
> - * key=value;key=value;... and inserts them into the non NULL dictionary.
> - * strtok is used so the params string will be copied to be modified.
> - */
> -inline int
> -rte_eth_pcap_tokenize_args(struct args_dict *dict,
> - const char *name,
> - const char *params)
> -{
> - int i;
> - char *args;
> - char *pairs[RTE_ETH_PCAP_ARG_PARSER_MAX_ARGS];
> - char *pair[2];
> - int num_of_pairs;
> -
> - /* 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;
> - }
> -
> - num_of_pairs = rte_strsplit(args, strnlen(args, MAX_ARG_STRLEN),
> pairs,
> - RTE_ETH_PCAP_ARG_PARSER_MAX_ARGS,
> RTE_ETH_PCAP_PAIRS_DELIM);
> -
> - for (i = 0; i < num_of_pairs; i++) {
> - pair[0] = NULL;
> - pair[1] = NULL;
> -
> - rte_strsplit(pairs[i], strnlen(pairs[i], MAX_ARG_STRLEN),
> pair, 2,
> - RTE_ETH_PCAP_KEY_VALUE_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_eth_pcap_add_pair_to_dict(dict, pair[0], pair[1]) < 0)
> - goto error;
> - }
> - return 0;
> -
> -error:
> - rte_free(args);
> - return -1;
> -}
> -
> -/*
> - * Determines whether a key is valid or not by looking
> - * into a list of valid keys.
> - */
> -static inline int
> -is_valid_key(const char *valid[],
> - struct key_value *pair)
> -{
> - const char **valid_ptr;
> -
> - for (valid_ptr = valid; *valid_ptr != NULL; valid_ptr++)
> - if (strstr(pair->key, *valid_ptr) != NULL)
> - return 1;
> - return 0;
> -}
> -
> -/*
> - * Determines whether all keys are valid or not by looking
> - * into a list of valid keys.
> - */
> -static inline int
> -check_for_valid_keys(struct args_dict *dict,
> - const char *valid[])
> -{
> - unsigned k_index, ret;
> - struct key_value *pair;
> -
> - for (k_index = 0; k_index < dict->index; k_index++) {
> - pair = &dict->pairs[k_index];
> - ret = is_valid_key(valid, pair);
> - if (!ret) {
> - RTE_LOG(ERR, PMD,
> - "Error parsing device, invalid key
> %s\n", pair->key);
> - return -1;
> - }
> - }
> - return 0;
> -}
> -
> -/*
> - * Returns the number of times a given arg_name exists on a dictionary.
> - * E.g. given a dict = { rx0 = 0, rx1 = 1, tx0 = 2 } the number of args for
> - * arg "rx" will be 2.
> - */
> -inline unsigned
> -rte_eth_pcap_num_of_args(struct args_dict *dict, const char *arg_name)
> -{
> - unsigned k_index;
> - struct key_value *pair;
> - unsigned num_of_keys;
> -
> - num_of_keys = 0;
> - for (k_index = 0; k_index < dict->index; k_index++) {
> - pair = &dict->pairs[k_index];
> - if (strcmp(pair->key, arg_name) == 0)
> - num_of_keys++;
> - }
> -
> - return num_of_keys;
> -}
> -
> -/*
> - * Calls the handler function for a given arg_name passing the
> - * value on the dictionary for that key and a given extra argument.
> - */
> -inline int
> -rte_eth_pcap_post_process_arguments(struct args_dict *dict,
> - const char *arg_name,
> - arg_handler_t handler,
> - void *extra_args)
> -{
> - unsigned k_index;
> - struct key_value *pair;
> -
> - for (k_index = 0; k_index < dict->index; k_index++) {
> - pair = &dict->pairs[k_index];
> - if (strstr(pair->key, arg_name) != NULL) {
> - if ((*handler)(pair->value, extra_args) < 0)
> - return -1;
> - }
> - }
> - return 0;
> -}
> -
> -/*
> - * Parses the arguments "key=value;key=value;..." string and returns
> - * a simple dictionary implementation containing these pairs. It also
> - * checks if only valid keys were used.
> - */
> -inline int
> -rte_eth_pcap_parse_args(struct args_dict *dict,
> - const char *name,
> - const char *args,
> - const char *valids[])
> -{
> -
> - int ret;
> -
> - ret = rte_eth_pcap_tokenize_args(dict, name, args);
> - if (ret < 0)
> - return ret;
> -
> - return check_for_valid_keys(dict, valids);
> -}
> -
> diff --git a/lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.h
> b/lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.h
> deleted file mode 100644
> index 47eb3a0..0000000
> --- a/lib/librte_pmd_pcap/rte_eth_pcap_arg_parser.h
> +++ /dev/null
> @@ -1,71 +0,0 @@
> -/*-
> - * BSD LICENSE
> - *
> - * Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
> - * 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_ETH_ARG_PARSER_H_
> -#define _RTE_ETH_ARG_PARSER_H_
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif
> -
> -#define RTE_ETH_PCAP_ARG_PARSER_MAX_ARGS 32
> -
> -typedef int (*arg_handler_t)(char*, void*);
> -
> -struct key_value {
> - char *key;
> - char *value;
> -};
> -
> -struct args_dict {
> - unsigned index;
> - size_t size;
> - struct key_value pairs[RTE_ETH_PCAP_ARG_PARSER_MAX_ARGS];
> -};
> -
> -int rte_eth_pcap_tokenize_args(struct args_dict *dict, const char *name,
> - const char *args);
> -int rte_eth_pcap_init_args_dict(struct args_dict *dict); -int
> rte_eth_pcap_add_pair_to_dict(struct args_dict *dict, char *key, char
> *val); -int rte_eth_pcap_parse_args(struct args_dict *dict, const char*
> name,
> - const char *args, const char *valids[]);
> -int rte_eth_pcap_post_process_arguments(struct args_dict *dict,
> - const char *arg_name, arg_handler_t handler, void
> *extra_args);
> -unsigned rte_eth_pcap_num_of_args(struct args_dict *dict, const char
> *key); -void rte_eth_pcap_free_dict(struct args_dict *dict);
> -
> -#ifdef __cplusplus
> -}
> -#endif
> -
> -#endif
> --
> 1.8.4.rc3
Acked-by: Bruce Richardson <bruce.richardson at intel.com>
More information about the dev
mailing list