From 9cac658a9fb6d9f6304abb5c99941ec336510159 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Wed, 11 Apr 2012 18:27:20 -0400 Subject: [PATCH] Keep more accurate track of media status changes. AutoConfigLooper now remembers the last media state it received from the device, and compares both to see if the active state actually changed. Should help with quality changes where the link didn't actually drop. May also help on ethernet if the chipset sends spurious link status change notifications. --- src/servers/net/AutoconfigLooper.cpp | 6 ++++-- src/servers/net/AutoconfigLooper.h | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/servers/net/AutoconfigLooper.cpp b/src/servers/net/AutoconfigLooper.cpp index 18b7d6a583..bc1b62280a 100644 --- a/src/servers/net/AutoconfigLooper.cpp +++ b/src/servers/net/AutoconfigLooper.cpp @@ -32,7 +32,8 @@ AutoconfigLooper::AutoconfigLooper(BMessenger target, const char* device) : BLooper(device), fTarget(target), fDevice(device), - fCurrentClient(NULL) + fCurrentClient(NULL), + fLastMediaStatus(0) { BMessage ready(kMsgReadyToRun); PostMessage(&ready); @@ -148,11 +149,12 @@ AutoconfigLooper::MessageReceived(BMessage* message) || message->FindInt32("media", &media) != B_OK) break; - if ((media & IFM_ACTIVE) != 0) { + if ((fLastMediaStatus & IFM_ACTIVE) != (media & IFM_ACTIVE)) { // Reconfigure the interface when we have a link again _ConfigureIPv4(); //_ConfigureIPv6(); // TODO: router advertisement and dhcpv6 } + fLastMediaStatus = media; break; default: diff --git a/src/servers/net/AutoconfigLooper.h b/src/servers/net/AutoconfigLooper.h index d08a8ebd52..fef9c2f95c 100644 --- a/src/servers/net/AutoconfigLooper.h +++ b/src/servers/net/AutoconfigLooper.h @@ -34,6 +34,7 @@ private: BMessenger fTarget; BString fDevice; AutoconfigClient* fCurrentClient; + int32 fLastMediaStatus; }; #endif // AUTOCONFIG_LOOPER_H