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