|
From 6fda3936a85319d6b09108dda67466baa1c93b6c Mon Sep 17 00:00:00 2001
|
|
From: Helmut Schaa <helmut.schaa@googlemail.com>
|
|
Date: Wed, 8 Jan 2014 13:48:49 +0100
|
|
Subject: [PATCH] netdev-linux: Let interface flag survive internal port setup
|
|
|
|
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.schaa@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 c6f3d2740..136668b1d 100644
|
|
--- a/lib/netdev-linux.c
|
|
+++ b/lib/netdev-linux.c
|
|
@@ -3461,7 +3461,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 debvice 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) {
|