5e8ad3921bc81c95fdb1476252d23fff145c2b91
[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 /* this value is set to 1022 in order to  */
17 #define NUM_SERVER_VOLS         (32 - sizeof(void *) / 4)
18 typedef struct cm_server_vols {
19     afs_uint32             ids[NUM_SERVER_VOLS];
20     struct cm_server_vols *nextp;
21 } cm_server_vols_t;
22
23 #ifdef GIVE_UP_CALLBACKS
24 #define AFS_MAXCBRSCALL 16
25 typedef struct cm_server_gucb {
26     afs_uint32          count;
27     cm_fid_t            fids[AFS_MAXCBRSCALL];
28     struct cm_server_gucb * nextp;
29 } cm_server_gucb_t;
30 #endif /* GIVE_UP_CALLBACKS */
31
32 /* pointed to by volumes and cells without holds; cm_serverLock is obtained
33  * at the appropriate times to change the pointers to these servers.
34  */
35 typedef struct cm_server {
36     struct cm_server *allNextp;         /* locked by cm_serverLock */
37     struct sockaddr_in addr;            /* by mx */
38     int type;                           /* by mx */
39     struct cm_conn *connsp;             /* locked by cm_connLock */
40     afs_int32 flags;                    /* by mx */
41     afs_int32 waitCount;                /* by mx */
42     afs_int32 capabilities;             /* by mx */
43     struct cm_cell *cellp;              /* cell containing this server */
44     unsigned long refCount;             /* locked by cm_serverLock */
45     osi_mutex_t mx;
46     unsigned short ipRank;              /* server priority */
47     cm_server_vols_t *  vols;           /* by mx */
48 #ifdef GIVE_UP_CALLBACKS
49     cm_server_gucb_t *  gucbs;          /* by mx */
50 #endif /* GIVE_UP_CALLBACKS */
51 } cm_server_t;
52
53 enum repstate {srv_not_busy, srv_busy, srv_offline, srv_deleted};
54
55 typedef struct cm_serverRef {
56     struct cm_serverRef *next;      /* locked by cm_serverLock */
57     struct cm_server *server;       /* locked by cm_serverLock */
58     enum repstate status;           /* locked by cm_serverLock */
59     unsigned long refCount;         /* locked by cm_serverLock */
60     afs_uint32 volID;               /* locked by cm_serverLock */
61 } cm_serverRef_t;
62
63 /* types */
64 #define CM_SERVER_VLDB          1       /* a VLDB server */
65 #define CM_SERVER_FILE          2       /* a file server */
66
67 /* flags */
68 #define CM_SERVERFLAG_DOWN      0x1     /* server is down */
69 #define CM_SERVERFLAG_PREF_SET  0x2     /* server preference set by user */
70 #define CM_SERVERFLAG_PINGING   0x4     /* a ping against this server in progress */
71 #define CM_SERVERFLAG_NO64BIT   0x8     /* server has no support for
72                                            64-bit operations. */
73 #define CM_SERVERFLAG_NOINLINEBULK 0x10 /* server has no support for inline bulk */
74
75 /* flags for procedures */
76 #define CM_FLAG_CHECKUPSERVERS          1       /* check working servers */
77 #define CM_FLAG_CHECKDOWNSERVERS        2       /* check down servers */
78 #define CM_FLAG_CHECKVLDBSERVERS        4       /* check only vldb servers */
79 #define CM_FLAG_CHECKFILESERVERS        8       /* check only file servers */
80
81 /* values for ipRank */
82 #define CM_IPRANK_TOP   5000    /* on same machine */
83 #define CM_IPRANK_HI    20000   /* on same subnet  */
84 #define CM_IPRANK_MED   30000   /* on same network */
85 #define CM_IPRANK_LOW   40000   /* on different networks */
86
87 /* the maximum number of network interfaces that this client has */ 
88
89 #define CM_MAXINTERFACE_ADDR          16
90
91 extern cm_server_t *cm_NewServer(struct sockaddr_in *addrp, int type,
92         struct cm_cell *cellp);
93
94 extern cm_serverRef_t *cm_NewServerRef(struct cm_server *serverp, afs_uint32 volID);
95
96 extern LONG_PTR cm_ChecksumServerList(cm_serverRef_t *serversp);
97
98 extern void cm_GetServer(cm_server_t *);
99
100 extern void cm_GetServerNoLock(cm_server_t *);
101
102 extern void cm_PutServer(cm_server_t *);
103
104 extern void cm_PutServerNoLock(cm_server_t *);
105
106 extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type);
107
108 extern osi_rwlock_t cm_serverLock;
109
110 extern void cm_InitServer(void);
111
112 extern void cm_CheckServers(long flags, struct cm_cell *cellp);
113
114 extern cm_server_t *cm_allServersp;
115
116 extern void cm_SetServerPrefs(cm_server_t * serverp);
117
118 extern void cm_InsertServerList(cm_serverRef_t** list,cm_serverRef_t* element);
119
120 extern long cm_ChangeRankServer(cm_serverRef_t** list, cm_server_t* server); 
121
122 extern void cm_RandomizeServer(cm_serverRef_t** list); 
123
124 extern void cm_FreeServer(cm_server_t* server);
125
126 #define CM_FREESERVERLIST_DELETE 1
127
128 extern void cm_FreeServerList(cm_serverRef_t** list, afs_uint32 flags);
129
130 extern void cm_ForceNewConnectionsAllServers(void);
131
132 extern void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit);
133
134 extern void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no);
135
136 extern cm_server_t * cm_FindServerByIP(afs_uint32 addr, int type);
137
138 #ifdef GIVE_UP_CALLBACKS
139 extern cm_server_gucb_t *cm_NewServerGUCBs(void);
140
141 extern void cm_AddFidToGiveUpCallBackList(cm_server_t * serverp, cm_fid_t *fidp);
142
143 extern void cm_RemoveFidFromGiveUpCallBackList(cm_server_t *serverp, cm_fid_t *fidp);
144
145 extern void cm_FreeGiveUpCallBackList(cm_server_t * serverp);
146
147 extern void cm_FreeAllGiveUpCallBackLists(void);
148 #endif /* GIVE_UP_CALLBACKS */
149 #endif /*  __CM_SERVER_H_ENV__ */