]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add API for issuing 'host_net_add' monitor command
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 23 Sep 2009 16:25:28 +0000 (17:25 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 29 Sep 2009 11:20:56 +0000 (12:20 +0100)
* 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
src/qemu/qemu_conf.h
src/qemu/qemu_driver.c
src/qemu/qemu_monitor_text.c
src/qemu/qemu_monitor_text.h

index c5314548d36fc9265e5d5b69ae9c99be60741409..1d986372603eba38eb86f418977ad39ef7ceb45d 100644 (file)
@@ -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;
index 6ff5f0d3d75581e913562066f6415b5cd468df9e..96b7c0c08824c2ae193d4b68f2fd860d505e576b 100644 (file)
@@ -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,
index c4d9fffe36c67ac51136d7bcbacfed63a2d0151b..d72d83744a8b23d14f0509757db9afc113aef9b6 100644 (file)
@@ -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);
index 7a2887464826cffbb06a8e588eae95a805b16606..912603da94df350937260f06474ba3a6c20f1e12 100644 (file)
@@ -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;
+}
index 8ea9aa10fe664df37baaa360c58c15a524c17705..19065ea2e27e505c3747dec07fa4aaa45d729f75 100644 (file)
@@ -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 */