]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
interface: report link state for bonds and vlans too
authorLaine Stump <laine@laine.org>
Fri, 13 Jun 2014 14:07:05 +0000 (17:07 +0300)
committerLaine Stump <laine@laine.org>
Fri, 20 Jun 2014 08:43:19 +0000 (11:43 +0300)
The interface state for bonds and vlans does seem to reflect the state
of the underlying physical devices, at least in some cases, so it
makes sense to allow reporting it (netcf now does).

The link state/speed for bridge devices is meaningless though, so we
don't even look for it.

docs/schemas/interface.rng
src/conf/interface_conf.c
tests/interfaceschemadata/bond.xml
tests/interfaceschemadata/vlan.xml

index 27610a544c62dd071b7c2a4baa782094073cc77d..80962d4db84ade9a191150d6fb8f117cf84be9e3 100644 (file)
@@ -78,6 +78,7 @@
          of the form DEVICE.VLAN
     -->
     <optional><ref name="name-attr"/></optional>
+    <ref name="link-speed-state"/>
   </define>
 
   <define name="vlan-device">
       <value>bond</value>
     </attribute>
     <ref name="name-attr"/>
+    <ref name="link-speed-state"/>
   </define>
 
   <define name="bond-element">
index 2b3f69928eaded6c905830d42ecb83edc9029249..397920b2d9bebb29e8029959c9555b3ea3b20534 100644 (file)
@@ -669,6 +669,8 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt, int parentIfType)
     int type;
     char *tmp;
     xmlNodePtr cur = ctxt->node;
+    xmlNodePtr lnk;
+
 
     /* check @type */
     tmp = virXPathString("string(./@type)", ctxt);
@@ -704,20 +706,22 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt, int parentIfType)
         goto error;
     }
     def->type = type;
+
+    if (type != VIR_INTERFACE_TYPE_BRIDGE) {
+        /* link status makes no sense for a bridge */
+        lnk = virXPathNode("./link", ctxt);
+        if (lnk && virInterfaceLinkParseXML(lnk, &def->lnk) < 0)
+            goto error;
+    }
+
     switch (type) {
         case VIR_INTERFACE_TYPE_ETHERNET: {
-            xmlNodePtr lnk;
-
             if (virInterfaceDefParseName(def, ctxt) < 0)
                 goto error;
             tmp = virXPathString("string(./mac/@address)", ctxt);
             if (tmp != NULL)
                 def->mac = tmp;
 
-            lnk = virXPathNode("./link", ctxt);
-            if (lnk && virInterfaceLinkParseXML(lnk, &def->lnk) < 0)
-                goto error;
-
             if (parentIfType == VIR_INTERFACE_TYPE_LAST) {
                 /* only recognize these in toplevel bond interfaces */
                 if (virInterfaceDefParseStartMode(def, ctxt) < 0)
@@ -1110,6 +1114,7 @@ virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDef *def)
             break;
         case VIR_INTERFACE_TYPE_BOND:
             virInterfaceStartmodeDefFormat(buf, def->startmode);
+            virInterfaceLinkFormat(buf, &def->lnk);
             if (def->mtu != 0)
                 virBufferAsprintf(buf, "<mtu size='%d'/>\n", def->mtu);
             virInterfaceProtocolDefFormat(buf, def);
@@ -1119,6 +1124,7 @@ virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDef *def)
             virInterfaceStartmodeDefFormat(buf, def->startmode);
             if (def->mac != NULL)
                 virBufferAsprintf(buf, "<mac address='%s'/>\n", def->mac);
+            virInterfaceLinkFormat(buf, &def->lnk);
             if (def->mtu != 0)
                 virBufferAsprintf(buf, "<mtu size='%d'/>\n", def->mtu);
             virInterfaceProtocolDefFormat(buf, def);
index c4e6d403bc11d2fb477240db1a7860c3f9cbd8ea..cbc1dfa8aa4a0afd014c7da11ae5a035fc0d0f7e 100644 (file)
@@ -1,5 +1,6 @@
 <interface type='bond' name='bond0'>
   <start mode='none'/>
+  <link speed='1000' state='up'/>
   <protocol family='ipv4'>
     <ip address='192.168.50.7' prefix='24'/>
     <route gateway='192.168.50.1'/>
index a9570e336177f681c7f893bfdd06f3382fb3c963..6432b9624001a5d6d53855eb1b093f82b697dcdb 100644 (file)
@@ -1,5 +1,6 @@
 <interface type='vlan' name='eth0.42'>
   <start mode='onboot'/>
+  <link state='lowerlayerdown'/>
   <protocol family='ipv4'>
     <dhcp peerdns='no'/>
   </protocol>