2 * Copyright 2000, International Business Machines Corporation and others.
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
10 #ifndef OPENAFS_WINNT_AFSD_CM_CONN_H
11 #define OPENAFS_WINNT_AFSD_CM_CONN_H 1
13 #define CM_CONN_DEFAULTRDRTIMEOUT 45
14 #ifndef CM_CONN_CONNDEADTIME
15 #define CM_CONN_CONNDEADTIME 0
17 #ifndef CM_CONN_HARDDEADTIME
18 #define CM_CONN_HARDDEADTIME 0
20 #ifndef CM_CONN_IDLEDEADTIME
21 #define CM_CONN_IDLEDEADTIME 0
23 #ifndef CM_CONN_IDLEDEADTIME_REP
24 #define CM_CONN_IDLEDEADTIME_REP 0
26 #ifndef CM_CONN_NATPINGINTERVAL
27 #define CM_CONN_NATPINGINTERVAL 0
30 #define CM_CONN_IFS_HARDDEADTIME 120
31 #define CM_CONN_IFS_CONNDEADTIME 60
32 #define CM_CONN_IFS_IDLEDEADTIME 1200
33 #define CM_CONN_IFS_IDLEDEADTIME_REP 180 /* must be larger than file server hard dead timeout = 120 */
35 extern unsigned short ConnDeadtimeout;
36 extern unsigned short HardDeadtimeout;
37 extern DWORD RDRtimeout;
38 extern afs_uint32 rx_pmtu_discovery;
40 typedef struct cm_conn {
41 struct cm_conn *nextp; /* locked by cm_connLock */
42 struct cm_server *serverp; /* locked by cm_serverLock */
43 struct rx_connection *rxconnp; /* locked by mx */
44 struct cm_user *userp; /* locked by mx; a held reference */
45 osi_mutex_t mx; /* mutex for some of these fields */
46 afs_int32 refCount; /* Interlocked */
47 int ucgen; /* ucellp's generation number */
48 afs_uint32 flags; /* locked by mx */
49 int cryptlevel; /* encryption status */
52 #define CM_CONN_FLAG_FORCE_NEW 1
53 #define CM_CONN_FLAG_REPLICATION 2
54 #define CM_CONN_FLAG_NEW 4
57 * structure used for tracking RPC progress
58 * and for passing path info from the smb layer
59 * to the cache manager functions.
61 typedef struct cm_req {
62 DWORD startTime; /* GetTickCount() when this struct was initialized */
63 int rpcError; /* RPC error code */
64 int volumeError; /* volume error code */
65 int accessError; /* access error code */
66 struct cm_server * errorServp; /* server that reported a token/idle error other than expired */
71 clientchar_t * tidPathp;
72 clientchar_t * relPathp;
75 /* flags in cm_req structure */
76 #define CM_REQ_NORETRY 0x01
77 #define CM_REQ_NEW_CONN_FORCED 0x02
78 #define CM_REQ_SOURCE_SMB 0x04
79 #define CM_REQ_VOLUME_UPDATED 0x08
80 #define CM_REQ_WOW64 0x10
81 #define CM_REQ_SOURCE_REDIR 0x20
82 #define CM_REQ_OFFLINE_VOL_CHK 0x40
87 * Note: all of the errors listed here are currently generated by the volume
88 * package. Other vice error codes, should they be needed, could be included
92 #define VREADONLY EROFS /* Attempt to write a read-only volume */
94 /* Special error codes, which may require special handling (other than just
95 passing them through directly to the end user) are listed below */
97 #define VICE_SPECIAL_ERRORS 101 /* Lowest special error code */
99 #define VSALVAGE 101 /* Volume needs salvage */
100 #define VNOVNODE 102 /* Bad vnode number quoted */
101 #define VNOVOL 103 /* Volume not attached, doesn't exist,
102 not created or not online */
103 #define VVOLEXISTS 104 /* Volume already exists */
104 #define VNOSERVICE 105 /* Volume is not in service (i.e. it's
105 is out of funds, is obsolete, or somesuch) */
106 #define VOFFLINE 106 /* Volume is off line, for the reason
107 given in the offline message */
108 #define VONLINE 107 /* Volume is already on line */
109 #define VDISKFULL 108 /* ENOSPC - Partition is "full",
110 i.e. roughly within n% of full */
111 #define VOVERQUOTA 109 /* EDQUOT - Volume max quota exceeded */
112 #define VBUSY 110 /* Volume temporarily unavailable; try again.
113 The volume should be available again shortly;
114 if it isn't something is wrong.
115 Not normally to be propagated to the
117 #define VMOVED 111 /* Volume has moved to another server;
118 do a VGetVolumeInfo to THIS server to find
120 #define VIO 112 /* Vnode temporarily unaccessible, but not known
121 * to be permanently bad. */
122 #define VRESTRICTED 120 /* Volume is restricted from using one or more
123 * of the given residencies; do a
124 * vos examine to find out the current
127 #define VRESTARTING -100 /* server is restarting, otherwise similar to
128 VBUSY above. This is negative so that old
129 cache managers treat it as "server is down"*/
131 #include "cm_server.h"
132 #ifndef AFS_PTHREAD_ENV
133 #define AFS_PTHREAD_ENV 1
138 * connp->serverp can be accessed without holding a lock because that
139 * never changes once the connection is created.
141 #define SERVERHAS64BIT(connp) (!((connp)->serverp->flags & CM_SERVERFLAG_NO64BIT))
142 #define SET_SERVERHASNO64BIT(connp) (cm_SetServerNo64Bit((connp)->serverp, TRUE))
144 #define SERVERHASINLINEBULK(connp) (!((connp)->serverp->flags & CM_SERVERFLAG_NOINLINEBULK))
145 #define SET_SERVERHASNOINLINEBULK(connp) (cm_SetServerNoInlineBulk((connp)->serverp, TRUE))
147 extern void cm_InitConn(void);
149 extern void cm_InitReq(cm_req_t *reqp);
151 extern int cm_Analyze(cm_conn_t *connp, struct cm_user *up, struct cm_req *reqp,
152 struct cm_fid *fidp, struct cm_cell *cellp,
154 struct AFSFetchStatus *statusp,
155 struct AFSVolSync *volInfop,
156 cm_serverRef_t ** vlServerspp,
157 struct cm_callbackRequest *cbrp, long code);
159 extern long cm_ConnByMServers(struct cm_serverRef *, afs_uint32, struct cm_user *,
160 cm_req_t *, cm_conn_t **);
162 extern long cm_ConnByServer(struct cm_server *, struct cm_user *, afs_uint32, cm_conn_t **);
164 extern long cm_ConnFromFID(struct cm_fid *, struct cm_user *, struct cm_req *,
167 extern long cm_ConnFromVolume(struct cm_volume *volp, unsigned long volid,
168 struct cm_user *userp, cm_req_t *reqp,
171 extern void cm_PutConn(cm_conn_t *connp);
173 extern void cm_GCConnections(cm_server_t *serverp);
175 extern struct rx_connection * cm_GetRxConn(cm_conn_t *connp);
177 extern void cm_ForceNewConnections(cm_server_t *serverp);
179 extern long cm_ServerAvailable(struct cm_fid *fidp, struct cm_user *userp);
181 extern long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp,
182 struct cm_req *reqp, afs_uint32 *replicated,
183 cm_serverRef_t ***serversppp);
185 extern long cm_GetVolServerList(struct cm_volume *volp, afs_uint32 volid,
186 struct cm_user *userp,
187 struct cm_req *reqp, afs_uint32 *replicated,
188 cm_serverRef_t ***serversppp);
190 #endif /* OPENAFS_WINNT_AFSD_CM_CONN_H */