Each packet_io type now implements a pktio_if_ops_t structure which serves as 
the
only interface use by odp_packet_io.c.
The type of a device is retrieved by calling the pktio_XX open function in enum 
order and
by stopping on the first successful order

Signed-off-by: Clément Leger <cle...@kalray.eu>
Signed-off-by: Nicolas Morey-Chaisemartin <nmo...@kalray.eu>
---
 platform/linux-generic/Makefile.am                 |   1 +
 .../linux-generic/include/odp_packet_io_internal.h |  52 +++----
 platform/linux-generic/include/odp_packet_socket.h |  38 -----
 platform/linux-generic/odp_packet_io.c             | 161 +++------------------
 platform/linux-generic/odp_packet_io_ops.c         |  14 ++
 platform/linux-generic/odp_packet_loop.c           |  38 +++--
 platform/linux-generic/odp_packet_socket.c         |  88 ++++++++---
 platform/linux-generic/odp_packet_socket_mmap.c    |  49 +++++--
 8 files changed, 190 insertions(+), 251 deletions(-)
 create mode 100644 platform/linux-generic/odp_packet_io_ops.c

diff --git a/platform/linux-generic/Makefile.am 
b/platform/linux-generic/Makefile.am
index 921497a..49986ec 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -153,6 +153,7 @@ __LIB__libodp_la_SOURCES = \
                           odp_packet.c \
                           odp_packet_flags.c \
                           odp_packet_io.c \
+                          odp_packet_io_ops.c \
                           odp_packet_loop.c \
                           odp_packet_socket.c \
                           odp_packet_socket_mmap.c \
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h 
b/platform/linux-generic/include/odp_packet_io_internal.h
index 9b62797..9922014 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -32,10 +32,11 @@ extern "C" {
  * Packet IO types
  */
 typedef enum {
-       ODP_PKTIO_TYPE_SOCKET_BASIC = 0x1,
-       ODP_PKTIO_TYPE_SOCKET_MMSG,
+       ODP_PKTIO_TYPE_LOOPBACK = 0x1,
        ODP_PKTIO_TYPE_SOCKET_MMAP,
-       ODP_PKTIO_TYPE_LOOPBACK,
+       ODP_PKTIO_TYPE_SOCKET_MMSG,
+       ODP_PKTIO_TYPE_SOCKET_BASIC,
+       ODP_PKTIO_TYPE_COUNT
 } odp_pktio_type_t;
 
 struct pktio_entry {
@@ -65,6 +66,20 @@ typedef struct {
        pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES];
 } pktio_table_t;
 
+typedef struct pktio_if_ops {
+       int (*open)(odp_pktio_t pktio, pktio_entry_t *pktio_entry,
+                   const char *devname, odp_pool_t pool);
+       int (*close)(pktio_entry_t *pktio_entry);
+       int (*recv)(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[],
+                   unsigned len);
+       int (*send)(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[],
+                   unsigned len);
+       int (*mtu_get)(pktio_entry_t *pktio_entry);
+       int (*promisc_mode_set)(pktio_entry_t *pktio_entry,  int enable);
+       int (*promisc_mode_get)(pktio_entry_t *pktio_entry);
+       int (*mac_get)(pktio_entry_t *pktio_entry, void *mac_addr);
+} pktio_if_ops_t;
+
 extern void *pktio_entry_ptr[];
 
 static inline int pktio_to_id(odp_pktio_t pktio)
@@ -88,32 +103,11 @@ static inline pktio_entry_t *get_pktio_entry(odp_pktio_t 
pktio)
 
 int pktin_poll(pktio_entry_t *entry);
 
-int init_loopback(pktio_entry_t *pktio_entry, odp_pktio_t id);
-int close_loopback(pktio_entry_t *pktio_entry);
-int recv_pkt_loopback(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
-                     unsigned len);
-int send_pkt_loopback(pktio_entry_t *pktio_entry, odp_packet_t pkt_tbl[],
-                     unsigned len);
-int mtu_get_loopback(pktio_entry_t *pktio_entry);
-int mac_addr_get_loopback(pktio_entry_t *pktio_entry, void *mac_addr);
-int promisc_mode_set_loopback(pktio_entry_t *pktio_entry, odp_bool_t enable);
-int promisc_mode_get_loopback(pktio_entry_t *pktio_entry);
-
-int mtu_get_sock_mmsg(pktio_entry_t *pktio_entry);
-
-int mtu_get_sock_mmap(pktio_entry_t *pktio_entry);
-
-int mac_addr_get_sock_mmsg(pktio_entry_t *pktio_entry, void *mac_addr);
-
-int mac_addr_get_sock_mmap(pktio_entry_t *pktio_entry, void *mac_addr);
-
-int promisc_mode_set_sock_mmsg(pktio_entry_t *pktio_entry, odp_bool_t enable);
-
-int promisc_mode_set_sock_mmap(pktio_entry_t *pktio_entry, odp_bool_t enable);
-
-int promisc_mode_get_sock_mmsg(pktio_entry_t *pktio_entry);
-
-int promisc_mode_get_sock_mmap(pktio_entry_t *pktio_entry);
+extern const pktio_if_ops_t sock_basic_pktio_ops;
+extern const pktio_if_ops_t sock_mmsg_pktio_ops;
+extern const pktio_if_ops_t sock_mmap_pktio_ops;
+extern const pktio_if_ops_t loopback_pktio_ops;
+extern const pktio_if_ops_t * const pktio_if_ops[ODP_PKTIO_TYPE_COUNT];
 
 #ifdef __cplusplus
 }
