Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 May 2020 17:15:54 +0000 (UTC)
From:      Aleksandr Fedorov <afedorov@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r360820 - head/usr.sbin/bhyve
Message-ID:  <202005081715.048HFsCu056713@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: afedorov
Date: Fri May  8 17:15:54 2020
New Revision: 360820
URL: https://svnweb.freebsd.org/changeset/base/360820

Log:
  bhyve: Pass the full string of options to the network backends.
  
  Reviewed by:	vmaffione
  Approved by:	vmaffione (mentor)
  Sponsored by:	vstack.com
  Differential Revision:	https://reviews.freebsd.org/D24735

Modified:
  head/usr.sbin/bhyve/net_backends.c
  head/usr.sbin/bhyve/net_backends.h
  head/usr.sbin/bhyve/pci_e82545.c
  head/usr.sbin/bhyve/pci_virtio_net.c

Modified: head/usr.sbin/bhyve/net_backends.c
==============================================================================
--- head/usr.sbin/bhyve/net_backends.c	Fri May  8 17:01:33 2020	(r360819)
+++ head/usr.sbin/bhyve/net_backends.c	Fri May  8 17:15:54 2020	(r360820)
@@ -91,7 +91,7 @@ struct net_backend {
 	 * and should not be called by the frontend.
 	 */
 	int (*init)(struct net_backend *be, const char *devname,
-	    net_be_rxeof_t cb, void *param);
+	    const char *opts, net_be_rxeof_t cb, void *param);
 	void (*cleanup)(struct net_backend *be);
 
 	/*
@@ -199,7 +199,7 @@ tap_cleanup(struct net_backend *be)
 
 static int
 tap_init(struct net_backend *be, const char *devname,
-	 net_be_rxeof_t cb, void *param)
+	 const char *opts, net_be_rxeof_t cb, void *param)
 {
 	struct tap_priv *priv = (struct tap_priv *)be->opaque;
 	char tbuf[80];
@@ -473,7 +473,7 @@ netmap_set_cap(struct net_backend *be, uint64_t featur
 
 static int
 netmap_init(struct net_backend *be, const char *devname,
-	    net_be_rxeof_t cb, void *param)
+	    const char *opts, net_be_rxeof_t cb, void *param)
 {
 	struct netmap_priv *priv = (struct netmap_priv *)be->opaque;
 
@@ -746,12 +746,22 @@ DATA_SET(net_backend_set, vale_backend);
  *	the argument for the callback.
  */
 int
-netbe_init(struct net_backend **ret, const char *devname, net_be_rxeof_t cb,
+netbe_init(struct net_backend **ret, const char *opts, net_be_rxeof_t cb,
     void *param)
 {
 	struct net_backend **pbe, *nbe, *tbe = NULL;
+	char *devname;
+	char *options;
 	int err;
 
+	devname = options = strdup(opts);
+
+	if (devname == NULL) {
+		return (-1);
+	}
+
+	devname = strsep(&options, ",");
+
 	/*
 	 * Find the network backend that matches the user-provided
 	 * device name. net_backend_set is built using a linker set.
@@ -771,8 +781,11 @@ netbe_init(struct net_backend **ret, const char *devna
 	}
 
 	*ret = NULL;
-	if (tbe == NULL)
+	if (tbe == NULL) {
+		free(devname);
 		return (EINVAL);
+	}
+
 	nbe = calloc(1, sizeof(*nbe) + tbe->priv_size);
 	*nbe = *tbe;	/* copy the template */
 	nbe->fd = -1;
@@ -781,13 +794,15 @@ netbe_init(struct net_backend **ret, const char *devna
 	nbe->fe_vnet_hdr_len = 0;
 
 	/* Initialize the backend. */
-	err = nbe->init(nbe, devname, cb, param);
+	err = nbe->init(nbe, devname, options, cb, param);
 	if (err) {
+		free(devname);
 		free(nbe);
 		return (err);
 	}
 
 	*ret = nbe;
+	free(devname);
 
 	return (0);
 }

Modified: head/usr.sbin/bhyve/net_backends.h
==============================================================================
--- head/usr.sbin/bhyve/net_backends.h	Fri May  8 17:01:33 2020	(r360819)
+++ head/usr.sbin/bhyve/net_backends.h	Fri May  8 17:15:54 2020	(r360820)
@@ -37,7 +37,7 @@ typedef struct net_backend net_backend_t;
 
 /* Interface between network frontends and the network backends. */
 typedef void (*net_be_rxeof_t)(int, enum ev_type, void *param);
-int	netbe_init(net_backend_t **be, const char *devname, net_be_rxeof_t cb,
+int	netbe_init(net_backend_t **be, const char *opts, net_be_rxeof_t cb,
             void *param);
 void	netbe_cleanup(net_backend_t *be);
 uint64_t netbe_get_cap(net_backend_t *be);

Modified: head/usr.sbin/bhyve/pci_e82545.c
==============================================================================
--- head/usr.sbin/bhyve/pci_e82545.c	Fri May  8 17:01:33 2020	(r360819)
+++ head/usr.sbin/bhyve/pci_e82545.c	Fri May  8 17:15:54 2020	(r360820)
@@ -2281,7 +2281,7 @@ e82545_init(struct vmctx *ctx, struct pci_devinst *pi,
 {
 	char nstr[80];
 	struct e82545_softc *sc;
-	char *devname;
+	char *optscopy;
 	char *vtopts;
 	int mac_provided;
 
@@ -2332,7 +2332,7 @@ e82545_init(struct vmctx *ctx, struct pci_devinst *pi,
 	if (opts != NULL) {
 		int err = 0;
 
-		devname = vtopts = strdup(opts);
+		optscopy = vtopts = strdup(opts);
 		(void) strsep(&vtopts, ",");
 
 		/*
@@ -2357,15 +2357,18 @@ e82545_init(struct vmctx *ctx, struct pci_devinst *pi,
 			}
 		}
 
+		free(optscopy);
+
 		if (err) {
-			free(devname);
+			free(sc);
 			return (err);
 		}
 
-		err = netbe_init(&sc->esc_be, devname, e82545_rx_callback, sc);
-		free(devname);
-		if (err)
+		err = netbe_init(&sc->esc_be, opts, e82545_rx_callback, sc);
+		if (err) {
+			free(sc);
 			return (err);
+		}
 	}
 
 	if (!mac_provided) {

Modified: head/usr.sbin/bhyve/pci_virtio_net.c
==============================================================================
--- head/usr.sbin/bhyve/pci_virtio_net.c	Fri May  8 17:01:33 2020	(r360819)
+++ head/usr.sbin/bhyve/pci_virtio_net.c	Fri May  8 17:15:54 2020	(r360820)
@@ -577,12 +577,12 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *
 	mac_provided = 0;
 	mtu_provided = 0;
 	if (opts != NULL) {
-		char *devname;
+		char *optscopy;
 		char *vtopts;
 		int err = 0;
 
 		/* Get the device name. */
-		devname = vtopts = strdup(opts);
+		optscopy = vtopts = strdup(opts);
 		(void) strsep(&vtopts, ",");
 
 		/*
@@ -618,15 +618,16 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *
 			}
 		}
 
+		free(optscopy);
+
 		if (err) {
-			free(devname);
 			free(sc);
 			return (err);
 		}
 
-		err = netbe_init(&sc->vsc_be, devname, pci_vtnet_rx_callback,
+		err = netbe_init(&sc->vsc_be, opts, pci_vtnet_rx_callback,
 		          sc);
-		free(devname);
+
 		if (err) {
 			free(sc);
 			return (err);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202005081715.048HFsCu056713>