From 4c10127b2cd0f7e21906dafc403c9a6c92e89421 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Wed, 23 Sep 2009 17:25:28 +0100 Subject: [PATCH] Add API for issuing 'host_net_add' monitor command * src/qemu/qemu_conf.h, src/qemu/qemu_conf.c: Remove prefix arg from qemuBuildHostNetStr which is no longer required * src/qemu/qemu_driver.c: Refactor to use qemuMonitorAddHostNetwork() API for adding host network * src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add new qemuMonitorAddHostNetwork() method for adding host networks --- src/qemu/qemu_conf.c | 14 ++++---------- src/qemu/qemu_conf.h | 1 - src/qemu/qemu_driver.c | 16 ++++++---------- src/qemu/qemu_monitor_text.c | 30 ++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_text.h | 7 +++++++ 5 files changed, 47 insertions(+), 21 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index c5314548d3..1d98637260 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 6ff5f0d3d7..96b7c0c088 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 c4d9fffe36..d72d83744a 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 7a28874648..912603da94 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 8ea9aa10fe..19065ea2e2 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 */