diff mbox

[PATCHv2] hide packet i/o selection to the api

Message ID 1400248156-7686-1-git-send-email-maxim.uvarov@linaro.org
State Superseded
Headers show

Commit Message

Maxim Uvarov May 16, 2014, 1:49 p.m. UTC
Ddp application should be independent of underlaying i/o type.
Propose is to use order of available i/o types and try to register
them.
Also use getenv() for hint which i/o type to select.

Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 v2: implement getenv() to allow linux-generic turn off types of packets I/O.
     This is needed mainly for testing all code paths.

 include/odp_packet_io.h                           |   3 +-
 platform/linux-generic/source/odp_packet_io.c     | 155 ++++++++++------------
 platform/linux-generic/source/odp_packet_netmap.c |  10 +-
 test/generator/odp_generator.c                    |  11 +-
 test/packet/odp_example_pktio.c                   |  31 +----
 test/packet_netmap/odp_example_pktio_netmap.c     |  15 +--
 6 files changed, 88 insertions(+), 137 deletions(-)

Comments

Ciprian Barbu May 16, 2014, 2:17 p.m. UTC | #1
Hi,


On Fri, May 16, 2014 at 4:49 PM, Maxim Uvarov <maxim.uvarov@linaro.org>wrote:

> Ddp application should be independent of underlaying i/o type.
> Propose is to use order of available i/o types and try to register
> them.
> Also use getenv() for hint which i/o type to select.
>
> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
> ---
>  v2: implement getenv() to allow linux-generic turn off types of packets
> I/O.
>      This is needed mainly for testing all code paths.
>
>  include/odp_packet_io.h                           |   3 +-
>  platform/linux-generic/source/odp_packet_io.c     | 155
> ++++++++++------------
>  platform/linux-generic/source/odp_packet_netmap.c |  10 +-
>  test/generator/odp_generator.c                    |  11 +-
>  test/packet/odp_example_pktio.c                   |  31 +----
>  test/packet_netmap/odp_example_pktio_netmap.c     |  15 +--
>  6 files changed, 88 insertions(+), 137 deletions(-)
>
> diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
> index cfefac0..96d6039 100644
> --- a/include/odp_packet_io.h
> +++ b/include/odp_packet_io.h
> @@ -40,8 +40,7 @@ typedef uint32_t odp_pktio_t;
>   *
>   * @return ODP packet IO handle or ODP_PKTIO_INVALID on error
>   */
> -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
> -                          odp_pktio_params_t *params);
> +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool);
>
>  /**
>   * Close an ODP packet IO instance
> diff --git a/platform/linux-generic/source/odp_packet_io.c
> b/platform/linux-generic/source/odp_packet_io.c
> index 33ade10..1b2e025 100644
> --- a/platform/linux-generic/source/odp_packet_io.c
> +++ b/platform/linux-generic/source/odp_packet_io.c
> @@ -13,21 +13,19 @@
>  #include <odp_spinlock.h>
>  #include <odp_shared_memory.h>
>  #include <odp_packet_socket.h>
> -#ifdef ODP_HAVE_NETMAP
> -#include <odp_packet_netmap.h>
> -#endif
>  #include <odp_hints.h>
>  #include <odp_config.h>
>  #include <odp_queue_internal.h>
>  #include <odp_schedule_internal.h>
>  #include <odp_debug.h>
> -
>  #include <odp_pktio_socket.h>
>  #ifdef ODP_HAVE_NETMAP
> +#include <odp_packet_netmap.h>
>  #include <odp_pktio_netmap.h>
>  #endif
>
>  #include <string.h>
> +#include <stdlib.h>
>
>  typedef struct {
>         pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES];
> @@ -112,32 +110,13 @@ static void unlock_entry(pktio_entry_t *entry)
>         odp_spinlock_unlock(&entry->s.lock);
>  }
>
> -static void init_pktio_entry(pktio_entry_t *entry, odp_pktio_params_t
> *params)
> +static void init_pktio_entry(pktio_entry_t *entry)
>  {
>         set_taken(entry);
>         entry->s.inq_default = ODP_QUEUE_INVALID;
> -       switch (params->type) {
> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
> -               memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
> -               memset(&entry->s.pkt_sock_mmap, 0,
> -                     sizeof(entry->s.pkt_sock_mmap));
> -               break;
> -#ifdef ODP_HAVE_NETMAP
> -       case ODP_PKTIO_TYPE_NETMAP:
> -               memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
> -               break;
> -#endif
> -       default:
> -               ODP_ERR("Packet I/O type not supported. Please
> recompile\n");
> -               break;
> -       }
> -       /* Save pktio parameters, type is the most useful */
> -       memcpy(&entry->s.params, params, sizeof(*params));
>  }
>
> -static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
> +static odp_pktio_t alloc_lock_pktio_entry(void)
>  {
>         odp_pktio_t id;
>         pktio_entry_t *entry;
> @@ -148,7 +127,7 @@ static odp_pktio_t
> alloc_lock_pktio_entry(odp_pktio_params_t *params)
>                 if (is_free(entry)) {
>                         lock_entry(entry);
>                         if (is_free(entry)) {
> -                               init_pktio_entry(entry, params);
> +                               init_pktio_entry(entry);
>                                 id = i + 1;
>                                 return id; /* return with entry locked! */
>                         }
> @@ -171,35 +150,14 @@ static int free_pktio_entry(odp_pktio_t id)
>         return 0;
>  }
>
> -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
> -                          odp_pktio_params_t *params)
> +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool)
>  {
>         odp_pktio_t id;
>         pktio_entry_t *pktio_entry;
>         int res;
> +       int fanout = 0;
>
> -       if (params == NULL) {
> -               ODP_ERR("Invalid pktio params\n");
> -               return ODP_PKTIO_INVALID;
> -       }
> -
> -       switch (params->type) {
> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
> -               ODP_DBG("Allocating socket pktio\n");
> -               break;
> -#ifdef ODP_HAVE_NETMAP
> -       case ODP_PKTIO_TYPE_NETMAP:
> -               ODP_DBG("Allocating netmap pktio\n");
> -               break;
> -#endif
> -       default:
> -               ODP_ERR("Invalid pktio type: %02x\n", params->type);
> -               return ODP_PKTIO_INVALID;
> -       }
> -
> -       id = alloc_lock_pktio_entry(params);
> +       id = alloc_lock_pktio_entry();
>         if (id == ODP_PKTIO_INVALID) {
>                 ODP_ERR("No resources available.\n");
>                 return ODP_PKTIO_INVALID;
> @@ -208,44 +166,77 @@ odp_pktio_t odp_pktio_open(const char *dev,
> odp_buffer_pool_t pool,
>
>         pktio_entry = get_entry(id);
>
> -       switch (params->type) {
> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
> -               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> -               if (res == -1) {
> -                       close_pkt_sock(&pktio_entry->s.pkt_sock);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
> -               res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
> dev,
> -                               pool, params->sock_params.fanout);
> -               if (res == -1) {
> -                       close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> -#ifdef ODP_HAVE_NETMAP
> -       case ODP_PKTIO_TYPE_NETMAP:
> +       if (getenv("ODP_PKTIO_USE_FANOUT"))
> +               fanout = 1;
> +       ODP_DBG("ODP_PKTIO_USE_FANOUT: %d\n", fanout);
>
> -               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
> -                               pool, &params->nm_params);
> -               if (res == -1) {
> +       memset(&pktio_entry->s.pkt_sock, 0,
> sizeof(pktio_entry->s.pkt_sock));
> +       memset(&pktio_entry->s.pkt_sock_mmap, 0,
> sizeof(pktio_entry->s.pkt_sock_mmap));
> +#ifdef ODP_HAVE_NETMAP
> +       memset(&pktio_entry->s.pkt_nm, 0, sizeof(pktio_entry->s.pkt_nm));
> +
> +       if (getenv("ODP_PKTIO_DISABLE_NETMAP") == NULL) {
> +               pktio_entry->s.params.ns_params->type =
> ODP_PKTIO_TYPE_NETMAP;
> +               if (getenv("ODP_NETMAP_MODE_HW")
> +                       pktio_entry->s.params.nm_params->netmap_mode =
> ODP_NETMAP_MODE_HW;
> +               else
> +                       pktio_entry->s.params.nm_params->netmap_mode =
> ODP_NETMAP_MODE_SW;
>

Almost good, but for our purpose of removing pktio type awareness from ODP
APIs we need to give up using ODP_NETMAP_MODE_SW, there is no correspondent
for it in socket operation mode. Instead, only physical interfaces will be
polled, just like raw sockets do. There is also a problem with multiple
pktios of netmap type on the same interface, I have to  look into that.


> +               pktio_entry->s.params.nm_params->ringid = 0;
> +               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool);
> +               if (res != -1) {
> +                       pktio_entry->s.params.type =
> pktio_entry->s.params.ns_params.type;
> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_NETMAP\n");
> +                       goto done;
> +               } else
>                         close_pkt_netmap(&pktio_entry->s.pkt_nm);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> +       }
>  #endif
> -       default:
> +
> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) {
>                 free_pktio_entry(id);
> -               id = ODP_PKTIO_INVALID;
> -               ODP_ERR("This type of I/O is not supported. Please
> recompile.\n");
> -               break;
> +               pktio_entry->s.params.sock_params.type =
> ODP_PKTIO_TYPE_SOCKET_MMAP;
> +               pktio_entry->s.params.sock_params.fanout = fanout;
> +               res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
> dev,
> +                               pool, fanout);
> +               if (res != -1) {
> +                       pktio_entry->s.params.type =
> pktio_entry->s.params.sock_params.type;
> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMAP\n");
> +                       goto done;
> +               } else
> +                       close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
> +       }
> +
> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) {
> +               free_pktio_entry(id);
> +               pktio_entry->s.params.sock_params.type =
> ODP_PKTIO_TYPE_SOCKET_MMSG;
> +               pktio_entry->s.params.sock_params.fanout = fanout;
> +               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> +               if (res != -1) {
> +                       pktio_entry->s.params.type =
> pktio_entry->s.params.sock_params.type;
> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMSG\n");
> +                       goto done;
> +               } else
> +                       close_pkt_sock(&pktio_entry->s.pkt_sock);
> +       }
> +
> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) {
> +               free_pktio_entry(id);
> +               pktio_entry->s.params.sock_params.type =
> ODP_PKTIO_TYPE_SOCKET_BASIC;
> +               pktio_entry->s.params.sock_params.fanout = fanout;
> +               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> +               if (res != -1) {
> +                       pktio_entry->s.params.type =
> pktio_entry->s.params.sock_params.type;
> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_BASIC\n");
> +                       goto done;
> +               } else
> +                       close_pkt_sock(&pktio_entry->s.pkt_sock);
>         }
>
> +       free_pktio_entry(id);
> +       ODP_ERR("Unable to init any I/O type.\n");
> +       return ODP_PKTIO_INVALID;
> +
> +done:
>         unlock_entry(pktio_entry);
>         return id;
>  }
> diff --git a/platform/linux-generic/source/odp_packet_netmap.c
> b/platform/linux-generic/source/odp_packet_netmap.c
> index e2215ab..027a338 100644
> --- a/platform/linux-generic/source/odp_packet_netmap.c
> +++ b/platform/linux-generic/source/odp_packet_netmap.c
> @@ -105,7 +105,7 @@ done:
>  }
>
>  int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
> -                    odp_buffer_pool_t pool, netmap_params_t *nm_params)
> +                    odp_buffer_pool_t pool)
>  {
>         char qname[ODP_QUEUE_NAME_LEN];
>         char ifname[32];
> @@ -132,12 +132,10 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm,
> const char *netdev,
>         pkt_nm->buf_size = odp_packet_buf_size(pkt);
>         /* max frame len taking into account the l2-offset */
>         pkt_nm->max_frame_len = pkt_nm->buf_size - pkt_nm->frame_offset;
> -       /* save netmap_mode for later use */
> -       pkt_nm->netmap_mode = nm_params->netmap_mode;
>
>         odp_packet_free(pkt);
>
> -       if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW)
> +       if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW)
>                 ringid = NETMAP_SW_RING;
>         else
>                 ringid = nm_params->ringid;
> @@ -153,7 +151,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm,
> const char *netdev,
>
>         ODP_DBG("thread %d mode %s mmap addr %p\n",
>                 odp_thread_id(),
> -               nm_params->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW",
> +               pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW",
>                 pkt_nm->nm_desc->mem);
>
>         if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) {
> @@ -178,7 +176,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm,
> const char *netdev,
>         }
>
>         /* Set TX checksumming if hardware rings */
> -       if (nm_params->netmap_mode == ODP_NETMAP_MODE_HW) {
> +       if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_HW) {
>                 ret = nm_do_ioctl(pkt_nm, SIOCGIFFLAGS, 0);
>                 if (ret)
>                         return ret;
> diff --git a/test/generator/odp_generator.c
> b/test/generator/odp_generator.c
> index ca84e4c..c386418 100644
> --- a/test/generator/odp_generator.c
> +++ b/test/generator/odp_generator.c
> @@ -294,17 +294,13 @@ static void *gen_send_thread(void *arg)
>         odp_pktio_t pktio;
>         thread_args_t *thr_args;
>         odp_queue_t outq_def;
> -       odp_pktio_params_t params;
> -       socket_params_t *sock_params = &params.sock_params;
> -
>         odp_buffer_t buf;
>
>         thr = odp_thread_id();
>         thr_args = arg;
>
>         /* Open a packet IO instance for this thread */
> -       sock_params->type = 1;
> -       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
> &params);
> +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>         if (pktio == ODP_PKTIO_INVALID) {
>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                 return NULL;
> @@ -459,10 +455,8 @@ static void *gen_recv_thread(void *arg)
>         odp_pktio_t pktio;
>         thread_args_t *thr_args;
>         odp_queue_t inq_def;
> -       odp_pktio_params_t params;
>         char inq_name[ODP_QUEUE_NAME_LEN];
>         odp_queue_param_t qparam;
> -       socket_params_t *sock_params = &params.sock_params;
>
>         odp_packet_t pkt;
>         odp_buffer_t buf;
> @@ -471,8 +465,7 @@ static void *gen_recv_thread(void *arg)
>         thr_args = arg;
>
>         /* Open a packet IO instance for this thread */
> -       sock_params->type = 1;
> -       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
> &params);
> +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>         if (pktio == ODP_PKTIO_INVALID) {
>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                 return NULL;
> diff --git a/test/packet/odp_example_pktio.c
> b/test/packet/odp_example_pktio.c
> index 3acb1fb..0d23bd6 100644
> --- a/test/packet/odp_example_pktio.c
> +++ b/test/packet/odp_example_pktio.c
> @@ -98,8 +98,6 @@ static void *pktio_queue_thread(void *arg)
>         int ret;
>         unsigned long pkt_cnt = 0;
>         unsigned long err_cnt = 0;
> -       odp_pktio_params_t params;
> -       socket_params_t *sock_params = &params.sock_params;
>
>         thr = odp_thread_id();
>         thr_args = arg;
> @@ -115,9 +113,7 @@ static void *pktio_queue_thread(void *arg)
>         }
>
>         /* Open a packet IO instance for this thread */
> -       sock_params->type = thr_args->type;
> -       sock_params->fanout = thr_args->fanout;
> -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
> +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>         if (pktio == ODP_PKTIO_INVALID) {
>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>                 return NULL;
> @@ -211,8 +207,6 @@ static void *pktio_ifburst_thread(void *arg)
>         unsigned long pkt_cnt = 0;
>         unsigned long err_cnt = 0;
>         unsigned long tmp = 0;
> -       odp_pktio_params_t params;
> -       socket_params_t *sock_params = &params.sock_params;
>
>         thr = odp_thread_id();
>         thr_args = arg;
> @@ -228,9 +222,7 @@ static void *pktio_ifburst_thread(void *arg)
>         }
>
>         /* Open a packet IO instance for this thread */
> -       sock_params->type = thr_args->type;
> -       sock_params->fanout = thr_args->fanout;
> -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
> +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>         if (pktio == ODP_PKTIO_INVALID) {
>                 ODP_ERR("  [%02i] Error: pktio create failed.\n", thr);
>                 return NULL;
> @@ -543,14 +535,6 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
>                                 appl_args->mode = APPL_MODE_PKT_QUEUE;
>                         break;
>
> -               case 't':
> -                       appl_args->type = atoi(optarg);
> -                       break;
> -
> -               case 'f':
> -                       appl_args->fanout = atoi(optarg);
> -                       break;
> -
>                 case 'h':
>                         usage(argv[0]);
>                         exit(EXIT_SUCCESS);
> @@ -620,16 +604,15 @@ static void usage(char *progname)
>                "  -i, --interface Eth interfaces (comma-separated, no
> spaces)\n"
>                "  -m, --mode      0: Burst send&receive packets (no
> queues)\n"
>                "                  1: Send&receive packets through ODP
> queues.\n"
> -              " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
> -              "              2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
> -              "              3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
> -              "              4: ODP_PKTIO_TYPE_NETMAP\n"
> -              "         Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
> -              " -f, --fanout 0: off 1: on (Default 1: on)\n"
>                "\n"
>                "Optional OPTIONS\n"
>                "  -c, --count <number> Core count.\n"
>                "  -h, --help           Display help and exit.\n"
> +              " environment variables: ODP_PKTIO_DISABLE_NETMAP"
> +              "                        ODP_PKTIO_DISABLE_SOCKET_MMAP\n"
> +              "                        ODP_PKTIO_DISABLE_SOCKET_MMSG\n"
> +              "                        ODP_PKTIO_DISABLE_SOCKET_BASIC\n"
> +              " can be used to advance packet I/O selection for
> linux-generic\n"
>                "\n", NO_PATH(progname), NO_PATH(progname)
>             );
>  }
> diff --git a/test/packet_netmap/odp_example_pktio_netmap.c
> b/test/packet_netmap/odp_example_pktio_netmap.c
> index f50f764..acabd0b 100644
> --- a/test/packet_netmap/odp_example_pktio_netmap.c
> +++ b/test/packet_netmap/odp_example_pktio_netmap.c
> @@ -248,8 +248,6 @@ int main(int argc, char *argv[])
>         odp_buffer_pool_print(pool);
>
>         for (i = 0; i < 2 * args->appl.if_count; ++i) {
> -               odp_pktio_params_t params;
> -               netmap_params_t *nm_params = &params.nm_params;
>                 char inq_name[ODP_QUEUE_NAME_LEN];
>                 odp_queue_t inq_def;
>                 odp_queue_param_t qparam;
> @@ -260,18 +258,8 @@ int main(int argc, char *argv[])
>                  * the software ring associated with the physical interface
>                  */
>
> -               args->pktios[i].pktio_dev = args->appl.ifs[i / 2].if_name;
> -               memset(nm_params, 0, sizeof(*nm_params));
> -               nm_params->type = ODP_PKTIO_TYPE_NETMAP;
> -               if (i % 2) {
> -                       nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
> -                       nm_params->ringid = 0;
> -               } else {
> -                       nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
> -                       nm_params->ringid = 0;
> -               }
>                 pktio = odp_pktio_open(args->pktios[i].pktio_dev,
> -                                      pool, &params);
> +                                      pool);
>                 /* Open a packet IO instance for this thread */
>                 if (pktio == ODP_PKTIO_INVALID) {
>                         ODP_ERR("  [%02i] Err: pktio create\n", i);
> @@ -280,7 +268,6 @@ int main(int argc, char *argv[])
>
>                 args->pktios[i].pktio = pktio;
>                 args->pktios[i].pool = pool;
> -               args->pktios[i].netmap_mode = nm_params->netmap_mode;
>                 /* Save pktio_info in the lookup table */
>                 args->pktio_lt[pktio] = &args->pktios[i];
>                 /*
>

The rest looks good to me, pretty much what I had in mind, except I didn't
think about the get_env part too much. I can take it up from here, do some
testing with netmap and send a new version of the patch.

/Ciprian


> --
> 1.8.5.1.163.gd7aced9
>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
>
Ciprian Barbu May 16, 2014, 2:23 p.m. UTC | #2
On Fri, May 16, 2014 at 5:17 PM, Ciprian Barbu <ciprian.barbu@linaro.org>wrote:

> Hi,
>
>
> On Fri, May 16, 2014 at 4:49 PM, Maxim Uvarov <maxim.uvarov@linaro.org>wrote:
>
>> Ddp application should be independent of underlaying i/o type.
>> Propose is to use order of available i/o types and try to register
>> them.
>> Also use getenv() for hint which i/o type to select.
>>
>> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
>> ---
>>  v2: implement getenv() to allow linux-generic turn off types of packets
>> I/O.
>>      This is needed mainly for testing all code paths.
>>
>>  include/odp_packet_io.h                           |   3 +-
>>  platform/linux-generic/source/odp_packet_io.c     | 155
>> ++++++++++------------
>>  platform/linux-generic/source/odp_packet_netmap.c |  10 +-
>>  test/generator/odp_generator.c                    |  11 +-
>>  test/packet/odp_example_pktio.c                   |  31 +----
>>  test/packet_netmap/odp_example_pktio_netmap.c     |  15 +--
>>  6 files changed, 88 insertions(+), 137 deletions(-)
>>
>> diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
>> index cfefac0..96d6039 100644
>> --- a/include/odp_packet_io.h
>> +++ b/include/odp_packet_io.h
>> @@ -40,8 +40,7 @@ typedef uint32_t odp_pktio_t;
>>   *
>>   * @return ODP packet IO handle or ODP_PKTIO_INVALID on error
>>   */
>> -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>> -                          odp_pktio_params_t *params);
>> +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool);
>>
>>  /**
>>   * Close an ODP packet IO instance
>> diff --git a/platform/linux-generic/source/odp_packet_io.c
>> b/platform/linux-generic/source/odp_packet_io.c
>> index 33ade10..1b2e025 100644
>> --- a/platform/linux-generic/source/odp_packet_io.c
>> +++ b/platform/linux-generic/source/odp_packet_io.c
>> @@ -13,21 +13,19 @@
>>  #include <odp_spinlock.h>
>>  #include <odp_shared_memory.h>
>>  #include <odp_packet_socket.h>
>> -#ifdef ODP_HAVE_NETMAP
>> -#include <odp_packet_netmap.h>
>> -#endif
>>  #include <odp_hints.h>
>>  #include <odp_config.h>
>>  #include <odp_queue_internal.h>
>>  #include <odp_schedule_internal.h>
>>  #include <odp_debug.h>
>> -
>>  #include <odp_pktio_socket.h>
>>  #ifdef ODP_HAVE_NETMAP
>> +#include <odp_packet_netmap.h>
>>  #include <odp_pktio_netmap.h>
>>  #endif
>>
>>  #include <string.h>
>> +#include <stdlib.h>
>>
>>  typedef struct {
>>         pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES];
>> @@ -112,32 +110,13 @@ static void unlock_entry(pktio_entry_t *entry)
>>         odp_spinlock_unlock(&entry->s.lock);
>>  }
>>
>> -static void init_pktio_entry(pktio_entry_t *entry, odp_pktio_params_t
>> *params)
>> +static void init_pktio_entry(pktio_entry_t *entry)
>>  {
>>         set_taken(entry);
>>         entry->s.inq_default = ODP_QUEUE_INVALID;
>> -       switch (params->type) {
>> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>> -               memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
>> -               memset(&entry->s.pkt_sock_mmap, 0,
>> -                     sizeof(entry->s.pkt_sock_mmap));
>> -               break;
>> -#ifdef ODP_HAVE_NETMAP
>> -       case ODP_PKTIO_TYPE_NETMAP:
>> -               memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
>> -               break;
>> -#endif
>> -       default:
>> -               ODP_ERR("Packet I/O type not supported. Please
>> recompile\n");
>> -               break;
>> -       }
>> -       /* Save pktio parameters, type is the most useful */
>> -       memcpy(&entry->s.params, params, sizeof(*params));
>>  }
>>
>> -static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
>> +static odp_pktio_t alloc_lock_pktio_entry(void)
>>  {
>>         odp_pktio_t id;
>>         pktio_entry_t *entry;
>> @@ -148,7 +127,7 @@ static odp_pktio_t
>> alloc_lock_pktio_entry(odp_pktio_params_t *params)
>>                 if (is_free(entry)) {
>>                         lock_entry(entry);
>>                         if (is_free(entry)) {
>> -                               init_pktio_entry(entry, params);
>> +                               init_pktio_entry(entry);
>>                                 id = i + 1;
>>                                 return id; /* return with entry locked! */
>>                         }
>> @@ -171,35 +150,14 @@ static int free_pktio_entry(odp_pktio_t id)
>>         return 0;
>>  }
>>
>> -odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>> -                          odp_pktio_params_t *params)
>> +odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool)
>>  {
>>         odp_pktio_t id;
>>         pktio_entry_t *pktio_entry;
>>         int res;
>> +       int fanout = 0;
>>
>> -       if (params == NULL) {
>> -               ODP_ERR("Invalid pktio params\n");
>> -               return ODP_PKTIO_INVALID;
>> -       }
>> -
>> -       switch (params->type) {
>> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>> -               ODP_DBG("Allocating socket pktio\n");
>> -               break;
>> -#ifdef ODP_HAVE_NETMAP
>> -       case ODP_PKTIO_TYPE_NETMAP:
>> -               ODP_DBG("Allocating netmap pktio\n");
>> -               break;
>> -#endif
>> -       default:
>> -               ODP_ERR("Invalid pktio type: %02x\n", params->type);
>> -               return ODP_PKTIO_INVALID;
>> -       }
>> -
>> -       id = alloc_lock_pktio_entry(params);
>> +       id = alloc_lock_pktio_entry();
>>         if (id == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("No resources available.\n");
>>                 return ODP_PKTIO_INVALID;
>> @@ -208,44 +166,77 @@ odp_pktio_t odp_pktio_open(const char *dev,
>> odp_buffer_pool_t pool,
>>
>>         pktio_entry = get_entry(id);
>>
>> -       switch (params->type) {
>> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
>> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
>> -               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>> -               if (res == -1) {
>> -                       close_pkt_sock(&pktio_entry->s.pkt_sock);
>> -                       free_pktio_entry(id);
>> -                       id = ODP_PKTIO_INVALID;
>> -               }
>> -               break;
>> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
>> -               res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
>> dev,
>> -                               pool, params->sock_params.fanout);
>> -               if (res == -1) {
>> -
>> close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
>> -                       free_pktio_entry(id);
>> -                       id = ODP_PKTIO_INVALID;
>> -               }
>> -               break;
>> -#ifdef ODP_HAVE_NETMAP
>> -       case ODP_PKTIO_TYPE_NETMAP:
>> +       if (getenv("ODP_PKTIO_USE_FANOUT"))
>> +               fanout = 1;
>> +       ODP_DBG("ODP_PKTIO_USE_FANOUT: %d\n", fanout);
>>
>> -               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
>> -                               pool, &params->nm_params);
>> -               if (res == -1) {
>> +       memset(&pktio_entry->s.pkt_sock, 0,
>> sizeof(pktio_entry->s.pkt_sock));
>> +       memset(&pktio_entry->s.pkt_sock_mmap, 0,
>> sizeof(pktio_entry->s.pkt_sock_mmap));
>> +#ifdef ODP_HAVE_NETMAP
>> +       memset(&pktio_entry->s.pkt_nm, 0, sizeof(pktio_entry->s.pkt_nm));
>> +
>> +       if (getenv("ODP_PKTIO_DISABLE_NETMAP") == NULL) {
>> +               pktio_entry->s.params.ns_params->type =
>> ODP_PKTIO_TYPE_NETMAP;
>>
>
Typo: no member named ns_params and nm_params is not a pointer so you have
to replace nm_params->type with nm_params.type

So the patch needs a bit of reworking anyhow. I will take care of them.


> +               if (getenv("ODP_NETMAP_MODE_HW")
>> +                       pktio_entry->s.params.nm_params->netmap_mode =
>> ODP_NETMAP_MODE_HW;
>> +               else
>> +                       pktio_entry->s.params.nm_params->netmap_mode =
>> ODP_NETMAP_MODE_SW;
>>
>
> Almost good, but for our purpose of removing pktio type awareness from ODP
> APIs we need to give up using ODP_NETMAP_MODE_SW, there is no correspondent
> for it in socket operation mode. Instead, only physical interfaces will be
> polled, just like raw sockets do. There is also a problem with multiple
> pktios of netmap type on the same interface, I have to  look into that.
>
>
>> +               pktio_entry->s.params.nm_params->ringid = 0;
>> +               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool);
>> +               if (res != -1) {
>> +                       pktio_entry->s.params.type =
>> pktio_entry->s.params.ns_params.type;
>> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_NETMAP\n");
>> +                       goto done;
>> +               } else
>>                         close_pkt_netmap(&pktio_entry->s.pkt_nm);
>> -                       free_pktio_entry(id);
>> -                       id = ODP_PKTIO_INVALID;
>> -               }
>> -               break;
>> +       }
>>  #endif
>> -       default:
>> +
>> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) {
>>                 free_pktio_entry(id);
>> -               id = ODP_PKTIO_INVALID;
>> -               ODP_ERR("This type of I/O is not supported. Please
>> recompile.\n");
>> -               break;
>> +               pktio_entry->s.params.sock_params.type =
>> ODP_PKTIO_TYPE_SOCKET_MMAP;
>> +               pktio_entry->s.params.sock_params.fanout = fanout;
>> +               res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
>> dev,
>> +                               pool, fanout);
>> +               if (res != -1) {
>> +                       pktio_entry->s.params.type =
>> pktio_entry->s.params.sock_params.type;
>> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMAP\n");
>> +                       goto done;
>> +               } else
>> +
>> close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
>> +       }
>> +
>> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) {
>> +               free_pktio_entry(id);
>> +               pktio_entry->s.params.sock_params.type =
>> ODP_PKTIO_TYPE_SOCKET_MMSG;
>> +               pktio_entry->s.params.sock_params.fanout = fanout;
>> +               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>> +               if (res != -1) {
>> +                       pktio_entry->s.params.type =
>> pktio_entry->s.params.sock_params.type;
>> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMSG\n");
>> +                       goto done;
>> +               } else
>> +                       close_pkt_sock(&pktio_entry->s.pkt_sock);
>> +       }
>> +
>> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) {
>> +               free_pktio_entry(id);
>> +               pktio_entry->s.params.sock_params.type =
>> ODP_PKTIO_TYPE_SOCKET_BASIC;
>> +               pktio_entry->s.params.sock_params.fanout = fanout;
>> +               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>> +               if (res != -1) {
>> +                       pktio_entry->s.params.type =
>> pktio_entry->s.params.sock_params.type;
>> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_BASIC\n");
>> +                       goto done;
>> +               } else
>> +                       close_pkt_sock(&pktio_entry->s.pkt_sock);
>>         }
>>
>> +       free_pktio_entry(id);
>> +       ODP_ERR("Unable to init any I/O type.\n");
>> +       return ODP_PKTIO_INVALID;
>> +
>> +done:
>>         unlock_entry(pktio_entry);
>>         return id;
>>  }
>> diff --git a/platform/linux-generic/source/odp_packet_netmap.c
>> b/platform/linux-generic/source/odp_packet_netmap.c
>> index e2215ab..027a338 100644
>> --- a/platform/linux-generic/source/odp_packet_netmap.c
>> +++ b/platform/linux-generic/source/odp_packet_netmap.c
>> @@ -105,7 +105,7 @@ done:
>>  }
>>
>>  int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
>> -                    odp_buffer_pool_t pool, netmap_params_t *nm_params)
>> +                    odp_buffer_pool_t pool)
>>  {
>>         char qname[ODP_QUEUE_NAME_LEN];
>>         char ifname[32];
>> @@ -132,12 +132,10 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm,
>> const char *netdev,
>>         pkt_nm->buf_size = odp_packet_buf_size(pkt);
>>         /* max frame len taking into account the l2-offset */
>>         pkt_nm->max_frame_len = pkt_nm->buf_size - pkt_nm->frame_offset;
>> -       /* save netmap_mode for later use */
>> -       pkt_nm->netmap_mode = nm_params->netmap_mode;
>>
>>         odp_packet_free(pkt);
>>
>> -       if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW)
>> +       if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW)
>>                 ringid = NETMAP_SW_RING;
>>         else
>>                 ringid = nm_params->ringid;
>> @@ -153,7 +151,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm,
>> const char *netdev,
>>
>>         ODP_DBG("thread %d mode %s mmap addr %p\n",
>>                 odp_thread_id(),
>> -               nm_params->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" :
>> "HW",
>> +               pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW",
>>                 pkt_nm->nm_desc->mem);
>>
>>         if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) {
>> @@ -178,7 +176,7 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm,
>> const char *netdev,
>>         }
>>
>>         /* Set TX checksumming if hardware rings */
>> -       if (nm_params->netmap_mode == ODP_NETMAP_MODE_HW) {
>> +       if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_HW) {
>>                 ret = nm_do_ioctl(pkt_nm, SIOCGIFFLAGS, 0);
>>                 if (ret)
>>                         return ret;
>> diff --git a/test/generator/odp_generator.c
>> b/test/generator/odp_generator.c
>> index ca84e4c..c386418 100644
>> --- a/test/generator/odp_generator.c
>> +++ b/test/generator/odp_generator.c
>> @@ -294,17 +294,13 @@ static void *gen_send_thread(void *arg)
>>         odp_pktio_t pktio;
>>         thread_args_t *thr_args;
>>         odp_queue_t outq_def;
>> -       odp_pktio_params_t params;
>> -       socket_params_t *sock_params = &params.sock_params;
>> -
>>         odp_buffer_t buf;
>>
>>         thr = odp_thread_id();
>>         thr_args = arg;
>>
>>         /* Open a packet IO instance for this thread */
>> -       sock_params->type = 1;
>> -       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
>> &params);
>> +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>>         if (pktio == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>>                 return NULL;
>> @@ -459,10 +455,8 @@ static void *gen_recv_thread(void *arg)
>>         odp_pktio_t pktio;
>>         thread_args_t *thr_args;
>>         odp_queue_t inq_def;
>> -       odp_pktio_params_t params;
>>         char inq_name[ODP_QUEUE_NAME_LEN];
>>         odp_queue_param_t qparam;
>> -       socket_params_t *sock_params = &params.sock_params;
>>
>>         odp_packet_t pkt;
>>         odp_buffer_t buf;
>> @@ -471,8 +465,7 @@ static void *gen_recv_thread(void *arg)
>>         thr_args = arg;
>>
>>         /* Open a packet IO instance for this thread */
>> -       sock_params->type = 1;
>> -       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
>> &params);
>> +       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
>>         if (pktio == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>>                 return NULL;
>> diff --git a/test/packet/odp_example_pktio.c
>> b/test/packet/odp_example_pktio.c
>> index 3acb1fb..0d23bd6 100644
>> --- a/test/packet/odp_example_pktio.c
>> +++ b/test/packet/odp_example_pktio.c
>> @@ -98,8 +98,6 @@ static void *pktio_queue_thread(void *arg)
>>         int ret;
>>         unsigned long pkt_cnt = 0;
>>         unsigned long err_cnt = 0;
>> -       odp_pktio_params_t params;
>> -       socket_params_t *sock_params = &params.sock_params;
>>
>>         thr = odp_thread_id();
>>         thr_args = arg;
>> @@ -115,9 +113,7 @@ static void *pktio_queue_thread(void *arg)
>>         }
>>
>>         /* Open a packet IO instance for this thread */
>> -       sock_params->type = thr_args->type;
>> -       sock_params->fanout = thr_args->fanout;
>> -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
>> +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>>         if (pktio == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
>>                 return NULL;
>> @@ -211,8 +207,6 @@ static void *pktio_ifburst_thread(void *arg)
>>         unsigned long pkt_cnt = 0;
>>         unsigned long err_cnt = 0;
>>         unsigned long tmp = 0;
>> -       odp_pktio_params_t params;
>> -       socket_params_t *sock_params = &params.sock_params;
>>
>>         thr = odp_thread_id();
>>         thr_args = arg;
>> @@ -228,9 +222,7 @@ static void *pktio_ifburst_thread(void *arg)
>>         }
>>
>>         /* Open a packet IO instance for this thread */
>> -       sock_params->type = thr_args->type;
>> -       sock_params->fanout = thr_args->fanout;
>> -       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
>> +       pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
>>         if (pktio == ODP_PKTIO_INVALID) {
>>                 ODP_ERR("  [%02i] Error: pktio create failed.\n", thr);
>>                 return NULL;
>> @@ -543,14 +535,6 @@ static void parse_args(int argc, char *argv[],
>> appl_args_t *appl_args)
>>                                 appl_args->mode = APPL_MODE_PKT_QUEUE;
>>                         break;
>>
>> -               case 't':
>> -                       appl_args->type = atoi(optarg);
>> -                       break;
>> -
>> -               case 'f':
>> -                       appl_args->fanout = atoi(optarg);
>> -                       break;
>> -
>>                 case 'h':
>>                         usage(argv[0]);
>>                         exit(EXIT_SUCCESS);
>> @@ -620,16 +604,15 @@ static void usage(char *progname)
>>                "  -i, --interface Eth interfaces (comma-separated, no
>> spaces)\n"
>>                "  -m, --mode      0: Burst send&receive packets (no
>> queues)\n"
>>                "                  1: Send&receive packets through ODP
>> queues.\n"
>> -              " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
>> -              "              2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
>> -              "              3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
>> -              "              4: ODP_PKTIO_TYPE_NETMAP\n"
>> -              "         Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
>> -              " -f, --fanout 0: off 1: on (Default 1: on)\n"
>>                "\n"
>>                "Optional OPTIONS\n"
>>                "  -c, --count <number> Core count.\n"
>>                "  -h, --help           Display help and exit.\n"
>> +              " environment variables: ODP_PKTIO_DISABLE_NETMAP"
>> +              "                        ODP_PKTIO_DISABLE_SOCKET_MMAP\n"
>> +              "                        ODP_PKTIO_DISABLE_SOCKET_MMSG\n"
>> +              "                        ODP_PKTIO_DISABLE_SOCKET_BASIC\n"
>> +              " can be used to advance packet I/O selection for
>> linux-generic\n"
>>                "\n", NO_PATH(progname), NO_PATH(progname)
>>             );
>>  }
>> diff --git a/test/packet_netmap/odp_example_pktio_netmap.c
>> b/test/packet_netmap/odp_example_pktio_netmap.c
>> index f50f764..acabd0b 100644
>> --- a/test/packet_netmap/odp_example_pktio_netmap.c
>> +++ b/test/packet_netmap/odp_example_pktio_netmap.c
>> @@ -248,8 +248,6 @@ int main(int argc, char *argv[])
>>         odp_buffer_pool_print(pool);
>>
>>         for (i = 0; i < 2 * args->appl.if_count; ++i) {
>> -               odp_pktio_params_t params;
>> -               netmap_params_t *nm_params = &params.nm_params;
>>                 char inq_name[ODP_QUEUE_NAME_LEN];
>>                 odp_queue_t inq_def;
>>                 odp_queue_param_t qparam;
>> @@ -260,18 +258,8 @@ int main(int argc, char *argv[])
>>                  * the software ring associated with the physical
>> interface
>>                  */
>>
>> -               args->pktios[i].pktio_dev = args->appl.ifs[i / 2].if_name;
>> -               memset(nm_params, 0, sizeof(*nm_params));
>> -               nm_params->type = ODP_PKTIO_TYPE_NETMAP;
>> -               if (i % 2) {
>> -                       nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
>> -                       nm_params->ringid = 0;
>> -               } else {
>> -                       nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
>> -                       nm_params->ringid = 0;
>> -               }
>>                 pktio = odp_pktio_open(args->pktios[i].pktio_dev,
>> -                                      pool, &params);
>> +                                      pool);
>>                 /* Open a packet IO instance for this thread */
>>                 if (pktio == ODP_PKTIO_INVALID) {
>>                         ODP_ERR("  [%02i] Err: pktio create\n", i);
>> @@ -280,7 +268,6 @@ int main(int argc, char *argv[])
>>
>>                 args->pktios[i].pktio = pktio;
>>                 args->pktios[i].pool = pool;
>> -               args->pktios[i].netmap_mode = nm_params->netmap_mode;
>>                 /* Save pktio_info in the lookup table */
>>                 args->pktio_lt[pktio] = &args->pktios[i];
>>                 /*
>>
>
> The rest looks good to me, pretty much what I had in mind, except I didn't
> think about the get_env part too much. I can take it up from here, do some
> testing with netmap and send a new version of the patch.
>
> /Ciprian
>
>
>> --
>> 1.8.5.1.163.gd7aced9
>>
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> http://lists.linaro.org/mailman/listinfo/lng-odp
>>
>
>
Stuart Haslam May 19, 2014, 4:34 p.m. UTC | #3
On Fri, May 16, 2014 at 02:49:16PM +0100, Maxim Uvarov wrote:
> Ddp application should be independent of underlaying i/o type.
> Propose is to use order of available i/o types and try to register
> them.
> Also use getenv() for hint which i/o type to select.
> 
> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
> ---
>  v2: implement getenv() to allow linux-generic turn off types of packets I/O.
>      This is needed mainly for testing all code paths.
> 
>  include/odp_packet_io.h                           |   3 +-
>  platform/linux-generic/source/odp_packet_io.c     | 155 ++++++++++------------
>  platform/linux-generic/source/odp_packet_netmap.c |  10 +-
>  test/generator/odp_generator.c                    |  11 +-
>  test/packet/odp_example_pktio.c                   |  31 +----
>  test/packet_netmap/odp_example_pktio_netmap.c     |  15 +--
>  6 files changed, 88 insertions(+), 137 deletions(-)
> 

> @@ -208,44 +166,77 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
> 
>         pktio_entry = get_entry(id);
> 
> -       switch (params->type) {
> -       case ODP_PKTIO_TYPE_SOCKET_BASIC:
> -       case ODP_PKTIO_TYPE_SOCKET_MMSG:
> -               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> -               if (res == -1) {
> -                       close_pkt_sock(&pktio_entry->s.pkt_sock);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> -       case ODP_PKTIO_TYPE_SOCKET_MMAP:
> -               res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
> -                               pool, params->sock_params.fanout);
> -               if (res == -1) {
> -                       close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> -#ifdef ODP_HAVE_NETMAP
> -       case ODP_PKTIO_TYPE_NETMAP:
> +       if (getenv("ODP_PKTIO_USE_FANOUT"))
> +               fanout = 1;
> +       ODP_DBG("ODP_PKTIO_USE_FANOUT: %d\n", fanout);
> 
> -               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
> -                               pool, &params->nm_params);
> -               if (res == -1) {
> +       memset(&pktio_entry->s.pkt_sock, 0, sizeof(pktio_entry->s.pkt_sock));
> +       memset(&pktio_entry->s.pkt_sock_mmap, 0, sizeof(pktio_entry->s.pkt_sock_mmap));
> +#ifdef ODP_HAVE_NETMAP
> +       memset(&pktio_entry->s.pkt_nm, 0, sizeof(pktio_entry->s.pkt_nm));
> +
> +       if (getenv("ODP_PKTIO_DISABLE_NETMAP") == NULL) {
> +               pktio_entry->s.params.ns_params->type = ODP_PKTIO_TYPE_NETMAP;
> +               if (getenv("ODP_NETMAP_MODE_HW")
> +                       pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
> +               else
> +                       pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
> +               pktio_entry->s.params.nm_params->ringid = 0;
> +               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool);
> +               if (res != -1) {
> +                       pktio_entry->s.params.type = pktio_entry->s.params.ns_params.type;
> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_NETMAP\n");
> +                       goto done;
> +               } else
>                         close_pkt_netmap(&pktio_entry->s.pkt_nm);
> -                       free_pktio_entry(id);
> -                       id = ODP_PKTIO_INVALID;
> -               }
> -               break;
> +       }
>  #endif
> -       default:
> +
> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) {
>                 free_pktio_entry(id);

This free shouldn't be here, as it stands id could be freed multiple
times and then returned.

> -               id = ODP_PKTIO_INVALID;
> -               ODP_ERR("This type of I/O is not supported. Please recompile.\n");
> -               break;
> +               pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMAP;
> +               pktio_entry->s.params.sock_params.fanout = fanout;
> +               res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
> +                               pool, fanout);
> +               if (res != -1) {
> +                       pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMAP\n");
> +                       goto done;
> +               } else
> +                       close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
> +       }
> +
> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) {
> +               free_pktio_entry(id);

^ remove

> +               pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMSG;
> +               pktio_entry->s.params.sock_params.fanout = fanout;
> +               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> +               if (res != -1) {
> +                       pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMSG\n");
> +                       goto done;
> +               } else
> +                       close_pkt_sock(&pktio_entry->s.pkt_sock);
> +       }
> +
> +       if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) {
> +               free_pktio_entry(id);

^ remove

> +               pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_BASIC;
> +               pktio_entry->s.params.sock_params.fanout = fanout;
> +               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> +               if (res != -1) {
> +                       pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
> +                       ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_BASIC\n");
> +                       goto done;
> +               } else
> +                       close_pkt_sock(&pktio_entry->s.pkt_sock);
>         }
> 
> +       free_pktio_entry(id);
> +       ODP_ERR("Unable to init any I/O type.\n");
> +       return ODP_PKTIO_INVALID;
> +
> +done:
>         unlock_entry(pktio_entry);
>         return id;
>  }

Rather than disabling particular I/O types I think it would be better to
explicitly select one. As it is I would need to know some implementation
details in order to select a specific one (e.g. to force use of BASIC
sockets I need to disable NETMAP, MMAP and MMSG). If the specified type
isn't available then the _open call can just fail.

The above method also doesn't allow selection on a per-device basis.

Perhaps this selection could be done by augmenting the device name,
e.g. "netmap:eth0" to force use of netmap or "eth0" to allow the
implementation to chose.

Anyway, I think the patch should be split into two with the first one
just doing the dynamic auto-selection (similar to v1).
diff mbox

Patch

diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
index cfefac0..96d6039 100644
--- a/include/odp_packet_io.h
+++ b/include/odp_packet_io.h
@@ -40,8 +40,7 @@  typedef uint32_t odp_pktio_t;
  *
  * @return ODP packet IO handle or ODP_PKTIO_INVALID on error
  */
-odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
-			   odp_pktio_params_t *params);
+odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool);
 
 /**
  * Close an ODP packet IO instance
diff --git a/platform/linux-generic/source/odp_packet_io.c b/platform/linux-generic/source/odp_packet_io.c
index 33ade10..1b2e025 100644
--- a/platform/linux-generic/source/odp_packet_io.c
+++ b/platform/linux-generic/source/odp_packet_io.c
@@ -13,21 +13,19 @@ 
 #include <odp_spinlock.h>
 #include <odp_shared_memory.h>
 #include <odp_packet_socket.h>
-#ifdef ODP_HAVE_NETMAP
-#include <odp_packet_netmap.h>
-#endif
 #include <odp_hints.h>
 #include <odp_config.h>
 #include <odp_queue_internal.h>
 #include <odp_schedule_internal.h>
 #include <odp_debug.h>
-
 #include <odp_pktio_socket.h>
 #ifdef ODP_HAVE_NETMAP
+#include <odp_packet_netmap.h>
 #include <odp_pktio_netmap.h>
 #endif
 
 #include <string.h>
+#include <stdlib.h>
 
 typedef struct {
 	pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES];
@@ -112,32 +110,13 @@  static void unlock_entry(pktio_entry_t *entry)
 	odp_spinlock_unlock(&entry->s.lock);
 }
 
-static void init_pktio_entry(pktio_entry_t *entry, odp_pktio_params_t *params)
+static void init_pktio_entry(pktio_entry_t *entry)
 {
 	set_taken(entry);
 	entry->s.inq_default = ODP_QUEUE_INVALID;
-	switch (params->type) {
-	case ODP_PKTIO_TYPE_SOCKET_BASIC:
-	case ODP_PKTIO_TYPE_SOCKET_MMSG:
-	case ODP_PKTIO_TYPE_SOCKET_MMAP:
-		memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
-		memset(&entry->s.pkt_sock_mmap, 0,
-		      sizeof(entry->s.pkt_sock_mmap));
-		break;
-#ifdef ODP_HAVE_NETMAP
-	case ODP_PKTIO_TYPE_NETMAP:
-		memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
-		break;
-#endif
-	default:
-		ODP_ERR("Packet I/O type not supported. Please recompile\n");
-		break;
-	}
-	/* Save pktio parameters, type is the most useful */
-	memcpy(&entry->s.params, params, sizeof(*params));
 }
 
