[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [UNIKRAFT PATCH v4 04/12] plat/xen/drivers/net: Configure netfront device
Hi Sharan, Please see inline. On 10/22/20 2:00 PM, Sharan Santhanam wrote: > Hello Costin, > > Please find some minor comments inline: > > Thanks & Regards > > Sharan > > On 8/13/20 10:53 AM, Costin Lupu wrote: >> The information needed for configuring netfront devices is in the >> Xenstore. For >> now, we only retrieve the MAC and IP addresses from there in order to >> initialize the device. >> >> This patch introduces the `netfront_dev` structure which integrates >> both netdev >> and Xenbus device information and also keeps the configuration >> parameters. >> >> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> >> Signed-off-by: Razvan Cojocaru <razvan.cojocaru93@xxxxxxxxx> >> --- >> plat/xen/Makefile.uk | 1 + >> plat/xen/drivers/net/netfront.c | 100 ++++++++++++++ >> plat/xen/drivers/net/netfront.h | 66 ++++++++++ >> plat/xen/drivers/net/netfront_xb.h | 43 ++++++ >> plat/xen/drivers/net/netfront_xs.c | 205 +++++++++++++++++++++++++++++ >> 5 files changed, 415 insertions(+) >> create mode 100644 plat/xen/drivers/net/netfront.h >> create mode 100644 plat/xen/drivers/net/netfront_xb.h >> create mode 100644 plat/xen/drivers/net/netfront_xs.c >> >> diff --git a/plat/xen/Makefile.uk b/plat/xen/Makefile.uk >> index 339b1b21..dfca58fe 100644 >> --- a/plat/xen/Makefile.uk >> +++ b/plat/xen/Makefile.uk >> @@ -121,6 +121,7 @@ LIBXENNETFRONT_ASINCLUDES-y += >> $(LIBXENPLAT_ASINCLUDES-y) >> LIBXENNETFRONT_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y) >> LIBXENNETFRONT_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y) >> LIBXENNETFRONT_SRCS-y += >> $(LIBXENPLAT_BASE)/drivers/net/netfront.c >> +LIBXENNETFRONT_SRCS-y += >> $(LIBXENPLAT_BASE)/drivers/net/netfront_xs.c >> endif >> ifeq ($(CONFIG_XEN_BLKFRONT),y) >> diff --git a/plat/xen/drivers/net/netfront.c >> b/plat/xen/drivers/net/netfront.c >> index b455911e..539e1cbc 100644 >> --- a/plat/xen/drivers/net/netfront.c >> +++ b/plat/xen/drivers/net/netfront.c >> @@ -33,21 +33,121 @@ >> * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. >> */ >> +#include <uk/assert.h> >> +#include <uk/print.h> >> +#include <uk/alloc.h> >> +#include <uk/netdev_driver.h> >> #include <xenbus/xenbus.h> >> +#include "netfront.h" >> +#include "netfront_xb.h" >> #define DRIVER_NAME "xen-netfront" >> +#define to_netfront_dev(dev) \ >> + __containerof(dev, struct netfront_dev, netdev) >> + >> static struct uk_alloc *drv_allocator; >> +static const void *netfront_einfo_get(struct uk_netdev *n, >> + enum uk_netdev_einfo_type einfo_type) >> +{ >> + struct netfront_dev *nfdev; >> + >> + UK_ASSERT(n != NULL); >> + >> + nfdev = to_netfront_dev(n); >> + switch (einfo_type) { >> + case UK_NETDEV_IPV4_ADDR_STR: >> + return nfdev->econf.ipv4addr; >> + case UK_NETDEV_IPV4_MASK_STR: >> + return nfdev->econf.ipv4mask; >> + case UK_NETDEV_IPV4_GW_STR: >> + return nfdev->econf.ipv4gw; >> + default: >> + break; >> + } >> + >> + /* type not supported */ >> + return NULL; >> +} >> + >> +static const struct uk_hwaddr *netfront_mac_get(struct uk_netdev *n) >> +{ >> + struct netfront_dev *nfdev; >> + >> + UK_ASSERT(n != NULL); >> + nfdev = to_netfront_dev(n); >> + return &nfdev->hw_addr; >> +} >> + >> +static uint16_t netfront_mtu_get(struct uk_netdev *n) >> +{ >> + struct netfront_dev *nfdev; >> + >> + UK_ASSERT(n != NULL); >> + nfdev = to_netfront_dev(n); >> + return nfdev->mtu; >> +} >> + >> +static unsigned int netfront_promisc_get(struct uk_netdev *n) >> +{ >> + struct netfront_dev *nfdev; >> + >> + UK_ASSERT(n != NULL); >> + nfdev = to_netfront_dev(n); >> + return nfdev->promisc; >> +} >> + >> +static const struct uk_netdev_ops netfront_ops = { >> + .einfo_get = netfront_einfo_get, >> + .hwaddr_get = netfront_mac_get, >> + .mtu_get = netfront_mtu_get, >> + .promiscuous_get = netfront_promisc_get, >> +}; >> static int netfront_add_dev(struct xenbus_device *xendev) >> { >> + struct netfront_dev *nfdev; >> int rc = 0; >> UK_ASSERT(xendev != NULL); >> + nfdev = uk_calloc(drv_allocator, 1, sizeof(*nfdev)); >> + if (!nfdev) { >> + rc = -ENOMEM; >> + goto err_out; >> + } >> + >> + nfdev->xendev = xendev; >> + nfdev->mtu = ETH_PKT_PAYLOAD_LEN; > Adapt it to make it compatible with latest macro. >> + >> + /* Xenbus initialization */ >> + rc = netfront_xb_init(nfdev, drv_allocator); >> + if (rc) { >> + uk_pr_err("Error initializing Xenbus data: %d\n", rc); >> + goto err_xenbus; >> + } >> + >> + /* register netdev */ >> + nfdev->netdev.ops = &netfront_ops; >> + rc = uk_netdev_drv_register(&nfdev->netdev, drv_allocator, >> DRIVER_NAME); >> + if (rc < 0) { >> + uk_pr_err("Failed to register %s device with libuknetdev\n", >> + DRIVER_NAME); >> + goto err_register; >> + } >> + nfdev->uid = rc; >> + rc = 0; >> + >> +out: >> return rc; >> +err_register: >> + netfront_xb_fini(nfdev, drv_allocator); >> +err_xenbus: >> + uk_free(drv_allocator, nfdev); >> +err_out: >> + goto out; >> } >> static int netfront_drv_init(struct uk_alloc *allocator) >> diff --git a/plat/xen/drivers/net/netfront.h >> b/plat/xen/drivers/net/netfront.h >> new file mode 100644 >> index 00000000..0cc8230b >> --- /dev/null >> +++ b/plat/xen/drivers/net/netfront.h >> @@ -0,0 +1,66 @@ >> +/* SPDX-License-Identifier: BSD-3-Clause */ >> +/* >> + * Authors: Costin Lupu <costin.lupu@xxxxxxxxx> >> + * Razvan Cojocaru <razvan.cojocaru93@xxxxxxxxx> >> + * >> + * Copyright (c) 2020, University Politehnica of Bucharest. 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. >> + */ >> + >> +#ifndef __NETFRONT_H__ >> +#define __NETFRONT_H__ >> + >> +#include <uk/netdev.h> >> + >> +struct xs_econf { >> + char *ipv4addr; >> + char *ipv4mask; >> + char *ipv4gw; >> +}; >> + >> +struct netfront_dev { >> + /* Xenbus device */ >> + struct xenbus_device *xendev; >> + /* Network device */ >> + struct uk_netdev netdev; >> + >> + /* Configuration parameters */ >> + struct xs_econf econf; >> + >> + /* The netdevice identifier */ >> + uint16_t uid; >> + /* The mtu */ >> + uint16_t mtu; >> + /* The hw address of the netdevice */ >> + struct uk_hwaddr hw_addr; >> + /* RX promiscuous mode. */ >> + uint8_t promisc : 1; >> +}; >> + >> +#endif /* __NETFRONT_H__ */ >> diff --git a/plat/xen/drivers/net/netfront_xb.h >> b/plat/xen/drivers/net/netfront_xb.h >> new file mode 100644 >> index 00000000..6332cf71 >> --- /dev/null >> +++ b/plat/xen/drivers/net/netfront_xb.h >> @@ -0,0 +1,43 @@ >> +/* SPDX-License-Identifier: BSD-3-Clause */ >> +/* >> + * Authors: Costin Lupu <costin.lupu@xxxxxxxxx> >> + * >> + * Copyright (c) 2020, University Politehnica of Bucharest. 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. >> + */ >> + >> +#ifndef __NETFRONT_XB_H__ >> +#define __NETFRONT_XB_H__ >> + >> +#include "netfront.h" >> + >> +int netfront_xb_init(struct netfront_dev *netdev, struct uk_alloc *a); >> +void netfront_xb_fini(struct netfront_dev *netdev, struct uk_alloc *a); >> + >> +#endif /* __NETFRONT_XB_H__ */ >> diff --git a/plat/xen/drivers/net/netfront_xs.c >> b/plat/xen/drivers/net/netfront_xs.c >> new file mode 100644 >> index 00000000..48f01b34 >> --- /dev/null >> +++ b/plat/xen/drivers/net/netfront_xs.c >> @@ -0,0 +1,205 @@ >> +/* SPDX-License-Identifier: BSD-3-Clause */ >> +/* >> + * Authors: Costin Lupu <costin.lupu@xxxxxxxxx> >> + * >> + * Copyright (c) 2020, University Politehnica of Bucharest. 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. >> + */ >> +#include <inttypes.h> >> +#include <stdio.h> >> +#include <string.h> >> +#include <uk/errptr.h> >> +#include <uk/print.h> >> +#include <uk/assert.h> >> +#include <xenbus/xs.h> >> +#include "netfront_xb.h" >> + >> + >> +static int xs_read_backend_id(const char *nodename, domid_t *domid) >> +{ >> + char path[strlen(nodename) + sizeof("/backend-id")]; >> + int value, rc; > UK_ASSERT(nodename); Actually this is too late to assert it here. Given that this is a static function and we control how we call it, the assertion should actually be made in netfront_xb_init(). >> + >> + sprintf(path, "%s/backend-id", nodename); > snprintf instead of sprintf Ack. >> + >> + rc = xs_read_integer(XBT_NIL, path, &value); >> + if (!rc) >> + *domid = (domid_t) value; >> + >> + return rc; >> +} >> + >> +static void xs_econf_fini(struct xs_econf *econf, >> + struct uk_alloc *a) >> +{ >> + if (econf->ipv4addr) { >> + uk_free(a, econf->ipv4addr); >> + econf->ipv4addr = NULL; >> + } >> + if (econf->ipv4mask) { >> + uk_free(a, econf->ipv4mask); >> + econf->ipv4mask = NULL; >> + } >> + if (econf->ipv4gw) { >> + uk_free(a, econf->ipv4gw); >> + econf->ipv4gw = NULL; >> + } >> +} >> + >> +static int xs_econf_init(struct xs_econf *econf, char *ip_str, >> + struct uk_alloc *a) >> +{ >> + int rc = -1; >> + char *ip_addr = NULL, *ip_gw_str = NULL, *ip_mask_str = NULL; >> + >> + /* IP */ >> + ip_addr = strtok(ip_str, " "); >> + if (ip_addr == NULL) >> + goto out_err; >> + econf->ipv4addr = uk_malloc(a, strlen(ip_addr) + 1); >> + if (!econf->ipv4addr) { >> + uk_pr_err("Error allocating ip config.\n"); >> + goto out_err; >> + } >> + memcpy(econf->ipv4addr, ip_addr, strlen(ip_addr) + 1); >> + >> + /* Mask */ >> + ip_mask_str = strtok(NULL, " "); >> + if (ip_mask_str == NULL) >> + goto out_err; >> + econf->ipv4mask = uk_malloc(a, strlen(ip_mask_str) + 1); >> + if (!econf->ipv4mask) { >> + uk_pr_err("Error allocating ip mask config.\n"); >> + goto out_err; >> + } >> + memcpy(econf->ipv4mask, ip_mask_str, strlen(ip_mask_str) + 1); >> + >> + /* Gateway */ >> + ip_gw_str = strtok(NULL, " "); >> + if (ip_gw_str == NULL) >> + goto out_err; >> + econf->ipv4gw = uk_malloc(a, strlen(ip_gw_str) + 1); >> + if (!econf->ipv4gw) { >> + uk_pr_err("Error allocating ip gateway config.\n"); >> + goto out_err; >> + } >> + memcpy(econf->ipv4gw, ip_gw_str, strlen(ip_gw_str) + 1); >> + >> + rc = 0; >> +out: >> + return rc; >> +out_err: >> + xs_econf_fini(econf, a); >> + goto out; >> +} >> + >> +int netfront_xb_init(struct netfront_dev *nfdev, struct uk_alloc *a) >> +{ >> + struct xenbus_device *xendev; >> + char *mac_str, *p, *ip_str; >> + int rc; >> + >> + UK_ASSERT(nfdev != NULL); >> + >> + xendev = nfdev->xendev; >> + UK_ASSERT(xendev != NULL); >> + >> + rc = xs_read_backend_id(xendev->nodename, &xendev->otherend_id); >> + if (rc) >> + goto out; >> + >> + /* read backend path */ >> + xendev->otherend = xs_read(XBT_NIL, xendev->nodename, "backend"); >> + if (PTRISERR(xendev->otherend)) { >> + uk_pr_err("Error reading backend path.\n"); >> + rc = PTR2ERR(xendev->otherend); >> + xendev->otherend = NULL; >> + goto out; >> + } >> + >> + /* read MAC address */ >> + mac_str = xs_read(XBT_NIL, xendev->nodename, "mac"); >> + if (PTRISERR(mac_str)) { >> + uk_pr_err("Error reading MAC address.\n"); >> + rc = PTR2ERR(mac_str); >> + goto no_conf; >> + } >> + uk_pr_info("\tMAC %s\n", mac_str); >> + >> + p = mac_str; >> + for (int i = 0; i < UK_NETDEV_HWADDR_LEN; i++) { >> + nfdev->hw_addr.addr_bytes[i] = (uint8_t) strtoul(p, &p, 16); >> + p++; >> + } >> + free(mac_str); >> + >> + /* read IP address */ >> + ip_str = xs_read(XBT_NIL, xendev->otherend, "ip"); >> + if (PTRISERR(ip_str)) { >> + uk_pr_err("Error reading IP address.\n"); >> + rc = PTR2ERR(ip_str); >> + goto no_conf; >> + } >> + uk_pr_info("\tIP: %s\n", ip_str); >> + >> + rc = xs_econf_init(&nfdev->econf, ip_str, a); >> + if (rc) >> + goto no_conf; >> + free(ip_str); >> + >> + /* TODO spit event channels */ >> + >> + /* TODO netmap */ >> + >> +out: >> + return rc; >> +no_conf: >> + if (xendev->otherend) { >> + free(xendev->otherend); >> + xendev->otherend = NULL; >> + } >> + goto out; >> +} >> + >> +void netfront_xb_fini(struct netfront_dev *nfdev, struct uk_alloc *a) >> +{ >> + struct xenbus_device *xendev; >> + >> + UK_ASSERT(nfdev != NULL); >> + >> + xendev = nfdev->xendev; >> + UK_ASSERT(xendev != NULL); >> + >> + xs_econf_fini(&nfdev->econf, a); >> + >> + if (xendev->otherend) { >> + free(xendev->otherend); >> + xendev->otherend = NULL; >> + } >> +} >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |