[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[UNIKRAFT/LIBLWIP PATCH v3 01/16] plat/linuxu/tap: Introduce tap driver



Introduce a tap driver skeleton which implements the uknetdev
interface.

Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
---
 plat/drivers/tap/tap.c  | 216 ++++++++++++++++++++++++++++++++++++++++
 plat/linuxu/Config.uk   |   9 ++
 plat/linuxu/Makefile.uk |   8 ++
 3 files changed, 233 insertions(+)
 create mode 100644 plat/drivers/tap/tap.c

diff --git a/plat/drivers/tap/tap.c b/plat/drivers/tap/tap.c
new file mode 100644
index 00000000..4beb67bd
--- /dev/null
+++ b/plat/drivers/tap/tap.c
@@ -0,0 +1,216 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
+ *
+ * Copyright (c) 2020, NEC Europe Ltd., NEC Corporation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include <errno.h>
+#include <uk/alloc.h>
+#include <uk/arch/types.h>
+#include <uk/netdev_core.h>
+#include <uk/netdev_driver.h>
+#include <uk/netbuf.h>
+#include <uk/errptr.h>
+
+/**
+ * Module functions
+ */
+static int tap_netdev_xmit(struct uk_netdev *dev,
+                          struct uk_netdev_tx_queue *queue,
+                          struct uk_netbuf *pkt);
+static int tap_netdev_recv(struct uk_netdev *dev,
+                          struct uk_netdev_rx_queue *queue,
+                          struct uk_netbuf **pkt);
+static struct uk_netdev_rx_queue *tap_netdev_rxq_setup(struct uk_netdev *dev,
+                                       __u16 queue_id, __u16 nb_desc,
+                                       struct uk_netdev_rxqueue_conf *conf);
+static struct uk_netdev_tx_queue *tap_netdev_txq_setup(struct uk_netdev *dev,
+                                       __u16 queue_id, __u16 nb_desc,
+                                       struct uk_netdev_txqueue_conf *conf);
+static int tap_netdev_configure(struct uk_netdev *n,
+                               const struct uk_netdev_conf *conf);
+static int tap_netdev_start(struct uk_netdev *n);
+static const struct uk_hwaddr *tap_netdev_mac_get(struct uk_netdev *n);
+static int tap_netdev_mac_set(struct uk_netdev *n,
+                             const struct uk_hwaddr *hwaddr);
+static __u16 tap_netdev_mtu_get(struct uk_netdev *n);
+static int tap_netdev_mtu_set(struct uk_netdev *n,  __u16 mtu);
+static unsigned int tap_netdev_promisc_get(struct uk_netdev *n);
+static void tap_netdev_info_get(struct uk_netdev *dev,
+                               struct uk_netdev_info *dev_info);
+static int tap_netdev_rxq_info_get(struct uk_netdev *dev, __u16 queue_id,
+                                  struct uk_netdev_queue_info *qinfo);
+static int tap_netdev_txq_info_get(struct uk_netdev *dev, __u16 queue_id,
+                                  struct uk_netdev_queue_info *qinfo);
+
+/**
+ * Local function definitions
+ */
+
+static int tap_netdev_recv(struct uk_netdev *dev,
+                          struct uk_netdev_rx_queue *queue,
+                          struct uk_netbuf **pkt)
+{
+       int rc = -EINVAL;
+
+       UK_ASSERT(dev);
+       UK_ASSERT(queue && pkt);
+
+       return rc;
+}
+
+static int tap_netdev_xmit(struct uk_netdev *dev,
+                          struct uk_netdev_tx_queue *queue,
+                          struct uk_netbuf *pkt)
+{
+       int rc = -EINVAL;
+
+       UK_ASSERT(dev);
+       UK_ASSERT(queue && pkt);
+
+       return rc;
+}
+
+static int tap_netdev_txq_info_get(struct uk_netdev *dev __unused,
+                                  __u16 queue_id __unused,
+                                  struct uk_netdev_queue_info *qinfo __unused)
+{
+       return -EINVAL;
+}
+
+static int tap_netdev_rxq_info_get(struct uk_netdev *dev __unused,
+                                  __u16 queue_id __unused,
+                                  struct uk_netdev_queue_info *qinfo __unused)
+{
+       return -EINVAL;
+}
+
+static struct uk_netdev_rx_queue *tap_netdev_rxq_setup(struct uk_netdev *dev,
+                                                      __u16 queue_id __unused,
+                                                      __u16 nb_desc __unused,
+                                       struct uk_netdev_rxqueue_conf *conf)
+{
+       int rc = -EINVAL;
+       struct uk_netdev_rx_queue *rxq = NULL;
+
+       UK_ASSERT(dev && conf);
+
+       rxq = ERR2PTR(rc);
+       return rxq;
+}
+
+static struct uk_netdev_tx_queue *tap_netdev_txq_setup(struct uk_netdev *dev,
+                                                      __u16 queue_id __unused,
+                                                      __u16 nb_desc __unused,
+                                       struct uk_netdev_txqueue_conf *conf)
+{
+       int rc = -EINVAL;
+       struct uk_netdev_tx_queue *txq = NULL;
+
+       UK_ASSERT(dev && conf);
+
+       txq = ERR2PTR(rc);
+       return txq;
+}
+
+static int tap_netdev_start(struct uk_netdev *n)
+{
+       int rc = -EINVAL;
+
+       UK_ASSERT(n);
+       return rc;
+}
+
+static void tap_netdev_info_get(struct uk_netdev *dev __unused,
+                               struct uk_netdev_info *dev_info)
+{
+       UK_ASSERT(dev_info);
+}
+
+static unsigned int tap_netdev_promisc_get(struct uk_netdev *n)
+{
+
+       UK_ASSERT(n);
+
+       return 0;
+}
+
+static __u16 tap_netdev_mtu_get(struct uk_netdev *n)
+{
+       UK_ASSERT(n);
+       return 0;
+}
+
+static int tap_netdev_mtu_set(struct uk_netdev *n,  __u16 mtu __unused)
+{
+       int rc = -EINVAL;
+
+       UK_ASSERT(n);
+
+       return rc;
+}
+
+static const struct uk_hwaddr *tap_netdev_mac_get(struct uk_netdev *n)
+{
+       UK_ASSERT(n);
+       return NULL;
+}
+
+static int tap_netdev_mac_set(struct uk_netdev *n,
+                             const struct uk_hwaddr *hwaddr)
+{
+       int rc = -EINVAL;
+
+       UK_ASSERT(n && hwaddr);
+       return rc;
+}
+
+static int tap_netdev_configure(struct uk_netdev *n,
+                               const struct uk_netdev_conf *conf)
+{
+       int rc = -EINVAL;
+
+       UK_ASSERT(n && conf);
+       return rc;
+}
+
+static const struct uk_netdev_ops tap_netdev_ops = {
+       .configure = tap_netdev_configure,
+       .rxq_configure = tap_netdev_rxq_setup,
+       .txq_configure = tap_netdev_txq_setup,
+       .start = tap_netdev_start,
+       .info_get = tap_netdev_info_get,
+       .promiscuous_get = tap_netdev_promisc_get,
+       .hwaddr_get = tap_netdev_mac_get,
+       .hwaddr_set = tap_netdev_mac_set,
+       .mtu_get = tap_netdev_mtu_get,
+       .mtu_set = tap_netdev_mtu_set,
+       .txq_info_get = tap_netdev_txq_info_get,
+       .rxq_info_get = tap_netdev_rxq_info_get,
+};
diff --git a/plat/linuxu/Config.uk b/plat/linuxu/Config.uk
index d8c86d81..5df48f3f 100644
--- a/plat/linuxu/Config.uk
+++ b/plat/linuxu/Config.uk
@@ -17,4 +17,13 @@ if (PLAT_LINUXU)
                changed by using linuxu.heap_size as a command line argument. 
For more
                information refer to "Command line arguments in Unikraft" 
sections in 
                the developers guide
+
+       config TAP_NET
+       bool "Tap driver"
+       default y if LIBUKNETDEV
+       depends on LIBUKNETDEV
+       help
+               Enable drivers to support tap device on the linuxu platform. The
+               driver implements the uknetdev interface and provides an 
interface
+               for the network stack to send/receive network packets.
 endif
diff --git a/plat/linuxu/Makefile.uk b/plat/linuxu/Makefile.uk
index 94516acd..0850fd99 100644
--- a/plat/linuxu/Makefile.uk
+++ b/plat/linuxu/Makefile.uk
@@ -7,6 +7,7 @@ $(eval $(call addplat_s,linuxu,$(CONFIG_PLAT_LINUXU)))
 ## Linux user platform library registration
 ##
 $(eval $(call addplatlib,linuxu,liblinuxuplat))
+$(eval $(call addplatlib_s,linuxu,liblinuxutapnet,$(CONFIG_TAP_NET)))
 
 ## Adding libparam for the linuxu platform
 $(eval $(call addlib_paramprefix,liblinuxuplat,linuxu))
@@ -46,3 +47,10 @@ LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_X86_64) += \
                        $(LIBLINUXUPLAT_BASE)/x86/link64.lds.S
 LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += \
                        $(LIBLINUXUPLAT_BASE)/arm/link.lds.S
+
+##
+## LINUXUTAPNET Source
+LIBLINUXUTAPNET_ASINCLUED-y         += -I$(LIBLINUXUPLAT_BASE)/include
+LIBLINUXUTAPNET_CINCLUDES-y         += -I$(LIBLINUXUPLAT_BASE)/include
+
+LIBLINUXUTAPNET_SRCS-y           += $(UK_PLAT_DRIVERS_BASE)/tap/tap.c
-- 
2.20.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.