# HG changeset patch
# User john.levon(a)sun.com
# Date 1232562942 28800
# Node ID 14b7020610538fbaf0cd5db5e713abe5769de2af
# Parent e0b0295722ecf4645983e3a9a090e0aaabc40da7
Parse ipaddr for bridge network types
As well as supporting round-tripping of the IP address, this fixes a
leak if ipaddr was specified in the Xen domain config.
Signed-off-by: John Levon <john.levon(a)sun.com>
diff --git a/src/domain_conf.c b/src/domain_conf.c
--- a/src/domain_conf.c
+++ b/src/domain_conf.c
@@ -289,6 +289,7 @@ void virDomainNetDefFree(virDomainNetDef
case VIR_DOMAIN_NET_TYPE_BRIDGE:
VIR_FREE(def->data.bridge.brname);
VIR_FREE(def->data.bridge.script);
+ VIR_FREE(def->data.bridge.ipaddr);
break;
}
@@ -887,7 +888,8 @@ virDomainNetDefParseXML(virConnectPtr co
address = virXMLPropString(cur, "address");
port = virXMLPropString(cur, "port");
} else if ((address == NULL) &&
- (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET) &&
+ (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET ||
+ def->type == VIR_DOMAIN_NET_TYPE_BRIDGE) &&
(xmlStrEqual(cur->name, BAD_CAST "ip"))) {
address = virXMLPropString(cur, "address");
} else if ((ifname == NULL) &&
@@ -953,6 +955,10 @@ virDomainNetDefParseXML(virConnectPtr co
if (script != NULL) {
def->data.bridge.script = script;
script = NULL;
+ }
+ if (address != NULL) {
+ def->data.bridge.ipaddr = address;
+ address = NULL;
}
break;
@@ -2889,6 +2895,9 @@ virDomainNetDefFormat(virConnectPtr conn
case VIR_DOMAIN_NET_TYPE_BRIDGE:
virBufferEscapeString(buf, " <source
bridge='%s'/>\n",
def->data.bridge.brname);
+ if (def->data.bridge.ipaddr)
+ virBufferVSprintf(buf, " <ip address='%s'/>\n",
+ def->data.bridge.ipaddr);
if (def->data.bridge.script)
virBufferEscapeString(buf, " <script
path='%s'/>\n",
def->data.bridge.script);
diff --git a/src/domain_conf.h b/src/domain_conf.h
--- a/src/domain_conf.h
+++ b/src/domain_conf.h
@@ -155,6 +155,7 @@ struct _virDomainNetDef {
struct {
char *brname;
char *script;
+ char *ipaddr;
} bridge;
} data;
char *ifname;
diff --git a/src/xend_internal.c b/src/xend_internal.c
--- a/src/xend_internal.c
+++ b/src/xend_internal.c
@@ -1756,10 +1756,18 @@ xenDaemonParseSxprNets(virConnectPtr con
net->type == VIR_DOMAIN_NET_TYPE_BRIDGE &&
!(net->data.bridge.script = strdup(tmp2)))
goto no_memory;
+ tmp = sexpr_node(node, "device/vif/ip");
+ if (tmp &&
+ !(net->data.bridge.ipaddr = strdup(tmp)))
+ goto no_memory;
} else {
net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
if (tmp2 &&
!(net->data.ethernet.script = strdup(tmp2)))
+ goto no_memory;
+ tmp = sexpr_node(node, "device/vif/ip");
+ if (tmp &&
+ !(net->data.ethernet.ipaddr = strdup(tmp)))
goto no_memory;
}
@@ -1793,11 +1801,6 @@ xenDaemonParseSxprNets(virConnectPtr con
net->mac[4] = mac[4];
net->mac[5] = mac[5];
}
-
- tmp = sexpr_node(node, "device/vif/ip");
- if (tmp &&
- !(net->data.ethernet.ipaddr = strdup(tmp)))
- goto no_memory;
if (model &&
!(net->model = strdup(model)))
@@ -5104,6 +5107,8 @@ xenDaemonFormatSxprNet(virConnectPtr con
script = def->data.bridge.script;
virBufferVSprintf(buf, "(script '%s')", script);
+ if (def->data.bridge.ipaddr != NULL)
+ virBufferVSprintf(buf, "(ip '%s')",
def->data.bridge.ipaddr);
break;
case VIR_DOMAIN_NET_TYPE_NETWORK:
diff --git a/src/xm_internal.c b/src/xm_internal.c
--- a/src/xm_internal.c
+++ b/src/xm_internal.c
@@ -1071,6 +1071,9 @@ xenXMDomainConfigParse(virConnectPtr con
if (script[0] &&
!(net->data.bridge.script = strdup(script)))
goto no_memory;
+ if (ip[0] &&
+ !(net->data.bridge.ipaddr = strdup(ip)))
+ goto no_memory;
} else {
if (script[0] &&
!(net->data.ethernet.script = strdup(script)))
@@ -1832,6 +1835,8 @@ static int xenXMDomainConfigFormatNet(vi
switch (net->type) {
case VIR_DOMAIN_NET_TYPE_BRIDGE:
virBufferVSprintf(&buf, ",bridge=%s", net->data.bridge.brname);
+ if (net->data.bridge.ipaddr)
+ virBufferVSprintf(&buf, ",ip=%s", net->data.bridge.ipaddr);
break;
case VIR_DOMAIN_NET_TYPE_ETHERNET:
diff --git a/tests/sexpr2xmldata/sexpr2xml-bridge-ipaddr.sexpr
b/tests/sexpr2xmldata/sexpr2xml-bridge-ipaddr.sexpr
new file mode 100644
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-bridge-ipaddr.sexpr
@@ -0,0 +1,2 @@
+(domain (domid 6)(name 'pvtest')(memory 420)(maxmem 420)(vcpus 2)(uuid
'596a5d2171f48fb2e068e2386a5c413e')(on_poweroff 'destroy')(on_reboot
'destroy')(on_crash 'destroy')(image (linux (kernel
'/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk
'/var/lib/xen/initrd.img.0u-Vhq')(args '
method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test...
')))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode
'w')))(device (vif (mac '00:11:22:33:44:55')(bridge
'xenbr2')(script 'vif-bridge')(ip '192.0.2.1')))
+
diff --git a/tests/sexpr2xmldata/sexpr2xml-bridge-ipaddr.xml
b/tests/sexpr2xmldata/sexpr2xml-bridge-ipaddr.xml
new file mode 100644
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-bridge-ipaddr.xml
@@ -0,0 +1,34 @@
+<domain type='xen' id='6'>
+ <name>pvtest</name>
+ <uuid>596a5d21-71f4-8fb2-e068-e2386a5c413e</uuid>
+ <memory>430080</memory>
+ <currentMemory>430080</currentMemory>
+ <vcpu>2</vcpu>
+ <os>
+ <type>linux</type>
+ <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
+ <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
+ <cmdline>
method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test...
</cmdline>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>destroy</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <disk type='file' device='disk'>
+ <driver name='file'/>
+ <source file='/root/some.img'/>
+ <target dev='xvda' bus='xen'/>
+ </disk>
+ <interface type='bridge'>
+ <mac address='00:11:22:33:44:55'/>
+ <source bridge='xenbr2'/>
+ <ip address='192.0.2.1'/>
+ <script path='vif-bridge'/>
+ <target dev='vif6.0'/>
+ </interface>
+ <console type='pty'>
+ <target port='0'/>
+ </console>
+ </devices>
+</domain>
diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c
--- a/tests/sexpr2xmltest.c
+++ b/tests/sexpr2xmltest.c
@@ -117,6 +117,7 @@ mymain(int argc, char **argv)
DO_TEST("net-routed", "net-routed", 2);
DO_TEST("net-bridged", "net-bridged", 2);
DO_TEST("net-e1000", "net-e1000", 2);
+ DO_TEST("bridge-ipaddr", "bridge-ipaddr", 3);
DO_TEST("no-source-cdrom", "no-source-cdrom", 2);
DO_TEST("fv-utc", "fv-utc", 1);
diff --git a/tests/xml2sexprdata/xml2sexpr-bridge-ipaddr.sexpr
b/tests/xml2sexprdata/xml2sexpr-bridge-ipaddr.sexpr
new file mode 100644
--- /dev/null
+++ b/tests/xml2sexprdata/xml2sexpr-bridge-ipaddr.sexpr
@@ -0,0 +1,1 @@
+(vm (name 'pvtest')(memory 420)(maxmem 420)(vcpus 2)(uuid
'596a5d21-71f4-8fb2-e068-e2386a5c413e')(on_poweroff 'destroy')(on_reboot
'destroy')(on_crash 'destroy')(image (linux (kernel
'/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk
'/var/lib/xen/initrd.img.0u-Vhq')(args '
method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test...
')))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode
'w')))(device (vif (mac '00:11:22:33:44:55')(bridge
'xenbr2')(script 'vif-bridge')(ip '192.0.2.1'))))
\ No newline at end of file
diff --git a/tests/xml2sexprdata/xml2sexpr-bridge-ipaddr.xml
b/tests/xml2sexprdata/xml2sexpr-bridge-ipaddr.xml
new file mode 100644
--- /dev/null
+++ b/tests/xml2sexprdata/xml2sexpr-bridge-ipaddr.xml
@@ -0,0 +1,30 @@
+<domain type='xen' id='15'>
+ <name>pvtest</name>
+ <uuid>596a5d2171f48fb2e068e2386a5c413e</uuid>
+ <os>
+ <type>linux</type>
+ <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
+ <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
+ <cmdline>
method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test...
</cmdline>
+ </os>
+ <memory>430080</memory>
+ <vcpu>2</vcpu>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>destroy</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <disk type='file' device='disk'>
+ <source file='/root/some.img'/>
+ <target dev='xvda'/>
+ </disk>
+ <interface type="bridge">
+ <mac address="00:11:22:33:44:55"/>
+ <source bridge="xenbr2"/>
+ <ip address="192.0.2.1"/>
+ <script path="vif-bridge"/>
+ <target dev="vif4.0"/>
+ </interface>
+ <console tty='/dev/pts/4'/>
+ </devices>
+</domain>
+
diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c
--- a/tests/xml2sexprtest.c
+++ b/tests/xml2sexprtest.c
@@ -126,6 +126,7 @@ mymain(int argc, char **argv)
DO_TEST("net-routed", "net-routed", "pvtest", 2);
DO_TEST("net-bridged", "net-bridged", "pvtest", 2);
DO_TEST("net-e1000", "net-e1000", "pvtest", 2);
+ DO_TEST("bridge-ipaddr", "bridge-ipaddr", "pvtest",
2);
DO_TEST("no-source-cdrom", "no-source-cdrom", "test",
2);
DO_TEST("fv-utc", "fv-utc", "fvtest", 1);