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
order from the global pktio_if_ops struct and by stopping on the
first successful order.

As a result odp_pktio_type_t has been removed, and implementation can
be extended by just adding a new pktio_if_opts_t structure to pktio_if_opts

Signed-off-by: ClĂ©ment Leger <[email protected]>
Signed-off-by: Nicolas Morey-Chaisemartin <[email protected]>
---
 platform/linux-generic/Makefile.am                 |   1 +
 .../linux-generic/include/odp_packet_io_internal.h |  58 +++-----
 platform/linux-generic/include/odp_packet_socket.h |  38 -----
 platform/linux-generic/odp_packet_io.c             | 162 +++------------------
 platform/linux-generic/pktio/io_ops.c              |  19 +++
 platform/linux-generic/pktio/loop.c                |  39 +++--
 platform/linux-generic/pktio/socket.c              |  92 +++++++++---
 platform/linux-generic/pktio/socket_mmap.c         |  49 +++++--
 8 files changed, 194 insertions(+), 264 deletions(-)
 create mode 100644 platform/linux-generic/pktio/io_ops.c

diff --git a/platform/linux-generic/Makefile.am 
b/platform/linux-generic/Makefile.am
index 26492c0..4ee781c 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -140,6 +140,7 @@ __LIB__libodp_la_SOURCES = \
                           odp_packet.c \
                           odp_packet_flags.c \
                           odp_packet_io.c \
+                          pktio/io_ops.c \
                           pktio/loop.c \
                           pktio/socket.c \
                           pktio/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 76c8e8e..ea09ab8 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -28,17 +28,11 @@ extern "C" {
 #include <odp/hints.h>
 #include <net/if.h>
 
-/**
- * Packet IO types
- */
-typedef enum {
-       ODP_PKTIO_TYPE_SOCKET_BASIC = 0x1,
-       ODP_PKTIO_TYPE_SOCKET_MMSG,
-       ODP_PKTIO_TYPE_SOCKET_MMAP,
-       ODP_PKTIO_TYPE_LOOPBACK,
-} odp_pktio_type_t;
+/* Forward declaration */
+struct pktio_if_ops;
 
 struct pktio_entry {
+       const struct pktio_if_ops *ops; /**< Implementation specific methods */
        odp_spinlock_t lock;            /**< entry spinlock */
        int taken;                      /**< is entry taken(1) or free(0) */
        int cls_enabled;                /**< is classifier enabled */
@@ -46,7 +40,6 @@ struct pktio_entry {
        odp_queue_t inq_default;        /**< default input queue, if set */
        odp_queue_t outq_default;       /**< default out queue */
        odp_queue_t loopq;              /**< loopback queue for "loop" device */
-       odp_pktio_type_t type;          /**< pktio type */
        pkt_sock_t pkt_sock;            /**< using socket API for IO */
        pkt_sock_mmap_t pkt_sock_mmap;  /**< using socket mmap API for IO */
        classifier_t cls;               /**< classifier linked with this pktio*/
@@ -65,6 +58,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 +95,11 @@ static inline pktio_entry_t *get_pktio_entry(odp_pktio_t 
pktio)
 
 int pktin_poll(pktio_entry_t *entry);
 
-int loopback_init(pktio_entry_t *pktio_entry, odp_pktio_t id);
-int loopback_close(pktio_entry_t *pktio_entry);
-int loopback_recv_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
-                     unsigned len);
-int loopback_send_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkt_tbl[],
-                     unsigned len);
-int loopback_mtu_get(pktio_entry_t *pktio_entry);
-int loopback_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr);
-int loopback_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable);
-int loopback_promisc_mode_get(pktio_entry_t *pktio_entry);
-
-int sock_mtu_get(pktio_entry_t *pktio_entry);
-
-int sock_mmap_mtu_get(pktio_entry_t *pktio_entry);
-
-int sock_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr);
-
-int sock_mmap_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr);
-
-int sock_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable);
-
-int sock_mmap_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable);
-
-int sock_promisc_mode_get(pktio_entry_t *pktio_entry);
-
-int sock_mmap_promisc_mode_get(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[];
 
 #ifdef __cplusplus
 }
