[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [Libvir] Extra options to dnsmasq



tir, 22 04 2008 kl. 17:50 +0200, skrev PATTE, Mathieu:
> Is there any way I can pass extra options to dnsmasq when starting a
> virtual network? I need that in order to specify static dhcp leases.
> (is there another way to do that?)

Actually, I wrote a patch for doing static hosts some time ago, but I
haven't had the time to clean it up properly.
It should apply cleanly to 0.4.0, but it shouldn't be hard to adopt to
CVS head.

In XML it works by specifying a stanza such as:
  <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.122.4" end="192.168.122.254" />
      <statichost mac="00:16:3E:XX:XX:XX" host="XXX"
ip="192.168.122.2" />
      <statichost host="YYY" ip="192.168.122.3" />
    </dhcp>
  </ip>

The patch is attached, please let me know if you have any questions :-)

-- 
Mads Chr. Olesen <shiyee shiyee dk>
shiyee.dk
Index: libvirt-0.4.0/src/qemu_conf.c
===================================================================
--- libvirt-0.4.0.orig/src/qemu_conf.c	2008-02-14 19:36:51.000000000 +0100
+++ libvirt-0.4.0/src/qemu_conf.c	2008-02-14 21:40:37.000000000 +0100
@@ -2120,6 +2120,12 @@
         free(range);
         range = next;
     }
+    struct qemud_dhcp_statichost_def *statichost = def->statichosts;
+    while (statichost) {
+        struct qemud_dhcp_statichost_def *next = statichost->next;
+        free(statichost);
+        statichost = next;
+    }
     free(def);
 }
 
@@ -2172,40 +2178,83 @@
     cur = node->children;
     while (cur != NULL) {
         struct qemud_dhcp_range_def *range;
-        xmlChar *start, *end;
+        struct qemud_dhcp_statichost_def *statichost;
+        xmlChar *start, *end, *mac, *host, *staticip;
 
-        if (cur->type != XML_ELEMENT_NODE ||
-            !xmlStrEqual(cur->name, BAD_CAST "range")) {
+        if (cur->type != XML_ELEMENT_NODE) {
             cur = cur->next;
             continue;
         }
 
-        if (!(range = calloc(1, sizeof(*range)))) {
-            qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "range");
-            return 0;
-        }
+        if (xmlStrEqual(cur->name, BAD_CAST "range")) {
+            if (!(range = calloc(1, sizeof(*range)))) {
+                qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "range");
+                return 0;
+            }
 
-        start = xmlGetProp(cur, BAD_CAST "start");
-        end = xmlGetProp(cur, BAD_CAST "end");
+            start = xmlGetProp(cur, BAD_CAST "start");
+            end = xmlGetProp(cur, BAD_CAST "end");
 
-        if (start && start[0] && end && end[0]) {
-            strncpy(range->start, (const char *)start, BR_INET_ADDR_MAXLEN-1);
-            range->start[BR_INET_ADDR_MAXLEN-1] = '\0';
-
-            strncpy(range->end, (const char *)end, BR_INET_ADDR_MAXLEN-1);
-            range->end[BR_INET_ADDR_MAXLEN-1] = '\0';
-
-            range->next = def->ranges;
-            def->ranges = range;
-            def->nranges++;
-        } else {
-            free(range);
-        }
+            if (start && start[0] && end && end[0]) {
+                strncpy(range->start, (const char *)start, BR_INET_ADDR_MAXLEN-1);
+                range->start[BR_INET_ADDR_MAXLEN-1] = '\0';
+
+                strncpy(range->end, (const char *)end, BR_INET_ADDR_MAXLEN-1);
+                range->end[BR_INET_ADDR_MAXLEN-1] = '\0';
+
+                range->next = def->ranges;
+                def->ranges = range;
+                def->nranges++;
+            } else {
+                free(range);
+            }
+
+            if (start)
+                xmlFree(start);
+            if (end)
+                xmlFree(end);
+        }
+        else if (xmlStrEqual(cur->name, BAD_CAST "statichost")) {
+            if (!(statichost = calloc(1, sizeof(*statichost)))) {
+                qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "statichost");
+                return 0;
+            }
+
+            mac = xmlGetProp(cur, BAD_CAST "mac");
+            host = xmlGetProp(cur, BAD_CAST "host");
+            staticip = xmlGetProp(cur, BAD_CAST "ip");
+
+            if (((mac && mac[0]) || (host && host[0])) && staticip && staticip[0]) {
+                if (mac && mac[0]) {
+                    strncpy(statichost->mac, (const char *)mac, 18-1);
+                    statichost->mac[18-1] = '\0';
+                } else {
+                    statichost->mac[0] = '\0';
+                }
+                if (host && host[0]) {
+                    strncpy(statichost->host, (const char *)host, QEMUD_MAX_NAME_LEN-1);
+                    statichost->host[QEMUD_MAX_NAME_LEN-1] = '\0';
+                } else {
+                    statichost->host[0] = '\0';
+                }
+
+                strncpy(statichost->staticip, (const char *)staticip, BR_INET_ADDR_MAXLEN-1);
+                statichost->staticip[BR_INET_ADDR_MAXLEN-1] = '\0';
+
+                statichost->next = def->statichosts;
+                def->statichosts = statichost;
+                def->nstatichosts++;
+            } else {
+                free(statichost);
+            }
 