diff --git a/platform/linux-generic/include/odp_packet_socket.h 
b/platform/linux-generic/include/odp_packet_socket.h
index a031d35..5a3fd48 100644
--- a/platform/linux-generic/include/odp_packet_socket.h
+++ b/platform/linux-generic/include/odp_packet_socket.h
@@ -112,42 +112,4 @@ int promisc_mode_set_fd(int fd, const char *name, int 
enable);
  */
 int promisc_mode_get_fd(int fd, const char *name);
 
-/**
- * Open & configure a raw packet socket
- */
-int setup_pkt_sock(pkt_sock_t * const pkt_sock, const char *netdev,
-                  odp_pool_t pool);
-
-int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, const char *netdev,
-                       odp_pool_t pool, int fanout);
-
-/**
- * Close a packet socket
- */
-int close_pkt_sock(pkt_sock_t * const pkt_sock);
-
-int close_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock);
-
-/**
- * Receive packets from the packet socket
- */
-int recv_pkt_sock_basic(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
-                       unsigned len);
-
-int recv_pkt_sock_mmsg(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
-                      unsigned len);
-
-int recv_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len);
-/**
- * Send packets through the packet socket
- */
-int send_pkt_sock_basic(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
-                       unsigned len);
-
-int send_pkt_sock_mmsg(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
-                      unsigned len);
-
-int send_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len);
 #endif
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index c5e095e..3ff0b4c 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -186,37 +186,12 @@ static int free_pktio_entry(odp_pktio_t id)
        return 0;
 }
 
