diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index c5314548d36fc9265e5d5b69ae9c99be60741409..1d986372603eba38eb86f418977ad39ef7ceb45d 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1287,7 +1287,6 @@ qemuBuildNicStr(virConnectPtr conn, int qemuBuildHostNetStr(virConnectPtr conn, virDomainNetDefPtr net, - const char *prefix, char type_sep, int vlan, const char *tapfd, @@ -1296,8 +1295,7 @@ qemuBuildHostNetStr(virConnectPtr conn, switch (net->type) { case VIR_DOMAIN_NET_TYPE_NETWORK: case VIR_DOMAIN_NET_TYPE_BRIDGE: - if (virAsprintf(str, "%stap%cfd=%s,vlan=%d%s%s", - prefix ? prefix : "", + if (virAsprintf(str, "tap%cfd=%s,vlan=%d%s%s", type_sep, tapfd, vlan, (net->hostnet_name ? ",name=" : ""), (net->hostnet_name ? net->hostnet_name : "")) < 0) { @@ -1310,8 +1308,6 @@ qemuBuildHostNetStr(virConnectPtr conn, { virBuffer buf = VIR_BUFFER_INITIALIZER; - if (prefix) - virBufferAdd(&buf, prefix, strlen(prefix)); virBufferAddLit(&buf, "tap"); if (net->ifname) { virBufferVSprintf(&buf, "%cifname=%s", type_sep, net->ifname); @@ -1355,8 +1351,7 @@ qemuBuildHostNetStr(virConnectPtr conn, break; } - if (virAsprintf(str, "%ssocket%c%s=%s:%d,vlan=%d%s%s", - prefix ? prefix : "", + if (virAsprintf(str, "socket%c%s=%s:%d,vlan=%d%s%s", type_sep, mode, net->data.socket.address, net->data.socket.port, @@ -1371,8 +1366,7 @@ qemuBuildHostNetStr(virConnectPtr conn, case VIR_DOMAIN_NET_TYPE_USER: default: - if (virAsprintf(str, "%suser%cvlan=%d%s%s", - prefix ? prefix : "", + if (virAsprintf(str, "user%cvlan=%d%s%s", type_sep, vlan, (net->hostnet_name ? ",name=" : ""), (net->hostnet_name ? net->hostnet_name : "")) < 0) { @@ -2014,7 +2008,7 @@ int qemudBuildCommandLine(virConnectPtr conn, goto no_memory; } - if (qemuBuildHostNetStr(conn, net, NULL, ',', + if (qemuBuildHostNetStr(conn, net, ',', net->vlan, tapfd_name, &host) < 0) { VIR_FREE(tapfd_name); goto error; diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 6ff5f0d3d75581e913562066f6415b5cd468df9e..96b7c0c08824c2ae193d4b68f2fd860d505e576b 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -170,7 +170,6 @@ int qemudBuildCommandLine (virConnectPtr conn, int qemuBuildHostNetStr (virConnectPtr conn, virDomainNetDefPtr net, - const char *prefix, char type_sep, int vlan, const char *tapfd, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c4d9fffe36c67ac51136d7bcbacfed63a2d0151b..d72d83744a8b23d14f0509757db9afc113aef9b6 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4556,6 +4556,7 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn, char *tapfd_name = NULL; int i, tapfd = -1; char *nicstr = NULL; + char *netstr = NULL; if (!(qemuCmdFlags & QEMUD_CMD_FLAG_HOST_NET_ADD)) { qemudReportError(conn, dom, NULL, VIR_ERR_NO_SUPPORT, "%s", @@ -4600,8 +4601,8 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn, goto cleanup; } - if (qemuBuildHostNetStr(conn, net, "host_net_add ", ' ', - net->vlan, tapfd_name, &cmd) < 0) + if (qemuBuildHostNetStr(conn, net, ' ', + net->vlan, tapfd_name, &netstr) < 0) goto try_tapfd_close; remove_cmd = NULL; @@ -4612,16 +4613,9 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn, goto try_tapfd_close; } - if (qemudMonitorCommand(vm, cmd, &reply) < 0) { - qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED, - _("failed to add network backend with '%s'"), cmd); + if (qemuMonitorAddHostNetwork(vm, netstr) < 0) goto try_tapfd_close; - } - - DEBUG("%s: host_net_add reply: %s", vm->def->name, reply); - VIR_FREE(reply); - VIR_FREE(cmd); VIR_FREE(tapfd_name); if (tapfd != -1) close(tapfd); @@ -4636,6 +4630,7 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn, &net->pci_addr.slot) < 0) goto try_remove; + VIR_FREE(netstr); VIR_FREE(nicstr); VIR_FREE(remove_cmd); @@ -4667,6 +4662,7 @@ no_memory: virReportOOMError(conn); cleanup: VIR_FREE(nicstr); + VIR_FREE(netstr); VIR_FREE(cmd); VIR_FREE(reply); VIR_FREE(remove_cmd); diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index 7a2887464826cffbb06a8e588eae95a805b16606..912603da94df350937260f06474ba3a6c20f1e12 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -1666,3 +1666,33 @@ cleanup: return ret; } + +int qemuMonitorAddHostNetwork(const virDomainObjPtr vm, + const char *netstr) +{ + char *cmd; + char *reply = NULL; + int ret = -1; + + if (virAsprintf(&cmd, "host_net_add %s", netstr) < 0) { + virReportOOMError(NULL); + return -1; + } + + if (qemudMonitorCommand(vm, cmd, &reply) < 0) { + qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED, + _("failed to close fd in qemu with '%s'"), cmd); + goto cleanup; + } + + DEBUG("%s: host_net_add reply: %s", vm->def->name, reply); + + /* XXX error messages here ? */ + + ret = 0; + +cleanup: + VIR_FREE(cmd); + VIR_FREE(reply); + return ret; +} diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h index 8ea9aa10fe664df37baaa360c58c15a524c17705..19065ea2e27e505c3747dec07fa4aaa45d729f75 100644 --- a/src/qemu/qemu_monitor_text.h +++ b/src/qemu/qemu_monitor_text.h @@ -192,4 +192,11 @@ int qemuMonitorSendFileHandle(const virDomainObjPtr vm, int qemuMonitorCloseFileHandle(const virDomainObjPtr vm, const char *fdname); + +/* XXX do we relaly want to hardcode 'netstr' as the + * sendable item here + */ +int qemuMonitorAddHostNetwork(const virDomainObjPtr vm, + const char *netstr); + #endif /* QEMU_MONITOR_TEXT_H */