]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
windows-vista-network-change-20080105
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 5 Jan 2008 17:55:20 +0000 (17:55 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 5 Jan 2008 17:55:20 +0000 (17:55 +0000)
LICENSE MIT

After a network change, test to see if the desired LAN adapter to bind
the Netbios Name to has changed.  If so, stop the Netbios Network and
restart with the new LAN adapter.

This can happen on Vista after a suspend if the service wakes up before
the Loopback adapter re-initializes.

src/WINNT/afsd/cm_daemon.c
src/WINNT/afsd/smb.c
src/WINNT/afsd/smb.h

index f708b8bc2f01343d2a55ad4dda9b3a9b203c3e4a..86b23fa66f841115e06165331838820d5ab0c556 100644 (file)
@@ -69,6 +69,7 @@ void cm_IpAddrDaemon(long parm)
         thrd_SetEvent(cm_IPAddrDaemon_ShutdownEvent);
         Result = NotifyAddrChange(NULL,NULL);
         if (Result == NO_ERROR && daemon_ShutdownFlag == 0) {
+            smb_LanAdapterChange();
             thrd_ResetEvent(cm_IPAddrDaemon_ShutdownEvent);
            Sleep(2500);
             if (daemon_ShutdownFlag == 0) {
index 3059ee272ec300b5bdc2b95e8e2b57bc39a58e53..acfd8559d96e5dc9ad6cd8a32c60aab5871551d6 100644 (file)
@@ -60,7 +60,7 @@ osi_rwlock_t smb_globalLock;
 osi_rwlock_t smb_rctLock;
 osi_mutex_t  smb_ListenerLock;
  
-char smb_LANadapter;
+char smb_LANadapter = -1;
 unsigned char smb_sharename[NCBNAMSZ+1] = {0};
 
 BOOL isGateway = FALSE;
@@ -8321,6 +8321,28 @@ void smb_Listener(void *parmp)
     FreeNCB(ncbp);
 }
 
+
+void smb_LanAdapterChange(void) {
+    lana_number_t lanaNum;
+    BOOL          bGateway;
+    char          NetbiosName[MAX_NB_NAME_LENGTH] = "";
+    int           change = 0;
+
+    if (SUCCEEDED(lana_GetUncServerNameEx(NetbiosName, &lanaNum, &bGateway, 
+                                                  LANA_NETBIOS_NAME_FULL))) {
+        if (smb_LANadapter != lanaNum ||
+            isGateway != bGateway ||
+            strcmp(cm_NetbiosName, NetbiosName))
+            change = 1;
+    } 
+
+    if (change) {
+        afsi_log("Lan Adapter Change detected");
+        smb_StopListeners();
+        smb_RestartListeners();
+    }
+}
+
 /* initialize Netbios */
 int smb_NetbiosInit(void)
 {
index 145dfd108d8df8fea4dc1da396906bf5da37771b..3a884be1c0a536d11d4743c419895202fdd969b8 100644 (file)
@@ -734,6 +734,7 @@ extern void smb_RestartListeners(void);
 extern void smb_StopListeners(void);
 extern void smb_StopListener(NCB *ncbp, int lana);
 extern long smb_IsNetworkStarted(void);
+extern void smb_LanAdapterChange(void);
 
 #define SMB_LISTENER_UNINITIALIZED -1
 #define SMB_LISTENER_STOPPED 0