On Tue, Dec 15, 2009 at 03:14:46PM +0000, Daniel P. Berrange wrote:
The current syntax uses a pair of args
-net nic,macaddr=52:54:00:56:6c:55,vlan=3,model=pcnet,name=pcnet.0
-net user,vlan=3,name=user.2
The new syntax does not need the vlan craziness anymore, and
so has a simplified pair of args
-netdev user,id=user.2
-device pcnet,netdev=user.2,mac=52:54:00:56:6c:55
---
src/qemu/qemu_conf.c | 166 +++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 137 insertions(+), 29 deletions(-)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 2480df4..464f582 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1490,6 +1490,35 @@ qemuBuildNicStr(virConnectPtr conn,
return 0;
}
+static int
+qemuBuildNicDevStr(virConnectPtr conn,
+ virDomainNetDefPtr net,
+ char **str)
+{
+ const char *nic;
+
+ if (!net->model) {
+ nic = "rtl8139";
Weren't we supposed to default to something more "performant" in
recent QEmus like e1000 or similar ? but I have no idea if this is
safe (old Windows may not have default drivers)
+ } else if (STREQ(net->model, "virtio")) {
+ nic = "virtio-net-pci";
+ } else {
+ nic = net->model;
+ }
+
+ if (virAsprintf(str,
+ "%s,netdev=%s,mac=%02x:%02x:%02x:%02x:%02x:%02x",
+ nic,
+ net->hostnet_name,
+ net->mac[0], net->mac[1],
+ net->mac[2], net->mac[3],
+ net->mac[4], net->mac[5]) < 0) {
+ virReportOOMError(conn);
+ return -1;
+ }
+
+ return 0;
+}
+
int
qemuBuildHostNetStr(virConnectPtr conn,
virDomainNetDefPtr net,
@@ -1587,6 +1616,87 @@ qemuBuildHostNetStr(virConnectPtr conn,
}
static int
+qemuBuildNetDevStr(virConnectPtr conn,
+ virDomainNetDefPtr net,
+ const char *tapfd,
+ char **str)
+{
+ switch (net->type) {
+ case VIR_DOMAIN_NET_TYPE_NETWORK:
+ case VIR_DOMAIN_NET_TYPE_BRIDGE:
+ if (virAsprintf(str, "tap,fd=%s,id=%s",
+ tapfd, net->hostnet_name) < 0) {
+ virReportOOMError(conn);
+ return -1;
+ }
+ break;
+
+ case VIR_DOMAIN_NET_TYPE_ETHERNET:
+ {
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+ virBufferAddLit(&buf, "tap");
+ if (net->ifname)
+ virBufferVSprintf(&buf, ",ifname=%s", net->ifname);
+ if (net->data.ethernet.script)
+ virBufferVSprintf(&buf, ",script=%s",
+ net->data.ethernet.script);
+ if (net->hostnet_name)
+ virBufferVSprintf(&buf, ",id=%s",
+ net->hostnet_name);
+ if (virBufferError(&buf)) {
+ virBufferFreeAndReset(&buf);
+ virReportOOMError(conn);
+ return -1;
+ }
+
+ *str = virBufferContentAndReset(&buf);
+ }
+ break;
+
+ case VIR_DOMAIN_NET_TYPE_CLIENT:
+ case VIR_DOMAIN_NET_TYPE_SERVER:
+ case VIR_DOMAIN_NET_TYPE_MCAST:
+ {
+ const char *mode = NULL;
+
+ switch (net->type) {
+ case VIR_DOMAIN_NET_TYPE_CLIENT:
+ mode = "connect";
+ break;
+ case VIR_DOMAIN_NET_TYPE_SERVER:
+ mode = "listen";
+ break;
+ case VIR_DOMAIN_NET_TYPE_MCAST:
+ mode = "mcast";
+ break;
+ }
+
+ if (virAsprintf(str, "socket,%s=%s:%d,id=%s",
+ mode,
+ net->data.socket.address,
+ net->data.socket.port,
+ net->hostnet_name) < 0) {
+ virReportOOMError(conn);
+ return -1;
+ }
+ }
+ break;
+
+ case VIR_DOMAIN_NET_TYPE_USER:
+ default:
+ if (virAsprintf(str, "user,id=%s",
+ net->hostnet_name) < 0) {
+ virReportOOMError(conn);
+ return -1;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static int
qemuBuildSoundDevStr(virConnectPtr conn,
virDomainSoundDefPtr sound,
char **str)
@@ -2279,26 +2389,9 @@ int qemudBuildCommandLine(virConnectPtr conn,
for (i = 0 ; i < def->nnets ; i++) {
virDomainNetDefPtr net = def->nets[i];
char *nic, *host;
- char *tapfd_name = NULL;
+ char tapfd_name[50];
net->vlan = i;
-
- ADD_ARG_SPACE;
- if ((qemuCmdFlags & QEMUD_CMD_FLAG_NET_NAME) &&
- qemuAssignNetNames(def, net) < 0)
- goto no_memory;
-
- if (qemuBuildNicStr(conn, net, "nic,", net->vlan, &nic)
< 0)
- goto error;
-
- if ((qargv[qargc++] = strdup("-net")) == NULL) {
- VIR_FREE(nic);
- goto no_memory;
- }
- ADD_ARG(nic);
-
-
- ADD_ARG_SPACE;
if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK ||
net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
int tapfd = qemudNetworkIfaceConnect(conn, driver, net, qemuCmdFlags);
@@ -2312,23 +2405,38 @@ int qemudBuildCommandLine(virConnectPtr conn,
(*tapfds)[(*ntapfds)++] = tapfd;
- if (virAsprintf(&tapfd_name, "%d", tapfd) < 0)
+ if (snprintf(tapfd_name, sizeof(tapfd_name), "%d", tapfd)
>= sizeof(tapfd_name))
goto no_memory;
}
- if (qemuBuildHostNetStr(conn, net, ',',
- net->vlan, tapfd_name, &host) < 0) {
- VIR_FREE(tapfd_name);
- goto error;
+ if ((qemuCmdFlags & QEMUD_CMD_FLAG_NET_NAME) ||
+ (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
+ if (qemuAssignNetNames(def, net) < 0)
+ goto no_memory;
}
- if ((qargv[qargc++] = strdup("-net")) == NULL) {
- VIR_FREE(host);
- goto no_memory;
- }
- ADD_ARG(host);
+ if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
+ ADD_ARG_LIT("-netdev");
+ if (qemuBuildNetDevStr(conn, net, tapfd_name, &host) < 0)
+ goto error;
+ ADD_ARG(host);
+
+ ADD_ARG_LIT("-device");
+ if (qemuBuildNicDevStr(conn, net, &nic) < 0)
+ goto error;
+ ADD_ARG(nic);
+ } else {
+ ADD_ARG_LIT("-net");
+ if (qemuBuildNicStr(conn, net, "nic,", net->vlan, &nic)
< 0)
+ goto error;
+ ADD_ARG(nic);
- VIR_FREE(tapfd_name);
+ ADD_ARG_LIT("-net");
+ if (qemuBuildHostNetStr(conn, net, ',',
+ net->vlan, tapfd_name, &host) < 0)
+ goto error;
+ ADD_ARG(host);
+ }
}
}
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/