-static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
+static odp_pktio_t alloc_lock_pktio_entry(void)
 {
 	odp_pktio_t id;
 	pktio_entry_t *entry;
@@ -148,7 +127,7 @@  static odp_pktio_t alloc_lock_pktio_entry(odp_pktio_params_t *params)
 		if (is_free(entry)) {
 			lock_entry(entry);
 			if (is_free(entry)) {
-				init_pktio_entry(entry, params);
+				init_pktio_entry(entry);
 				id = i + 1;
 				return id; /* return with entry locked! */
 			}
@@ -171,35 +150,14 @@  static int free_pktio_entry(odp_pktio_t id)
 	return 0;
 }
 
-odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
-			   odp_pktio_params_t *params)
+odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool)
 {
 	odp_pktio_t id;
 	pktio_entry_t *pktio_entry;
 	int res;
+	int fanout = 0;
 
-	if (params == NULL) {
-		ODP_ERR("Invalid pktio params\n");
-		return ODP_PKTIO_INVALID;
-	}
-
-	switch (params->type) {
-	case ODP_PKTIO_TYPE_SOCKET_BASIC:
-	case ODP_PKTIO_TYPE_SOCKET_MMSG:
-	case ODP_PKTIO_TYPE_SOCKET_MMAP:
-		ODP_DBG("Allocating socket pktio\n");
-		break;
-#ifdef ODP_HAVE_NETMAP
-	case ODP_PKTIO_TYPE_NETMAP:
-		ODP_DBG("Allocating netmap pktio\n");
-		break;
-#endif
-	default:
-		ODP_ERR("Invalid pktio type: %02x\n", params->type);
-		return ODP_PKTIO_INVALID;
-	}
-
-	id = alloc_lock_pktio_entry(params);
+	id = alloc_lock_pktio_entry();
 	if (id == ODP_PKTIO_INVALID) {
 		ODP_ERR("No resources available.\n");
 		return ODP_PKTIO_INVALID;
@@ -208,44 +166,77 @@  odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
 
 	pktio_entry = get_entry(id);
 
-	switch (params->type) {
-	case ODP_PKTIO_TYPE_SOCKET_BASIC:
-	case ODP_PKTIO_TYPE_SOCKET_MMSG:
-		res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
-		if (res == -1) {
-			close_pkt_sock(&pktio_entry->s.pkt_sock);
-			free_pktio_entry(id);
-			id = ODP_PKTIO_INVALID;
-		}
-		break;
-	case ODP_PKTIO_TYPE_SOCKET_MMAP:
-		res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
-				pool, params->sock_params.fanout);
-		if (res == -1) {
-			close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
-			free_pktio_entry(id);
-			id = ODP_PKTIO_INVALID;
-		}
-		break;
-#ifdef ODP_HAVE_NETMAP
-	case ODP_PKTIO_TYPE_NETMAP:
+	if (getenv("ODP_PKTIO_USE_FANOUT"))
+		fanout = 1;
+	ODP_DBG("ODP_PKTIO_USE_FANOUT: %d\n", fanout);
 
-		res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
-				pool, &params->nm_params);
-		if (res == -1) {
+	memset(&pktio_entry->s.pkt_sock, 0, sizeof(pktio_entry->s.pkt_sock));
+	memset(&pktio_entry->s.pkt_sock_mmap, 0, sizeof(pktio_entry->s.pkt_sock_mmap));
+#ifdef ODP_HAVE_NETMAP
+	memset(&pktio_entry->s.pkt_nm, 0, sizeof(pktio_entry->s.pkt_nm));
+
+	if (getenv("ODP_PKTIO_DISABLE_NETMAP") == NULL) {
+		pktio_entry->s.params.ns_params->type = ODP_PKTIO_TYPE_NETMAP;
+		if (getenv("ODP_NETMAP_MODE_HW")
+			pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
+		else
+			pktio_entry->s.params.nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
+		pktio_entry->s.params.nm_params->ringid = 0;
+		res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool);
+		if (res != -1) {
+			pktio_entry->s.params.type = pktio_entry->s.params.ns_params.type;
+			ODP_DBG("IO type: ODP_PKTIO_TYPE_NETMAP\n");
+			goto done;
+		} else
 			close_pkt_netmap(&pktio_entry->s.pkt_nm);
-			free_pktio_entry(id);
-			id = ODP_PKTIO_INVALID;
-		}
-		break;
+	}
 #endif
-	default:
+
+	if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) {
 		free_pktio_entry(id);
-		id = ODP_PKTIO_INVALID;
-		ODP_ERR("This type of I/O is not supported. Please recompile.\n");
-		break;
+		pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMAP;
+		pktio_entry->s.params.sock_params.fanout = fanout;
+		res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
+				pool, fanout);
+		if (res != -1) {
+			pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
+			ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMAP\n");
+			goto done;
+		} else
+			close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
+	}
+
+	if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) {
+		free_pktio_entry(id);
+		pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_MMSG;
+		pktio_entry->s.params.sock_params.fanout = fanout;
+		res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
+		if (res != -1) {
+			pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
+			ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_MMSG\n");
+			goto done;
+		} else
+			close_pkt_sock(&pktio_entry->s.pkt_sock);
+	}
+
+	if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) {
+		free_pktio_entry(id);
+		pktio_entry->s.params.sock_params.type = ODP_PKTIO_TYPE_SOCKET_BASIC;
+		pktio_entry->s.params.sock_params.fanout = fanout;
+		res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
+		if (res != -1) {
+			pktio_entry->s.params.type = pktio_entry->s.params.sock_params.type;
+			ODP_DBG("IO type: ODP_PKTIO_TYPE_SOCKET_BASIC\n");
+			goto done;
+		} else
+			close_pkt_sock(&pktio_entry->s.pkt_sock);
 	}
 
