- From 974dc36a87274d7bae13e7dddd3364fecf5b3e7c 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(-)
-
- --- a/lib/netdev-linux.c
- +++ b/lib/netdev-linux.c
- @@ -3485,7 +3485,13 @@ update_flags(struct netdev_linux *netdev
- 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) {
|