| 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 |
| @@ -3571,7 +3571,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) { |