+	free_pktio_entry(id);
+	ODP_ERR("Unable to init any I/O type.\n");
+	return ODP_PKTIO_INVALID;
+
+done:
 	unlock_entry(pktio_entry);
 	return id;
 }
diff --git a/platform/linux-generic/source/odp_packet_netmap.c b/platform/linux-generic/source/odp_packet_netmap.c
index e2215ab..027a338 100644
--- a/platform/linux-generic/source/odp_packet_netmap.c
+++ b/platform/linux-generic/source/odp_packet_netmap.c
@@ -105,7 +105,7 @@  done:
 }
 
 int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
-		     odp_buffer_pool_t pool, netmap_params_t *nm_params)
+		     odp_buffer_pool_t pool)
 {
 	char qname[ODP_QUEUE_NAME_LEN];
 	char ifname[32];
@@ -132,12 +132,10 @@  int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
 	pkt_nm->buf_size = odp_packet_buf_size(pkt);
 	/* max frame len taking into account the l2-offset */
 	pkt_nm->max_frame_len = pkt_nm->buf_size - pkt_nm->frame_offset;
-	/* save netmap_mode for later use */
-	pkt_nm->netmap_mode = nm_params->netmap_mode;
 
 	odp_packet_free(pkt);
 
-	if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW)
+	if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW)
 		ringid = NETMAP_SW_RING;
 	else
 		ringid = nm_params->ringid;