diff --git a/platform/linux-generic/include/odp_packet_socket.h 
b/platform/linux-generic/include/odp_packet_socket.h
index 137da07..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 sock_setup_pkt(pkt_sock_t * const pkt_sock, const char *netdev,
-                  odp_pool_t pool);
-
-int sock_mmap_setup_pkt(pkt_sock_mmap_t * const pkt_sock, const char *netdev,
-                       odp_pool_t pool, int fanout);
-
-/**
- * Close a packet socket
- */
-int sock_close_pkt(pkt_sock_t * const pkt_sock);
-
-int sock_mmap_close_pkt(pkt_sock_mmap_t * const pkt_sock);
-
-/**
- * Receive packets from the packet socket
- */
-int sock_basic_recv_pkt(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
-                       unsigned len);
-
-int sock_mmsg_recv_pkt(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
-                      unsigned len);
-
-int sock_mmap_recv_pkt(pkt_sock_mmap_t * const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len);
-/**
- * Send packets through the packet socket
- */
-int sock_basic_send_pkt(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
-                       unsigned len);
-
-int sock_mmsg_send_pkt(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
-                      unsigned len);
-
-int sock_mmap_send_pkt(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 669bea8..e8bb6c6 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 sock_init(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 = sock_mmap_setup_pkt(&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 = sock_setup_pkt(&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 = sock_setup_pkt(&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 ret = -1;
+       int pktio_if;
 
        if (strlen(dev) >= IF_NAMESIZE) {
                /* ioctl names limitation */
@@ -236,10 +211,14 @@ 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 = loopback_init(pktio_entry, id);
-       else
-               ret = sock_init(pktio_entry, dev, pool);
+       for (pktio_if = 0; pktio_if_ops[pktio_if]; ++pktio_if) {
+               ret = pktio_if_ops[pktio_if]->open(id, pktio_entry, dev, pool);
+
+               if (!ret) {
+                       pktio_entry->s.ops = pktio_if_ops[pktio_if];
+                       break;
+               }
+       }
 
        if (ret != 0) {
                unlock_entry_classifier(pktio_entry);
@@ -285,20 +264,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  = sock_close_pkt(&entry->s.pkt_sock);
-                       break;
-               case ODP_PKTIO_TYPE_SOCKET_MMAP:
-                       res  = sock_mmap_close_pkt(&entry->s.pkt_sock_mmap);
-                       break;
-               case ODP_PKTIO_TYPE_LOOPBACK:
-                       res = loopback_close(entry);
-                       break;
-               default:
-                       break;
-               }
+               res = entry->s.ops->close(entry);
                res |= free_pktio_entry(id);
        }
        unlock_entry(entry);
@@ -351,28 +317,9 @@ 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 = sock_basic_recv_pkt(&pktio_entry->s.pkt_sock,
-                                          pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               pkts = sock_mmsg_recv_pkt(&pktio_entry->s.pkt_sock,
-                                         pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               pkts = sock_mmap_recv_pkt(&pktio_entry->s.pkt_sock_mmap,
-                                         pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               pkts = loopback_recv_pkt(pktio_entry, pkt_table, len);
-               break;
-       default:
-               pkts = -1;
-               break;
-       }
-
+       pkts = pktio_entry->s.ops->recv(pktio_entry, pkt_table, len);
        unlock_entry(pktio_entry);
+
        if (pkts < 0)
                return pkts;
 
@@ -391,25 +338,7 @@ 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 = sock_basic_send_pkt(&pktio_entry->s.pkt_sock,
-                                          pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               pkts = sock_mmsg_send_pkt(&pktio_entry->s.pkt_sock,
-                                         pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               pkts = sock_mmap_send_pkt(&pktio_entry->s.pkt_sock_mmap,
-                                         pkt_table, len);
-               break;
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               pkts = loopback_send_pkt(pktio_entry, pkt_table, len);
-               break;
-       default:
-               pkts = -1;
-       }
+       pkts = pktio_entry->s.ops->send(pktio_entry, pkt_table, len);
        unlock_entry(pktio_entry);
 
        return pkts;
@@ -682,21 +611,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 = loopback_mtu_get(entry);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               ret = sock_mtu_get(entry);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               ret = sock_mmap_mtu_get(entry);
-               break;
-       default:
-               ODP_ABORT("Wrong socket type %d\n", entry->s.type);
-       }
+       ret = entry->s.ops->mtu_get(entry);
 
        unlock_entry(entry);
        return ret;
@@ -721,20 +636,7 @@ int odp_pktio_promisc_mode_set(odp_pktio_t id, odp_bool_t 
enable)
                return -1;
        }
 
-       switch (entry->s.type) {
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               ret = loopback_promisc_mode_set(entry, enable);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               ret = sock_promisc_mode_set(entry, enable);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               ret = sock_mmap_promisc_mode_set(entry, enable);
-               break;
-       default:
-               ODP_ABORT("Wrong socket type %d\n", entry->s.type);
-       }
+       ret = entry->s.ops->promisc_mode_set(entry, enable);
 
        unlock_entry(entry);
        return ret;
@@ -759,21 +661,7 @@ int odp_pktio_promisc_mode(odp_pktio_t id)
                return -1;
        }
 
-       switch (entry->s.type) {
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               ret = loopback_promisc_mode_get(entry);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_BASIC:
-       case ODP_PKTIO_TYPE_SOCKET_MMSG:
-               ret = sock_promisc_mode_get(entry);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               ret = sock_mmap_promisc_mode_get(entry);
-               break;
-       default:
-               ODP_ABORT("Wrong socket type %d\n", entry->s.type);
-       }
-
+       ret = entry->s.ops->promisc_mode_get(entry);
        unlock_entry(entry);
 
        return ret;
@@ -804,21 +692,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 = sock_mac_addr_get(entry, mac_addr);
-               break;
-       case ODP_PKTIO_TYPE_SOCKET_MMAP:
-               ret = sock_mmap_mac_addr_get(entry, mac_addr);
-               break;
-       case ODP_PKTIO_TYPE_LOOPBACK:
-               ret = loopback_mac_addr_get(entry, mac_addr);
-               break;
-       default:
-               ODP_ABORT("Wrong socket type %d\n", entry->s.type);
-       }
-
+       ret = entry->s.ops->mac_get(entry, mac_addr);
        unlock_entry(entry);
 
        return ret;
diff --git a/platform/linux-generic/pktio/io_ops.c 
b/platform/linux-generic/pktio/io_ops.c
new file mode 100644
index 0000000..6cd3d00
--- /dev/null
+++ b/platform/linux-generic/pktio/io_ops.c
@@ -0,0 +1,19 @@
+/* Copyright (c) 2013, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <odp_packet_io_internal.h>
+
+/* Ops for all implementation of pktio.
+ * Order matters. The first implementation to setup successfully
+ * will be picked.
+ * Array must be NULL terminated */
+const pktio_if_ops_t * const pktio_if_ops[]  = {
+       &loopback_pktio_ops,
+       &sock_mmap_pktio_ops,
+       &sock_mmsg_pktio_ops,
+       &sock_basic_pktio_ops,
+       NULL
+};
diff --git a/platform/linux-generic/pktio/loop.c 
b/platform/linux-generic/pktio/loop.c
index 421b3c4..a9bbb01 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -24,11 +24,14 @@
 /* MAC address for the "loop" interface */
 static const char pktio_loop_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x01};
 
-int loopback_init(pktio_entry_t *pktio_entry, odp_pktio_t id)
+static int loopback_init(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;
        snprintf(loopq_name, sizeof(loopq_name), "%" PRIu64 "-pktio_loopq",
                 odp_pktio_to_u64(id));
        pktio_entry->s.loopq = odp_queue_create(loopq_name,
@@ -40,13 +43,13 @@ int loopback_init(pktio_entry_t *pktio_entry, odp_pktio_t 
id)
        return 0;
 }
 
-int loopback_close(pktio_entry_t *pktio_entry)
+static int loopback_close(pktio_entry_t *pktio_entry)
 {
        return odp_queue_destroy(pktio_entry->s.loopq);
 }
 
-int loopback_recv_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
-                     unsigned len)
+static int loopback_recv_pkt(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 +66,8 @@ int loopback_recv_pkt(pktio_entry_t *pktio_entry, 
odp_packet_t pkts[],
        return nbr;
 }
 
-int loopback_send_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkt_tbl[],
-                     unsigned len)
+static int loopback_send_pkt(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,25 +80,37 @@ int loopback_send_pkt(pktio_entry_t *pktio_entry, 
odp_packet_t pkt_tbl[],
        return queue_enq_multi(qentry, hdr_tbl, len);
 }
 
-int loopback_mtu_get(pktio_entry_t *pktio_entry ODP_UNUSED)
+static int loopback_mtu_get(pktio_entry_t *pktio_entry ODP_UNUSED)
 {
        return PKTIO_LOOP_MTU;
 }
 
-int loopback_mac_addr_get(pktio_entry_t *pktio_entry ODP_UNUSED, void 
*mac_addr)
+static int loopback_mac_addr_get(pktio_entry_t *pktio_entry ODP_UNUSED,
+                                void *mac_addr)
 {
        memcpy(mac_addr, pktio_loop_mac, ETH_ALEN);
        return ETH_ALEN;
 }
 
-int loopback_promisc_mode_set(pktio_entry_t *pktio_entry,
-                             odp_bool_t enable ODP_UNUSED)
+static int loopback_promisc_mode_set(pktio_entry_t *pktio_entry,
+                                    odp_bool_t enable)
 {
        pktio_entry->s.promisc = enable;
        return 0;
 }
 
-int loopback_promisc_mode_get(pktio_entry_t *pktio_entry)
+static int loopback_promisc_mode_get(pktio_entry_t *pktio_entry)
 {
        return pktio_entry->s.promisc ? 1 : 0;
 }
+
+const pktio_if_ops_t loopback_pktio_ops = {
+       .open = loopback_init,
+       .close = loopback_close,
+       .recv = loopback_recv_pkt,
+       .send = loopback_send_pkt,
+       .mtu_get = loopback_mtu_get,
+       .promisc_mode_set = loopback_promisc_mode_set,
+       .promisc_mode_get = loopback_promisc_mode_get,
+       .mac_get = loopback_mac_addr_get
+};
diff --git a/platform/linux-generic/pktio/socket.c 
b/platform/linux-generic/pktio/socket.c
index aaa2c99..b9ccd2d 100644
--- a/platform/linux-generic/pktio/socket.c
+++ b/platform/linux-generic/pktio/socket.c
@@ -161,12 +161,9 @@ int promisc_mode_get_fd(int fd, const char *name)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-/*
- * ODP_PACKET_SOCKET_BASIC:
- * ODP_PACKET_SOCKET_MMSG:
- */
-int sock_close_pkt(pkt_sock_t *const pkt_sock)
+static int sock_close_pkt(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));
@@ -180,14 +177,15 @@ int sock_close_pkt(pkt_sock_t *const pkt_sock)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int sock_setup_pkt(pkt_sock_t *const pkt_sock, const char *netdev,
-                  odp_pool_t pool)
+static int sock_setup_pkt(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;
@@ -241,11 +239,11 @@ int sock_setup_pkt(pkt_sock_t *const pkt_sock, const char 
*netdev,
                goto error;
        }
 
-       return sockfd;
+       return 0;
 
 error:
        __odp_errno = errno;
-       sock_close_pkt(pkt_sock);
+       sock_close_pkt(pktio_entry);
 
        return -1;
 }
@@ -253,9 +251,34 @@ error:
 /*
  * ODP_PACKET_SOCKET_BASIC:
  */
-int sock_basic_recv_pkt(pkt_sock_t *const pkt_sock,
-                       odp_packet_t pkt_table[], unsigned len)
+static int sock_basic_init(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 sock_setup_pkt(pktio_entry, devname, pool);
+}
+
+/*
+ * ODP_PACKET_SOCKET_MMSG:
+ */
+static int sock_mmsg_init(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 sock_setup_pkt(pktio_entry, devname, pool);
+}
+
+/*
+ * ODP_PACKET_SOCKET_BASIC:
+ */
+static int sock_basic_recv_pkt(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;
@@ -311,9 +334,10 @@ int sock_basic_recv_pkt(pkt_sock_t *const pkt_sock,
 /*
  * ODP_PACKET_SOCKET_BASIC:
  */
-int sock_basic_send_pkt(pkt_sock_t *const pkt_sock,
-                       odp_packet_t pkt_table[], unsigned len)
+static int sock_basic_send_pkt(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;
@@ -354,9 +378,10 @@ int sock_basic_send_pkt(pkt_sock_t *const pkt_sock,
 /*
  * ODP_PACKET_SOCKET_MMSG:
  */
-int sock_mmsg_recv_pkt(pkt_sock_t *const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len)
+static int sock_mmsg_recv_pkt(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];
@@ -420,9 +445,10 @@ int sock_mmsg_recv_pkt(pkt_sock_t *const pkt_sock,
 /*
  * ODP_PACKET_SOCKET_MMSG:
  */
-int sock_mmsg_send_pkt(pkt_sock_t *const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len)
+static int sock_mmsg_send_pkt(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;
@@ -463,7 +489,7 @@ int sock_mmsg_send_pkt(pkt_sock_t *const pkt_sock,
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int sock_mtu_get(pktio_entry_t *pktio_entry)
+static int sock_mtu_get(pktio_entry_t *pktio_entry)
 {
        return mtu_get_fd(pktio_entry->s.pkt_sock.sockfd, pktio_entry->s.name);
 }
@@ -472,7 +498,8 @@ int sock_mtu_get(pktio_entry_t *pktio_entry)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int sock_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr)
+static int sock_mac_addr_get(pktio_entry_t *pktio_entry,
+                            void *mac_addr)
 {
        memcpy(mac_addr, pktio_entry->s.pkt_sock.if_mac, ETH_ALEN);
        return ETH_ALEN;
@@ -482,7 +509,8 @@ int sock_mac_addr_get(pktio_entry_t *pktio_entry, void 
*mac_addr)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int sock_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable)
+static int sock_promisc_mode_set(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);
@@ -492,8 +520,30 @@ int sock_promisc_mode_set(pktio_entry_t *pktio_entry, 
odp_bool_t enable)
  * ODP_PACKET_SOCKET_BASIC:
  * ODP_PACKET_SOCKET_MMSG:
  */
-int sock_promisc_mode_get(pktio_entry_t *pktio_entry)
+static int sock_promisc_mode_get(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 = sock_basic_init,
+       .close = sock_close_pkt,
+       .recv = sock_basic_recv_pkt,
+       .send = sock_basic_send_pkt,
+       .mtu_get = sock_mtu_get,
+       .promisc_mode_set = sock_promisc_mode_set,
+       .promisc_mode_get = sock_promisc_mode_get,
+       .mac_get = sock_mac_addr_get
+};
+
+const pktio_if_ops_t sock_mmsg_pktio_ops = {
+       .open = sock_mmsg_init,
+       .close = sock_close_pkt,
+       .recv = sock_mmsg_recv_pkt,
+       .send = sock_mmsg_send_pkt,
+       .mtu_get = sock_mtu_get,
+       .promisc_mode_set = sock_promisc_mode_set,
+       .promisc_mode_get = sock_promisc_mode_get,
+       .mac_get = sock_mac_addr_get
+};
diff --git a/platform/linux-generic/pktio/socket_mmap.c 
b/platform/linux-generic/pktio/socket_mmap.c
index ae2602f..fe25d37 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/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 sock_mmap_close_pkt(pkt_sock_mmap_t *const pkt_sock)
+static int sock_mmap_close_pkt(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 sock_mmap_close_pkt(pkt_sock_mmap_t *const pkt_sock)
        return 0;
 }
 
-int sock_mmap_setup_pkt(pkt_sock_mmap_t *const pkt_sock, const char *netdev,
-                       odp_pool_t pool, int fanout)
+static int sock_mmap_open_pkt(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 sock_mmap_setup_pkt(pkt_sock_mmap_t *const pkt_sock, 
const char *netdev,
                        goto error;
        }
 
-       return pkt_sock->sockfd;
+       return 0;
 
 error:
-       sock_mmap_close_pkt(pkt_sock);
+       sock_mmap_close_pkt(pktio_entry);
        return -1;
 }
 
-int sock_mmap_recv_pkt(pkt_sock_mmap_t *const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len)
+static int sock_mmap_recv_pkt(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 sock_mmap_send_pkt(pkt_sock_mmap_t *const pkt_sock,
-                      odp_packet_t pkt_table[], unsigned len)
+static int sock_mmap_send_pkt(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 sock_mmap_mtu_get(pktio_entry_t *pktio_entry)
+static int sock_mmap_mtu_get(pktio_entry_t *pktio_entry)
 {
        return mtu_get_fd(pktio_entry->s.pkt_sock_mmap.sockfd,
                          pktio_entry->s.name);
 }
 
-int sock_mmap_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr)
+static int sock_mmap_mac_addr_get(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 sock_mmap_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable)
+static int sock_mmap_promisc_mode_set(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 sock_mmap_promisc_mode_get(pktio_entry_t *pktio_entry)
+static int sock_mmap_promisc_mode_get(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 = sock_mmap_open_pkt,
+       .close = sock_mmap_close_pkt,
+       .recv = sock_mmap_recv_pkt,
+       .send = sock_mmap_send_pkt,
+       .mtu_get = sock_mmap_mtu_get,
+       .promisc_mode_set = sock_mmap_promisc_mode_set,
+       .promisc_mode_get = sock_mmap_promisc_mode_get,
+       .mac_get = sock_mmap_mac_addr_get
+};
-- 
2.4.5.3.g4915f6f


_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to