Windows: preserve prior vlserver list on dns failure
[openafs.git] / src / WINNT / afsd / cm_server.h
index defb81d..fc25d2e 100644 (file)
@@ -1,14 +1,14 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
  */
 
-#ifndef __CM_SERVER_H_ENV__
-#define __CM_SERVER_H_ENV__ 1
+#ifndef OPENAFS_WINNT_AFSD_CM_SERVER_H
+#define OPENAFS_WINNT_AFSD_CM_SERVER_H 1
 
 #include <winsock2.h>
 #include <osi.h>
@@ -24,7 +24,7 @@ typedef struct cm_server_vols {
  * at the appropriate times to change the pointers to these servers.
  */
 typedef struct cm_server {
-    struct cm_server *allNextp;                /* locked by cm_serverLock */
+    osi_queue_t allq;                  /* locked by cm_serverLock */
     struct sockaddr_in addr;           /* by mx */
     int type;                          /* by mx */
     struct cm_conn *connsp;            /* locked by cm_connLock */
@@ -34,11 +34,16 @@ typedef struct cm_server {
     struct cm_cell *cellp;             /* cell containing this server */
     afs_int32 refCount;                        /* Interlocked with cm_serverLock */
     osi_mutex_t mx;
-    unsigned short ipRank;             /* server priority */
+    unsigned short ipRank;             /* network class rank */
+    unsigned short adminRank;          /* set if admin sets a rank
+                                         * (fs setserverpref or registry or dns)
+                                         */
+    unsigned short activeRank;          /* Computed rank combining ipRank, adminRank,
+                                         * and performance data.
+                                         */
     cm_server_vols_t *  vols;           /* by mx */
     time_t downTime;                    /* by mx */
     afsUUID uuid;                       /* by mx */
-    unsigned short adminRank;          /* only set if admin sets a rank */
 } cm_server_t;
 
 enum repstate {srv_not_busy, srv_busy, srv_offline, srv_deleted};
@@ -75,8 +80,9 @@ typedef struct cm_serverRef {
 #define CM_IPRANK_HI   20000   /* on same subnet  */
 #define CM_IPRANK_MED  30000   /* on same network */
 #define CM_IPRANK_LOW  40000   /* on different networks */
+#define CM_IPRANK_DOWN  65535   /* unavailable */
 
-/* the maximum number of network interfaces that this client has */ 
+/* the maximum number of network interfaces that this client has */
 
 #define CM_MAXINTERFACE_ADDR          16
 
@@ -85,6 +91,10 @@ extern cm_server_t *cm_NewServer(struct sockaddr_in *addrp, int type,
 
 extern cm_serverRef_t *cm_NewServerRef(struct cm_server *serverp, afs_uint32 volID);
 
+extern void cm_GetServerRef(cm_serverRef_t *tsrp, int locked);
+
+extern afs_int32 cm_PutServerRef(cm_serverRef_t *tsrp, int locked);
+
 extern LONG_PTR cm_ChecksumServerList(cm_serverRef_t *serversp);
 
 extern void cm_GetServer(cm_server_t *);
@@ -95,7 +105,7 @@ extern void cm_PutServer(cm_server_t *);
 
 extern void cm_PutServerNoLock(cm_server_t *);
 
-extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type);
+extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type, int locked);
 
 extern osi_rwlock_t cm_serverLock;
 
@@ -111,29 +121,35 @@ extern afs_int32 cm_RankServer(cm_server_t * server);
 
 extern void cm_RankUpServers();
 
-extern void cm_SetServerPrefs(cm_server_t * serverp);
+extern void cm_SetServerIPRank(cm_server_t * serverp);
+
+extern afs_int32 cm_UpdateIFInfo(void);
 
 extern void cm_InsertServerList(cm_serverRef_t** list,cm_serverRef_t* element);
 
-extern long cm_ChangeRankServer(cm_serverRef_t** list, cm_server_t* server); 
+extern long cm_ChangeRankServer(cm_serverRef_t** list, cm_server_t* server);
 
-extern void cm_RandomizeServer(cm_serverRef_t** list); 
+extern void cm_RandomizeServer(cm_serverRef_t** list);
 
 extern void cm_FreeServer(cm_server_t* server);
 
+extern afs_uint32 cm_ServerListSize(cm_serverRef_t* list);
+
 #define CM_FREESERVERLIST_DELETE 1
 
 extern void cm_FreeServerList(cm_serverRef_t** list, afs_uint32 flags);
 
+extern void cm_AppendServerList(cm_serverRef_t *dest, cm_serverRef_t **src);
+
 extern void cm_ForceNewConnectionsAllServers(void);
 
 extern void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit);
 
 extern void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no);
 
-extern cm_server_t * cm_FindServerByIP(afs_uint32 addr, unsigned short port, int type);
+extern cm_server_t * cm_FindServerByIP(afs_uint32 addr, unsigned short port, int type, int locked);
 
-extern cm_server_t * cm_FindServerByUuid(afsUUID* uuid, int type);
+extern cm_server_t * cm_FindServerByUuid(afsUUID* uuid, int type, int locked);
 
 extern void cm_SetLanAdapterChangeDetected(void);
 
@@ -143,6 +159,10 @@ extern int cm_DumpServers(FILE *outputFile, char *cookie, int lock);
 
 extern int cm_ServerEqual(cm_server_t *srv1, cm_server_t *srv2);
 
+extern int cm_IsServerListEmpty(cm_serverRef_t *serversp);
+
+extern void cm_ServerClearRPCStats(void);
+
 /* Protected by cm_syscfgLock (rw) */
 extern int cm_noIPAddr;         /* number of client network interfaces */
 extern int cm_IPAddr[CM_MAXINTERFACE_ADDR];    /* client's IP address in host order */
@@ -150,4 +170,10 @@ extern int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host o
 extern int cm_NetMtu[CM_MAXINTERFACE_ADDR];    /* client's MTU sizes */
 extern int cm_NetFlags[CM_MAXINTERFACE_ADDR];  /* network flags */
 extern int cm_LanAdapterChangeDetected;
-#endif /*  __CM_SERVER_H_ENV__ */
+
+/* Protected by cm_serverLock */
+extern cm_server_t *cm_serversAllFirstp;
+extern cm_server_t *cm_serversAllLastp;
+extern afs_uint32   cm_numFileServers;
+extern afs_uint32   cm_numVldbServers;
+#endif /*  OPENAFS_WINNT_AFSD_CM_SERVER_H */