-        if (start)
-            xmlFree(start);
-        if (end)
-            xmlFree(end);
+            if (mac)
+                xmlFree(mac);
+            if (host)
+                xmlFree(host);
+            if (staticip)
+                xmlFree(staticip);
+        }
 
         cur = cur->next;
     }
@@ -3012,6 +3061,7 @@
 
         if (def->ranges) {
             struct qemud_dhcp_range_def *range = def->ranges;
+            struct qemud_dhcp_statichost_def *statichost = def->statichosts;
             if (virBufferAdd(buf, "    <dhcp>\n", -1) < 0)
                 goto no_memory;
             while (range) {
@@ -3020,6 +3070,25 @@
                     goto no_memory;
                 range = range->next;
             }
+            while (statichost) {
+                if (virBufferAdd(buf, "      <statichost", -1) < 0)
+                    goto no_memory;
+
+                if (statichost->mac && virBufferVSprintf(buf, " mac='%s'", statichost->mac) < 0)
+                    goto no_memory;
+
+                if (statichost->host && virBufferVSprintf(buf, " host='%s'", statichost->host) < 0)
+                    goto no_memory;
+
+                if (virBufferVSprintf(buf, " ip='%s'", statichost->staticip) < 0)
+                    goto no_memory;
+
+                if (virBufferAdd(buf, " />\n", -1) < 0)
+                    goto no_memory;
+
+                statichost = statichost->next;
+            }
+
             if (virBufferAdd(buf, "    </dhcp>\n", -1) < 0)
                 goto no_memory;
         }
Index: libvirt-0.4.0/src/qemu_conf.h
===================================================================
--- libvirt-0.4.0.orig/src/qemu_conf.h	2008-02-14 20:09:25.000000000 +0100
+++ libvirt-0.4.0/src/qemu_conf.h	2008-02-14 20:26:25.000000000 +0100
@@ -254,6 +254,15 @@
     struct qemud_dhcp_range_def *next;
 };
 
+/* Store mac address, hostname and ip address of a static dhcp host mapping */
+struct qemud_dhcp_statichost_def {
+    char mac[18]; /* "01:23:45:67:89:0a" */
+    char host[QEMUD_MAX_NAME_LEN];
+    char staticip[BR_INET_ADDR_MAXLEN];
+
+    struct qemud_dhcp_statichost_def *next;
+};
+
 /* Virtual Network main configuration */
 struct qemud_network_def {
     unsigned char uuid[VIR_UUID_BUFLEN];
@@ -272,6 +281,8 @@
 
     int nranges;
     struct qemud_dhcp_range_def *ranges;
+    int nstatichosts;
+    struct qemud_dhcp_statichost_def *statichosts;
 };
 
 /* Virtual Network runtime state */
Index: libvirt-0.4.0/src/qemu_driver.c
===================================================================
--- libvirt-0.4.0.orig/src/qemu_driver.c	2008-02-14 19:36:24.000000000 +0100
+++ libvirt-0.4.0/src/qemu_driver.c	2008-02-14 21:35:32.000000000 +0100
@@ -823,6 +823,7 @@
     int i, len;
     char buf[PATH_MAX];
     struct qemud_dhcp_range_def *range;
+    struct qemud_dhcp_statichost_def *statichost;
 
     len =
         1 + /* dnsmasq */
@@ -836,6 +837,7 @@
         2 + /* --listen-address 10.0.0.1 */
         1 + /* --dhcp-leasefile=path */
         (2 * network->def->nranges) + /* --dhcp-range 10.0.0.2,10.0.0.254 */
+        (2 * network->def->nstatichosts) + /* --dhcp-host 01:23:45:67:89:0a,hostname,10.0.0.3 */
         1;  /* NULL */
 
     if (!(*argv = calloc(len, sizeof(**argv))))
@@ -899,6 +901,25 @@
         range = range->next;
     }
 
+    statichost = network->def->statichosts;
+    while (statichost) {
+        buf[0] = '\0';
+        if (statichost->mac && statichost->mac[0] && statichost->host && statichost->host[0])
+            snprintf(buf, sizeof(buf), "%s,%s,%s",
+                     statichost->mac, statichost->host, statichost->staticip);
+        else if (statichost->mac && statichost->mac[0])
+            snprintf(buf, sizeof(buf), "%s,%s",
+                     statichost->mac, statichost->staticip);
+        else if (statichost->host && statichost->host[0])
+            snprintf(buf, sizeof(buf), "%s,%s",
+                     statichost->host, statichost->staticip);
+
+        APPEND_ARG(*argv, i++, "--dhcp-host");
+        APPEND_ARG(*argv, i++, buf);
+
+        statichost = statichost->next;
+    }
+
 #undef APPEND_ARG
 
     return 0;

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]