From d755205c8d0bb3d816fd72dcf82b648a721cf665 Mon Sep 17 00:00:00 2001 From: Chenli Wei Date: Wed, 26 Jan 2022 15:29:20 +0800 Subject: [PATCH] dm:change virtio-net parameters for cmdline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove device name requirement for “tap” and "vmnet", change the parameter format like: "-s 4,virtio-net,tap/vmnet=dev_name". Tracked-On: #6690 Acked-by: Yu1 Wang Signed-off-by: Chenli Wei --- devicemodel/hw/pci/core.c | 4 +++ devicemodel/hw/pci/virtio/virtio_net.c | 37 +++++++++++++++++++------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/devicemodel/hw/pci/core.c b/devicemodel/hw/pci/core.c index ade97ad6d..9527d66d2 100644 --- a/devicemodel/hw/pci/core.c +++ b/devicemodel/hw/pci/core.c @@ -341,6 +341,10 @@ pci_parse_slot(char *opt) /* saved fi param in case reboot */ si->si_funcs[fnum].fi_param_saved = config; + if (strcmp("virtio-net", emul) == 0) { + si->si_funcs[fnum].fi_param_saved = cp; + } + if (b != NULL) { if ((strcmp("virtio-blk", emul) == 0) && (b != NULL) && (strchr(b, 'b') != NULL)) { diff --git a/devicemodel/hw/pci/virtio/virtio_net.c b/devicemodel/hw/pci/virtio/virtio_net.c index 3e35a1b68..3dae64ba3 100644 --- a/devicemodel/hw/pci/virtio/virtio_net.c +++ b/devicemodel/hw/pci/virtio/virtio_net.c @@ -817,7 +817,11 @@ virtio_net_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts) char nstr[80]; char tname[MAXCOMLEN + 1]; struct virtio_net *net; - char *devname = NULL; + char fname[IFNAMSIZ]; + char *devopts = NULL; + char *name = NULL; + char *type = NULL; + char *tmp; char *vtopts; char *opt; int mac_provided; @@ -852,8 +856,8 @@ virtio_net_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts) if (opts != NULL) { int err; - devname = vtopts = strdup(opts); - if (!devname) { + devopts = vtopts = strdup(opts); + if (!devopts) { WPRINTF(("virtio_net: strdup returns NULL\n")); free(net); return -1; @@ -868,7 +872,7 @@ virtio_net_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts) err = virtio_net_parsemac(opt, net->config.mac); if (err != 0) { - free(devname); + free(devopts); free(net); return err; } @@ -896,17 +900,27 @@ virtio_net_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts) */ net->tapfd = -1; - if (!devname) { - WPRINTF(("virtio_net: devname NULL\n")); + if (!devopts) { + WPRINTF(("virtio_net: invalid optional argument\n")); free(net); return -1; } - if ((strstr(devname, "tap") != NULL) || - (strncmp(devname, "vmnet", 5) == 0)) - virtio_net_tap_setup(net, devname); + vtopts = tmp = strdup(opts); + if ((strstr(tmp, "tap") != NULL) + || (strncmp(tmp, "vmnet",5) == 0)) { + type = strsep(&tmp, "="); + name = strsep(&tmp, ","); + } - free(devname); + if ((type != NULL) && (name != NULL)) { + snprintf(fname, IFNAMSIZ, "%s_%s", type, name); + + if ((strstr(type, "tap") != NULL) || + (strncmp(type, "vmnet", 5) == 0)){ + virtio_net_tap_setup(net, fname); + } + } /* * The default MAC address is the standard NetApp OUI of 00-a0-98, @@ -928,6 +942,9 @@ virtio_net_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts) net->config.mac[5] = digest[2]; } + free(vtopts); + free(devopts); + /* initialize config space */ pci_set_cfgdata16(dev, PCIR_DEVICE, VIRTIO_DEV_NET); pci_set_cfgdata16(dev, PCIR_VENDOR, VIRTIO_VENDOR);