The Netbios NCBRESET command resets all of the Netbios state
associated with the LAN adapter including the name bindings.
In response to a detected LAN adapter IP address change, the
smb_LanAdapterChange() function is called to determine if any
Netbios LAN adapter bindings that were in use or should be in
use by afsd_service were altered. As part of the check,
lana_GetUncServerNameEx() is called which in turn calls
lana_FindLoopback() which in turn issued a lana_IsLoopback()
for each LAN adapter with the 'reset adapter' flag set to TRUE.
Calling lana_IsLoopback() with 'reset' equal TRUE was fine
when lana_GetUncServerNameEx() was only called from smb_Init(),
but it is not fine when called after the service is processing
calls. By resetting the adapter the binding of the netbios name
"AFS" (or "<MACHINE>-AFS") is removed and all outstanding calls
are canceled. If the SMB redirector attempts a reconnect during
the window before NCBADDNAM is called to re-bind the name, a
negative cache entry will be placed in the netbios name lookup
table that will prevent the SMB redirector from connecting to
the client for several minutes.
If the environment is one in which frequent IP address change
events are triggered, it is possible that the SMB redirector
will never be able to reconnect to the service.
This patchset adds a flag, LANA_NETBIOS_NO_RESET, to the
lana_GetUncServerEx interface which permits smb_LanAdapterChange()
to avoid the undesirable reset. This negative flag was selected
in order to avoid changing the current default behavior as the
lanahelper library is used by out of tree installers and it
is preferred that OpenAFS avoid breaking them unnecessarily.
Reviewed-on: http://gerrit.openafs.org/3821
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit
efe4a20c46c73c39bd979437956beddcd3057bc3)
Change-Id: Ice4380550fec8c1ac2c2c5ec76e1b73f23cd4829
Reviewed-on: http://gerrit.openafs.org/3911
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
return lanainfo;
}
-extern "C" lana_number_t lana_FindLoopback(void)
+extern "C" lana_number_t lana_FindLoopback(BOOL reset)
{
NCB ncb;
LANA_ENUM lana_list;
return LANA_INVALID;
}
for (i = 0; i < lana_list.length; i++) {
- if (lana_IsLoopback(lana_list.lana[i],TRUE)) {
+ if (lana_IsLoopback(lana_list.lana[i], reset)) {
// Found one, return it.
#ifndef NOLOGGING
afsi_log("lana_FindLoopback: Found LAN adapter %d",
// LANA_NETBIOS_NAME_IN : Use the values of *pLana and *pIsGateway as [in] parameters.
// LANA_NETBIOS_NAME_SUFFIX : Only return the suffix of netbios name
// LANA_NETBIOS_NAME_FULL : Return full netbios name
+// LANA_NETBIOS_NO_RESET : Do not reset the netbios adapter state when finding the loopback
extern "C" long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags) {
HKEY hkConfig;
DWORD dummyLen;
nLana = LANA_INVALID;
if(nLana == LANA_INVALID && !regGateway) {
- nLana = lana_FindLoopback();
+ nLana = lana_FindLoopback(!(flags & LANA_NETBIOS_NO_RESET));
}
if(nLana != LANA_INVALID)
regLana = nLana;
- }
+ }
if(regNbName[0] &&
- (regLana >=0 && lana_IsLoopback((lana_number_t) regLana,FALSE)))
+ (regLana >=0 && lana_IsLoopback((lana_number_t) regLana, FALSE)))
{
strncpy(nbName,regNbName,14);
nbName[14] = 0;
#define LANA_NETBIOS_NAME_IN 2
+#define LANA_NETBIOS_NO_RESET 4
+
int lana_GetNameFromGuid(char *Guid, char **Name);
struct LANAINFO * lana_FindLanaByName(const char *LanaName);
- lana_number_t lana_FindLoopback(void);
+ lana_number_t lana_FindLoopback(BOOL reset);
BOOL lana_OnlyLoopback(void);
if (!powerStateSuspended &&
SUCCEEDED(lana_GetUncServerNameEx(NetbiosName, &lanaNum, &bGateway,
- LANA_NETBIOS_NAME_FULL)) &&
+ LANA_NETBIOS_NAME_FULL | LANA_NETBIOS_NO_RESET)) &&
lanaNum != LANA_INVALID && smb_LANadapter != lanaNum) {
if ( isGateway != bGateway ) {
afsi_log("Lan Adapter Change detected (%d != %d): gateway %d != %d",
/* setup the NCB system */
ncbp = smb_GetNCB();
- /* Call lanahelper to get Netbios name, lan adapter number and gateway flag */
+ /*
+ * Call lanahelper to get Netbios name, lan adapter number and gateway flag
+ * This will reset all of the network adapter's netbios state.
+ */
if (SUCCEEDED(code = lana_GetUncServerNameEx(cm_NetbiosName, &lanaNum, &isGateway, LANA_NETBIOS_NAME_FULL))) {
smb_LANadapter = (lanaNum == LANA_INVALID)? -1: lanaNum;