extern osi_rwlock_t cm_aclLock;
extern osi_rwlock_t buf_globalLock;
-extern osi_rwlock_t cm_callbackLock;
extern osi_rwlock_t cm_cellLock;
extern osi_rwlock_t cm_connLock;
extern osi_rwlock_t cm_daemonLock;
extern osi_rwlock_t cm_dnlcLock;
extern osi_rwlock_t cm_scacheLock;
extern osi_rwlock_t cm_serverLock;
+extern osi_rwlock_t cm_syscfgLock;
extern osi_rwlock_t cm_userLock;
extern osi_rwlock_t cm_utilsLock;
extern osi_rwlock_t cm_volumeLock;
{"buf_globalLock", (char*)&buf_globalLock, LOCKTYPE_RW},
{"cm_serverLock", (char*)&cm_serverLock, LOCKTYPE_RW},
{"cm_callbackLock", (char*)&cm_callbackLock, LOCKTYPE_RW},
+ {"cm_syscfgLock", (char*)&cm_syscfgLock, LOCKTYPE_RW},
{"cm_aclLock", (char*)&cm_aclLock, LOCKTYPE_RW},
{"cm_cellLock", (char*)&cm_cellLock, LOCKTYPE_RW},
{"cm_connLock", (char*)&cm_connLock, LOCKTYPE_RW},
SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr)
{
int i;
- int cm_noIPAddr; /* number of client network interfaces */
- int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */
- int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
- int cm_NetMtu[CM_MAXINTERFACE_ADDR]; /* client's MTU sizes */
- int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */
long code;
struct rx_connection *connp;
struct rx_peer *peerp;
port = rx_PortOf(peerp);
}
- /* get network related info */
- cm_noIPAddr = CM_MAXINTERFACE_ADDR;
- code = syscfg_GetIFInfo(&cm_noIPAddr,
- cm_IPAddr, cm_SubnetMask,
- cm_NetMtu, cm_NetFlags);
-
- /* return all network interface addresses */
osi_Log2(afsd_logp, "SRXAFSCB_WhoAreYou from host 0x%x port %d",
ntohl(host),
ntohs(port));
+ lock_ObtainRead(&cm_syscfgLock);
+ if (cm_LanAdapterChangeDetected) {
+ lock_ConvertRToW(&cm_syscfgLock);
+ if (cm_LanAdapterChangeDetected) {
+ /* get network related info */
+ cm_noIPAddr = CM_MAXINTERFACE_ADDR;
+ code = syscfg_GetIFInfo(&cm_noIPAddr,
+ cm_IPAddr, cm_SubnetMask,
+ cm_NetMtu, cm_NetFlags);
+ cm_LanAdapterChangeDetected = 0;
+ }
+ lock_ConvertWToR(&cm_syscfgLock);
+ }
+
+ /* return all network interface addresses */
addr->numberOfInterfaces = cm_noIPAddr;
addr->uuid = cm_data.Uuid;
for ( i=0; i < cm_noIPAddr; i++ ) {
cm_NetMtu[i] : rx_mtu;
}
+ lock_ReleaseRead(&cm_syscfgLock);
+
return 0;
}
int i;
afs_int32 *dataBuffP;
afs_int32 dataBytes;
- int cm_noIPAddr; /* number of client network interfaces */
- int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */
- int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
- int cm_NetMtu[CM_MAXINTERFACE_ADDR]; /* client's MTU sizes */
- int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */
long code;
struct rx_connection *connp;
struct rx_peer *peerp;
port = rx_PortOf(peerp);
}
- /* get network related info */
- cm_noIPAddr = CM_MAXINTERFACE_ADDR;
- code = syscfg_GetIFInfo(&cm_noIPAddr,
- cm_IPAddr, cm_SubnetMask,
- cm_NetMtu, cm_NetFlags);
-
osi_Log2(afsd_logp, "SRXAFSCB_TellMeAboutYourself from host 0x%x port %d",
ntohl(host),
ntohs(port));
+ lock_ObtainRead(&cm_syscfgLock);
+ if (cm_LanAdapterChangeDetected) {
+ lock_ConvertRToW(&cm_syscfgLock);
+ if (cm_LanAdapterChangeDetected) {
+ /* get network related info */
+ cm_noIPAddr = CM_MAXINTERFACE_ADDR;
+ code = syscfg_GetIFInfo(&cm_noIPAddr,
+ cm_IPAddr, cm_SubnetMask,
+ cm_NetMtu, cm_NetFlags);
+ cm_LanAdapterChangeDetected = 0;
+ }
+ lock_ConvertWToR(&cm_syscfgLock);
+ }
+
/* return all network interface addresses */
addr->numberOfInterfaces = cm_noIPAddr;
addr->uuid = cm_data.Uuid;
addr->mtu[i] = (rx_mtu == -1 || (rx_mtu != -1 && cm_NetMtu[i] < rx_mtu)) ?
cm_NetMtu[i] : rx_mtu;
}
+ lock_ReleaseRead(&cm_syscfgLock);
dataBytes = 1 * sizeof(afs_int32);
dataBuffP = (afs_int32 *) osi_Alloc(dataBytes);
#include <rx/rx.h>
osi_rwlock_t cm_serverLock;
+osi_rwlock_t cm_syscfgLock;
cm_server_t *cm_allServersp;
afs_uint32 cm_numFileServers = 0;
if (osi_Once(&once)) {
lock_InitializeRWLock(&cm_serverLock, "cm_serverLock");
+ lock_InitializeRWLock(&cm_syscfgLock, "cm_syscfgLock");
osi_EndOnce(&once);
}
}
+/* Protected by cm_syscfgLock (rw) */
+int cm_noIPAddr; /* number of client network interfaces */
+int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */
+int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
+int cm_NetMtu[CM_MAXINTERFACE_ADDR]; /* client's MTU sizes */
+int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */
+int cm_LanAdapterChangeDetected = 1;
+
+void cm_SetLanAdapterChangeDetected(void)
+{
+ lock_ObtainWrite(&cm_syscfgLock);
+ cm_LanAdapterChangeDetected = 1;
+ lock_ReleaseWrite(&cm_syscfgLock);
+}
+
void cm_GetServer(cm_server_t *serverp)
{
lock_ObtainRead(&cm_serverLock);
unsigned long myAddr, myNet, mySubnet;/* in host byte order */
unsigned long netMask;
int i;
-
- int cm_noIPAddr; /* number of client network interfaces */
- int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */
- int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
- int cm_NetMtu[CM_MAXINTERFACE_ADDR]; /* client's MTU sizes */
- int cm_NetFlags[CM_MAXINTERFACE_ADDR]; /* network flags */
long code;
-
- /* get network related info */
- cm_noIPAddr = CM_MAXINTERFACE_ADDR;
- code = syscfg_GetIFInfo(&cm_noIPAddr,
- cm_IPAddr, cm_SubnetMask,
- cm_NetMtu, cm_NetFlags);
+ int writeLock = 0;
+
+ lock_ObtainRead(&cm_syscfgLock);
+ if (cm_LanAdapterChangeDetected) {
+ lock_ConvertRToW(&cm_syscfgLock);
+ writeLock = 1;
+ if (cm_LanAdapterChangeDetected) {
+ /* get network related info */
+ cm_noIPAddr = CM_MAXINTERFACE_ADDR;
+ code = syscfg_GetIFInfo(&cm_noIPAddr,
+ cm_IPAddr, cm_SubnetMask,
+ cm_NetMtu, cm_NetFlags);
+ cm_LanAdapterChangeDetected = 0;
+ }
+ lock_ConvertWToR(&cm_syscfgLock);
+ }
serverAddr = ntohl(serverp->addr.sin_addr.s_addr);
serverp->ipRank = CM_IPRANK_LOW; /* default setings */
/* random between 0..15*/
serverp->ipRank += min(serverp->ipRank, rand() % 0x000f);
} /* and of for loop */
+ lock_ReleaseRead(&cm_syscfgLock);
}
cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp, afs_uint32 flags) {