-static int init_socket(pktio_entry_t *entry, const char *dev,
-                      odp_pool_t pool)
-{
-       int fd = -1;
-
-       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP") == NULL) {
-               entry->s.type = ODP_PKTIO_TYPE_SOCKET_MMAP;
-               fd = setup_pkt_sock_mmap(&entry->s.pkt_sock_mmap, dev, pool, 1);
-       }
-
-       if (fd == -1 && getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG") == NULL) {
-               entry->s.type = ODP_PKTIO_TYPE_SOCKET_MMSG;
-               fd = setup_pkt_sock(&entry->s.pkt_sock, dev, pool);
-       }
-
-       if (fd == -1 && getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC") == NULL) {
-               entry->s.type = ODP_PKTIO_TYPE_SOCKET_BASIC;
-               fd = setup_pkt_sock(&entry->s.pkt_sock, dev, pool);
-       }
-
-       if (fd == -1)
-               return -1;
-
-       return 0;
-}
-
 static odp_pktio_t setup_pktio_entry(const char *dev, odp_pool_t pool)
 {
        odp_pktio_t id;
        pktio_entry_t *pktio_entry;
        int ret;
+       int pktio_if;
 
        if (strlen(dev) >= IF_NAMESIZE) {
                /* ioctl names limitation */
@@ -236,10 +211,12 @@ static odp_pktio_t setup_pktio_entry(const char *dev, 
odp_pool_t pool)
        if (!pktio_entry)
                return ODP_PKTIO_INVALID;
 
-       if (strcmp(dev, "loop") == 0)
-               ret = init_loopback(pktio_entry, id);
-       else
-               ret = init_socket(pktio_entry, dev, pool);
+       for (pktio_if = 1; pktio_if < ODP_PKTIO_TYPE_COUNT; ++pktio_if) {
+               ret = pktio_if_ops[pktio_if]->open(id, pktio_entry, dev, pool);
+
+               if (!ret)
+                       break;
+       }
 
        if (ret != 0) {
                unlock_entry_classifier(pktio_entry);
@@ -247,6 +224,7 @@ static odp_pktio_t setup_pktio_entry(const char *dev, 
odp_pool_t pool)
                id = ODP_PKTIO_INVALID;
                ODP_ERR("Unable to init any I/O type.\n");
        } else {
+               pktio_entry->s.type = pktio_if;
                snprintf(pktio_entry->s.name, IF_NAMESIZE, "%s", dev);
                unlock_entry_classifier(pktio_entry);
        }
@@ -285,20 +263,7 @@ int odp_pktio_close(odp_pktio_t id)
 
        lock_entry(entry);
        if (!is_free(entry)) {
-               switch (entry->s.type) {
-               case ODP_PKTIO_TYPE_SOCKET_BASIC:
-               case ODP_PKTIO_TYPE_SOCKET_MMSG:
-                       res  = close_pkt_sock(&entry->s.pkt_sock);
-                       break;
-               case ODP_PKTIO_TYPE_SOCKET_MMAP:
-                       res  = close_pkt_sock_mmap(&entry->s.pkt_sock_mmap);
-                       break;
-               case ODP_PKTIO_TYPE_LOOPBACK:
-                       res = close_loopback(entry);
-                       break;
-               default:
-                       break;
-               }
+               res = pktio_if_ops[entry->s.type]->close(entry);
                res |= free_pktio_entry(id);
        }
        unlock_entry(entry);
@@ -351,28 +316,10 @@ int odp_pktio_recv(odp_pktio_t id, odp_packet_t 
pkt_table[], int len)
                return -1;
 
        lock_entry(pktio_entry);
-       switch (pktio_entry->s.type) {
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-               pkts = recv_pkt_sock_basic(&pktio_entry->s.pkt_sock,
-                               pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               pkts = recv_pkt_sock_mmsg(&pktio_entry->s.pkt_sock,
-                               pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               pkts = recv_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
-                               pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               pkts = recv_pkt_loopback(pktio_entry, pkt_table, len);
-               break;
-       default:
-               pkts = -1;
-               break;
-       }
-
+       pkts = pktio_if_ops[pktio_entry->s.type]->recv(pktio_entry,
+                                                      pkt_table, len);
        unlock_entry(pktio_entry);
+
        if (pkts < 0)
                return pkts;
 
@@ -391,25 +338,8 @@ int odp_pktio_send(odp_pktio_t id, odp_packet_t 
pkt_table[], int len)
                return -1;
 
        lock_entry(pktio_entry);
-       switch (pktio_entry->s.type) {
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-               pkts = send_pkt_sock_basic(&pktio_entry->s.pkt_sock,
-                               pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               pkts = send_pkt_sock_mmsg(&pktio_entry->s.pkt_sock,
-                               pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               pkts = send_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
-                               pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               pkts = send_pkt_loopback(pktio_entry, pkt_table, len);
-               break;
-       default:
-               pkts = -1;
-       }
+       pkts = pktio_if_ops[pktio_entry->s.type]->send(pktio_entry,
+                                                      pkt_table, len);
        unlock_entry(pktio_entry);
 
        return pkts;
@@ -682,21 +612,7 @@ int odp_pktio_mtu(odp_pktio_t id)
                ODP_DBG("already freed pktio\n");
                return -1;
        }
-
-       switch (entry->s.type) {
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               ret = mtu_get_loopback(entry);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               ret = mtu_get_sock_mmsg(entry);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               ret = mtu_get_sock_mmap(entry);
-               break;
-       default:
-               ODP_ABORT("Wrong socket type %d\n", entry->s.type);
-       }
+       ret = pktio_if_ops[entry->s.type]->mtu_get(entry);
 
        unlock_entry(entry);
        return ret;
@@ -722,20 +638,7 @@ int odp_pktio_promisc_mode_set(odp_pktio_t id, odp_bool_t 
enable)
        }
 
        entry->s.promisc = enable;
-       switch (entry->s.type) {
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               ret = promisc_mode_set_loopback(entry, enable);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               ret = promisc_mode_set_sock_mmsg(entry, enable);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               ret = promisc_mode_set_sock_mmap(entry, enable);
-               break;
-       default:
-               ODP_ABORT("Wrong socket type %d\n", entry->s.type);
-       }
+       ret = pktio_if_ops[entry->s.type]->promisc_mode_set(entry, enable);
 
        unlock_entry(entry);
        return ret;
@@ -760,21 +663,7 @@ int odp_pktio_promisc_mode(odp_pktio_t id)
                return -1;
        }
 
-       switch (entry->s.type) {
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               ret = promisc_mode_get_loopback(entry);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               ret = promisc_mode_get_sock_mmsg(entry);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               ret = promisc_mode_get_sock_mmap(entry);
-               break;
-       default:
-               ODP_ABORT("Wrong socket type %d\n", entry->s.type);
-       }
-
+       ret = pktio_if_ops[entry->s.type]->promisc_mode_get(entry);
        unlock_entry(entry);
 
        return ret;
@@ -805,21 +694,7 @@ int odp_pktio_mac_addr(odp_pktio_t id, void *mac_addr, int 
addr_size)
                return -1;
        }
 
-       switch (entry->s.type) {
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               ret = mac_addr_get_sock_mmsg(entry, mac_addr);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               ret = mac_addr_get_sock_mmap(entry, mac_addr);
-               break;
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               ret = mac_addr_get_loopback(entry, mac_addr);
-               break;
-       default:
-               ODP_ABORT("Wrong socket type %d\n", entry->s.type);
-       }
-
+       ret = pktio_if_ops[entry->s.type]->mac_get(entry, mac_addr);
        unlock_entry(entry);
 
        return ret;
diff --git a/platform/linux-generic/odp_packet_io_ops.c 
b/platform/linux-generic/odp_packet_io_ops.c
new file mode 100644
index 0000000..b6e3663
--- /dev/null
+++ b/platform/linux-generic/odp_packet_io_ops.c
@@ -0,0 +1,14 @@
+/* Copyright (c) 2013, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <odp_packet_io_internal.h>
+
+const pktio_if_ops_t * const pktio_if_ops[ODP_PKTIO_TYPE_COUNT]  = {
+       [ODP_PKTIO_TYPE_LOOPBACK] = &loopback_pktio_ops,
+       [ODP_PKTIO_TYPE_SOCKET_MMAP] = &sock_mmap_pktio_ops,
+       [ODP_PKTIO_TYPE_SOCKET_MMSG] = &sock_mmsg_pktio_ops,
+       [ODP_PKTIO_TYPE_SOCKET_BASIC] = &sock_basic_pktio_ops,
+};
diff --git a/platform/linux-generic/odp_packet_loop.c 
b/platform/linux-generic/odp_packet_loop.c
index 307233e..0f9998c 100644
--- a/platform/linux-generic/odp_packet_loop.c
+++ b/platform/linux-generic/odp_packet_loop.c
@@ -24,8 +24,12 @@
 /* MAC address for the "loop" interface */
 static const char pktio_loop_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x01};
 
-int init_loopback(pktio_entry_t *pktio_entry, odp_pktio_t id)
+static int init_loopback(odp_pktio_t id, pktio_entry_t *pktio_entry,
+                        const char *devname, odp_pool_t pool ODP_UNUSED)
 {
+       if (strcmp(devname, "loop"))
+               return -1;
+
        char loopq_name[ODP_QUEUE_NAME_LEN];
 
        pktio_entry->s.type = ODP_PKTIO_TYPE_LOOPBACK;
@@ -40,13 +44,13 @@ int init_loopback(pktio_entry_t *pktio_entry, odp_pktio_t 
id)
        return 0;
 }
 
-int close_loopback(pktio_entry_t *pktio_entry)
+static int close_loopback(pktio_entry_t *pktio_entry)
 {
        return odp_queue_destroy(pktio_entry->s.loopq);
 }
 
-int recv_pkt_loopback(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
-                     unsigned len)
+static int recv_pkt_loopback(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
+                            unsigned len)
 {
        int nbr, i;
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
@@ -63,8 +67,8 @@ int recv_pkt_loopback(pktio_entry_t *pktio_entry, 
odp_packet_t pkts[],
        return nbr;
 }
 
-int send_pkt_loopback(pktio_entry_t *pktio_entry, odp_packet_t pkt_tbl[],
-                     unsigned len)
+static int send_pkt_loopback(pktio_entry_t *pktio_entry, odp_packet_t 
pkt_tbl[],
+                            unsigned len)
 {
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        queue_entry_t *qentry;
@@ -77,24 +81,36 @@ int send_pkt_loopback(pktio_entry_t *pktio_entry, 
odp_packet_t pkt_tbl[],
        return queue_enq_multi(qentry, hdr_tbl, len);
 }
 
-int mtu_get_loopback(pktio_entry_t *pktio_entry ODP_UNUSED)
+static int mtu_get_loopback(pktio_entry_t *pktio_entry ODP_UNUSED)
 {
        return PKTIO_LOOP_MTU;
 }
 
-int mac_addr_get_loopback(pktio_entry_t *pktio_entry ODP_UNUSED, void 
*mac_addr)
+static int mac_addr_get_loopback(pktio_entry_t *pktio_entry ODP_UNUSED,
+                                void *mac_addr)
 {
        memcpy(mac_addr, pktio_loop_mac, ETH_ALEN);
        return ETH_ALEN;
 }
 
-int promisc_mode_set_loopback(pktio_entry_t *pktio_entry ODP_UNUSED,
-                             odp_bool_t enable ODP_UNUSED)
+static int promisc_mode_set_loopback(pktio_entry_t *pktio_entry ODP_UNUSED,
+                                    odp_bool_t enable ODP_UNUSED)
 {
        return 0;
 }
 
-int promisc_mode_get_loopback(pktio_entry_t *pktio_entry)
+static int promisc_mode_get_loopback(pktio_entry_t *pktio_entry)
 {
        return pktio_entry->s.promisc ? 1 : 0;
 }
+
+const pktio_if_ops_t loopback_pktio_ops = {
+       .open = init_loopback,
+       .close = close_loopback,
+       .recv = recv_pkt_loopback,
+       .send = send_pkt_loopback,
+       .mtu_get = mtu_get_loopback,
+       .promisc_mode_set = promisc_mode_set_loopback,
+       .promisc_mode_get = promisc_mode_get_loopback,
+       .mac_get = mac_addr_get_loopback
+};
diff --git a/platform/linux-generic/odp_packet_socket.c 
b/platform/linux-generic/odp_packet_socket.c
index ac0e130..2d95ca9 100644
--- a/platform/linux-generic/odp_packet_socket.c
+++ b/platform/linux-generic/odp_packet_socket.c
@@ -160,8 +160,9 @@ int promisc_mode_get_fd(int fd, const char *name)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int close_pkt_sock(pkt_sock_t *const pkt_sock)
+static int close_pkt_sock(pktio_entry_t *pktio_entry)
 {
+       pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
        if (pkt_sock->sockfd != -1 && close(pkt_sock->sockfd) != 0) {
                __odp_errno = errno;
                ODP_ERR("close(sockfd): %s\n", strerror(errno));
@@ -175,14 +176,15 @@ int close_pkt_sock(pkt_sock_t *const pkt_sock)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int setup_pkt_sock(pkt_sock_t *const pkt_sock, const char *netdev,
-                  odp_pool_t pool)
+static int setup_pkt_sock(pktio_entry_t *pktio_entry, const char *netdev,
+                         odp_pool_t pool)
 {
        int sockfd;
        int err;
        unsigned int if_idx;
        struct ifreq ethreq;
        struct sockaddr_ll sa_ll;
+       pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
 
        if (pool == ODP_POOL_INVALID)
                return -1;
@@ -236,11 +238,11 @@ int setup_pkt_sock(pkt_sock_t *const pkt_sock, const char 
*netdev,
                goto error;
        }
 
-       return sockfd;
+       return 0;
 
 error:
        __odp_errno = errno;
-       close_pkt_sock(pkt_sock);
+       close_pkt_sock(pktio_entry);
 
        return -1;
 }
@@ -248,9 +250,34 @@ error:
 /*
  * ODP_PACKET_SOCKET_BASIC:
  */
-int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
-                       odp_packet_t pkt_table[], unsigned len)
+static int init_sock_basic(odp_pktio_t id ODP_UNUSED,
+                          pktio_entry_t *pktio_entry,
+                          const char *devname, odp_pool_t pool)
+{
+       if (getenv("ODP_PKTIO_DISABLE_SOCKET_BASIC"))
+               return -1;
+       return setup_pkt_sock(pktio_entry, devname, pool);
+}
+
+/*
+ * ODP_PACKET_SOCKET_MMSG:
+ */
+static int init_sock_mmsg(odp_pktio_t id ODP_UNUSED,
+                         pktio_entry_t *pktio_entry,
+                         const char *devname, odp_pool_t pool)
+{
+       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMSG"))
+               return -1;
+       return setup_pkt_sock(pktio_entry, devname, pool);
+}
+
+/*
+ * ODP_PACKET_SOCKET_BASIC:
+ */
+static int recv_pkt_sock_basic(pktio_entry_t *pktio_entry,
+                              odp_packet_t pkt_table[], unsigned len)
 {
+       pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
        ssize_t recv_bytes;
        unsigned i;
        struct sockaddr_ll sll;
@@ -306,9 +333,10 @@ int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
 /*
  * ODP_PACKET_SOCKET_BASIC:
  */
-int send_pkt_sock_basic(pkt_sock_t *const pkt_sock,
-                       odp_packet_t pkt_table[], unsigned len)
+static int send_pkt_sock_basic(pktio_entry_t *pktio_entry,
+                              odp_packet_t pkt_table[], unsigned len)
 {
+       pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
        odp_packet_t pkt;
        uint8_t *frame;
        uint32_t frame_len;
@@ -349,9 +377,10 @@ int send_pkt_sock_basic(pkt_sock_t *const pkt_sock,
 /*
  * ODP_PACKET_SOCKET_MMSG:
  */
-int recv_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len)
+static int recv_pkt_sock_mmsg(pktio_entry_t *pktio_entry,
+                             odp_packet_t pkt_table[], unsigned len)
 {
+       pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
        const int sockfd = pkt_sock->sockfd;
        int msgvec_len;
        struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_RX];
@@ -415,9 +444,10 @@ int recv_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
 /*
  * ODP_PACKET_SOCKET_MMSG:
  */
-int send_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len)
+static int send_pkt_sock_mmsg(pktio_entry_t *pktio_entry,
+                             odp_packet_t pkt_table[], unsigned len)
 {
+       pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
        struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_TX];
        struct iovec iovecs[ODP_PACKET_SOCKET_MAX_BURST_TX];
        int ret;
@@ -457,7 +487,7 @@ int send_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int mtu_get_sock_mmsg(pktio_entry_t *pktio_entry)
+static int mtu_get_sock_mmsg(pktio_entry_t *pktio_entry)
 {
        return mtu_get_fd(pktio_entry->s.pkt_sock.sockfd, pktio_entry->s.name);
 }
@@ -466,7 +496,8 @@ int mtu_get_sock_mmsg(pktio_entry_t *pktio_entry)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int mac_addr_get_sock_mmsg(pktio_entry_t *pktio_entry, void *mac_addr)
+static int mac_addr_get_sock_mmsg(pktio_entry_t *pktio_entry,
+                                 void *mac_addr)
 {
        memcpy(mac_addr, pktio_entry->s.pkt_sock.if_mac, ETH_ALEN);
        return ETH_ALEN;
@@ -476,7 +507,8 @@ int mac_addr_get_sock_mmsg(pktio_entry_t *pktio_entry, void 
*mac_addr)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int promisc_mode_set_sock_mmsg(pktio_entry_t *pktio_entry, odp_bool_t enable)
+static int promisc_mode_set_sock_mmsg(pktio_entry_t *pktio_entry,
+                                     odp_bool_t enable)
 {
        return promisc_mode_set_fd(pktio_entry->s.pkt_sock.sockfd,
                                   pktio_entry->s.name, enable);
@@ -486,8 +518,30 @@ int promisc_mode_set_sock_mmsg(pktio_entry_t *pktio_entry, 
odp_bool_t enable)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int promisc_mode_get_sock_mmsg(pktio_entry_t *pktio_entry)
+static int promisc_mode_get_sock_mmsg(pktio_entry_t *pktio_entry)
 {
        return promisc_mode_get_fd(pktio_entry->s.pkt_sock.sockfd,
                                   pktio_entry->s.name);
 }
+
+const pktio_if_ops_t sock_basic_pktio_ops = {
+       .open = init_sock_basic,
+       .close = close_pkt_sock,
+       .recv = recv_pkt_sock_basic,
+       .send = send_pkt_sock_basic,
+       .mtu_get = mtu_get_sock_mmsg,
+       .promisc_mode_set = promisc_mode_set_sock_mmsg,
+       .promisc_mode_get = promisc_mode_get_sock_mmsg,
+       .mac_get = mac_addr_get_sock_mmsg
+};
+
+const pktio_if_ops_t sock_mmsg_pktio_ops = {
+       .open = init_sock_mmsg,
+       .close = close_pkt_sock,
+       .recv = recv_pkt_sock_mmsg,
+       .send = send_pkt_sock_mmsg,
+       .mtu_get = mtu_get_sock_mmsg,
+       .promisc_mode_set = promisc_mode_set_sock_mmsg,
+       .promisc_mode_get = promisc_mode_get_sock_mmsg,
+       .mac_get = mac_addr_get_sock_mmsg
+};
diff --git a/platform/linux-generic/odp_packet_socket_mmap.c 
b/platform/linux-generic/odp_packet_socket_mmap.c
index 2f48800..94e041f 100644
--- a/platform/linux-generic/odp_packet_socket_mmap.c
+++ b/platform/linux-generic/odp_packet_socket_mmap.c
@@ -8,6 +8,7 @@
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
+#include <odp_packet_io_internal.h>
 
 #include <sys/socket.h>
 #include <stdio.h>
@@ -406,8 +407,10 @@ static int mmap_store_hw_addr(pkt_sock_mmap_t *const 
pkt_sock,
        return 0;
 }
 
-int close_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock)
+static int close_pkt_sock_mmap(pktio_entry_t *entry)
 {
+       pkt_sock_mmap_t *const pkt_sock = &entry->s.pkt_sock_mmap;
+
        mmap_unmap_sock(pkt_sock);
        if (pkt_sock->sockfd != -1 && close(pkt_sock->sockfd) != 0) {
                __odp_errno = errno;
@@ -418,12 +421,18 @@ int close_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock)
        return 0;
 }
 
-int setup_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock, const char *netdev,
-                       odp_pool_t pool, int fanout)
+static int open_pkt_sock_mmap(odp_pktio_t id ODP_UNUSED,
+                             pktio_entry_t *pktio_entry,
+                             const char *netdev, odp_pool_t pool)
 {
        int if_idx;
        int ret = 0;
 
+       if (getenv("ODP_PKTIO_DISABLE_SOCKET_MMAP"))
+               return -1;
+
+       pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap;
+       int fanout = 1;
        memset(pkt_sock, 0, sizeof(*pkt_sock));
 
        if (pool == ODP_POOL_INVALID)
@@ -473,48 +482,62 @@ int setup_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock, 
const char *netdev,
                        goto error;
        }
 
-       return pkt_sock->sockfd;
+       return 0;
 
 error:
-       close_pkt_sock_mmap(pkt_sock);
+       close_pkt_sock_mmap(pktio_entry);
        return -1;
 }
 
-int recv_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len)
+static int recv_pkt_sock_mmap(pktio_entry_t *pktio_entry,
+                             odp_packet_t pkt_table[], unsigned len)
 {
+       pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap;
        return pkt_mmap_v2_rx(pkt_sock->rx_ring.sock, &pkt_sock->rx_ring,
                              pkt_table, len, pkt_sock->pool,
                              pkt_sock->if_mac);
 }
 
-int send_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len)
+static int send_pkt_sock_mmap(pktio_entry_t *pktio_entry,
+                             odp_packet_t pkt_table[], unsigned len)
 {
+       pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap;
        return pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring,
                              pkt_table, len);
 }
 
-int mtu_get_sock_mmap(pktio_entry_t *pktio_entry)
+static int mtu_get_sock_mmap(pktio_entry_t *pktio_entry)
 {
        return mtu_get_fd(pktio_entry->s.pkt_sock_mmap.sockfd,
                          pktio_entry->s.name);
 }
 
-int mac_addr_get_sock_mmap(pktio_entry_t *pktio_entry, void *mac_addr)
+static int mac_addr_get_sock_mmap(pktio_entry_t *pktio_entry, void *mac_addr)
 {
        memcpy(mac_addr, pktio_entry->s.pkt_sock_mmap.if_mac, ETH_ALEN);
        return ETH_ALEN;
 }
 
-int promisc_mode_set_sock_mmap(pktio_entry_t *pktio_entry, odp_bool_t enable)
+static int promisc_mode_set_sock_mmap(pktio_entry_t *pktio_entry,
+                                     odp_bool_t enable)
 {
        return promisc_mode_set_fd(pktio_entry->s.pkt_sock_mmap.sockfd,
                                   pktio_entry->s.name, enable);
 }
 
-int promisc_mode_get_sock_mmap(pktio_entry_t *pktio_entry)
+static int promisc_mode_get_sock_mmap(pktio_entry_t *pktio_entry)
 {
        return promisc_mode_get_fd(pktio_entry->s.pkt_sock_mmap.sockfd,
                                   pktio_entry->s.name);
 }
+
+const pktio_if_ops_t sock_mmap_pktio_ops = {
+       .open = open_pkt_sock_mmap,
+       .close = close_pkt_sock_mmap,
+       .recv = recv_pkt_sock_mmap,
+       .send = send_pkt_sock_mmap,
+       .mtu_get = mtu_get_sock_mmap,
+       .promisc_mode_set = promisc_mode_set_sock_mmap,
+       .promisc_mode_get = promisc_mode_get_sock_mmap,
+       .mac_get = mac_addr_get_sock_mmap
+};
-- 
2.4.2.3.g8277175

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to