[Libvir] PATCH: Fix virtual neworks with xm driver
Daniel P. Berrange
berrange at redhat.com
Fri Aug 10 15:36:25 UTC 2007
The virtual networks stuff was never added to the xm driver for Xen 3.0.3
or earlier. This means that if adding a virtual network the bridge device
won't get defined in the config. This patch addreses this, and also fixes
a tiny mem leak in the equivalent code in the xend driver.
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
-------------- next part --------------
diff -rup libvirt-0.2.3.orig/src/xm_internal.c libvirt-0.2.3.new/src/xm_internal.c
--- libvirt-0.2.3.orig/src/xm_internal.c 2007-07-24 14:32:41.000000000 -0400
+++ libvirt-0.2.3.new/src/xm_internal.c 2007-08-09 12:46:58.000000000 -0400
@@ -1624,7 +1623,7 @@ static int xenXMParseXMLDisk(xmlNodePtr
return (ret);
}
-static char *xenXMParseXMLVif(xmlNodePtr node, int hvm) {
+static char *xenXMParseXMLVif(virConnectPtr conn, xmlNodePtr node, int hvm) {
xmlNodePtr cur;
xmlChar *type = NULL;
xmlChar *source = NULL;
@@ -1634,6 +1633,7 @@ static char *xenXMParseXMLVif(xmlNodePtr
int typ = 0;
char *buf = NULL;
int buflen = 0;
+ char *bridge = NULL;
type = xmlGetProp(node, BAD_CAST "type");
if (type != NULL) {
@@ -1641,6 +1641,8 @@ static char *xenXMParseXMLVif(xmlNodePtr
typ = 0;
else if (xmlStrEqual(type, BAD_CAST "ethernet"))
typ = 1;
+ else if (xmlStrEqual(type, BAD_CAST "network"))
+ typ = 2;
xmlFree(type);
}
cur = node->children;
@@ -1651,8 +1653,10 @@ static char *xenXMParseXMLVif(xmlNodePtr
if (typ == 0)
source = xmlGetProp(cur, BAD_CAST "bridge");
- else
+ else if (typ == 1)
source = xmlGetProp(cur, BAD_CAST "dev");
+ else
+ source = xmlGetProp(cur, BAD_CAST "network");
} else if ((mac == NULL) &&
(xmlStrEqual(cur->name, BAD_CAST "mac"))) {
mac = xmlGetProp(cur, BAD_CAST "address");
@@ -1674,8 +1678,17 @@ static char *xenXMParseXMLVif(xmlNodePtr
if (source) {
if (typ == 0) {
buflen += 8 + strlen((const char *)source);
- } else {
+ } else if (typ == 1) {
buflen += 5 + strlen((const char *)source);
+ } else {
+ virNetworkPtr network = virNetworkLookupByName(conn, (const char *) source);
+ if (!network || !(bridge = virNetworkGetBridgeName(network))) {
+ if (network)
+ virNetworkFree(network);
+ goto cleanup;
+ }
+ virNetworkFree(network);
+ buflen += 8 + strlen(bridge);
}
}
if (hvm)
@@ -1694,9 +1707,12 @@ static char *xenXMParseXMLVif(xmlNodePtr
if (typ == 0) {
strcat(buf, ",bridge=");
strcat(buf, (const char*)source);
- } else {
- strcat(buf, ",mac=");
+ } else if (typ == 1) {
+ strcat(buf, ",dev=");
strcat(buf, (const char*)source);
+ } else {
+ strcat(buf, ",bridge=");
+ strcat(buf, bridge);
}
}
if (hvm) {
@@ -1712,6 +1728,8 @@ static char *xenXMParseXMLVif(xmlNodePtr
}
cleanup:
+ if (bridge != NULL)
+ free(bridge);
if (mac != NULL)
xmlFree(mac);
if (source != NULL)
@@ -2033,7 +2058,7 @@ virConfPtr xenXMParseXMLToConfig(virConn
vifs->list = NULL;
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
virConfValuePtr thisVif;
- char *vif = xenXMParseXMLVif(obj->nodesetval->nodeTab[i], hvm);
+ char *vif = xenXMParseXMLVif(conn, obj->nodesetval->nodeTab[i], hvm);
if (!vif)
goto error;
if (!(thisVif = malloc(sizeof(virConfValue)))) {
diff -rup libvirt-0.2.3.orig/src/xml.c libvirt-0.2.3.new/src/xml.c
--- libvirt-0.2.3.orig/src/xml.c 2007-08-09 11:23:40.000000000 -0400
+++ libvirt-0.2.3.new/src/xml.c 2007-08-09 12:44:55.000000000 -0400
@@ -1119,9 +1119,12 @@ virDomainParseXMLIfDesc(virConnectPtr co
virNetworkPtr network = virNetworkLookupByName(conn, (const char *) source);
char *bridge;
if (!network || !(bridge = virNetworkGetBridgeName(network))) {
+ if (network)
+ virNetworkFree(network);
virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) source, 0);
goto error;
}
+ virNetworkFree(network);
virBufferVSprintf(buf, "(bridge '%s')", bridge);
free(bridge);
}
More information about the libvir-list
mailing list