mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-29 17:42:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			36 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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
 | |
| @@ -3469,7 +3469,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) {
 | 
