Remove rx_SetEpoch, rx_SetConnectionEpoch, rx_SetConnectionId
[openafs.git] / src / rx / rx.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 #ifdef KDUMP_RX_LOCK
11 /* kdump for SGI needs MP and SP versions of rx_serverQueueEntry,
12  * rx_peer, rx_connection and rx_call structs. rx.h gets included a
13  * second time to pick up mp_ versions of those structs. Currently
14  * the affected struct's have #ifdef's in them for the second pass.
15  * This should change once we start using only ANSI compilers.
16  * Actually, kdump does not use rx_serverQueueEntry, but I'm including
17  * it for completeness.
18  */
19 #undef _RX_
20 #endif
21
22 #ifndef _RX_
23 #define _RX_
24
25 #ifndef KDUMP_RX_LOCK
26 #ifdef  KERNEL
27 #include "rx_kmutex.h"
28 #include "rx_kernel.h"
29 #if defined (AFS_OBSD_ENV) && !defined (MLEN)
30 #include "sys/mbuf.h"
31 #endif
32 #include "netinet/in.h"
33 #include "sys/socket.h"
34 #else /* KERNEL */
35 # include <sys/types.h>
36 # include <stdio.h>
37 # include <string.h>
38 #ifdef AFS_PTHREAD_ENV
39 # include "rx_pthread.h"
40 #else
41 # include "rx_lwp.h"
42 #endif
43 #ifdef AFS_NT40_ENV
44 #include <malloc.h>
45 #include <winsock2.h>
46 #include <ws2tcpip.h>
47 #endif
48 # include "rx_user.h"
49 #ifndef AFS_NT40_ENV
50 # include <netinet/in.h>
51 # include <sys/socket.h>
52 #endif
53 #endif /* KERNEL */
54
55 #include <opr/queue.h>
56
57 #include "rx_clock.h"
58 #include "rx_event.h"
59 #include "rx_misc.h"
60 #include "rx_null.h"
61 #include "rx_multi.h"
62
63 /* These items are part of the new RX API. They're living in this section
64  * for now, to keep them separate from everything else... */
65
66 struct rx_connection;
67 struct rx_call;
68 struct rx_packet;
69
70 /* Connection management */
71
72 extern afs_uint32  rx_GetConnectionEpoch(struct rx_connection *conn);
73 extern afs_uint32  rx_GetConnectionId(struct rx_connection *conn);
74 extern void *rx_GetSecurityData(struct rx_connection *conn);
75 extern void  rx_SetSecurityData(struct rx_connection *conn, void *data);
76 extern int  rx_IsUsingPktCksum(struct rx_connection *conn);
77 extern void rx_SetSecurityHeaderSize(struct rx_connection *conn, afs_uint32 size);
78 extern afs_uint32  rx_GetSecurityHeaderSize(struct rx_connection *conn);
79 extern void rx_SetSecurityMaxTrailerSize(struct rx_connection *conn, afs_uint32 size);
80 extern afs_uint32  rx_GetSecurityMaxTrailerSize(struct rx_connection *conn);
81 extern void rx_SetMsgsizeRetryErr(struct rx_connection *conn, int err);
82 extern int  rx_IsServerConn(struct rx_connection *conn);
83 extern int  rx_IsClientConn(struct rx_connection *conn);
84 extern struct rx_securityClass *rx_SecurityObjectOf(const struct rx_connection *);
85 extern struct rx_peer *rx_PeerOf(struct rx_connection *);
86 extern u_short rx_ServiceIdOf(struct rx_connection *);
87 extern int rx_SecurityClassOf(struct rx_connection *);
88 extern struct rx_service *rx_ServiceOf(struct rx_connection *);
89 extern int rx_ConnError(struct rx_connection *);
90
91 /* Call management */
92 extern struct rx_connection *rx_ConnectionOf(struct rx_call *call);
93 extern int rx_Error(struct rx_call *call);
94 extern int rx_GetRemoteStatus(struct rx_call *call);
95 extern void rx_SetLocalStatus(struct rx_call *call, int status);
96 extern int rx_GetCallAbortCode(struct rx_call *call);
97 extern void rx_SetCallAbortCode(struct rx_call *call, int code);
98
99 extern void rx_RecordCallStatistics(struct rx_call *call,
100                                     unsigned int rxInterface,
101                                     unsigned int currentFunc,
102                                     unsigned int totalFunc,
103                                     int isServer);
104
105 /* Peer management */
106 extern afs_uint32 rx_HostOf(struct rx_peer *peer);
107 extern u_short rx_PortOf(struct rx_peer *peer);
108
109 /* Packets */
110
111 /* Packet classes, for rx_AllocPacket and rx_packetQuota */
112 #define RX_PACKET_CLASS_RECEIVE     0
113 #define RX_PACKET_CLASS_SEND        1
114 #define RX_PACKET_CLASS_SPECIAL     2
115 #define RX_PACKET_CLASS_RECV_CBUF   3
116 #define RX_PACKET_CLASS_SEND_CBUF   4
117
118 #define RX_N_PACKET_CLASSES         5   /* Must agree with above list */
119
120 #define RX_PACKET_TYPES     {"data", "ack", "busy", "abort", "ackall", "challenge", "response", "debug", "params", "unused", "unused", "unused", "version"}
121 #define RX_N_PACKET_TYPES           13  /* Must agree with above list;
122                                          * counts 0
123                                          * WARNING: if this number ever
124                                          * grows past 13, rxdebug packets
125                                          * will need to be modified */
126
127
128 /* For most Unixes, maximum elements in an iovec is 16 */
129 #define RX_MAXIOVECS 16                 /* limit for ReadvProc/WritevProc */
130 #define RX_MAXWVECS (RX_MAXIOVECS-1)    /* need one iovec for packet header */
131
132 /* Debugging */
133
134 /* Call flags, states and modes are exposed by the debug interface */
135 #ifndef KDUMP_RX_LOCK
136 /* Major call states */
137 #define RX_STATE_NOTINIT  0     /* Call structure has never been initialized */
138 #define RX_STATE_PRECALL  1     /* Server-only:  call is not in progress, but packets have arrived */
139 #define RX_STATE_ACTIVE   2     /* An active call; a process is dealing with this call */
140 #define RX_STATE_DALLY    3     /* Dallying after process is done with call */
141 #define RX_STATE_HOLD     4     /* Waiting for acks on reply data packets */
142 #define RX_STATE_RESET    5     /* Call is being reset */
143
144 /* Call modes:  the modes of a call in RX_STATE_ACTIVE state (process attached) */
145 #define RX_MODE_SENDING   1     /* Sending or ready to send */
146 #define RX_MODE_RECEIVING 2     /* Receiving or ready to receive */
147 #define RX_MODE_ERROR     3     /* Something in error for current conversation */
148 #define RX_MODE_EOF       4     /* Server has flushed (or client has read) last reply packet */
149
150 /* Flags */
151 #define RX_CALL_READER_WAIT        1    /* Reader is waiting for next packet */
152 #define RX_CALL_WAIT_WINDOW_ALLOC  2    /* Sender is waiting for window to allocate buffers */
153 #define RX_CALL_WAIT_WINDOW_SEND   4    /* Sender is waiting for window to send buffers */
154 #define RX_CALL_WAIT_PACKETS       8    /* Sender is waiting for packet buffers */
155 #define RX_CALL_WAIT_PROC         16    /* Waiting for a process to be assigned */
156 #define RX_CALL_RECEIVE_DONE      32    /* All packets received on this call */
157 #define RX_CALL_CLEARED           64    /* Receive queue cleared in precall state */
158 #define RX_CALL_TQ_BUSY          128    /* Call's Xmit Queue is busy; don't modify */
159 #define RX_CALL_TQ_CLEARME       256    /* Need to clear this call's TQ later */
160 #define RX_CALL_TQ_SOME_ACKED    512    /* rxi_Start needs to discard ack'd packets. */
161 #define RX_CALL_TQ_WAIT         1024    /* Reader is waiting for TQ_BUSY to be reset */
162 #define RX_CALL_FAST_RECOVER    2048    /* call is doing congestion recovery */
163 /* 4096 was RX_CALL_FAST_RECOVER_WAIT */
164 #define RX_CALL_SLOW_START_OK   8192    /* receiver acks every other packet */
165 #define RX_CALL_IOVEC_WAIT      16384   /* waiting thread is using an iovec */
166 #define RX_CALL_HAVE_LAST       32768   /* Last packet has been received */
167 #define RX_CALL_NEED_START      0x10000 /* tells rxi_Start to start again */
168 #define RX_CALL_PEER_BUSY       0x20000 /* the last packet we received on this call was a
169                                          * BUSY packet; i.e. the channel for this call is busy */
170 #define RX_CALL_ACKALL_SENT     0x40000 /* ACKALL has been sent on the call */
171 #define RX_CALL_FLUSH           0x80000 /* Transmit queue should be flushed to peer */
172 #endif
173
174
175 /* Configurable parameters */
176 #define RX_IDLE_DEAD_TIME       60      /* default idle dead time */
177 #define RX_MAX_SERVICES         20      /* Maximum number of services that may be installed */
178 #if defined(KERNEL) && defined(AFS_AIX51_ENV) && defined(__64__)
179 #define RX_DEFAULT_STACK_SIZE   24000
180 #else
181 #define RX_DEFAULT_STACK_SIZE   16000   /* Default process stack size; overriden by rx_SetStackSize */
182 #endif
183
184 /* This parameter should not normally be changed */
185 #define RX_PROCESS_PRIORITY     LWP_NORMAL_PRIORITY
186
187 #define ADDRSPERSITE 16
188
189 #ifndef KDUMP_RX_LOCK
190 /* Bottom n-bits of the Call Identifier give the call number */
191 #define RX_MAXCALLS 4           /* Power of 2; max async calls per connection */
192 #define RX_CIDSHIFT 2           /* Log2(RX_MAXCALLS) */
193 #define RX_CHANNELMASK (RX_MAXCALLS-1)
194 #define RX_CIDMASK  (~RX_CHANNELMASK)
195 #endif /* !KDUMP_RX_LOCK */
196
197 #ifndef KERNEL
198 typedef void (*rx_destructor_t) (void *);
199 int rx_KeyCreate(rx_destructor_t);
200 osi_socket rxi_GetHostUDPSocket(u_int host, u_short port);
201 osi_socket rxi_GetUDPSocket(u_short port);
202 #endif /* KERNEL */
203
204
205 int ntoh_syserr_conv(int error);
206
207 #define RX_WAIT     1
208 #define RX_DONTWAIT 0
209
210 #define rx_GetLocalStatus(call, status) ((call)->localStatus)
211
212
213 static_inline int
214 rx_IsLoopbackAddr(afs_uint32 addr)
215 {
216     return ((addr & 0xffff0000) == 0x7f000000);
217 }
218
219 /*******************
220  * Macros callable by the user to further define attributes of a
221  * service.  Must be called before rx_StartServer
222  */
223
224 /* Set the service stack size.  This currently just sets the stack
225  * size for all processes to be the maximum seen, so far */
226 #define rx_SetStackSize(service, stackSize) \
227   rx_stackSize = (((stackSize) > rx_stackSize)? stackSize: rx_stackSize)
228
229 /* Set minimum number of processes guaranteed to be available for this
230  * service at all times */
231 #define rx_SetMinProcs(service, min) ((service)->minProcs = (min))
232
233 /* Set maximum number of processes that will be made available to this
234  * service (also a guarantee that this number will be made available
235  * if there is no competition) */
236 #define rx_SetMaxProcs(service, max) ((service)->maxProcs = (max))
237
238 /* Define a procedure to be called just before a server connection is destroyed */
239 #define rx_SetDestroyConnProc(service,proc) ((service)->destroyConnProc = (proc))
240
241 /* Define procedure to set service dead time */
242 #define rx_SetIdleDeadTime(service,time) ((service)->idleDeadTime = (time))
243
244 /*
245  * Define error to return in server connections when failing to answer.
246  * (server only) For example, AFS viced sends VNOSERVICE.
247  */
248 #define rx_SetServerIdleDeadErr(service,err) ((service)->idleDeadErr = (err))
249
250 /* Define procedures for getting and setting before and after execute-request procs */
251 #define rx_SetAfterProc(service,proc) ((service)->afterProc = (proc))
252 #define rx_SetBeforeProc(service,proc) ((service)->beforeProc = (proc))
253 #define rx_GetAfterProc(service) ((service)->afterProc)
254 #define rx_GetBeforeProc(service) ((service)->beforeProc)
255 #define rx_SetPostProc(service,proc) ((service)->postProc = (proc))
256 #define rx_GetPostProc(service) ((service)->postProc)
257
258 /* Define a procedure to be called when a server connection is created */
259 #define rx_SetNewConnProc(service, proc) ((service)->newConnProc = (proc))
260
261 /* NOTE:  We'll probably redefine the following three routines, again, sometime. */
262
263 /* Set the connection dead time for any connections created for this service (server only) */
264 #define rx_SetServiceDeadTime(service, seconds) ((service)->secondsUntilDead = (seconds))
265
266 /* Enable or disable asymmetric client checking for a service */
267 #define rx_SetCheckReach(service, x) ((service)->checkReach = (x))
268
269 /* Set the overload threshold and the overload error */
270 #define rx_SetBusyThreshold(threshold, code) (rx_BusyThreshold=(threshold),rx_BusyError=(code))
271
272 /* If this flag is set,no new requests are processed by rx, all new requests are
273 returned with an error code of RX_CALL_DEAD ( transient error ) */
274 #define rx_SetRxTranquil()              (rx_tranquil = 1)
275 #define rx_ClearRxTranquil()            (rx_tranquil = 0)
276
277 /* Set the threshold and time to delay aborts for consecutive errors */
278 #define rx_SetCallAbortThreshold(A) (rxi_callAbortThreshhold = (A))
279 #define rx_SetCallAbortDelay(A) (rxi_callAbortDelay = (A))
280 #define rx_SetConnAbortThreshold(A) (rxi_connAbortThreshhold = (A))
281 #define rx_SetConnAbortDelay(A) (rxi_connAbortDelay = (A))
282
283
284
285 #define cpspace(call) ((call)->curlen)
286 #define cppos(call) ((call)->curpos)
287
288 #define rx_Read(call, buf, nbytes)   rx_ReadProc(call, buf, nbytes)
289 #define rx_Read32(call, value)   rx_ReadProc32(call, value)
290 #define rx_Readv(call, iov, nio, maxio, nbytes) \
291    rx_ReadvProc(call, iov, nio, maxio, nbytes)
292 #define rx_Write(call, buf, nbytes) rx_WriteProc(call, buf, nbytes)
293 #define rx_Write32(call, value) rx_WriteProc32(call, value)
294 #define rx_Writev(call, iov, nio, nbytes) \
295    rx_WritevProc(call, iov, nio, nbytes)
296
297 /* This is the maximum size data packet that can be sent on this connection, accounting for security module-specific overheads. */
298 #define rx_MaxUserDataSize(call)                ((call)->MTU - RX_HEADER_SIZE - (call)->conn->securityHeaderSize - (call)->conn->securityMaxTrailerSize)
299
300 /* Macros to turn the hot thread feature on and off. Enabling hot threads
301  * allows the listener thread to trade places with an idle worker thread,
302  * which moves the context switch from listener to worker out of the
303  * critical path.
304  */
305 #define rx_EnableHotThread()            (rx_enable_hot_thread = 1)
306 #define rx_DisableHotThread()           (rx_enable_hot_thread = 0)
307
308 #define rx_PutConnection(conn) rx_DestroyConnection(conn)
309
310 /* A service is installed by rx_NewService, and specifies a service type that
311  * is exported by this process.  Incoming calls are stamped with the service
312  * type, and must match an installed service for the call to be accepted.
313  * Each service exported has a (port,serviceId) pair to uniquely identify it.
314  * It is also named:  this is intended to allow a remote statistics gathering
315  * program to retrieve per service statistics without having to know the local
316  * service id's.  Each service has a number of
317  */
318
319 /* security objects (instances of security classes) which implement
320  * various types of end-to-end security protocols for connections made
321  * to this service.  Finally, there are two parameters controlling the
322  * number of requests which may be executed in parallel by this
323  * service: minProcs is the number of requests to this service which
324  * are guaranteed to be able to run in parallel at any time; maxProcs
325  * has two meanings: it limits the total number of requests which may
326  * execute in parallel and it also guarantees that that many requests
327  * may be handled in parallel if no other service is handling any
328  * requests. */
329
330 struct rx_service {
331     u_short serviceId;          /* Service number */
332     afs_uint32 serviceHost;     /* IP address for this service */
333     u_short servicePort;        /* UDP port for this service */
334     char *serviceName;          /* Name of the service */
335     osi_socket socket;          /* socket structure or file descriptor */
336     u_short nRequestsRunning;   /* Number of requests currently in progress */
337     u_short nSecurityObjects;   /* Number of entries in security objects array */
338     struct rx_securityClass **securityObjects;  /* Array of security class objects */
339       afs_int32(*executeRequestProc) (struct rx_call * acall);  /* Routine to call when an rpc request is received */
340     void (*destroyConnProc) (struct rx_connection * tcon);      /* Routine to call when a server connection is destroyed */
341     void (*newConnProc) (struct rx_connection * tcon);  /* Routine to call when a server connection is created */
342     void (*beforeProc) (struct rx_call * acall);        /* routine to call before a call is executed */
343     void (*afterProc) (struct rx_call * acall, afs_int32 code); /* routine to call after a call is executed */
344     void (*postProc) (afs_int32 code);  /* routine to call after the call has ended */
345     u_short maxProcs;           /* Maximum procs to be used for this service */
346     u_short minProcs;           /* Minimum # of requests guaranteed executable simultaneously */
347     u_short connDeadTime;       /* Seconds until a client of this service will be declared dead, if it is not responding */
348     u_short idleDeadTime;       /* Time a server will wait for I/O to start up again */
349     u_char checkReach;          /* Check for asymmetric clients? */
350     afs_int32 idleDeadErr;
351     int nSpecific;              /* number entries in specific data */
352     void **specific;            /* pointer to connection specific data */
353 #ifdef  RX_ENABLE_LOCKS
354     afs_kmutex_t svc_data_lock; /* protect specific data */
355 #endif
356
357 };
358
359 #endif /* KDUMP_RX_LOCK */
360
361 #ifndef KDUMP_RX_LOCK
362 /* Flag bits for connection structure */
363 #define RX_CONN_MAKECALL_WAITING    1   /* rx_NewCall is waiting for a channel */
364 #define RX_CONN_DESTROY_ME          2   /* Destroy *client* connection after last call */
365 #define RX_CONN_USING_PACKET_CKSUM  4   /* non-zero header.spare field seen */
366 #define RX_CONN_KNOW_WINDOW         8   /* window size negotiation works */
367 #define RX_CONN_RESET              16   /* connection is reset, remove */
368 #define RX_CONN_BUSY               32   /* connection is busy; don't delete */
369 #define RX_CONN_ATTACHWAIT         64   /* attach waiting for peer->lastReach */
370 #define RX_CONN_MAKECALL_ACTIVE   128   /* a thread is actively in rx_NewCall */
371 #define RX_CONN_NAT_PING          256   /* nat ping requested */
372
373 /* Type of connection, client or server */
374 #define RX_CLIENT_CONNECTION    0
375 #define RX_SERVER_CONNECTION    1
376 #endif /* !KDUMP_RX_LOCK */
377
378 /* Maximum number of acknowledgements in an acknowledge packet */
379 #define RX_MAXACKS          255
380
381 #ifndef KDUMP_RX_LOCK
382
383 /* The structure of the data portion of an acknowledge packet: An acknowledge
384  * packet is in network byte order at all times.  An acknowledgement is always
385  * prompted for a specific reason by a specific incoming packet.  This reason
386  * is reported in "reason" and the packet's sequence number in the packet
387  * header.seq.  In addition to this information, all of the current
388  * acknowledgement information about this call is placed in the packet.
389  * "FirstPacket" is the sequence number of the first packet represented in an
390  * array of bytes, "acks", containing acknowledgement information for a number
391  * of consecutive packets.  All packets prior to FirstPacket are implicitly
392  * acknowledged: the sender need no longer be concerned about them.  Packets
393  * from firstPacket+nAcks and on are not acknowledged.  Packets in the range
394  * [firstPacket,firstPacket+nAcks) are each acknowledged explicitly.  The
395  * acknowledgement may be RX_NACK if the packet is not (currently) at the
396  * receiver (it may have never been received, or received and then later
397  * dropped), or it may be RX_ACK if the packet is queued up waiting to be read
398  * by the upper level software.  RX_ACK does not imply that the packet may not
399  * be dropped before it is read; it does imply that the sender should stop
400  * retransmitting the packet until notified otherwise.  The field
401  * previousPacket identifies the previous packet received by the peer.  This
402  * was used in a previous version of this software, and could be used in the
403  * future.  The serial number in the data part of the ack packet corresponds to
404  * the serial number oof the packet which prompted the acknowledge.  Any
405  * packets which are explicitly not acknowledged, and which were last
406  * transmitted with a serial number less than the provided serial number,
407  * should be retransmitted immediately.  Actually, this is slightly inaccurate:
408  * packets are not necessarily received in order.  When packets are habitually
409  * transmitted out of order, this is allowed for in the retransmission
410  * algorithm by introducing the notion of maximum packet skew: the degree of
411  * out-of-orderness of the packets received on the wire.  This number is
412  * communicated from the receiver to the sender in ack packets. */
413
414 struct rx_ackPacket {
415     u_short bufferSpace;        /* Number of packet buffers available.  That is:  the number of buffers that the sender of the ack packet is willing to provide for data, on this or subsequent calls.  Lying is permissable. */
416     u_short maxSkew;            /* Maximum difference between serial# of packet acknowledged and highest packet yet received */
417     afs_uint32 firstPacket;     /* The first packet in the list of acknowledged packets */
418     afs_uint32 previousPacket;  /* The previous packet number received (obsolete?) */
419     afs_uint32 serial;          /* Serial number of the packet which prompted the acknowledge */
420     u_char reason;              /* Reason for the acknowledge of ackPacket, defined below */
421     u_char nAcks;               /* Number of acknowledgements */
422     u_char acks[RX_MAXACKS];    /* Up to RX_MAXACKS packet acknowledgements, defined below */
423     /* Packets <firstPacket are implicitly acknowledged and may be discarded by the sender.  Packets >= firstPacket+nAcks are implicitly NOT acknowledged.  No packets with sequence numbers >= firstPacket should be discarded by the sender (they may thrown out at any time by the receiver) */
424 };
425
426 #define FIRSTACKOFFSET 4
427
428 /* Reason for acknowledge message */
429 #define RX_ACK_REQUESTED        1       /* Peer requested an ack on this packet */
430 #define RX_ACK_DUPLICATE        2       /* Duplicate packet */
431 #define RX_ACK_OUT_OF_SEQUENCE  3       /* Packet out of sequence */
432 #define RX_ACK_EXCEEDS_WINDOW   4       /* Packet sequence number higher than window; discarded */
433 #define RX_ACK_NOSPACE          5       /* No buffer space at all */
434 #define RX_ACK_PING             6       /* This is a keep-alive ack */
435 #define RX_ACK_PING_RESPONSE    7       /* Ack'ing because we were pinged */
436 #define RX_ACK_DELAY            8       /* Ack generated since nothing has happened since receiving packet */
437 #define RX_ACK_IDLE             9       /* Similar to RX_ACK_DELAY, but can
438                                          * be used to compute RTT */
439 #define RX_ACK_MTU             -1       /* will be rewritten to ACK_PING */
440
441 /* Packet acknowledgement type */
442 #define RX_ACK_TYPE_NACK        0       /* I Don't have this packet */
443 #define RX_ACK_TYPE_ACK         1       /* I have this packet, although I may discard it later */
444
445 /* The packet size transmitted for an acknowledge is adjusted to reflect the actual size of the acks array.  This macro defines the size */
446 #define rx_AckDataSize(nAcks) (3 + nAcks + offsetof(struct rx_ackPacket, acks[0]))
447
448 #define RX_CHALLENGE_TIMEOUT    2       /* Number of seconds before another authentication request packet is generated */
449 #define RX_CHALLENGE_MAXTRIES   50      /* Max # of times we resend challenge */
450 #define RX_CHECKREACH_TIMEOUT   2       /* Number of seconds before another ping is generated */
451 #define RX_CHECKREACH_TTL       60      /* Re-check reachability this often */
452
453 /*
454  * rx_GetNetworkError 'origin' constants. These define the meaning of the
455  * 'type' and 'code' values returned by rx_GetNetworkError.
456  */
457
458 /* Used for ICMP errors; the type and code are the ICMP type and code,
459  * respectively */
460 #define RX_NETWORK_ERROR_ORIGIN_ICMP (0)
461
462 /*
463  * RX error codes.  RX uses error codes from -1 to -64 and -100.
464  * Rxgen uses other error codes < -64 (see src/rxgen/rpc_errors.h);
465  * user programs are expected to return positive error codes
466  */
467
468 /* Something bad happened to the connection; temporary loss of communication */
469 #define RX_CALL_DEAD                (-1)
470
471 /*
472  * An invalid operation, such as a client attempting to send data
473  * after having received the beginning of a reply from the server.
474  */
475 #define RX_INVALID_OPERATION        (-2)
476
477 /* An optional timeout per call may be specified */
478 #define RX_CALL_TIMEOUT             (-3)
479
480 /* End of data on a read.  Not currently in use. */
481 #define RX_EOF                      (-4)
482
483 /* Some sort of low-level protocol error. */
484 #define RX_PROTOCOL_ERROR           (-5)
485
486 /*
487  * Generic user abort code; used when no more specific error code needs to be
488  * communicated.  For example, multi rx clients use this code to abort a multi-
489  * rx call.
490  */
491 #define RX_USER_ABORT               (-6)
492
493 /* Port already in use (from rx_Init).  This error is never sent on the wire. */
494 #define RX_ADDRINUSE                (-7)
495
496 /* EMSGSIZE returned from network.  Packet too big, must fragment */
497 #define RX_MSGSIZE                  (-8)
498
499 /*
500  * Idle dead timeout error.  This error is never sent on the wire.
501  * rxi_SendCallAbort() translates RX_CALL_IDLE to RX_CALL_TIMEOUT.
502  */
503 #define RX_CALL_IDLE                (-9)
504
505 /*
506  * Busy call channel error.  This error is never sent on the wire.
507  * rxi_SendCallAbort() translates RX_CALL_BUSY to RX_CALL_TIMEOUT.
508  */
509 #define RX_CALL_BUSY                (-10)
510
511 /* transient failure detected ( possibly the server is restarting ) */
512 /* this should be equal to VRESTARTING ( util/errors.h ) for old clients to work */
513 #define RX_RESTARTING               (-100)
514
515 typedef enum {
516     RX_SECIDX_NULL = 0,         /** rxnull, no security. */
517     RX_SECIDX_VAB  = 1,         /** vice tokens with bcrypt.  Unused. */
518     RX_SECIDX_KAD  = 2,         /** kerberos/DES. */
519     RX_SECIDX_KAE  = 3,         /** rxkad, but always encrypt. */
520     RX_SECIDX_GK   = 4,         /** rxgk, RFC 3961 crypto. */
521     RX_SECIDX_K5   = 5,         /** kerberos 5 tickets as tokens. */
522 } rx_securityIndex;
523
524 struct rx_securityObjectStats {
525     char type;                  /* 0:unk 1:null,2:vab 3:kad */
526     char level;
527     char sparec[10];            /* force correct alignment */
528     afs_int32 flags;            /* 1=>unalloc, 2=>auth, 4=>expired */
529     afs_uint32 expires;
530     afs_uint32 packetsReceived;
531     afs_uint32 packetsSent;
532     afs_uint32 bytesReceived;
533     afs_uint32 bytesSent;
534     short spares[4];
535     afs_int32 sparel[8];
536 };
537
538 /* Configuration settings */
539
540 /* Enum for storing configuration variables which can be set via the
541  * SetConfiguration method in the rx_securityClass, below
542  */
543
544 typedef enum {
545      RXS_CONFIG_FLAGS /* afs_uint32 set of bitwise flags */
546 } rx_securityConfigVariables;
547
548 /* For the RXS_CONFIG_FLAGS, the following bit values are defined */
549
550 /* Disable the principal name contains dot check in rxkad */
551 #define RXS_CONFIG_FLAGS_DISABLE_DOTCHECK       0x01
552
553 /* XXXX (rewrite this description) A security class object contains a set of
554  * procedures and some private data to implement a security model for rx
555  * connections.  These routines are called by rx as appropriate.  Rx knows
556  * nothing about the internal details of any particular security model, or
557  * about security state.  Rx does maintain state per connection on behalf of
558  * the security class.  Each security class implementation is also expected to
559  * provide routines to create these objects.  Rx provides a basic routine to
560  * allocate one of these objects; this routine must be called by the class. */
561 struct rx_securityClass {
562     struct rx_securityOps {
563         int (*op_Close) (struct rx_securityClass * aobj);
564         int (*op_NewConnection) (struct rx_securityClass * aobj,
565                                  struct rx_connection * aconn);
566         int (*op_PreparePacket) (struct rx_securityClass * aobj,
567                                  struct rx_call * acall,
568                                  struct rx_packet * apacket);
569         int (*op_SendPacket) (struct rx_securityClass * aobj,
570                               struct rx_call * acall,
571                               struct rx_packet * apacket);
572         int (*op_CheckAuthentication) (struct rx_securityClass * aobj,
573                                        struct rx_connection * aconn);
574         int (*op_CreateChallenge) (struct rx_securityClass * aobj,
575                                    struct rx_connection * aconn);
576         int (*op_GetChallenge) (struct rx_securityClass * aobj,
577                                 struct rx_connection * aconn,
578                                 struct rx_packet * apacket);
579         int (*op_GetResponse) (struct rx_securityClass * aobj,
580                                struct rx_connection * aconn,
581                                struct rx_packet * apacket);
582         int (*op_CheckResponse) (struct rx_securityClass * aobj,
583                                  struct rx_connection * aconn,
584                                  struct rx_packet * apacket);
585         int (*op_CheckPacket) (struct rx_securityClass * aobj,
586                                struct rx_call * acall,
587                                struct rx_packet * apacket);
588         int (*op_DestroyConnection) (struct rx_securityClass * aobj,
589                                      struct rx_connection * aconn);
590         int (*op_GetStats) (struct rx_securityClass * aobj,
591                             struct rx_connection * aconn,
592                             struct rx_securityObjectStats * astats);
593         int (*op_SetConfiguration) (struct rx_securityClass * aobj,
594                                     struct rx_connection * aconn,
595                                     rx_securityConfigVariables atype,
596                                     void * avalue,
597                                     void ** acurrentValue);
598         int (*op_Spare2) (void);
599         int (*op_Spare3) (void);
600     } *ops;
601     void *privateData;
602     int refCount;
603 };
604
605 #define RXS_OP(obj,op,args) ((obj && (obj->ops->op_ ## op)) ? (*(obj)->ops->op_ ## op)args : 0)
606
607 #define RXS_Close(obj) RXS_OP(obj,Close,(obj))
608 #define RXS_NewConnection(obj,conn) RXS_OP(obj,NewConnection,(obj,conn))
609 #define RXS_PreparePacket(obj,call,packet) RXS_OP(obj,PreparePacket,(obj,call,packet))
610 #define RXS_SendPacket(obj,call,packet) RXS_OP(obj,SendPacket,(obj,call,packet))
611 #define RXS_CheckAuthentication(obj,conn) RXS_OP(obj,CheckAuthentication,(obj,conn))
612 #define RXS_CreateChallenge(obj,conn) RXS_OP(obj,CreateChallenge,(obj,conn))
613 #define RXS_GetChallenge(obj,conn,packet) RXS_OP(obj,GetChallenge,(obj,conn,packet))
614 #define RXS_GetResponse(obj,conn,packet) RXS_OP(obj,GetResponse,(obj,conn,packet))
615 #define RXS_CheckResponse(obj,conn,packet) RXS_OP(obj,CheckResponse,(obj,conn,packet))
616 #define RXS_CheckPacket(obj,call,packet) RXS_OP(obj,CheckPacket,(obj,call,packet))
617 #define RXS_DestroyConnection(obj,conn) RXS_OP(obj,DestroyConnection,(obj,conn))
618 #define RXS_GetStats(obj,conn,stats) RXS_OP(obj,GetStats,(obj,conn,stats))
619 #define RXS_SetConfiguration(obj, conn, type, value, currentValue) RXS_OP(obj, SetConfiguration,(obj,conn,type,value,currentValue))
620
621
622
623 /* Structure for keeping rx statistics.  Note that this structure is returned
624  * by rxdebug, so, for compatibility reasons, new fields should be appended (or
625  * spares used), the rxdebug protocol checked, if necessary, and the PrintStats
626  * code should be updated as well.
627  *
628  * Clearly we assume that ntohl will work on these structures so sizeof(int)
629  * must equal sizeof(afs_int32). */
630
631 struct rx_statistics {          /* General rx statistics */
632     int packetRequests;         /* Number of packet allocation requests */
633     int receivePktAllocFailures;
634     int sendPktAllocFailures;
635     int specialPktAllocFailures;
636     int socketGreedy;           /* Whether SO_GREEDY succeeded */
637     int bogusPacketOnRead;      /* Number of inappropriately short packets received */
638     int bogusHost;              /* Host address from bogus packets */
639     int noPacketOnRead;         /* Number of read packets attempted when there was actually no packet to read off the wire */
640     int noPacketBuffersOnRead;  /* Number of dropped data packets due to lack of packet buffers */
641     int selects;                /* Number of selects waiting for packet or timeout */
642     int sendSelects;            /* Number of selects forced when sending packet */
643     int packetsRead[RX_N_PACKET_TYPES]; /* Total number of packets read, per type */
644     int dataPacketsRead;        /* Number of unique data packets read off the wire */
645     int ackPacketsRead;         /* Number of ack packets read */
646     int dupPacketsRead;         /* Number of duplicate data packets read */
647     int spuriousPacketsRead;    /* Number of inappropriate data packets */
648     int packetsSent[RX_N_PACKET_TYPES]; /* Number of rxi_Sends: packets sent over the wire, per type */
649     int ackPacketsSent;         /* Number of acks sent */
650     int pingPacketsSent;        /* Total number of ping packets sent */
651     int abortPacketsSent;       /* Total number of aborts */
652     int busyPacketsSent;        /* Total number of busies sent received */
653     int dataPacketsSent;        /* Number of unique data packets sent */
654     int dataPacketsReSent;      /* Number of retransmissions */
655     int dataPacketsPushed;      /* Number of retransmissions pushed early by a NACK */
656     int ignoreAckedPacket;      /* Number of packets with acked flag, on rxi_Start */
657     struct clock totalRtt;      /* Total round trip time measured (use to compute average) */
658     struct clock minRtt;        /* Minimum round trip time measured */
659     struct clock maxRtt;        /* Maximum round trip time measured */
660     int nRttSamples;            /* Total number of round trip samples */
661     int nServerConns;           /* Total number of server connections */
662     int nClientConns;           /* Total number of client connections */
663     int nPeerStructs;           /* Total number of peer structures */
664     int nCallStructs;           /* Total number of call structures allocated */
665     int nFreeCallStructs;       /* Total number of previously allocated free call structures */
666     int netSendFailures;
667     afs_int32 fatalErrors;
668     int ignorePacketDally;      /* packets dropped because call is in dally state */
669     int receiveCbufPktAllocFailures;
670     int sendCbufPktAllocFailures;
671     int nBusies;
672     int spares[4];
673 };
674
675 /* structures for debug input and output packets */
676
677 /* debug input types */
678 struct rx_debugIn {
679     afs_int32 type;
680     afs_int32 index;
681 };
682
683 /* Invalid rx debug package type */
684 #define RX_DEBUGI_BADTYPE     (-8)
685
686 #define RX_DEBUGI_VERSION_MINIMUM ('L') /* earliest real version */
687 #define RX_DEBUGI_VERSION     ('S')    /* Latest version */
688     /* first version w/ secStats */
689 #define RX_DEBUGI_VERSION_W_SECSTATS ('L')
690     /* version M is first supporting GETALLCONN and RXSTATS type */
691 #define RX_DEBUGI_VERSION_W_GETALLCONN ('M')
692 #define RX_DEBUGI_VERSION_W_RXSTATS ('M')
693     /* last version with unaligned debugConn */
694 #define RX_DEBUGI_VERSION_W_UNALIGNED_CONN ('L')
695 #define RX_DEBUGI_VERSION_W_WAITERS ('N')
696 #define RX_DEBUGI_VERSION_W_IDLETHREADS ('O')
697 #define RX_DEBUGI_VERSION_W_NEWPACKETTYPES ('P')
698 #define RX_DEBUGI_VERSION_W_GETPEER ('Q')
699 #define RX_DEBUGI_VERSION_W_WAITED ('R')
700 #define RX_DEBUGI_VERSION_W_PACKETS ('S')
701
702 #define RX_DEBUGI_GETSTATS      1       /* get basic rx stats */
703 #define RX_DEBUGI_GETCONN       2       /* get connection info */
704 #define RX_DEBUGI_GETALLCONN    3       /* get even uninteresting conns */
705 #define RX_DEBUGI_RXSTATS       4       /* get all rx stats */
706 #define RX_DEBUGI_GETPEER       5       /* get all peer structs */
707
708 struct rx_debugStats {
709     afs_int32 nFreePackets;
710     afs_int32 packetReclaims;
711     afs_int32 callsExecuted;
712     char waitingForPackets;
713     char usedFDs;
714     char version;
715     char spare1;
716     afs_int32 nWaiting;
717     afs_int32 idleThreads;      /* Number of server threads that are idle */
718     afs_int32 nWaited;
719     afs_int32 nPackets;
720     afs_int32 spare2[6];
721 };
722
723 struct rx_debugConn_vL {
724     afs_uint32 host;
725     afs_int32 cid;
726     afs_int32 serial;
727     afs_int32 callNumber[RX_MAXCALLS];
728     afs_int32 error;
729     short port;
730     char flags;
731     char type;
732     char securityIndex;
733     char callState[RX_MAXCALLS];
734     char callMode[RX_MAXCALLS];
735     char callFlags[RX_MAXCALLS];
736     char callOther[RX_MAXCALLS];
737     /* old style getconn stops here */
738     struct rx_securityObjectStats secStats;
739     afs_int32 sparel[10];
740 };
741
742 struct rx_debugConn {
743     afs_uint32 host;
744     afs_int32 cid;
745     afs_int32 serial;
746     afs_int32 callNumber[RX_MAXCALLS];
747     afs_int32 error;
748     short port;
749     char flags;
750     char type;
751     char securityIndex;
752     char sparec[3];             /* force correct alignment */
753     char callState[RX_MAXCALLS];
754     char callMode[RX_MAXCALLS];
755     char callFlags[RX_MAXCALLS];
756     char callOther[RX_MAXCALLS];
757     /* old style getconn stops here */
758     struct rx_securityObjectStats secStats;
759     afs_int32 epoch;
760     afs_int32 natMTU;
761     afs_int32 sparel[9];
762 };
763
764 struct rx_debugPeer {
765     afs_uint32 host;
766     u_short port;
767     u_short ifMTU;
768     afs_uint32 idleWhen;
769     short refCount;
770     u_char burstSize;
771     u_char burst;
772     struct clock burstWait;
773     afs_int32 rtt;
774     afs_int32 rtt_dev;
775     struct clock timeout;
776     afs_int32 nSent;
777     afs_int32 reSends;
778     afs_int32 inPacketSkew;
779     afs_int32 outPacketSkew;
780     afs_int32 rateFlag;
781     u_short natMTU;
782     u_short maxMTU;
783     u_short maxDgramPackets;
784     u_short ifDgramPackets;
785     u_short MTU;
786     u_short cwind;
787     u_short nDgramPackets;
788     u_short congestSeq;
789     afs_hyper_t bytesSent;
790     afs_hyper_t bytesReceived;
791     afs_int32 sparel[10];
792 };
793
794 #define RX_OTHER_IN     1       /* packets avail in in queue */
795 #define RX_OTHER_OUT    2       /* packets avail in out queue */
796
797 #define RX_SERVER_DEBUG_SEC_STATS               0x1
798 #define RX_SERVER_DEBUG_ALL_CONN                0x2
799 #define RX_SERVER_DEBUG_RX_STATS                0x4
800 #define RX_SERVER_DEBUG_WAITER_CNT              0x8
801 #define RX_SERVER_DEBUG_IDLE_THREADS            0x10
802 #define RX_SERVER_DEBUG_OLD_CONN                0x20
803 #define RX_SERVER_DEBUG_NEW_PACKETS             0x40
804 #define RX_SERVER_DEBUG_ALL_PEER                0x80
805 #define RX_SERVER_DEBUG_WAITED_CNT              0x100
806 #define RX_SERVER_DEBUG_PACKETS_CNT              0x200
807
808 #define AFS_RX_STATS_CLEAR_ALL                  0xffffffff
809 #define AFS_RX_STATS_CLEAR_INVOCATIONS          0x1
810 #define AFS_RX_STATS_CLEAR_BYTES_SENT           0x2
811 #define AFS_RX_STATS_CLEAR_BYTES_RCVD           0x4
812 #define AFS_RX_STATS_CLEAR_QUEUE_TIME_SUM       0x8
813 #define AFS_RX_STATS_CLEAR_QUEUE_TIME_SQUARE    0x10
814 #define AFS_RX_STATS_CLEAR_QUEUE_TIME_MIN       0x20
815 #define AFS_RX_STATS_CLEAR_QUEUE_TIME_MAX       0x40
816 #define AFS_RX_STATS_CLEAR_EXEC_TIME_SUM        0x80
817 #define AFS_RX_STATS_CLEAR_EXEC_TIME_SQUARE     0x100
818 #define AFS_RX_STATS_CLEAR_EXEC_TIME_MIN        0x200
819 #define AFS_RX_STATS_CLEAR_EXEC_TIME_MAX        0x400
820
821 typedef struct rx_function_entry_v1 {
822     afs_uint32 remote_peer;
823     afs_uint32 remote_port;
824     afs_uint32 remote_is_server;
825     afs_uint32 interfaceId;
826     afs_uint32 func_total;
827     afs_uint32 func_index;
828     afs_uint64 invocations;
829     afs_uint64 bytes_sent;
830     afs_uint64 bytes_rcvd;
831     struct clock queue_time_sum;
832     struct clock queue_time_sum_sqr;
833     struct clock queue_time_min;
834     struct clock queue_time_max;
835     struct clock execution_time_sum;
836     struct clock execution_time_sum_sqr;
837     struct clock execution_time_min;
838     struct clock execution_time_max;
839 } rx_function_entry_v1_t, *rx_function_entry_v1_p;
840
841 /*
842  * If you need to change rx_function_entry, you should probably create a brand
843  * new structure.  Keeping the old structure will allow backwards compatibility
844  * with old clients (even if it is only used to calculate allocation size).
845  * If you do change the size or the format, you'll need to bump
846  * RX_STATS_RETRIEVAL_VERSION.  This allows some primitive form
847  * of versioning a la rxdebug.
848  */
849
850 #define RX_STATS_RETRIEVAL_VERSION 1    /* latest version */
851 #define RX_STATS_RETRIEVAL_FIRST_EDITION 1      /* first implementation */
852
853 typedef struct rx_interface_stat {
854     struct opr_queue entry;
855     struct opr_queue entryPeers;
856     rx_function_entry_v1_t stats[1];    /* make sure this is aligned correctly */
857 } rx_interface_stat_t, *rx_interface_stat_p;
858
859 #define RX_STATS_SERVICE_ID 409
860
861 #ifdef AFS_NT40_ENV
862 extern int rx_DumpCalls(FILE *outputFile, char *cookie);
863 #endif
864
865 #endif /* _RX_   End of rx.h */
866
867 #ifdef  KERNEL
868 #include "rx/rx_prototypes.h"
869 #else
870 #include "rx_prototypes.h"
871 #endif
872
873 static_inline afs_uint32
874 RPCOpStat_Peer(void *blob) {
875     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
876     return rpcop_stat->remote_peer;
877 }
878
879 static_inline afs_uint32
880 RPCOpStat_Port(void *blob) {
881     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
882     return rpcop_stat->remote_port;
883 }
884
885 static_inline afs_uint32
886 RPCOpStat_IsServer(void *blob) {
887     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
888     return rpcop_stat->remote_is_server;
889 }
890
891 static_inline afs_uint32
892 RPCOpStat_InterfaceId(void *blob) {
893     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
894     return rpcop_stat->interfaceId;
895 }
896
897 static_inline afs_uint32
898 RPCOpStat_NumFuncs(void *blob) {
899     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
900     return rpcop_stat->func_total;
901 }
902
903 static_inline afs_uint32
904 RPCOpStat_CurFunc(void *blob) {
905     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
906     return rpcop_stat->func_index;
907 }
908
909 static_inline struct clock *
910 RPCOpStat_QTimeSum(void *blob) {
911     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
912     return &(rpcop_stat->queue_time_sum);
913 }
914
915 static_inline struct clock *
916 RPCOpStat_QTimeSumSqr(void *blob) {
917     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
918     return &(rpcop_stat->queue_time_sum_sqr);
919 }
920
921 static_inline struct clock *
922 RPCOpStat_QTimeSumMin(void *blob) {
923     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
924     return &(rpcop_stat->queue_time_min);
925 }
926
927 static_inline struct clock *
928 RPCOpStat_QTimeSumMax(void *blob) {
929     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
930     return &(rpcop_stat->queue_time_max);
931 }
932
933 static_inline struct clock *
934 RPCOpStat_ExecTimeSum(void *blob) {
935     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
936     return &(rpcop_stat->execution_time_sum);
937 }
938
939 static_inline struct clock *
940 RPCOpStat_ExecTimeSumSqr(void *blob) {
941     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
942     return &(rpcop_stat->execution_time_sum_sqr);
943 }
944
945 static_inline struct clock *
946 RPCOpStat_ExecTimeSumMin(void *blob) {
947     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
948     return &(rpcop_stat->execution_time_min);
949 }
950
951 static_inline struct clock *
952 RPCOpStat_ExecTimeSumMax(void *blob) {
953     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
954     return &(rpcop_stat->execution_time_max);
955 }
956
957 static_inline afs_uint64
958 RPCOpStat_NumCalls(void *blob) {
959     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
960     return rpcop_stat->invocations;
961 }
962
963 static_inline afs_uint64
964 RPCOpStat_BytesSent(void *blob) {
965     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
966     return rpcop_stat->bytes_sent;
967 }
968
969 static_inline afs_uint64
970 RPCOpStat_BytesRcvd(void *blob) {
971     rx_function_entry_v1_p rpcop_stat = (rx_function_entry_v1_p)blob;
972     return rpcop_stat->bytes_rcvd;
973 }
974 #endif /* !KDUMP_RX_LOCK */