[netcf-devel] [PATCH 3/3] bridge: allow enslaving vlan's

David Lutterkort lutter at redhat.com
Tue Jun 30 05:33:26 UTC 2009


  * data/xml/interface.rng: allow vlan interface inside <bridge/>
  * data/xml/initscripts-get.xsl, data/xml/initscripts-put.xsl: handle
    enslaved vlan interfaces
  * tests/test-initscripts.c: add transform test bridge-vlan.xml
---
 data/xml/initscripts-get.xsl      |    7 ++++++-
 data/xml/initscripts-put.xsl      |   17 +++++++++++++++--
 data/xml/interface.rng            |    5 ++++-
 tests/initscripts/bridge-vlan.xml |   15 +++++++++++++++
 tests/interface/bridge-vlan.xml   |   13 +++++++++++++
 tests/test-initscripts.c          |    1 +
 6 files changed, 54 insertions(+), 4 deletions(-)
 create mode 100644 tests/initscripts/bridge-vlan.xml
 create mode 100644 tests/interface/bridge-vlan.xml

diff --git a/data/xml/initscripts-get.xsl b/data/xml/initscripts-get.xsl
index 8e031ef..5fe70a8 100644
--- a/data/xml/initscripts-get.xsl
+++ b/data/xml/initscripts-get.xsl
@@ -63,7 +63,12 @@
     </tree>
     <xsl:for-each select='bridge/interface'>
       <tree>
-        <xsl:call-template name="bare-ethernet-interface"/>
+        <xsl:if test="@type = 'ethernet'">
+          <xsl:call-template name="bare-ethernet-interface"/>
+        </xsl:if>
+        <xsl:if test="@type = 'vlan'">
+          <xsl:call-template name="bare-vlan-interface"/>
+        </xsl:if>
         <node label="BRIDGE" value="{../../name}"/>
       </tree>
     </xsl:for-each>
diff --git a/data/xml/initscripts-put.xsl b/data/xml/initscripts-put.xsl
index ec4d345..777273c 100644
--- a/data/xml/initscripts-put.xsl
+++ b/data/xml/initscripts-put.xsl
@@ -29,7 +29,7 @@
       VLAN's
   -->
   <xsl:template name="vlan-interface"
-                match="tree[node[@label = 'VLAN' and @value = 'yes']]">
+                match="tree[node[@label = 'VLAN' and @value = 'yes']][count(node[@label = 'MASTER' or @label='BRIDGE']) = 0]">
     <xsl:variable name="name" select="node[@label = 'DEVICE']/@value"/>
     <interface type="vlan" device="{substring-before($name, '.')}"
                vlan="{substring-after($name, '.')}">
@@ -39,6 +39,14 @@
     </interface>
   </xsl:template>
 
+  <xsl:template name="bare-vlan-interface">
+    <xsl:variable name="name" select="node[@label = 'DEVICE']/@value"/>
+    <interface type="vlan" device="{substring-before($name, '.')}"
+               vlan="{substring-after($name, '.')}">
+      <name><xsl:value-of select="node[@label= 'DEVICE']/@value"/></name>
+    </interface>
+  </xsl:template>
+
   <!--
       Bridge
   -->
@@ -55,7 +63,12 @@
           <xsl:attribute name="stp"><xsl:value-of select="node[@label = 'STP']/@value"/></xsl:attribute>
         </xsl:if>
         <xsl:for-each select="/descendant-or-self::*[node[@label = 'BRIDGE' and @value = $iface]]">
-          <xsl:call-template name="bare-ethernet-interface"/>
+          <xsl:if test="count(node[@label = 'VLAN']) = 0">
+            <xsl:call-template name="bare-ethernet-interface"/>
+          </xsl:if>
+          <xsl:if test="count(node[@label = 'VLAN']) > 0">
+            <xsl:call-template name="bare-vlan-interface"/>
+          </xsl:if>
         </xsl:for-each>
       </bridge>
     </interface>
diff --git a/data/xml/interface.rng b/data/xml/interface.rng
index a45f30e..62b80f5 100644
--- a/data/xml/interface.rng
+++ b/data/xml/interface.rng
@@ -106,7 +106,10 @@
           </attribute>
         </optional>
         <oneOrMore>
-          <ref name="bare-ethernet-interface"/>
+          <choice>
+            <ref name="bare-ethernet-interface"/>
+            <ref name="bare-vlan-interface"/>
+          </choice>
         </oneOrMore>
       </element>
     </element>
diff --git a/tests/initscripts/bridge-vlan.xml b/tests/initscripts/bridge-vlan.xml
new file mode 100644
index 0000000..3938b14
--- /dev/null
+++ b/tests/initscripts/bridge-vlan.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/sysconfig/network-scripts/ifcfg-br0">
+    <node label="DEVICE" value="br0"/>
+    <node label="TYPE" value="Bridge"/>
+    <node label="ONBOOT" value="yes"/>
+    <node label="BOOTPROTO" value="dhcp"/>
+    <node label="STP" value="off"/>
+  </tree>
+  <tree path="/files/etc/sysconfig/network-scripts/ifcfg-eth0.42">
+    <node label="DEVICE" value="eth0.42"/>
+    <node label="VLAN" value="yes"/>
+    <node label="BRIDGE" value="br0"/>
+  </tree>
+</forest>
diff --git a/tests/interface/bridge-vlan.xml b/tests/interface/bridge-vlan.xml
new file mode 100644
index 0000000..21fe807
--- /dev/null
+++ b/tests/interface/bridge-vlan.xml
@@ -0,0 +1,13 @@
+<interface type="bridge" startmode="onboot">
+  <name>br0</name>
+  <protocol family="ipv4">
+    <dhcp/>
+  </protocol>
+  <bridge stp="off">
+    <interface type="vlan" device="eth0" vlan="42">
+      <!-- It's legal to leave out the <name/>, but then the
+           roundtrip test files, since we always generate a <name/> -->
+      <name>eth0.42</name>
+    </interface>
+  </bridge>
+</interface>
diff --git a/tests/test-initscripts.c b/tests/test-initscripts.c
index 4ad9332..5baf008 100644
--- a/tests/test-initscripts.c
+++ b/tests/test-initscripts.c
@@ -256,6 +256,7 @@ static void testTransforms(CuTest *tc) {
     assert_transforms(tc, "bond");
     assert_transforms(tc, "bond-arp");
     assert_transforms(tc, "bridge");
+    assert_transforms(tc, "bridge-vlan");
     assert_transforms(tc, "ethernet-static");
     assert_transforms(tc, "ethernet-static-no-prefix");
     assert_transforms(tc, "ethernet-dhcp");
-- 
1.6.0.6



More information about the netcf-devel mailing list