The RNG now supports IPv6 and bonds attached to bridges, along with
some other minor tweaks. All test files from netcf have been copied to
the test directory and added to the xml2xml and schema tests (and they
all pass, of course ;-)
---
docs/schemas/interface.rng | 316 ++++++++++++++--------
tests/interfaceschemadata/bond-arp.xml | 6 +-
tests/interfaceschemadata/bond.xml | 6 +-
tests/interfaceschemadata/bridge-bond.xml | 17 ++
tests/interfaceschemadata/bridge-empty.xml | 6 +
tests/interfaceschemadata/bridge-no-address.xml | 3 +-
tests/interfaceschemadata/bridge-vlan.xml | 2 +-
tests/interfaceschemadata/bridge.xml | 5 +-
tests/interfaceschemadata/bridge42.xml | 3 +-
tests/interfaceschemadata/ipv6-autoconf-dhcp.xml | 7 +
tests/interfaceschemadata/ipv6-autoconf.xml | 6 +
tests/interfaceschemadata/ipv6-dhcp.xml | 6 +
tests/interfaceschemadata/ipv6-local.xml | 5 +
tests/interfaceschemadata/ipv6-static-multi.xml | 8 +
tests/interfaceschemadata/ipv6-static.xml | 7 +
tests/interfacexml2xmltest.c | 9 +
16 files changed, 288 insertions(+), 124 deletions(-)
create mode 100644 tests/interfaceschemadata/bridge-bond.xml
create mode 100644 tests/interfaceschemadata/bridge-empty.xml
create mode 100644 tests/interfaceschemadata/ipv6-autoconf-dhcp.xml
create mode 100644 tests/interfaceschemadata/ipv6-autoconf.xml
create mode 100644 tests/interfaceschemadata/ipv6-dhcp.xml
create mode 100644 tests/interfaceschemadata/ipv6-local.xml
create mode 100644 tests/interfaceschemadata/ipv6-static-multi.xml
create mode 100644 tests/interfaceschemadata/ipv6-static.xml
diff --git a/docs/schemas/interface.rng b/docs/schemas/interface.rng
index bed2f0a..a0df9ba 100644
--- a/docs/schemas/interface.rng
+++ b/docs/schemas/interface.rng
@@ -1,7 +1,13 @@
<!-- A Relax NG schema for network interfaces -->
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
+
xmlns:v="http://netcf.org/xml/version/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
- <start>
+ <!-- Versions for this schema are simple integers that are incremented
+ everytime a changed (but backwards compatible) version
+ is released. The current version is indicated with the v:serial
+ attribute on the start element.
+ -->
+ <start v:serial="4">
<choice>
<ref name="ethernet-interface"/>
<ref name="bridge-interface"/>
@@ -109,12 +115,17 @@
<ref name="on-or-off"/>
</attribute>
</optional>
- <oneOrMore>
+ <!-- Bridge forward delay (see 'brctl setfd') -->
+ <optional v:since="2">
+ <attribute name="delay"><ref
name="timeval"/></attribute>
+ </optional>
+ <zeroOrMore>
<choice>
<ref name="bare-ethernet-interface"/>
<ref name="bare-vlan-interface"/>
+ <ref v:since="2" name="bare-bond-interface"/>
</choice>
- </oneOrMore>
+ </zeroOrMore>
</element>
</element>
</define>
@@ -125,90 +136,105 @@
<!--
Bonds
-->
- <define name="bond-interface">
- <element name="interface">
- <attribute name="type">
- <value>bond</value>
- </attribute>
- <ref name="name-attr"/>
- <ref name="startmode"/>
- <ref name="mtu"/>
- <ref name="interface-addressing"/>
- <element name="bond">
- <optional>
- <attribute name="mode">
- <choice>
- <value>balance-rr</value>
- <!-- The primary interface is the first interface child
- of the bond element -->
- <value>active-backup</value>
- <value>balance-xor</value>
- <value>broadcast</value>
- <value>802.3ad</value>
- <value>balance-tlb</value>
- <value>balance-alb</value>
- </choice>
- </attribute>
- </optional>
+ <define name="bond-interface-common">
+ <attribute name="type">
+ <value>bond</value>
+ </attribute>
+ <ref name="name-attr"/>
+ </define>
- <!-- FIXME: add more attributes
+ <define name="bond-element">
+ <element name="bond">
+ <optional>
+ <attribute name="mode">
+ <choice>
+ <value>balance-rr</value>
+ <!-- The primary interface is the first interface child
+ of the bond element -->
+ <value>active-backup</value>
+ <value>balance-xor</value>
+ <value>broadcast</value>
+ <value>802.3ad</value>
+ <value>balance-tlb</value>
+ <value>balance-alb</value>
+ </choice>
+ </attribute>
+ </optional>
- mode == 802.3ad
- ad_select
- lacp_rate
- xmit_hash_policy
+ <!-- FIXME: add more attributes
- mode == active-backup
- fail_over_mac
- num_grat_arp when mode == active-backup (since 3.3.0)
- num_unsol_na when mode == active-backup (ipv6, since 3.4.0)
+ mode == 802.3ad
+ ad_select
+ lacp_rate
+ xmit_hash_policy
- mode == balance-xor
- xmit_hash_policy (since 2.6.3/3.2.2)
- -->
+ mode == active-backup
+ fail_over_mac
+ num_grat_arp when mode == active-backup (since 3.3.0)
+ num_unsol_na when mode == active-backup (ipv6, since 3.4.0)
- <choice>
- <element name="miimon">
- <!-- miimon frequency in ms -->
- <attribute name="freq"><ref
name="uint"/></attribute>
- <optional>
- <attribute name="downdelay"><ref
name="uint"/></attribute>
- </optional>
- <optional>
- <attribute name="updelay"><ref
name="uint"/></attribute>
- </optional>
- <optional>
- <!-- use_carrier -->
- <attribute name="carrier">
- <choice>
- <!-- use MII/ETHTOOL ioctl -->
- <value>ioctl</value>
- <!-- use netif_carrier_ok() -->
- <value>netif</value>
- </choice>
- </attribute>
- </optional>
- </element>
- <element name="arpmon">
- <attribute name="interval"><ref
name="uint"/></attribute>
- <attribute name="target"><ref
name="ipv4-addr"/></attribute>
- <optional>
- <attribute name="validate">
- <choice>
- <value>none</value>
- <value>active</value>
- <value>backup</value>
- <value>all</value>
- </choice>
- </attribute>
- </optional>
- </element>
- </choice>
- <oneOrMore>
- <!-- The slave interfaces -->
- <ref name="bare-ethernet-interface"/>
- </oneOrMore>
- </element>
+ mode == balance-xor
+ xmit_hash_policy (since 2.6.3/3.2.2)
+ -->
+
+ <choice>
+ <element name="miimon">
+ <!-- miimon frequency in ms -->
+ <attribute name="freq"><ref
name="uint"/></attribute>
+ <optional>
+ <attribute name="downdelay"><ref
name="uint"/></attribute>
+ </optional>
+ <optional>
+ <attribute name="updelay"><ref
name="uint"/></attribute>
+ </optional>
+ <optional>
+ <!-- use_carrier -->
+ <attribute name="carrier">
+ <choice>
+ <!-- use MII/ETHTOOL ioctl -->
+ <value>ioctl</value>
+ <!-- use netif_carrier_ok() -->
+ <value>netif</value>
+ </choice>
+ </attribute>
+ </optional>
+ </element>
+ <element name="arpmon">
+ <attribute name="interval"><ref
name="uint"/></attribute>
+ <attribute name="target"><ref
name="ipv4-addr"/></attribute>
+ <optional>
+ <attribute name="validate">
+ <choice>
+ <value>none</value>
+ <value>active</value>
+ <value>backup</value>
+ <value>all</value>
+ </choice>
+ </attribute>
+ </optional>
+ </element>
+ </choice>
+ <oneOrMore>
+ <!-- The slave interfaces -->
+ <ref name="bare-ethernet-interface"/>
+ </oneOrMore>
+ </element>
+ </define>
+
+ <define name="bare-bond-interface">
+ <element name="interface">
+ <ref name="bond-interface-common"/>
+ <ref name="bond-element"/>
+ </element>
+ </define>
+
+ <define name="bond-interface">
+ <element name="interface">
+ <ref name="bond-interface-common"/>
+ <ref name="startmode"/>
+ <ref name="mtu"/>
+ <ref name="interface-addressing"/>
+ <ref name="bond-element"/>
</element>
</define>
@@ -245,47 +271,87 @@
different protocols
-->
<define name="interface-addressing">
- <optional>
- <element name="protocol">
- <ref name="protocol-ipv4"/>
- </element>
- </optional>
- </define>
-
- <define name="protocol-ipv4">
- <attribute name="family">
- <value>ipv4</value>
- </attribute>
<choice>
- <element name="dhcp">
+ <group>
<optional>
- <attribute name="peerdns">
- <ref name="yes-or-no"/>
- </attribute>
+ <ref name="protocol-ipv4"/>
</optional>
- </element>
- <!-- FIXME: This format should be good enough for IPv4 and IPv6, i.e.
+ <optional v:since="3">
+ <ref name="protocol-ipv6"/>
+ </optional>
+ </group>
+ <group>
+ <optional v:since="3">
+ <ref name="protocol-ipv6"/>
+ </optional>
+ <optional>
+ <ref name="protocol-ipv4"/>
+ </optional>
+ </group>
+ </choice>
+ </define>
- ipaddr="192.168.0.5/24"
- ipaddr="2001:DB8:ABCD::1/64"
+ <define name="protocol-ipv4">
+ <element name="protocol">
+ <attribute name="family">
+ <value>ipv4</value>
+ </attribute>
+ <choice>
+ <ref name="dhcp-element"/>
+ <group>
+ <element name="ip">
+ <attribute name="address"><ref
name="ipv4-addr"/></attribute>
+ <optional>
+ <attribute name="prefix"><ref
name="ipv4-prefix"/></attribute>
+ </optional>
+ </element>
+ <optional>
+ <element name="route">
+ <attribute name="gateway"><ref
name="ipv4-addr"/></attribute>
+ </element>
+ </optional>
+ </group>
+ </choice>
+ </element>
+ </define>
- but will cause some backend pain
- -->
- <group>
+ <define name="protocol-ipv6">
+ <element name="protocol">
+ <attribute name="family">
+ <value>ipv6</value>
+ </attribute>
+ <optional>
+ <element name="autoconf"><empty/></element>
+ </optional>
+ <optional>
+ <ref name="dhcp-element"/>
+ </optional>
+ <zeroOrMore>
<element name="ip">
- <attribute name="address"><ref
name="ipv4-addr"/></attribute>
+ <attribute name="address"><ref
name="ipv6-addr"/></attribute>
<optional>
- <attribute name="prefix"><ref
name="ipv4-prefix"/></attribute>
+ <attribute name="prefix"><ref
name="ipv6-prefix"/></attribute>
</optional>
</element>
- <optional>
- <element name="route">
- <attribute name="gateway"><ref
name="ipv4-addr"/></attribute>
- </element>
- </optional>
- </group>
- </choice>
+ </zeroOrMore>
+ <optional>
+ <element name="route">
+ <attribute name="gateway"><ref
name="ipv6-addr"/></attribute>
+ </element>
+ </optional>
+ </element>
</define>
+
+ <define name="dhcp-element">
+ <element name="dhcp">
+ <optional>
+ <attribute name="peerdns">
+ <ref name="yes-or-no"/>
+ </attribute>
+ </optional>
+ </element>
+ </define>
+
<!-- Jim Fehlig (<jfehlig(a)novell.com>) suggest the
following additions to DHCP:
@@ -342,6 +408,12 @@
</data>
</define>
+ <define name="timeval">
+ <data type="double">
+ <param name="minInclusive">0</param>
+ </data>
+ </define>
+
<define name='device-name'>
<data type='string'>
<param name="pattern">[a-zA-Z0-9_\.\-:/]+</param>
@@ -367,13 +439,27 @@
<define name='ipv4-addr'>
<data type='string'>
- <param
name="pattern">([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9]</param>
+ <param
name="pattern">(((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))\.){3}((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))</param>
</data>
</define>
<define name='ipv4-prefix'>
+ <data type='unsignedInt'>
+ <param name="maxInclusive">32</param>
+ </data>
+ </define>
+
+ <!-- Based on
http://blog.mes-stats.fr/2008/10/09/regex-ipv4-et-ipv6 -->
+ <define name='ipv6-addr'>
<data type='string'>
- <param name="pattern">[1-9]|[12][0-9]|3[0-2]</param>
+ <!-- To understand this better, take apart the toplevel '|'s -->
+ <param
name="pattern">(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2})))\.){3}(((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))))|(([0-9A-Fa-f]{1,4}:){0,5}:((((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2})))\.){3}(((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))))|(::([0-9A-Fa-f]{1,4}:){0,5}((((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2})))\.){3}(((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)</param>
+ </data>
+ </define>
+
+ <define name='ipv6-prefix'>
+ <data type='unsignedInt'>
+ <param name="maxInclusive">128</param>
</data>
</define>
diff --git a/tests/interfaceschemadata/bond-arp.xml
b/tests/interfaceschemadata/bond-arp.xml
index 7b4ed6f..69e1d98 100644
--- a/tests/interfaceschemadata/bond-arp.xml
+++ b/tests/interfaceschemadata/bond-arp.xml
@@ -6,7 +6,9 @@
</protocol>
<bond mode='active-backup'>
<arpmon interval='100' target='192.168.50.1'
validate='active'/>
- <interface type='ethernet' name='eth1'/>
- <interface type='ethernet' name='eth0'/>
+ <interface type='ethernet' name='eth1'>
+ </interface>
+ <interface type='ethernet' name='eth0'>
+ </interface>
</bond>
</interface>
diff --git a/tests/interfaceschemadata/bond.xml b/tests/interfaceschemadata/bond.xml
index 81b92e3..c4e6d40 100644
--- a/tests/interfaceschemadata/bond.xml
+++ b/tests/interfaceschemadata/bond.xml
@@ -6,7 +6,9 @@
</protocol>
<bond mode='active-backup'>
<miimon freq='100' updelay='10' carrier='ioctl'/>
- <interface type='ethernet' name='eth1'/>
- <interface type='ethernet' name='eth0'/>
+ <interface type='ethernet' name='eth1'>
+ </interface>
+ <interface type='ethernet' name='eth0'>
+ </interface>
</bond>
</interface>
diff --git a/tests/interfaceschemadata/bridge-bond.xml
b/tests/interfaceschemadata/bridge-bond.xml
new file mode 100644
index 0000000..a8c30b9
--- /dev/null
+++ b/tests/interfaceschemadata/bridge-bond.xml
@@ -0,0 +1,17 @@
+<interface type='bridge' name='br0'>
+ <start mode='onboot'/>
+ <mtu size='1500'/>
+ <bridge stp='off'>
+ <interface type='ethernet' name='eth2'>
+ </interface>
+ <interface type='bond' name='bond0'>
+ <bond mode='active-backup'>
+ <miimon freq='100' updelay='10' carrier='ioctl'/>
+ <interface type='ethernet' name='eth1'>
+ </interface>
+ <interface type='ethernet' name='eth0'>
+ </interface>
+ </bond>
+ </interface>
+ </bridge>
+</interface>
diff --git a/tests/interfaceschemadata/bridge-empty.xml
b/tests/interfaceschemadata/bridge-empty.xml
new file mode 100644
index 0000000..72861e6
--- /dev/null
+++ b/tests/interfaceschemadata/bridge-empty.xml
@@ -0,0 +1,6 @@
+<interface type='bridge' name='br0'>
+ <start mode='onboot'/>
+ <mtu size='1500'/>
+ <bridge stp='off'>
+ </bridge>
+</interface>
diff --git a/tests/interfaceschemadata/bridge-no-address.xml
b/tests/interfaceschemadata/bridge-no-address.xml
index cddafb1..7757534 100644
--- a/tests/interfaceschemadata/bridge-no-address.xml
+++ b/tests/interfaceschemadata/bridge-no-address.xml
@@ -5,6 +5,7 @@
<interface type='ethernet' name='eth0'>
<mac address='ab:bb:cc:dd:ee:ff'/>
</interface>
- <interface type='ethernet' name='eth1'/>
+ <interface type='ethernet' name='eth1'>
+ </interface>
</bridge>
</interface>
diff --git a/tests/interfaceschemadata/bridge-vlan.xml
b/tests/interfaceschemadata/bridge-vlan.xml
index 77f992d..559ebc4 100644
--- a/tests/interfaceschemadata/bridge-vlan.xml
+++ b/tests/interfaceschemadata/bridge-vlan.xml
@@ -6,7 +6,7 @@
<bridge stp='off'>
<interface type='vlan' name='eth0.42'>
<vlan tag='42'>
- <interface name='eth0'/>
+ <interface name='eth0'/>
</vlan>
</interface>
</bridge>
diff --git a/tests/interfaceschemadata/bridge.xml b/tests/interfaceschemadata/bridge.xml
index 1f17114..2535edf 100644
--- a/tests/interfaceschemadata/bridge.xml
+++ b/tests/interfaceschemadata/bridge.xml
@@ -4,10 +4,11 @@
<protocol family='ipv4'>
<dhcp/>
</protocol>
- <bridge stp='off'>
+ <bridge stp='off' delay='0.01'>
<interface type='ethernet' name='eth0'>
<mac address='ab:bb:cc:dd:ee:ff'/>
</interface>
- <interface type='ethernet' name='eth1'/>
+ <interface type='ethernet' name='eth1'>
+ </interface>
</bridge>
</interface>
diff --git a/tests/interfaceschemadata/bridge42.xml
b/tests/interfaceschemadata/bridge42.xml
index c6639ab..199b62c 100644
--- a/tests/interfaceschemadata/bridge42.xml
+++ b/tests/interfaceschemadata/bridge42.xml
@@ -2,6 +2,7 @@
<start mode='onboot'/>
<mtu size='1500'/>
<bridge stp='off'>
- <interface type='ethernet' name='eth42'/>
+ <interface type='ethernet' name='eth42'>
+ </interface>
</bridge>
</interface>
diff --git a/tests/interfaceschemadata/ipv6-autoconf-dhcp.xml
b/tests/interfaceschemadata/ipv6-autoconf-dhcp.xml
new file mode 100644
index 0000000..9ea716d
--- /dev/null
+++ b/tests/interfaceschemadata/ipv6-autoconf-dhcp.xml
@@ -0,0 +1,7 @@
+<interface type='ethernet' name='eth0'>
+ <start mode='onboot'/>
+ <protocol family='ipv6'>
+ <autoconf/>
+ <dhcp/>
+ </protocol>
+</interface>
diff --git a/tests/interfaceschemadata/ipv6-autoconf.xml
b/tests/interfaceschemadata/ipv6-autoconf.xml
new file mode 100644
index 0000000..eda0ea7
--- /dev/null
+++ b/tests/interfaceschemadata/ipv6-autoconf.xml
@@ -0,0 +1,6 @@
+<interface type='ethernet' name='eth0'>
+ <start mode='onboot'/>
+ <protocol family='ipv6'>
+ <autoconf/>
+ </protocol>
+</interface>
diff --git a/tests/interfaceschemadata/ipv6-dhcp.xml
b/tests/interfaceschemadata/ipv6-dhcp.xml
new file mode 100644
index 0000000..7439539
--- /dev/null
+++ b/tests/interfaceschemadata/ipv6-dhcp.xml
@@ -0,0 +1,6 @@
+<interface type='ethernet' name='eth0'>
+ <start mode='onboot'/>
+ <protocol family='ipv6'>
+ <dhcp/>
+ </protocol>
+</interface>
diff --git a/tests/interfaceschemadata/ipv6-local.xml
b/tests/interfaceschemadata/ipv6-local.xml
new file mode 100644
index 0000000..895d0f7
--- /dev/null
+++ b/tests/interfaceschemadata/ipv6-local.xml
@@ -0,0 +1,5 @@
+<interface type='ethernet' name='eth0'>
+ <start mode='onboot'/>
+ <protocol family='ipv6'>
+ </protocol>
+</interface>
diff --git a/tests/interfaceschemadata/ipv6-static-multi.xml
b/tests/interfaceschemadata/ipv6-static-multi.xml
new file mode 100644
index 0000000..f0cb00b
--- /dev/null
+++ b/tests/interfaceschemadata/ipv6-static-multi.xml
@@ -0,0 +1,8 @@
+<interface type='ethernet' name='eth0'>
+ <start mode='onboot'/>
+ <protocol family='ipv6'>
+ <ip address='3ffe:ffff:0:5::1' prefix='128'/>
+ <ip address='3ffe:ffff:0:5::3' prefix='128'/>
+ <ip address='3ffe:ffff:0:5::5' prefix='128'/>
+ </protocol>
+</interface>
diff --git a/tests/interfaceschemadata/ipv6-static.xml
b/tests/interfaceschemadata/ipv6-static.xml
new file mode 100644
index 0000000..e43d2a2
--- /dev/null
+++ b/tests/interfaceschemadata/ipv6-static.xml
@@ -0,0 +1,7 @@
+<interface type='ethernet' name='eth0'>
+ <start mode='onboot'/>
+ <protocol family='ipv6'>
+ <ip address='3ffe:ffff:0:5::1' prefix='128'/>
+ <route gateway='3ffe:ffff:1234:5678::1'/>
+ </protocol>
+</interface>
diff --git a/tests/interfacexml2xmltest.c b/tests/interfacexml2xmltest.c
index ed3093c..d8f1b43 100644
--- a/tests/interfacexml2xmltest.c
+++ b/tests/interfacexml2xmltest.c
@@ -83,11 +83,20 @@ mymain(int argc, char **argv)
DO_TEST("ethernet-static-no-prefix");
DO_TEST("bridge");
DO_TEST("bridge42");
+ DO_TEST("bridge-bond");
+ DO_TEST("bridge-empty");
+ DO_TEST("bridge-no-address");
DO_TEST("bridge-vlan");
DO_TEST("bridge-no-address");
DO_TEST("vlan");
DO_TEST("bond");
DO_TEST("bond-arp");
+ DO_TEST("ipv6-autoconf-dhcp");
+ DO_TEST("ipv6-autoconf");
+ DO_TEST("ipv6-dhcp");
+ DO_TEST("ipv6-local");
+ DO_TEST("ipv6-static-multi");
+ DO_TEST("ipv6-static");
return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
}
:|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|