1234567891011121314151617181920212223242526272829303132333435363738394041 |
- From b9284f535e93c337ab21f330753e60e1038f9a27 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 2/2] 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 9eaac33..423e72e 100644
- --- a/lib/netdev-linux.c
- +++ b/lib/netdev-linux.c
- @@ -2712,7 +2712,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) {
- --
- 1.8.1.4
|