windows-multi-fix-20061003
[openafs.git] / src / WINNT / afsd / cm_server.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #ifndef __CM_SERVER_H_ENV__
11 #define __CM_SERVER_H_ENV__ 1
12
13 #include <winsock2.h>
14 #include <osi.h>
15
16 /* pointed to by volumes and cells without holds; cm_serverLock is obtained
17  * at the appropriate times to change the pointers to these servers.
18  */
19 typedef struct cm_server {
20     struct cm_server *allNextp;         /* locked by cm_serverLock */
21     struct sockaddr_in addr;            /* by mx */
22     int type;                           /* by mx */
23     struct cm_conn *connsp;             /* locked by cm_connLock */
24     afs_int32 flags;                    /* by mx */
25     afs_int32 waitCount;                /* by mx */
26     afs_int32 capabilities;             /* by mx */
27     struct cm_cell *cellp;              /* cell containing this server */
28     unsigned long refCount;             /* locked by cm_serverLock */
29     osi_mutex_t mx;
30     unsigned short ipRank;              /* server priority */
31 } cm_server_t;
32
33 enum repstate {not_busy, busy, offline};
34
35 typedef struct cm_serverRef {
36     struct cm_serverRef *next;      /* locked by cm_serverLock */
37     struct cm_server *server;       /* locked by cm_serverLock */
38     enum repstate status;           /* locked by cm_serverLock */
39     unsigned long refCount;         /* locked by cm_serverLock */
40 } cm_serverRef_t;
41
42 /* types */
43 #define CM_SERVER_VLDB          1       /* a VLDB server */
44 #define CM_SERVER_FILE          2       /* a file server */
45
46 /* flags */
47 #define CM_SERVERFLAG_DOWN      0x1     /* server is down */
48 #define CM_SERVERFLAG_PREF_SET  0x2     /* server preference set by user */
49 #define CM_SERVERFLAG_PINGING   0x4     /* a ping against this server in progress */
50 #define CM_SERVERFLAG_NO64BIT   0x8     /* server has no support for
51                                            64-bit operations. */
52 #define CM_SERVERFLAG_NOINLINEBULK 0x10 /* server has no support for inline bulk */
53
54 /* flags for procedures */
55 #define CM_FLAG_CHECKUPSERVERS          1       /* check working servers */
56 #define CM_FLAG_CHECKDOWNSERVERS        2       /* check down servers */
57
58 /* values for ipRank */
59 #define CM_IPRANK_TOP   5000    /* on same machine */
60 #define CM_IPRANK_HI    20000   /* on same subnet  */
61 #define CM_IPRANK_MED   30000   /* on same network */
62 #define CM_IPRANK_LOW   40000   /* on different networks */
63
64 /* the maximum number of network interfaces that this client has */ 
65
66 #define CM_MAXINTERFACE_ADDR          16
67
68 extern cm_server_t *cm_NewServer(struct sockaddr_in *addrp, int type,
69         struct cm_cell *cellp);
70
71 extern cm_serverRef_t *cm_NewServerRef(struct cm_server *serverp);
72
73 extern LONG_PTR cm_ChecksumServerList(cm_serverRef_t *serversp);
74
75 extern void cm_GetServer(cm_server_t *);
76
77 extern void cm_GetServerNoLock(cm_server_t *);
78
79 extern void cm_PutServer(cm_server_t *);
80
81 extern void cm_PutServerNoLock(cm_server_t *);
82
83 extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type);
84
85 extern osi_rwlock_t cm_serverLock;
86
87 extern void cm_InitServer(void);
88
89 extern void cm_CheckServers(long flags, struct cm_cell *cellp);
90
91 extern cm_server_t *cm_allServersp;
92
93 extern void cm_SetServerPrefs(cm_server_t * serverp);
94
95 extern void cm_InsertServerList(cm_serverRef_t** list,cm_serverRef_t* element);
96
97 extern long cm_ChangeRankServer(cm_serverRef_t** list, cm_server_t* server); 
98
99 extern void cm_RandomizeServer(cm_serverRef_t** list); 
100
101 extern void cm_FreeServer(cm_server_t* server);
102
103 extern void cm_FreeServerList(cm_serverRef_t** list);
104
105 extern void cm_ForceNewConnectionsAllServers(void);
106
107 extern void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit);
108
109 extern void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no);
110
111 #endif /*  __CM_SERVER_H_ENV__ */