]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu domain allow to set ip address, peer address and route
authorVasiliy Tolstov <v.tolstov@selfip.ru>
Mon, 4 Apr 2016 21:00:06 +0000 (21:00 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 7 Apr 2016 17:34:48 +0000 (18:34 +0100)
Signed-off-by: Vasiliy Tolstov <v.tolstov@selfip.ru>
src/qemu/qemu_interface.c
tests/qemuxml2argvmock.c

index 13a513152876d381f77460733a91df4706f6bc41..74c9ca8b821cae9b9fb3bc26ebbd27ef72d7cc8c 100644 (file)
@@ -438,6 +438,7 @@ qemuInterfaceEthernetConnect(virDomainDefPtr def,
     bool template_ifname = false;
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
     const char *tunpath = "/dev/net/tun";
+    size_t i;
 
     if (net->backend.tap) {
         tunpath = net->backend.tap;
@@ -474,6 +475,45 @@ qemuInterfaceEthernetConnect(virDomainDefPtr def,
     if (virNetDevSetMAC(net->ifname, &tapmac) < 0)
         goto cleanup;
 
+    for (i = 0; i < net->nips; i++) {
+        virDomainNetIpDefPtr ip = net->ips[i];
+        unsigned int prefix = (ip->prefix > 0) ? ip->prefix :
+            VIR_SOCKET_ADDR_DEFAULT_PREFIX;
+        char *ipStr = virSocketAddrFormat(&ip->address);
+
+        VIR_DEBUG("Adding IP address '%s/%u' to '%s'",
+                  ipStr, ip->prefix, net->ifname);
+
+        if (virNetDevSetIPAddress(net->ifname, &ip->address, &ip->peer, prefix) < 0) {
+            virReportError(VIR_ERR_SYSTEM_ERROR,
+                           _("Failed to set IP address '%s' on %s"),
+                           ipStr, net->ifname);
+            VIR_FREE(ipStr);
+            goto cleanup;
+        }
+        VIR_FREE(ipStr);
+    }
+
+    if (net->linkstate == VIR_DOMAIN_NET_INTERFACE_LINK_STATE_UP ||
+        net->linkstate == VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT) {
+        if (virNetDevSetOnline(net->ifname, true) < 0)
+            goto cleanup;
+
+        /* Set the routes */
+        for (i = 0; i < net->nroutes; i++) {
+            virNetworkRouteDefPtr route = net->routes[i];
+
+            if (virNetDevAddRoute(net->ifname,
+                                  virNetworkRouteDefGetAddress(route),
+                                  virNetworkRouteDefGetPrefix(route),
+                                  virNetworkRouteDefGetGateway(route),
+                                  virNetworkRouteDefGetMetric(route)) < 0) {
+                goto cleanup;
+            }
+        }
+    }
+
+
     if (net->script &&
         qemuExecuteEthernetScript(net->ifname, net->script) < 0)
         goto cleanup;
@@ -493,7 +533,6 @@ qemuInterfaceEthernetConnect(virDomainDefPtr def,
 
  cleanup:
     if (ret < 0) {
-        size_t i;
         for (i = 0; i < tapfdSize && tapfd[i] >= 0; i++)
             VIR_FORCE_CLOSE(tapfd[i]);
         if (template_ifname)
index e2c19a647061de459bc74e971ac5cb6e2342944b..eb2a5b4353f6258b01b3339712f2e504567e32a0 100644 (file)
@@ -124,6 +124,13 @@ virNetDevSetMAC(const char *ifname ATTRIBUTE_UNUSED,
     return 0;
 }
 
+int
+virNetDevSetOnline(const char *ifname ATTRIBUTE_UNUSED,
+                   bool online ATTRIBUTE_UNUSED)
+{
+    return 0;
+}
+
 int
 virCommandRun(virCommandPtr cmd ATTRIBUTE_UNUSED,
               int *exitstatus)