Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > ebe084c140192657f9094e135a84202c > files > 66

libvirt-0.8.2-29.el5.src.rpm

From e8457e41cb943ecc51d63d105eaec30bf1294c14 Mon Sep 17 00:00:00 2001
Message-Id: <e8457e41cb943ecc51d63d105eaec30bf1294c14.1284409900.git.jdenemar@redhat.com>
From: Jiri Denemark <jdenemar@redhat.com>
Date: Thu, 9 Sep 2010 16:00:08 +0200
Subject: [PATCH] bridge: Fix static-only DHCP configuration

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=597363

For static-only DHCP, i.e. with no <range> but at least one <host>
element within <dhcp> element, we have to add "--dhcp-range IP,static"
option to dnsmasq to actually enable the service. Without this option,
dnsmasq will not respond to DHCP requests.
(cherry picked from commit df990b445bd85bbd59296acbcaeb9d81543466c8)
---
 src/network/bridge_driver.c |   26 +++++++++++++++++++++++---
 1 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index b62e52f..5a96485 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -394,6 +394,16 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
     int nbleases = 0;
     char *pidfileArg;
     char buf[1024];
+    unsigned int ranges;
+
+    /*
+     * For static-only DHCP, i.e. with no range but at least one host element,
+     * we have to add a special --dhcp-range option to enable the service in
+     * dnsmasq.
+     */
+    ranges = network->def->nranges;
+    if (!ranges && network->def->nhosts)
+        ranges = 1;
 
     /*
      * NB, be careful about syntax for dnsmasq options in long format
@@ -424,11 +434,11 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
         /*2 + *//* --interface virbr0 */
         2 + /* --except-interface lo */
         2 + /* --listen-address 10.0.0.1 */
-        (2 * network->def->nranges) + /* --dhcp-range 10.0.0.2,10.0.0.254 */
+        (2 * ranges) + /* --dhcp-range 10.0.0.2,10.0.0.254 */
         /* --dhcp-lease-max=xxx if needed */
         (network->def->nranges ? 1 : 0) +
         /* --dhcp-no-override if needed */
-        (network->def->nranges ? 1 : 0) +
+        (ranges ? 1 : 0) +
         /* --dhcp-hostsfile=/var/lib/dnsmasq/$NAME.hostsfile */
         (network->def->nhosts > 0 ? 1 : 0) +
         /* --enable-tftp --tftp-root /srv/tftp */
@@ -496,12 +506,22 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
         nbleases += network->def->ranges[r].size;
     }
 
+    if (!network->def->nranges && network->def->nhosts) {
+        snprintf(buf, sizeof(buf), "%s,static",
+                 network->def->ipAddress);
+
+        APPEND_ARG(*argv, i++, "--dhcp-range");
+        APPEND_ARG(*argv, i++, buf);
+    }
+
     if (network->def->nranges > 0) {
         snprintf(buf, sizeof(buf), "--dhcp-lease-max=%d", nbleases);
         APPEND_ARG(*argv, i++, buf);
-        APPEND_ARG(*argv, i++, "--dhcp-no-override");
     }
 
+    if (ranges)
+        APPEND_ARG(*argv, i++, "--dhcp-no-override");
+
     if (network->def->nhosts > 0) {
         dnsmasqContext *dctx = dnsmasqContextNew(network->def->name, DNSMASQ_STATE_DIR);
         char *hostsfileArg;
-- 
1.7.2.2