From 69db5f921a2f6d62645f3531042b13b6382eb865 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Fri, 13 Jun 2014 17:07:05 +0300 Subject: [PATCH] interface: report link state for bonds and vlans too 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 | 2 ++ src/conf/interface_conf.c | 18 ++++++++++++------ tests/interfaceschemadata/bond.xml | 1 + tests/interfaceschemadata/vlan.xml | 1 + 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/schemas/interface.rng b/docs/schemas/interface.rng index 27610a544c..80962d4db8 100644 --- a/docs/schemas/interface.rng +++ b/docs/schemas/interface.rng @@ -78,6 +78,7 @@ of the form DEVICE.VLAN --> + @@ -156,6 +157,7 @@ bond + diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c index 2b3f69928e..397920b2d9 100644 --- a/src/conf/interface_conf.c +++ b/src/conf/interface_conf.c @@ -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, "\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, "\n", def->mac); + virInterfaceLinkFormat(buf, &def->lnk); if (def->mtu != 0) virBufferAsprintf(buf, "\n", def->mtu); virInterfaceProtocolDefFormat(buf, def); diff --git a/tests/interfaceschemadata/bond.xml b/tests/interfaceschemadata/bond.xml index c4e6d403bc..cbc1dfa8aa 100644 --- a/tests/interfaceschemadata/bond.xml +++ b/tests/interfaceschemadata/bond.xml @@ -1,5 +1,6 @@ + diff --git a/tests/interfaceschemadata/vlan.xml b/tests/interfaceschemadata/vlan.xml index a9570e3361..6432b96240 100644 --- a/tests/interfaceschemadata/vlan.xml +++ b/tests/interfaceschemadata/vlan.xml @@ -1,5 +1,6 @@ +