[libvirt] [PATCH v2 4/4] node_device: Expose link state & speed

Michal Privoznik mprivozn at redhat.com
Thu Jun 5 15:39:26 UTC 2014


While exposing the info under <interface/> in previous patch works, it
may work only in cases where interface is configured on the host.
However, orchestrating application may want to know the link state and
speed even in that case. That's why we ought to expose this in nodedev
XML too:

virsh # nodedev-dumpxml net_eth0_f0_de_f1_2b_1b_f3
<device>
  <name>net_eth0_f0_de_f1_2b_1b_f3</name>
  <path>/sys/devices/pci0000:00/0000:00:19.0/net/eth0</path>
  <parent>pci_0000_00_19_0</parent>
  <capability type='net'>
    <interface>eth0</interface>
    <address>f0:de:f1:2b:1b:f3</address>
    <link speed='1000' state='up'/>
    <capability type='80203'/>
  </capability>
</device>

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 docs/formatnode.html.in              |  6 ++++++
 docs/schemas/nodedev.rng             |  1 +
 src/Makefile.am                      |  2 +-
 src/conf/node_device_conf.c          |  7 ++++++-
 src/conf/node_device_conf.h          |  2 ++
 src/node_device/node_device_driver.c | 11 +++++++++--
 src/node_device/node_device_udev.c   |  5 +++++
 7 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in
index b424c96..0ef890f 100644
--- a/docs/formatnode.html.in
+++ b/docs/formatnode.html.in
@@ -154,6 +154,12 @@
               <dd>The interface name tied to this device.</dd>
               <dt><code>address</code></dt>
               <dd>If present, the MAC address of the device.</dd>
+              <dt><code>link</code></dt>
+              <dd>Optional to reflect the status of the link. It has
+                two optional attributes: <code>speed</code> in Mbit per
+                second and <code>state</code> to tell the state of the
+                link.
+              </dd>
               <dt><code>capability</code></dt>
               <dd>A network protocol exposed by the device, where the
                 attribute <code>type</code> can be "80203" for IEEE
diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
index 81ab4d4..8c70536 100644
--- a/docs/schemas/nodedev.rng
+++ b/docs/schemas/nodedev.rng
@@ -233,6 +233,7 @@
         <ref name='mac'/>
       </element>
     </optional>
+    <ref name="link-speed-state"/>
 
     <zeroOrMore>
       <ref name='subcapnet'/>
diff --git a/src/Makefile.am b/src/Makefile.am
index a6b8d0b..e7b3318 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1518,7 +1518,7 @@ libvirt_driver_nodedev_la_SOURCES = $(NODE_DEVICE_DRIVER_SOURCES)
 libvirt_driver_nodedev_la_CFLAGS = \
 		-I$(top_srcdir)/src/access \
 		-I$(top_srcdir)/src/conf \
-		$(AM_CFLAGS)
+		$(AM_CFLAGS) $(LIBNL_CFLAGS)
 libvirt_driver_nodedev_la_LDFLAGS = $(AM_LDFLAGS)
 libvirt_driver_nodedev_la_LIBADD =
 
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index e65b5e4..8405a25 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -386,6 +386,7 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDef *def)
             if (data->net.address)
                 virBufferEscapeString(&buf, "<address>%s</address>\n",
                                   data->net.address);
+            virInterfaceLinkFormat(&buf, &data->net.lnk);
             if (data->net.subtype != VIR_NODE_DEV_CAP_NET_LAST) {
                 const char *subtyp =
                     virNodeDevNetCapTypeToString(data->net.subtype);
@@ -837,7 +838,7 @@ virNodeDevCapNetParseXML(xmlXPathContextPtr ctxt,
                          xmlNodePtr node,
                          union _virNodeDevCapData *data)
 {
-    xmlNodePtr orignode;
+    xmlNodePtr orignode, lnk;
     int ret = -1;
     char *tmp;
 
@@ -869,6 +870,10 @@ virNodeDevCapNetParseXML(xmlXPathContextPtr ctxt,
         data->net.subtype = val;
     }
 
+    lnk = virXPathNode("./link", ctxt);
+    if (lnk && virInterfaceLinkParseXML(lnk, &data->net.lnk) < 0)
+        goto out;
+
     ret = 0;
  out:
     ctxt->node = orignode;
diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
index 50e6805..462bfa4 100644
--- a/src/conf/node_device_conf.h
+++ b/src/conf/node_device_conf.h
@@ -29,6 +29,7 @@
 # include "virutil.h"
 # include "virthread.h"
 # include "virpci.h"
+# include "device_conf.h"
 
 # include <libxml/tree.h>
 
@@ -135,6 +136,7 @@ struct _virNodeDevCapsDef {
             char *address;
             unsigned int address_len;
             char *ifname;
+            virInterfaceLink lnk;
             virNodeDevNetCapType subtype;  /* LAST -> no subtype */
         } net;
         struct {
diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
index 6906463..92aeb45 100644
--- a/src/node_device/node_device_driver.c
+++ b/src/node_device/node_device_driver.c
@@ -39,6 +39,7 @@
 #include "node_device_driver.h"
 #include "virutil.h"
 #include "viraccessapicheck.h"
+#include "virnetdev.h"
 
 #define VIR_FROM_THIS VIR_FROM_NODEDEV
 
@@ -47,10 +48,15 @@ static int update_caps(virNodeDeviceObjPtr dev)
     virNodeDevCapsDefPtr cap = dev->def->caps;
 
     while (cap) {
-        /* The only caps that currently need updating are FC related. */
         if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST) {
             detect_scsi_host_caps(&dev->def->caps->data);
         }
+        if (cap->type == VIR_NODE_DEV_CAP_NET &&
+            virNetDevGetLinkInfo(dev->def->caps->data.net.ifname,
+                                 &dev->def->caps->data.net.lnk.state,
+                                 &dev->def->caps->data.net.lnk.speed) < 0)
+            return -1;
+
         cap = cap->next;
     }
 
@@ -315,7 +321,8 @@ nodeDeviceGetXMLDesc(virNodeDevicePtr dev,
         goto cleanup;
 
     update_driver_name(obj);
-    update_caps(obj);
+    if (update_caps(obj) < 0)
+        goto cleanup;
 
     ret = virNodeDeviceDefFormat(obj->def);
 
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
index 9a951d9..0d94bba 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -40,6 +40,7 @@
 #include "virfile.h"
 #include "virpci.h"
 #include "virstring.h"
+#include "virnetdev.h"
 
 #define VIR_FROM_THIS VIR_FROM_NODEDEV
 
@@ -667,6 +668,10 @@ static int udevProcessNetworkInterface(struct udev_device *device,
         goto out;
     }
 
+    if (virNetDevGetLinkInfo(data->net.ifname, &data->net.lnk.state,
+                             &data->net.lnk.speed) < 0)
+        goto out;
+
     ret = 0;
 
  out:
-- 
2.0.0




More information about the libvir-list mailing list