[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [UNIKRAFT PATCH v2 01/15] plat/linuxu/tap: Introduce tap driver
Hi Sharan, looks good to me, small nitpick in the copyright header (inline). regards, Hugo On Tue, 2020-06-30 at 11:58 +0200, Sharan Santhanam wrote: > Introduce a tap driver skeleton which implements the uknetdev > interface. > > Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx> > --- > plat/drivers/tap/tap.c | 217 > ++++++++++++++++++++++++++++++++++++++++++++++++ > plat/linuxu/Config.uk | 9 ++ > plat/linuxu/Makefile.uk | 8 ++ > 3 files changed, 234 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 0000000..9bbf7dd > --- /dev/null > +++ b/plat/drivers/tap/tap.c > @@ -0,0 +1,217 @@ > +/* SPDX-License-Identifier: BSD-3-Clause */ > +/* > + * Authors: Sharan Santhanam <sharan.santhanam@xxxxxxxxx> > + * > + * Copyright (c) 2019, 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. > + * > + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. I think that the last line should be removed. > + */ > +#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 d8c86d8..5df48f3 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 94516ac..0850fd9 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |