Re: [PATCH] Fix vlan ID detection in udev interface driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



My ACK was premature ..

On 24.04.2014 15:19, Ján Tomko wrote:
Instead of guessing it from the interface name, look into
/proc/net/vlan/<interface>.

This works for devices not named <real_device>.<vlan ID>,
avoiding an error flood when virt-manager keeps asking about
them every second:

https://bugzilla.redhat.com/show_bug.cgi?id=966329
---
  src/interface/interface_backend_udev.c | 67 ++++++++++++++++++++++++++--------
  1 file changed, 51 insertions(+), 16 deletions(-)

diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
index b05ac0e..bec8c45 100644
--- a/src/interface/interface_backend_udev.c
+++ b/src/interface/interface_backend_udev.c
@@ -20,11 +20,13 @@
   */
  #include <config.h>

+#include <ctype.h>
  #include <errno.h>
  #include <dirent.h>
  #include <libudev.h>

  #include "virerror.h"
+#include "virfile.h"
  #include "c-ctype.h"
  #include "datatypes.h"
  #include "domain_conf.h"
@@ -966,31 +968,64 @@ udevGetIfaceDefVlan(struct udev *udev ATTRIBUTE_UNUSED,
                      const char *name,
                      virInterfaceDef *ifacedef)
  {
-    const char *vid;
+    char *procpath = NULL;
+    char *buf = NULL;
+    char *vid_pos, *dev_pos;
+    size_t vid_len, dev_len;
+    const char *vid_prefix = "VID: ";
+    const char *dev_prefix = "\nDevice: ";
+    int ret = -1;
+
+    if (virAsprintf(&procpath, "/proc/net/vlan/%s", name) < 0)
+        goto cleanup;
+
+    if (virFileReadAll(procpath, BUFSIZ, &buf) < 0)
+        goto cleanup;

-    /* Find the DEVICE.VID again */
-    vid = strrchr(name, '.');
-    if (!vid) {
+    if ((vid_pos = strstr(buf, vid_prefix)) == NULL) {
          virReportError(VIR_ERR_INTERNAL_ERROR,
                         _("failed to find the VID for the VLAN device '%s'"),
                         name);
-        return -1;
+        goto cleanup;
      }
+    vid_pos += strlen(vid_prefix);

-    /* Set the VLAN specifics */
-    if (VIR_STRDUP(ifacedef->data.vlan.tag, vid + 1) < 0)
-        goto error;
-    if (VIR_STRNDUP(ifacedef->data.vlan.devname,
-                    name, (vid - name)) < 0)
-        goto error;
+    if ((vid_len = strspn(vid_pos, "0123456789")) == 0 ||
+        !isspace(vid_pos[vid_len])) {

s/isspace/c_isspace/

With this change my ACK still stands.

Michal

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list





[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]