dns-and-server-ref-counts-20040530
[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 #ifndef DJGPP
14 #include <winsock2.h>
15 #else /* DJGPP */
16 #include <netinet/in.h>
17 #endif /* !DJGPP */
18 #include <osi.h>
19
20 /* pointed to by volumes and cells without holds; cm_serverLock is obtained
21  * at the appropriate times to change the pointers to these servers.
22  */
23 typedef struct cm_server {
24         struct cm_server *allNextp;             /* locked by cm_serverLock */
25         struct sockaddr_in addr;                /* by mx */
26         int type;                               /* by mx */
27         struct cm_conn *connsp;                 /* locked by cm_connLock */
28         long flags;                             /* by mx */
29         struct cm_cell *cellp;                  /* cell containing this server */
30         int refCount;                           /* locked by cm_serverLock */
31         osi_mutex_t mx;
32         unsigned short ipRank;                  /* server priority */
33 } cm_server_t;
34
35 enum repstate {not_busy, busy, offline};
36
37 typedef struct cm_serverRef {
38         struct cm_serverRef *next;
39         struct cm_server *server;
40         enum repstate status;
41 } cm_serverRef_t;
42
43 /* types */
44 #define CM_SERVER_VLDB          1       /* a VLDB server */
45 #define CM_SERVER_FILE          2       /* a file server */
46
47 /* flags */
48 #define CM_SERVERFLAG_DOWN      1       /* server is down */
49
50 /* flags for procedures */
51 #define CM_FLAG_CHECKUPSERVERS          1       /* check working servers */
52 #define CM_FLAG_CHECKDOWNSERVERS        2       /* check down servers */
53
54 /* values for ipRank */
55 #define CM_IPRANK_TOP   5000    /* on same machine */
56 #define CM_IPRANK_HI    20000   /* on same subnet  */
57 #define CM_IPRANK_MED   30000   /* on same network */
58 #define CM_IPRANK_LOW   40000   /* on different networks */
59
60 /* the maximum number of network interfaces that this client has */ 
61
62 #define CM_MAXINTERFACE_ADDR          16
63 extern int cm_noIPAddr;         /* number of client network interfaces */
64 extern int cm_IPAddr[CM_MAXINTERFACE_ADDR];    /* client's IP address */
65 extern int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask*/ 
66 extern int cm_NetMtu[CM_MAXINTERFACE_ADDR];    /* client's MTU sizes */
67 extern int cm_NetFlags[CM_MAXINTERFACE_ADDR];  /* network flags */
68
69 extern cm_server_t *cm_NewServer(struct sockaddr_in *addrp, int type,
70         struct cm_cell *cellp);
71
72 extern cm_serverRef_t *cm_NewServerRef(struct cm_server *serverp);
73
74 extern long cm_ChecksumServerList(cm_serverRef_t *serversp);
75
76 extern void cm_PutServer(cm_server_t *);
77
78 extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type);
79
80 extern osi_rwlock_t cm_serverLock;
81
82 extern void cm_InitServer(void);
83
84 extern void cm_CheckServers(long flags, struct cm_cell *cellp);
85
86 extern cm_server_t *cm_allServersp;
87
88 extern void cm_SetServerPrefs(cm_server_t * serverp);
89
90 extern void cm_InsertServerList(cm_serverRef_t** list,cm_serverRef_t* element);
91
92 extern long cm_ChangeRankServer(cm_serverRef_t** list, cm_server_t* server); 
93
94 extern void cm_RandomizeServer(cm_serverRef_t** list); 
95
96 extern void cm_FreeServer(cm_server_t* server);
97
98 extern void cm_FreeServerList(cm_serverRef_t** list);
99
100 #endif /*  __CM_SERVER_H_ENV__ */