mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-23 06:23:10 +00:00
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
This commit is contained in:
parent
f8d54e7c94
commit
4c10127b2c
@ -1287,7 +1287,6 @@ qemuBuildNicStr(virConnectPtr conn,
|
|||||||
int
|
int
|
||||||
qemuBuildHostNetStr(virConnectPtr conn,
|
qemuBuildHostNetStr(virConnectPtr conn,
|
||||||
virDomainNetDefPtr net,
|
virDomainNetDefPtr net,
|
||||||
const char *prefix,
|
|
||||||
char type_sep,
|
char type_sep,
|
||||||
int vlan,
|
int vlan,
|
||||||
const char *tapfd,
|
const char *tapfd,
|
||||||
@ -1296,8 +1295,7 @@ qemuBuildHostNetStr(virConnectPtr conn,
|
|||||||
switch (net->type) {
|
switch (net->type) {
|
||||||
case VIR_DOMAIN_NET_TYPE_NETWORK:
|
case VIR_DOMAIN_NET_TYPE_NETWORK:
|
||||||
case VIR_DOMAIN_NET_TYPE_BRIDGE:
|
case VIR_DOMAIN_NET_TYPE_BRIDGE:
|
||||||
if (virAsprintf(str, "%stap%cfd=%s,vlan=%d%s%s",
|
if (virAsprintf(str, "tap%cfd=%s,vlan=%d%s%s",
|
||||||
prefix ? prefix : "",
|
|
||||||
type_sep, tapfd, vlan,
|
type_sep, tapfd, vlan,
|
||||||
(net->hostnet_name ? ",name=" : ""),
|
(net->hostnet_name ? ",name=" : ""),
|
||||||
(net->hostnet_name ? net->hostnet_name : "")) < 0) {
|
(net->hostnet_name ? net->hostnet_name : "")) < 0) {
|
||||||
@ -1310,8 +1308,6 @@ qemuBuildHostNetStr(virConnectPtr conn,
|
|||||||
{
|
{
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
|
||||||
if (prefix)
|
|
||||||
virBufferAdd(&buf, prefix, strlen(prefix));
|
|
||||||
virBufferAddLit(&buf, "tap");
|
virBufferAddLit(&buf, "tap");
|
||||||
if (net->ifname) {
|
if (net->ifname) {
|
||||||
virBufferVSprintf(&buf, "%cifname=%s", type_sep, net->ifname);
|
virBufferVSprintf(&buf, "%cifname=%s", type_sep, net->ifname);
|
||||||
@ -1355,8 +1351,7 @@ qemuBuildHostNetStr(virConnectPtr conn,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virAsprintf(str, "%ssocket%c%s=%s:%d,vlan=%d%s%s",
|
if (virAsprintf(str, "socket%c%s=%s:%d,vlan=%d%s%s",
|
||||||
prefix ? prefix : "",
|
|
||||||
type_sep, mode,
|
type_sep, mode,
|
||||||
net->data.socket.address,
|
net->data.socket.address,
|
||||||
net->data.socket.port,
|
net->data.socket.port,
|
||||||
@ -1371,8 +1366,7 @@ qemuBuildHostNetStr(virConnectPtr conn,
|
|||||||
|
|
||||||
case VIR_DOMAIN_NET_TYPE_USER:
|
case VIR_DOMAIN_NET_TYPE_USER:
|
||||||
default:
|
default:
|
||||||
if (virAsprintf(str, "%suser%cvlan=%d%s%s",
|
if (virAsprintf(str, "user%cvlan=%d%s%s",
|
||||||
prefix ? prefix : "",
|
|
||||||
type_sep, vlan,
|
type_sep, vlan,
|
||||||
(net->hostnet_name ? ",name=" : ""),
|
(net->hostnet_name ? ",name=" : ""),
|
||||||
(net->hostnet_name ? net->hostnet_name : "")) < 0) {
|
(net->hostnet_name ? net->hostnet_name : "")) < 0) {
|
||||||
@ -2014,7 +2008,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||||||
goto no_memory;
|
goto no_memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuBuildHostNetStr(conn, net, NULL, ',',
|
if (qemuBuildHostNetStr(conn, net, ',',
|
||||||
net->vlan, tapfd_name, &host) < 0) {
|
net->vlan, tapfd_name, &host) < 0) {
|
||||||
VIR_FREE(tapfd_name);
|
VIR_FREE(tapfd_name);
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -170,7 +170,6 @@ int qemudBuildCommandLine (virConnectPtr conn,
|
|||||||
|
|
||||||
int qemuBuildHostNetStr (virConnectPtr conn,
|
int qemuBuildHostNetStr (virConnectPtr conn,
|
||||||
virDomainNetDefPtr net,
|
virDomainNetDefPtr net,
|
||||||
const char *prefix,
|
|
||||||
char type_sep,
|
char type_sep,
|
||||||
int vlan,
|
int vlan,
|
||||||
const char *tapfd,
|
const char *tapfd,
|
||||||
|
@ -4556,6 +4556,7 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn,
|
|||||||
char *tapfd_name = NULL;
|
char *tapfd_name = NULL;
|
||||||
int i, tapfd = -1;
|
int i, tapfd = -1;
|
||||||
char *nicstr = NULL;
|
char *nicstr = NULL;
|
||||||
|
char *netstr = NULL;
|
||||||
|
|
||||||
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_HOST_NET_ADD)) {
|
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_HOST_NET_ADD)) {
|
||||||
qemudReportError(conn, dom, NULL, VIR_ERR_NO_SUPPORT, "%s",
|
qemudReportError(conn, dom, NULL, VIR_ERR_NO_SUPPORT, "%s",
|
||||||
@ -4600,8 +4601,8 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuBuildHostNetStr(conn, net, "host_net_add ", ' ',
|
if (qemuBuildHostNetStr(conn, net, ' ',
|
||||||
net->vlan, tapfd_name, &cmd) < 0)
|
net->vlan, tapfd_name, &netstr) < 0)
|
||||||
goto try_tapfd_close;
|
goto try_tapfd_close;
|
||||||
|
|
||||||
remove_cmd = NULL;
|
remove_cmd = NULL;
|
||||||
@ -4612,16 +4613,9 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn,
|
|||||||
goto try_tapfd_close;
|
goto try_tapfd_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
|
if (qemuMonitorAddHostNetwork(vm, netstr) < 0)
|
||||||
qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
|
|
||||||
_("failed to add network backend with '%s'"), cmd);
|
|
||||||
goto try_tapfd_close;
|
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);
|
VIR_FREE(tapfd_name);
|
||||||
if (tapfd != -1)
|
if (tapfd != -1)
|
||||||
close(tapfd);
|
close(tapfd);
|
||||||
@ -4636,6 +4630,7 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn,
|
|||||||
&net->pci_addr.slot) < 0)
|
&net->pci_addr.slot) < 0)
|
||||||
goto try_remove;
|
goto try_remove;
|
||||||
|
|
||||||
|
VIR_FREE(netstr);
|
||||||
VIR_FREE(nicstr);
|
VIR_FREE(nicstr);
|
||||||
VIR_FREE(remove_cmd);
|
VIR_FREE(remove_cmd);
|
||||||
|
|
||||||
@ -4667,6 +4662,7 @@ no_memory:
|
|||||||
virReportOOMError(conn);
|
virReportOOMError(conn);
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(nicstr);
|
VIR_FREE(nicstr);
|
||||||
|
VIR_FREE(netstr);
|
||||||
VIR_FREE(cmd);
|
VIR_FREE(cmd);
|
||||||
VIR_FREE(reply);
|
VIR_FREE(reply);
|
||||||
VIR_FREE(remove_cmd);
|
VIR_FREE(remove_cmd);
|
||||||
|
@ -1666,3 +1666,33 @@ cleanup:
|
|||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
|
@ -192,4 +192,11 @@ int qemuMonitorSendFileHandle(const virDomainObjPtr vm,
|
|||||||
int qemuMonitorCloseFileHandle(const virDomainObjPtr vm,
|
int qemuMonitorCloseFileHandle(const virDomainObjPtr vm,
|
||||||
const char *fdname);
|
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 */
|
#endif /* QEMU_MONITOR_TEXT_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user