@@ -153,7 +151,7 @@  int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
 
 	ODP_DBG("thread %d mode %s mmap addr %p\n",
 		odp_thread_id(),
-		nm_params->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW",
+		pkt_nm->netmap_mode == ODP_NETMAP_MODE_SW ? "SW" : "HW",
 		pkt_nm->nm_desc->mem);
 
 	if (nm_params->netmap_mode == ODP_NETMAP_MODE_SW) {
@@ -178,7 +176,7 @@  int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
 	}
 
 	/* Set TX checksumming if hardware rings */
-	if (nm_params->netmap_mode == ODP_NETMAP_MODE_HW) {
+	if (pkt_nm->netmap_mode == ODP_NETMAP_MODE_HW) {
 		ret = nm_do_ioctl(pkt_nm, SIOCGIFFLAGS, 0);
 		if (ret)
 			return ret;
diff --git a/test/generator/odp_generator.c b/test/generator/odp_generator.c
index ca84e4c..c386418 100644
--- a/test/generator/odp_generator.c
+++ b/test/generator/odp_generator.c
@@ -294,17 +294,13 @@  static void *gen_send_thread(void *arg)
 	odp_pktio_t pktio;
 	thread_args_t *thr_args;
 	odp_queue_t outq_def;
-	odp_pktio_params_t params;
-	socket_params_t *sock_params = &params.sock_params;
-
 	odp_buffer_t buf;
 
 	thr = odp_thread_id();
 	thr_args = arg;
 
 	/* Open a packet IO instance for this thread */
-	sock_params->type = 1;
-	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool, &params);
+	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
 	if (pktio == ODP_PKTIO_INVALID) {
 		ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
 		return NULL;
@@ -459,10 +455,8 @@  static void *gen_recv_thread(void *arg)
 	odp_pktio_t pktio;
 	thread_args_t *thr_args;
 	odp_queue_t inq_def;
-	odp_pktio_params_t params;
 	char inq_name[ODP_QUEUE_NAME_LEN];
 	odp_queue_param_t qparam;
-	socket_params_t *sock_params = &params.sock_params;
 
 	odp_packet_t pkt;
 	odp_buffer_t buf;
@@ -471,8 +465,7 @@  static void *gen_recv_thread(void *arg)
 	thr_args = arg;
 
 	/* Open a packet IO instance for this thread */
-	sock_params->type = 1;
-	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool, &params);
+	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool);
 	if (pktio == ODP_PKTIO_INVALID) {
 		ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
 		return NULL;
diff --git a/test/packet/odp_example_pktio.c b/test/packet/odp_example_pktio.c
index 3acb1fb..0d23bd6 100644
--- a/test/packet/odp_example_pktio.c
+++ b/test/packet/odp_example_pktio.c
@@ -98,8 +98,6 @@  static void *pktio_queue_thread(void *arg)
 	int ret;
 	unsigned long pkt_cnt = 0;
 	unsigned long err_cnt = 0;
-	odp_pktio_params_t params;
-	socket_params_t *sock_params = &params.sock_params;
 
 	thr = odp_thread_id();
 	thr_args = arg;
@@ -115,9 +113,7 @@  static void *pktio_queue_thread(void *arg)
 	}
 
 	/* Open a packet IO instance for this thread */
