Add tap object implementation to the softnic.

Signed-off-by: Cristian Dumitrescu <cristian.dumitre...@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.si...@intel.com>
---
 drivers/net/softnic/Makefile                    |   1 +
 drivers/net/softnic/rte_eth_softnic.c           |   2 +
 drivers/net/softnic/rte_eth_softnic_internals.h |  29 ++++++
 drivers/net/softnic/rte_eth_softnic_tap.c       | 118 ++++++++++++++++++++++++
 4 files changed, 150 insertions(+)
 create mode 100644 drivers/net/softnic/rte_eth_softnic_tap.c

diff --git a/drivers/net/softnic/Makefile b/drivers/net/softnic/Makefile
index 9b33d81..82a2b72 100644
--- a/drivers/net/softnic/Makefile
+++ b/drivers/net/softnic/Makefile
@@ -26,6 +26,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += 
rte_eth_softnic_mempool.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_swq.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_link.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_tm.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_tap.c
 
 #
 # Export include files
diff --git a/drivers/net/softnic/rte_eth_softnic.c 
b/drivers/net/softnic/rte_eth_softnic.c
index 4f57c13..48332cd 100644
--- a/drivers/net/softnic/rte_eth_softnic.c
+++ b/drivers/net/softnic/rte_eth_softnic.c
@@ -225,6 +225,7 @@ pmd_init(struct pmd_params *params)
        mempool_init(p);
        swq_init(p);
        link_init(p);
+       tap_init(p);
 
        return p;
 }
@@ -235,6 +236,7 @@ pmd_free(struct pmd_internals *p)
        if (p == NULL)
                return;
 
+       tap_free(p);
        link_free(p);
        swq_free(p);
        mempool_free(p);
diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h 
b/drivers/net/softnic/rte_eth_softnic_internals.h
index 18074b7..48d7fc2 100644
--- a/drivers/net/softnic/rte_eth_softnic_internals.h
+++ b/drivers/net/softnic/rte_eth_softnic_internals.h
@@ -218,6 +218,17 @@ struct tm_internals {
 };
 
 /**
+ * TAP
+ */
+struct tap {
+       TAILQ_ENTRY(tap) node;
+       char name[NAME_SIZE];
+       int fd;
+};
+
+TAILQ_HEAD(tap_list, tap);
+
+/**
  * PMD Internals
  */
 struct pmd_internals {
@@ -232,6 +243,7 @@ struct pmd_internals {
        struct mempool_list mempool_list;
        struct swq_list swq_list;
        struct link_list link_list;
+       struct tap_list tap_list;
 };
 
 /**
@@ -311,4 +323,21 @@ tm_used(struct rte_eth_dev *dev __rte_unused)
        return 0;
 }
 
+/**
+ * TAP
+ */
+int
+tap_init(struct pmd_internals *p);
+
+void
+tap_free(struct pmd_internals *p);
+
+struct tap *
+tap_find(struct pmd_internals *p,
+       const char *name);
+
+struct tap *
+tap_create(struct pmd_internals *p,
+       const char *name);
+
 #endif /* __INCLUDE_RTE_ETH_SOFTNIC_INTERNALS_H__ */
diff --git a/drivers/net/softnic/rte_eth_softnic_tap.c 
b/drivers/net/softnic/rte_eth_softnic_tap.c
new file mode 100644
index 0000000..96771e8
--- /dev/null
+++ b/drivers/net/softnic/rte_eth_softnic_tap.c
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2018 Intel Corporation
+ */
+
+#include <netinet/in.h>
+#ifdef RTE_EXEC_ENV_LINUXAPP
+#include <linux/if.h>
+#include <linux/if_tun.h>
+#endif
+#include <sys/ioctl.h>
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <rte_string_fns.h>
+
+#include "rte_eth_softnic_internals.h"
+
+#define TAP_DEV                                            "/dev/net/tun"
+
+int
+tap_init(struct pmd_internals *p)
+{
+       TAILQ_INIT(&p->tap_list);
+
+       return 0;
+}
+
+void
+tap_free(struct pmd_internals *p)
+{
+       for ( ; ; ) {
+               struct tap *tap;
+
+               tap = TAILQ_FIRST(&p->tap_list);
+               if (tap == NULL)
+                       break;
+
+               TAILQ_REMOVE(&p->tap_list, tap, node);
+               free(tap);
+       }
+}
+
+struct tap *
+tap_find(struct pmd_internals *p,
+       const char *name)
+{
+       struct tap *tap;
+
+       if (name == NULL)
+               return NULL;
+
+       TAILQ_FOREACH(tap, &p->tap_list, node)
+               if (strcmp(tap->name, name) == 0)
+                       return tap;
+
+       return NULL;
+}
+
+#ifndef RTE_EXEC_ENV_LINUXAPP
+
+struct tap *
+tap_create(struct pmd_internals *p __rte_unused,
+       const char *name __rte_unused)
+{
+       return NULL;
+}
+
+#else
+
+struct tap *
+tap_create(struct pmd_internals *p,
+       const char *name)
+{
+       struct tap *tap;
+       struct ifreq ifr;
+       int fd, status;
+
+       /* Check input params */
+       if (name == NULL ||
+               tap_find(p, name))
+               return NULL;
+
+       /* Resource create */
+       fd = open(TAP_DEV, O_RDWR | O_NONBLOCK);
+       if (fd < 0)
+               return NULL;
+
+       memset(&ifr, 0, sizeof(ifr));
+       ifr.ifr_flags = IFF_TAP | IFF_NO_PI; /* No packet information */
+       snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);
+
+       status = ioctl(fd, TUNSETIFF, (void *)&ifr);
+       if (status < 0) {
+               close(fd);
+               return NULL;
+       }
+
+       /* Node allocation */
+       tap = calloc(1, sizeof(struct tap));
+       if (tap == NULL) {
+               close(fd);
+               return NULL;
+       }
+       /* Node fill in */
+       strlcpy(tap->name, name, sizeof(tap->name));
+       tap->fd = fd;
+
+       /* Node add to list */
+       TAILQ_INSERT_TAIL(&p->tap_list, tap, node);
+
+       return tap;
+}
+
+#endif
-- 
2.9.3

Reply via email to