diff options
author | Maxim Uvarov <maxim.uvarov@linaro.org> | 2014-12-09 20:44:48 +0300 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2014-12-10 16:52:31 +0300 |
commit | 3b366191520817c1592c42006e13410229dc7207 (patch) | |
tree | dd62aa466cdbebe8f1e1f8943dd172678dde5873 /platform/linux-generic | |
parent | 52e18de38ab5bf9774753d5224de7ae3f161c21b (diff) |
linux-generic: odp_pktio_open loop support
Implement pktio device loop device suitable for testing.
Note: sometimes lo0 can not be used in case if you need
change / get mac, promisc, mtu for specific device.
Environment variable is added to bind loop to specific device, example:
export ODP_PKTIO_LOOPDEV=eth0
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Reviewed-by: Ciprian Barbu <ciprian.barbu@linaro.org>
Diffstat (limited to 'platform/linux-generic')
-rw-r--r-- | platform/linux-generic/odp_packet_io.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index de24e6f0b..96f2eb62f 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -22,6 +22,7 @@ #include <string.h> #include <sys/ioctl.h> #include <linux/if_arp.h> +#include <ifaddrs.h> static pktio_table_t *pktio_tbl; @@ -165,6 +166,37 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool) pktio_entry_t *pktio_entry; int res; int fanout = 1; + char loop[IFNAMSIZ] = {0}; + char *loop_hint; + + if (strlen(dev) >= IFNAMSIZ) { + /* ioctl names limitation */ + ODP_ERR("pktio name %s is too big, limit is %d bytes\n", + dev, IFNAMSIZ); + return ODP_PKTIO_INVALID; + } + + if (!strcmp(dev, "loop")) { + /* If hint with ODP_PKTIO_LOOPDEV is provided, use hint, + * if not try to find usable device. + */ + loop_hint = getenv("ODP_PKTIO_LOOPDEV"); + if (!loop_hint || (strlen(loop_hint) == 0)) { + ODP_ERR("Set loop with ODP_PKTIO_LOOPDEV=ethX\n"); + return ODP_PKTIO_INVALID; + } + + if (strlen(loop_hint) >= IFNAMSIZ) { + ODP_ERR("pktio name %s is too big, limit is %d bytes\n", + loop_hint, IFNAMSIZ); + return ODP_PKTIO_INVALID; + } + + memset(loop, 0, IFNAMSIZ); + memcpy(loop, loop_hint, strlen(loop_hint)); + dev = loop; + ODP_DBG("pktio using %s as loopback device\n", loop_hint); + } id = alloc_lock_pktio_entry(); if (id == ODP_PKTIO_INVALID) { |