aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic
diff options
context:
space:
mode:
authorMaxim Uvarov <maxim.uvarov@linaro.org>2014-12-09 20:44:48 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2014-12-10 16:52:31 +0300
commit3b366191520817c1592c42006e13410229dc7207 (patch)
treedd62aa466cdbebe8f1e1f8943dd172678dde5873 /platform/linux-generic
parent52e18de38ab5bf9774753d5224de7ae3f161c21b (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.c32
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) {