-	sock_params->type = thr_args->type;
-	sock_params->fanout = thr_args->fanout;
-	pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
+	pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
 	if (pktio == ODP_PKTIO_INVALID) {
 		ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
 		return NULL;
@@ -211,8 +207,6 @@  static void *pktio_ifburst_thread(void *arg)
 	unsigned long pkt_cnt = 0;
 	unsigned long err_cnt = 0;
 	unsigned long tmp = 0;
-	odp_pktio_params_t params;
-	socket_params_t *sock_params = &params.sock_params;
 
 	thr = odp_thread_id();
 	thr_args = arg;
@@ -228,9 +222,7 @@  static void *pktio_ifburst_thread(void *arg)
 	}
 
 	/* Open a packet IO instance for this thread */
-	sock_params->type = thr_args->type;
-	sock_params->fanout = thr_args->fanout;
-	pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool, &params);
+	pktio = odp_pktio_open(thr_args->pktio_dev, pkt_pool);
 	if (pktio == ODP_PKTIO_INVALID) {
 		ODP_ERR("  [%02i] Error: pktio create failed.\n", thr);
 		return NULL;
@@ -543,14 +535,6 @@  static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
 				appl_args->mode = APPL_MODE_PKT_QUEUE;
 			break;
 
-		case 't':
-			appl_args->type = atoi(optarg);
-			break;
-
-		case 'f':
-			appl_args->fanout = atoi(optarg);
-			break;
-
 		case 'h':
 			usage(argv[0]);
 			exit(EXIT_SUCCESS);
@@ -620,16 +604,15 @@  static void usage(char *progname)
 	       "  -i, --interface Eth interfaces (comma-separated, no spaces)\n"
 	       "  -m, --mode      0: Burst send&receive packets (no queues)\n"
 	       "                  1: Send&receive packets through ODP queues.\n"
-	       " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
-	       "	      2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
-	       "	      3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
-	       "	      4: ODP_PKTIO_TYPE_NETMAP\n"
-	       "	 Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
-	       " -f, --fanout 0: off 1: on (Default 1: on)\n"
 	       "\n"
 	       "Optional OPTIONS\n"
 	       "  -c, --count <number> Core count.\n"
 	       "  -h, --help           Display help and exit.\n"
+	       " environment variables: ODP_PKTIO_DISABLE_NETMAP"
+	       " 			ODP_PKTIO_DISABLE_SOCKET_MMAP\n"
+	       "			ODP_PKTIO_DISABLE_SOCKET_MMSG\n"
+	       "			ODP_PKTIO_DISABLE_SOCKET_BASIC\n"
+	       " can be used to advance packet I/O selection for linux-generic\n"
 	       "\n", NO_PATH(progname), NO_PATH(progname)
 	    );
 }
