From 4127de6c6ef90e28a9f32b40bd6360296cf6e93a Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 14 Nov 2005 06:00:34 +0000 Subject: [PATCH] network-distance-server-prefs-20051113 Use network distance based server preferences for all server types not just file servers. --- src/WINNT/afsd/cm_server.c | 104 +++++++++++++++++-------------------- src/afs/afs_server.c | 6 +-- 2 files changed, 50 insertions(+), 60 deletions(-) diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index 8337e6673..b945c83a3 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -159,62 +159,56 @@ void cm_SetServerPrefs(cm_server_t * serverp) unsigned long netMask; int i; - /* implement server prefs for fileservers only */ - if ( serverp->type == CM_SERVER_FILE ) + 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); + + serverAddr = ntohl(serverp->addr.sin_addr.s_addr); + serverp->ipRank = CM_IPRANK_LOW; /* default setings */ + + for ( i=0; i < cm_noIPAddr; 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); - - serverAddr = ntohl(serverp->addr.sin_addr.s_addr); - serverp->ipRank = CM_IPRANK_LOW; /* default setings */ - - for ( i=0; i < cm_noIPAddr; i++) - { - /* loop through all the client's IP address and compare - ** each of them against the server's IP address */ - - myAddr = cm_IPAddr[i]; - if ( IN_CLASSA(myAddr) ) - netMask = IN_CLASSA_NET; - else if ( IN_CLASSB(myAddr) ) - netMask = IN_CLASSB_NET; - else if ( IN_CLASSC(myAddr) ) - netMask = IN_CLASSC_NET; - else - netMask = 0; - - myNet = myAddr & netMask; - mySubnet = myAddr & cm_SubnetMask[i]; - - if ( (serverAddr & netMask) == myNet ) - { - if ( (serverAddr & cm_SubnetMask[i]) == mySubnet) - { - if ( serverAddr == myAddr ) - serverp->ipRank = min(serverp->ipRank, - CM_IPRANK_TOP);/* same machine */ - else serverp->ipRank = min(serverp->ipRank, - CM_IPRANK_HI); /* same subnet */ - } - else serverp->ipRank = min(serverp->ipRank,CM_IPRANK_MED); - /* same net */ - } - /* random between 0..15*/ - serverp->ipRank += min(serverp->ipRank, rand() % 0x000f); - } /* and of for loop */ - } - else - serverp->ipRank = 10000 + (rand() % 0x00ff); /* VL server */ + /* loop through all the client's IP address and compare + ** each of them against the server's IP address */ + + myAddr = cm_IPAddr[i]; + if ( IN_CLASSA(myAddr) ) + netMask = IN_CLASSA_NET; + else if ( IN_CLASSB(myAddr) ) + netMask = IN_CLASSB_NET; + else if ( IN_CLASSC(myAddr) ) + netMask = IN_CLASSC_NET; + else + netMask = 0; + + myNet = myAddr & netMask; + mySubnet = myAddr & cm_SubnetMask[i]; + + if ( (serverAddr & netMask) == myNet ) + { + if ( (serverAddr & cm_SubnetMask[i]) == mySubnet) + { + if ( serverAddr == myAddr ) + serverp->ipRank = min(serverp->ipRank, + CM_IPRANK_TOP);/* same machine */ + else serverp->ipRank = min(serverp->ipRank, + CM_IPRANK_HI); /* same subnet */ + } + else serverp->ipRank = min(serverp->ipRank,CM_IPRANK_MED); + /* same net */ + } + /* random between 0..15*/ + serverp->ipRank += min(serverp->ipRank, rand() % 0x000f); + } /* and of for loop */ } cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp) { diff --git a/src/afs/afs_server.c b/src/afs/afs_server.c index 6ba3e3efb..de863b44a 100644 --- a/src/afs/afs_server.c +++ b/src/afs/afs_server.c @@ -1654,11 +1654,7 @@ struct server *afs_GetServer(afs_uint32 * aserverp, afs_int32 nservers, /* Compute preference values and resort */ if (!newsa->sa_iprank) { - if (aport == fsport) { - afs_SetServerPrefs(newsa); /* new fileserver rank */ - } else { - newsa->sa_iprank = 10000 + afs_randomMod127(); /* new vlserver rank */ - } + afs_SetServerPrefs(newsa); /* new server rank */ } } afs_SortOneServer(newts); /* Sort by rank */ -- 2.39.5