[libvirt] [PATCH 23/27] Add API for issuing 'host_net_add' monitor command

Daniel P. Berrange berrange at redhat.com
Thu Sep 24 15:00:25 UTC 2009


* 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 c531454..1d98637 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 6ff5f0d..96b7c0c 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 6363edc..dfd5359 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 c6ffd33..5bff427 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -1665,3 +1665,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 1bd9d6d..d97baaf 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 */
-- 
1.6.2.5




More information about the libvir-list mailing list