diff --git a/test/packet_netmap/odp_example_pktio_netmap.c b/test/packet_netmap/odp_example_pktio_netmap.c
index f50f764..acabd0b 100644
--- a/test/packet_netmap/odp_example_pktio_netmap.c
+++ b/test/packet_netmap/odp_example_pktio_netmap.c
@@ -248,8 +248,6 @@  int main(int argc, char *argv[])
 	odp_buffer_pool_print(pool);
 
 	for (i = 0; i < 2 * args->appl.if_count; ++i) {
-		odp_pktio_params_t params;
-		netmap_params_t *nm_params = &params.nm_params;
 		char inq_name[ODP_QUEUE_NAME_LEN];
 		odp_queue_t inq_def;
 		odp_queue_param_t qparam;
@@ -260,18 +258,8 @@  int main(int argc, char *argv[])
 		 * the software ring associated with the physical interface
 		 */
 
-		args->pktios[i].pktio_dev = args->appl.ifs[i / 2].if_name;
-		memset(nm_params, 0, sizeof(*nm_params));
-		nm_params->type = ODP_PKTIO_TYPE_NETMAP;
-		if (i % 2) {
-			nm_params->netmap_mode = ODP_NETMAP_MODE_SW;
-			nm_params->ringid = 0;
-		} else {
-			nm_params->netmap_mode = ODP_NETMAP_MODE_HW;
-			nm_params->ringid = 0;
-		}
 		pktio = odp_pktio_open(args->pktios[i].pktio_dev,
-				       pool, &params);
+				       pool);
 		/* Open a packet IO instance for this thread */
 		if (pktio == ODP_PKTIO_INVALID) {
 			ODP_ERR("  [%02i] Err: pktio create\n", i);
@@ -280,7 +268,6 @@  int main(int argc, char *argv[])
 
 		args->pktios[i].pktio = pktio;
 		args->pktios[i].pool = pool;
-		args->pktios[i].netmap_mode = nm_params->netmap_mode;
 		/* Save pktio_info in the lookup table */
 		args->pktio_lt[pktio] = &args->pktios[i];
 		/*