[libvirt] [PATCH] "static" ip address
Daniel Veillard
veillard at redhat.com
Tue Aug 12 21:24:01 UTC 2008
On Tue, Aug 12, 2008 at 03:39:28PM -0400, Daniel Veillard wrote:
> On Tue, Aug 12, 2008 at 06:49:59PM +0200, Olivier Deckmyn wrote:
> > On Tue, Aug 12, 2008 at 5:17 PM, Daniel Veillard <veillard at redhat.com>wrote:
> > >
> > > That said I'm working on a new version of the patch which would be adequate
> [...]
> > Once again, if I can do anything to help, I will.
>
> Then please try the following patch, tell me if it works for you, I didn't
> really tried it yet and parallel testing would help.
> The things to test are:
> - no crash
> - the network definition is correctly parsed
> - virsh network define and dump still work
> - and IP as provided by dnsmasq as suggested
> in case of mismatches try to grab the full command line used by libvirtd
> for dnsmasq and report it in parallel of the XML file used,
New patch with just a pair of minor fixes which seems to work just fine for
me. The syntax is nearly the old one, just use host instead of statichost:
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.4" end="192.168.122.254" />
<host mac="00:16:3E:XX:XX:XX" host="XXX"
ip="192.168.122.2" />
<host host="YYY" ip="192.168.122.3" />
</dhcp>
</ip>
I tried net-edit, net-xmldump, the dnsmasq arguments seems to be properly
set, please report,
thanks
Daniel
--
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard | virtualization library http://libvirt.org/
veillard at redhat.com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/
-------------- next part --------------
Index: src/network_conf.c
===================================================================
RCS file: /data/cvs/libxen/src/network_conf.c,v
retrieving revision 1.6
diff -u -r1.6 network_conf.c
--- src/network_conf.c 12 Aug 2008 08:25:48 -0000 1.6
+++ src/network_conf.c 12 Aug 2008 21:23:30 -0000
@@ -40,6 +40,7 @@
#include "uuid.h"
#include "util.h"
#include "buf.h"
+#include "c-ctype.h"
VIR_ENUM_DECL(virNetworkForward)
@@ -115,6 +116,13 @@
}
VIR_FREE(def->ranges);
+ for (i = 0 ; i < def->nhosts && def->hosts ; i++) {
+ VIR_FREE(def->hosts[i].mac);
+ VIR_FREE(def->hosts[i].ip);
+ VIR_FREE(def->hosts[i].host);
+ }
+ VIR_FREE(def->hosts);
+
VIR_FREE(def);
}
@@ -197,33 +205,82 @@
cur = node->children;
while (cur != NULL) {
- xmlChar *start, *end;
-
- if (cur->type != XML_ELEMENT_NODE ||
- !xmlStrEqual(cur->name, BAD_CAST "range")) {
- cur = cur->next;
- continue;
- }
-
- if (!(start = xmlGetProp(cur, BAD_CAST "start"))) {
- cur = cur->next;
- continue;
- }
- if (!(end = xmlGetProp(cur, BAD_CAST "end"))) {
- cur = cur->next;
- xmlFree(start);
- continue;
- }
+ if (cur->type == XML_ELEMENT_NODE &&
+ xmlStrEqual(cur->name, BAD_CAST "range")) {
+ xmlChar *start, *end;
+
+ if (!(start = xmlGetProp(cur, BAD_CAST "start"))) {
+ cur = cur->next;
+ continue;
+ }
+ if (!(end = xmlGetProp(cur, BAD_CAST "end"))) {
+ cur = cur->next;
+ xmlFree(start);
+ continue;
+ }
- if (VIR_REALLOC_N(def->ranges, def->nranges + 1) < 0) {
- xmlFree(start);
- xmlFree(end);
- virNetworkReportError(conn, VIR_ERR_NO_MEMORY, NULL);
- return -1;
+ if (VIR_REALLOC_N(def->ranges, def->nranges + 1) < 0) {
+ xmlFree(start);
+ xmlFree(end);
+ virNetworkReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ return -1;
+ }
+ def->ranges[def->nranges].start = (char *)start;
+ def->ranges[def->nranges].end = (char *)end;
+ def->nranges++;
+ } else if (cur->type == XML_ELEMENT_NODE &&
+ xmlStrEqual(cur->name, BAD_CAST "host")) {
+ xmlChar *mac, *host, *ip;
+ unsigned char addr[6];
+ struct in_addr inaddress;
+
+ mac = xmlGetProp(cur, BAD_CAST "mac");
+ if ((mac != NULL) &&
+ (virParseMacAddr((const char *) mac, &addr[0]) != 0)) {
+ virNetworkReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse MAC address '%s'"),
+ mac);
+ VIR_FREE(mac);
+ }
+ host = xmlGetProp(cur, BAD_CAST "host");
+ if ((host != NULL) && (!c_isalpha(host[0]))) {
+ virNetworkReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot use host address '%s'"),
+ host);
+ VIR_FREE(host);
+ }
+ /*
+ * You need at least one MAC address or one host name
+ */
+ if ((mac == NULL) && (host == NULL)) {
+ VIR_FREE(mac);
+ VIR_FREE(host);
+ cur = cur->next;
+ continue;
+ }
+ ip = xmlGetProp(cur, BAD_CAST "ip");
+ if (inet_pton(AF_INET, (const char *) ip, &inaddress) <= 0) {
+ virNetworkReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse IP address '%s'"),
+ ip);
+ VIR_FREE(ip);
+ VIR_FREE(mac);
+ VIR_FREE(host);
+ cur = cur->next;
+ continue;
+ }
+ if (VIR_REALLOC_N(def->hosts, def->nhosts + 1) < 0) {
+ VIR_FREE(ip);
+ VIR_FREE(mac);
+ VIR_FREE(host);
+ virNetworkReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ return -1;
+ }
+ def->hosts[def->nhosts].mac = (char *)mac;
+ def->hosts[def->nhosts].host = (char *)host;
+ def->hosts[def->nhosts].ip = (char *)ip;
+ def->nhosts++;
}
- def->ranges[def->nranges].start = (char *)start;
- def->ranges[def->nranges].end = (char *)end;
- def->nranges++;
cur = cur->next;
}
@@ -524,12 +581,22 @@
virBufferAddLit(&buf, ">\n");
- if (def->nranges) {
+ if ((def->nranges || def->nhosts)) {
int i;
virBufferAddLit(&buf, " <dhcp>\n");
for (i = 0 ; i < def->nranges ; i++)
virBufferVSprintf(&buf, " <range start='%s' end='%s' />\n",
def->ranges[i].start, def->ranges[i].end);
+ for (i = 0 ; i < def->nhosts ; i++) {
+ virBufferAddLit(&buf, " <host ");
+ if (def->hosts[i].mac)
+ virBufferVSprintf(&buf, "mac='%s' ", def->hosts[i].mac);
+ if (def->hosts[i].host)
+ virBufferVSprintf(&buf, "host='%s' ", def->hosts[i].host);
+ if (def->hosts[i].ip)
+ virBufferVSprintf(&buf, "ip='%s' ", def->hosts[i].ip);
+ virBufferAddLit(&buf, "/>\n");
+ }
virBufferAddLit(&buf, " </dhcp>\n");
}
Index: src/network_conf.h
===================================================================
RCS file: /data/cvs/libxen/src/network_conf.h,v
retrieving revision 1.1
diff -u -r1.1 network_conf.h
--- src/network_conf.h 11 Jul 2008 10:48:34 -0000 1.1
+++ src/network_conf.h 12 Aug 2008 21:23:30 -0000
@@ -42,6 +42,14 @@
char *end;
};
+typedef struct _virNetworkDHCPHostDef virNetworkDHCPHostDef;
+typedef virNetworkDHCPHostDef *virNetworkDHCPHostDefPtr;
+struct _virNetworkDHCPHostDef {
+ char *mac;
+ char *host;
+ char *ip;
+};
+
typedef struct _virNetworkDef virNetworkDef;
typedef virNetworkDef *virNetworkDefPtr;
struct _virNetworkDef {
@@ -61,6 +69,9 @@
unsigned int nranges; /* Zero or more dhcp ranges */
virNetworkDHCPRangeDefPtr ranges;
+
+ unsigned int nhosts; /* Zero or more dhcp hosts */
+ virNetworkDHCPHostDefPtr hosts;
};
typedef struct _virNetworkObj virNetworkObj;
Index: src/qemu_driver.c
===================================================================
RCS file: /data/cvs/libxen/src/qemu_driver.c,v
retrieving revision 1.105
diff -u -r1.105 qemu_driver.c
--- src/qemu_driver.c 12 Aug 2008 08:38:22 -0000 1.105
+++ src/qemu_driver.c 12 Aug 2008 21:23:30 -0000
@@ -1103,6 +1103,8 @@
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 */
+ /* --dhcp-host 01:23:45:67:89:0a,hostname,10.0.0.3 */
+ (2 * network->def->nhosts) +
1; /* NULL */
if (VIR_ALLOC_N(*argv, len) < 0)
@@ -1164,6 +1166,24 @@
APPEND_ARG(*argv, i++, buf);
}
+ for (r = 0 ; r < network->def->nhosts ; r++) {
+ virNetworkDHCPHostDefPtr host = &(network->def->hosts[r]);
+ if ((host->mac) && (host->host)) {
+ snprintf(buf, sizeof(buf), "%s,%s,%s",
+ host->mac, host->host, host->ip);
+ } else if (host->mac) {
+ snprintf(buf, sizeof(buf), "%s,%s",
+ host->mac, host->ip);
+ } else if (host->host) {
+ snprintf(buf, sizeof(buf), "%s,%s",
+ host->host, host->ip);
+ } else
+ continue;
+
+ APPEND_ARG(*argv, i++, "--dhcp-host");
+ APPEND_ARG(*argv, i++, buf);
+ }
+
#undef APPEND_ARG
return 0;
More information about the libvir-list
mailing list