[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



 


Rackspace

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