Due to a race condition when bringing up an internal port on Linux
some interface flags (e.g. IFF_MULTICAST) are falsely reset. This
happens because netlink events may be processed after the according
netdev has been brought up (which sets interface flags).

Fix this by reading the interface flags just before updating them
if they have not been updated by from the kernel yet.

Signed-off-by: Helmut Schaa <helmut.sc...@googlemail.com>
---
 lib/netdev-linux.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index d0afaf6..b23cc6a 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -2508,7 +2508,13 @@ update_flags(struct netdev_linux *netdev, enum 
netdev_flags off,
     unsigned int old_flags, new_flags;
     int error = 0;
 
-    old_flags = netdev->ifi_flags;
+    if (!(netdev->cache_valid & VALID_DRVINFO)) {
+        /* Most likely the device flags are not in sync yet, fetch them now */
+        get_flags(&netdev->up, &old_flags);
+    } else {
+        old_flags = netdev->ifi_flags;
+    }
+
     *old_flagsp = iff_to_nd_flags(old_flags);
     new_flags = (old_flags & ~nd_to_iff_flags(off)) | nd_to_iff_flags(on);
     if (new_flags != old_flags) {
-- 
1.8.1.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to