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
