bc3fe35cd5dd31ad5d202411a1c95612620fdb3b
[openafs.git] / src / rx / rx.c
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 /* RX:  Extended Remote Procedure Call */
11
12 #include <afsconfig.h>
13 #ifdef  KERNEL
14 #include "afs/param.h"
15 #else
16 #include <afs/param.h>
17 #endif
18
19 RCSID
20     ("$Header$");
21
22 #ifdef KERNEL
23 #include "afs/sysincludes.h"
24 #include "afsincludes.h"
25 #ifndef UKERNEL
26 #include "h/types.h"
27 #include "h/time.h"
28 #include "h/stat.h"
29 #ifdef  AFS_OSF_ENV
30 #include <net/net_globals.h>
31 #endif /* AFS_OSF_ENV */
32 #ifdef AFS_LINUX20_ENV
33 #include "h/socket.h"
34 #endif
35 #include "netinet/in.h"
36 #include "afs/afs_args.h"
37 #include "afs/afs_osi.h"
38 #ifdef RX_KERNEL_TRACE
39 #include "rx_kcommon.h"
40 #endif
41 #if     (defined(AFS_AUX_ENV) || defined(AFS_AIX_ENV))
42 #include "h/systm.h"
43 #endif
44 #ifdef RXDEBUG
45 #undef RXDEBUG                  /* turn off debugging */
46 #endif /* RXDEBUG */
47 #if defined(AFS_SGI_ENV)
48 #include "sys/debug.h"
49 #endif
50 #include "afsint.h"
51 #ifdef  AFS_OSF_ENV
52 #undef kmem_alloc
53 #undef kmem_free
54 #undef mem_alloc
55 #undef mem_free
56 #undef register
57 #endif /* AFS_OSF_ENV */
58 #else /* !UKERNEL */
59 #include "afs/sysincludes.h"
60 #include "afsincludes.h"
61 #endif /* !UKERNEL */
62 #include "afs/lock.h"
63 #include "rx_kmutex.h"
64 #include "rx_kernel.h"
65 #include "rx_clock.h"
66 #include "rx_queue.h"
67 #include "rx.h"
68 #include "rx_globals.h"
69 #include "rx_trace.h"
70 #define AFSOP_STOP_RXCALLBACK   210     /* Stop CALLBACK process */
71 #define AFSOP_STOP_AFS          211     /* Stop AFS process */
72 #define AFSOP_STOP_BKG          212     /* Stop BKG process */
73 #include "afsint.h"
74 extern afs_int32 afs_termState;
75 #ifdef AFS_AIX41_ENV
76 #include "sys/lockl.h"
77 #include "sys/lock_def.h"
78 #endif /* AFS_AIX41_ENV */
79 # include "rxgen_consts.h"
80 #else /* KERNEL */
81 # include <sys/types.h>
82 # include <errno.h>
83 #ifdef AFS_NT40_ENV
84 # include <stdlib.h>
85 # include <fcntl.h>
86 # include <afs/afsutil.h>
87 #else
88 # include <sys/socket.h>
89 # include <sys/file.h>
90 # include <netdb.h>
91 # include <sys/stat.h>
92 # include <netinet/in.h>
93 # include <sys/time.h>
94 #endif
95 #ifdef HAVE_STRING_H
96 #include <string.h>
97 #else
98 #ifdef HAVE_STRINGS_H
99 #include <strings.h>
100 #endif
101 #endif
102 # include "rx.h"
103 # include "rx_user.h"
104 # include "rx_clock.h"
105 # include "rx_queue.h"
106 # include "rx_globals.h"
107 # include "rx_trace.h"
108 # include <afs/rxgen_consts.h>
109 #endif /* KERNEL */
110
111 int (*registerProgram) () = 0;
112 int (*swapNameProgram) () = 0;
113
114 /* Local static routines */
115 static void rxi_DestroyConnectionNoLock(register struct rx_connection *conn);
116 #ifdef RX_ENABLE_LOCKS
117 static void rxi_SetAcksInTransmitQueue(register struct rx_call *call);
118 #endif
119
120 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
121 struct rx_tq_debug {
122     afs_int32 rxi_start_aborted;        /* rxi_start awoke after rxi_Send in error. */
123     afs_int32 rxi_start_in_error;
124 } rx_tq_debug;
125 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
126
127 /*
128  * rxi_rpc_peer_stat_cnt counts the total number of peer stat structures
129  * currently allocated within rx.  This number is used to allocate the
130  * memory required to return the statistics when queried.
131  */
132
133 static unsigned int rxi_rpc_peer_stat_cnt;
134
135 /*
136  * rxi_rpc_process_stat_cnt counts the total number of local process stat
137  * structures currently allocated within rx.  The number is used to allocate
138  * the memory required to return the statistics when queried.
139  */
140
141 static unsigned int rxi_rpc_process_stat_cnt;
142
143 #if !defined(offsetof)
144 #include <stddef.h>             /* for definition of offsetof() */
145 #endif
146
147 #ifdef AFS_PTHREAD_ENV
148 #include <assert.h>
149
150 /*
151  * Use procedural initialization of mutexes/condition variables
152  * to ease NT porting
153  */
154
155 extern pthread_mutex_t rx_stats_mutex;
156 extern pthread_mutex_t rxkad_stats_mutex;
157 extern pthread_mutex_t des_init_mutex;
158 extern pthread_mutex_t des_random_mutex;
159 extern pthread_mutex_t rx_clock_mutex;
160 extern pthread_mutex_t rxi_connCacheMutex;
161 extern pthread_mutex_t rx_event_mutex;
162 extern pthread_mutex_t osi_malloc_mutex;
163 extern pthread_mutex_t event_handler_mutex;
164 extern pthread_mutex_t listener_mutex;
165 extern pthread_mutex_t rx_if_init_mutex;
166 extern pthread_mutex_t rx_if_mutex;
167 extern pthread_mutex_t rxkad_client_uid_mutex;
168 extern pthread_mutex_t rxkad_random_mutex;
169
170 extern pthread_cond_t rx_event_handler_cond;
171 extern pthread_cond_t rx_listener_cond;
172
173 static pthread_mutex_t epoch_mutex;
174 static pthread_mutex_t rx_init_mutex;
175 static pthread_mutex_t rx_debug_mutex;
176
177 static void
178 rxi_InitPthread(void)
179 {
180     assert(pthread_mutex_init(&rx_clock_mutex, (const pthread_mutexattr_t *)0)
181            == 0);
182     assert(pthread_mutex_init(&rx_stats_mutex, (const pthread_mutexattr_t *)0)
183            == 0);
184     assert(pthread_mutex_init
185            (&rxi_connCacheMutex, (const pthread_mutexattr_t *)0) == 0);
186     assert(pthread_mutex_init(&rx_init_mutex, (const pthread_mutexattr_t *)0)
187            == 0);
188     assert(pthread_mutex_init(&epoch_mutex, (const pthread_mutexattr_t *)0) ==
189            0);
190     assert(pthread_mutex_init(&rx_event_mutex, (const pthread_mutexattr_t *)0)
191            == 0);
192     assert(pthread_mutex_init(&des_init_mutex, (const pthread_mutexattr_t *)0)
193            == 0);
194     assert(pthread_mutex_init
195            (&des_random_mutex, (const pthread_mutexattr_t *)0) == 0);
196     assert(pthread_mutex_init
197            (&osi_malloc_mutex, (const pthread_mutexattr_t *)0) == 0);
198     assert(pthread_mutex_init
199            (&event_handler_mutex, (const pthread_mutexattr_t *)0) == 0);
200     assert(pthread_mutex_init(&listener_mutex, (const pthread_mutexattr_t *)0)
201            == 0);
202     assert(pthread_mutex_init
203            (&rx_if_init_mutex, (const pthread_mutexattr_t *)0) == 0);
204     assert(pthread_mutex_init(&rx_if_mutex, (const pthread_mutexattr_t *)0) ==
205            0);
206     assert(pthread_mutex_init
207            (&rxkad_client_uid_mutex, (const pthread_mutexattr_t *)0) == 0);
208     assert(pthread_mutex_init
209            (&rxkad_random_mutex, (const pthread_mutexattr_t *)0) == 0);
210     assert(pthread_mutex_init
211            (&rxkad_stats_mutex, (const pthread_mutexattr_t *)0) == 0);
212     assert(pthread_mutex_init(&rx_debug_mutex, (const pthread_mutexattr_t *)0)
213            == 0);
214
215     assert(pthread_cond_init
216            (&rx_event_handler_cond, (const pthread_condattr_t *)0) == 0);
217     assert(pthread_cond_init(&rx_listener_cond, (const pthread_condattr_t *)0)
218            == 0);
219     assert(pthread_key_create(&rx_thread_id_key, NULL) == 0);
220     assert(pthread_key_create(&rx_ts_info_key, NULL) == 0);
221 }
222
223 pthread_once_t rx_once_init = PTHREAD_ONCE_INIT;
224 #define INIT_PTHREAD_LOCKS \
225 assert(pthread_once(&rx_once_init, rxi_InitPthread)==0)
226 /*
227  * The rx_stats_mutex mutex protects the following global variables:
228  * rxi_dataQuota
229  * rxi_minDeficit
230  * rxi_availProcs
231  * rxi_totalMin
232  * rxi_lowConnRefCount
233  * rxi_lowPeerRefCount
234  * rxi_nCalls
235  * rxi_Alloccnt
236  * rxi_Allocsize
237  * rx_nFreePackets
238  * rx_tq_debug
239  * rx_stats
240  */
241 #else
242 #define INIT_PTHREAD_LOCKS
243 #endif
244
245
246 /* Variables for handling the minProcs implementation.  availProcs gives the
247  * number of threads available in the pool at this moment (not counting dudes
248  * executing right now).  totalMin gives the total number of procs required
249  * for handling all minProcs requests.  minDeficit is a dynamic variable
250  * tracking the # of procs required to satisfy all of the remaining minProcs
251  * demands.
252  * For fine grain locking to work, the quota check and the reservation of
253  * a server thread has to come while rxi_availProcs and rxi_minDeficit
254  * are locked. To this end, the code has been modified under #ifdef
255  * RX_ENABLE_LOCKS so that quota checks and reservation occur at the
256  * same time. A new function, ReturnToServerPool() returns the allocation.
257  * 
258  * A call can be on several queue's (but only one at a time). When
259  * rxi_ResetCall wants to remove the call from a queue, it has to ensure
260  * that no one else is touching the queue. To this end, we store the address
261  * of the queue lock in the call structure (under the call lock) when we
262  * put the call on a queue, and we clear the call_queue_lock when the
263  * call is removed from a queue (once the call lock has been obtained).
264  * This allows rxi_ResetCall to safely synchronize with others wishing
265  * to manipulate the queue.
266  */
267
268 #ifdef RX_ENABLE_LOCKS
269 static afs_kmutex_t rx_rpc_stats;
270 void rxi_StartUnlocked();
271 #endif
272
273 /* We keep a "last conn pointer" in rxi_FindConnection. The odds are 
274 ** pretty good that the next packet coming in is from the same connection 
275 ** as the last packet, since we're send multiple packets in a transmit window.
276 */
277 struct rx_connection *rxLastConn = 0;
278
279 #ifdef RX_ENABLE_LOCKS
280 /* The locking hierarchy for rx fine grain locking is composed of these
281  * tiers:
282  *
283  * rx_connHashTable_lock - synchronizes conn creation, rx_connHashTable access
284  * conn_call_lock - used to synchonize rx_EndCall and rx_NewCall
285  * call->lock - locks call data fields.
286  * These are independent of each other:
287  *      rx_freeCallQueue_lock
288  *      rxi_keyCreate_lock
289  * rx_serverPool_lock
290  * freeSQEList_lock
291  *
292  * serverQueueEntry->lock
293  * rx_rpc_stats
294  * rx_peerHashTable_lock - locked under rx_connHashTable_lock
295  * peer->lock - locks peer data fields.
296  * conn_data_lock - that more than one thread is not updating a conn data
297  *                  field at the same time.
298  * rx_freePktQ_lock
299  *
300  * lowest level:
301  *      multi_handle->lock
302  *      rxevent_lock
303  *      rx_stats_mutex
304  *
305  * Do we need a lock to protect the peer field in the conn structure?
306  *      conn->peer was previously a constant for all intents and so has no
307  *      lock protecting this field. The multihomed client delta introduced
308  *      a RX code change : change the peer field in the connection structure
309  *      to that remote inetrface from which the last packet for this
310  *      connection was sent out. This may become an issue if further changes
311  *      are made.
312  */
313 #define SET_CALL_QUEUE_LOCK(C, L) (C)->call_queue_lock = (L)
314 #define CLEAR_CALL_QUEUE_LOCK(C) (C)->call_queue_lock = NULL
315 #ifdef RX_LOCKS_DB
316 /* rxdb_fileID is used to identify the lock location, along with line#. */
317 static int rxdb_fileID = RXDB_FILE_RX;
318 #endif /* RX_LOCKS_DB */
319 #else /* RX_ENABLE_LOCKS */
320 #define SET_CALL_QUEUE_LOCK(C, L)
321 #define CLEAR_CALL_QUEUE_LOCK(C)
322 #endif /* RX_ENABLE_LOCKS */
323 struct rx_serverQueueEntry *rx_waitForPacket = 0;
324 struct rx_serverQueueEntry *rx_waitingForPacket = 0;
325
326 /* ------------Exported Interfaces------------- */
327
328 /* This function allows rxkad to set the epoch to a suitably random number
329  * which rx_NewConnection will use in the future.  The principle purpose is to
330  * get rxnull connections to use the same epoch as the rxkad connections do, at
331  * least once the first rxkad connection is established.  This is important now
332  * that the host/port addresses aren't used in FindConnection: the uniqueness
333  * of epoch/cid matters and the start time won't do. */
334
335 #ifdef AFS_PTHREAD_ENV
336 /*
337  * This mutex protects the following global variables:
338  * rx_epoch
339  */
340
341 #define LOCK_EPOCH assert(pthread_mutex_lock(&epoch_mutex)==0)
342 #define UNLOCK_EPOCH assert(pthread_mutex_unlock(&epoch_mutex)==0)
343 #else
344 #define LOCK_EPOCH
345 #define UNLOCK_EPOCH
346 #endif /* AFS_PTHREAD_ENV */
347
348 void
349 rx_SetEpoch(afs_uint32 epoch)
350 {
351     LOCK_EPOCH;
352     rx_epoch = epoch;
353     UNLOCK_EPOCH;
354 }
355
356 /* Initialize rx.  A port number may be mentioned, in which case this
357  * becomes the default port number for any service installed later.
358  * If 0 is provided for the port number, a random port will be chosen
359  * by the kernel.  Whether this will ever overlap anything in
360  * /etc/services is anybody's guess...  Returns 0 on success, -1 on
361  * error. */
362 static int rxinit_status = 1;
363 #ifdef AFS_PTHREAD_ENV
364 /*
365  * This mutex protects the following global variables:
366  * rxinit_status
367  */
368
369 #define LOCK_RX_INIT assert(pthread_mutex_lock(&rx_init_mutex)==0)
370 #define UNLOCK_RX_INIT assert(pthread_mutex_unlock(&rx_init_mutex)==0)
371 #else
372 #define LOCK_RX_INIT
373 #define UNLOCK_RX_INIT
374 #endif
375
376 int
377 rx_InitHost(u_int host, u_int port)
378 {
379 #ifdef KERNEL
380     osi_timeval_t tv;
381 #else /* KERNEL */
382     struct timeval tv;
383 #endif /* KERNEL */
384     char *htable, *ptable;
385     int tmp_status;
386
387 #if defined(AFS_DJGPP_ENV) && !defined(DEBUG)
388     __djgpp_set_quiet_socket(1);
389 #endif
390
391     SPLVAR;
392
393     INIT_PTHREAD_LOCKS;
394     LOCK_RX_INIT;
395     if (rxinit_status == 0) {
396         tmp_status = rxinit_status;
397         UNLOCK_RX_INIT;
398         return tmp_status;      /* Already started; return previous error code. */
399     }
400 #ifdef AFS_NT40_ENV
401     if (afs_winsockInit() < 0)
402         return -1;
403 #endif
404
405 #ifndef KERNEL
406     /*
407      * Initialize anything necessary to provide a non-premptive threading
408      * environment.
409      */
410     rxi_InitializeThreadSupport();
411 #endif
412
413     /* Allocate and initialize a socket for client and perhaps server
414      * connections. */
415
416     rx_socket = rxi_GetHostUDPSocket(host, (u_short) port);
417     if (rx_socket == OSI_NULLSOCKET) {
418         UNLOCK_RX_INIT;
419         return RX_ADDRINUSE;
420     }
421 #ifdef  RX_ENABLE_LOCKS
422 #ifdef RX_LOCKS_DB
423     rxdb_init();
424 #endif /* RX_LOCKS_DB */
425     MUTEX_INIT(&rx_stats_mutex, "rx_stats_mutex", MUTEX_DEFAULT, 0);
426     MUTEX_INIT(&rx_rpc_stats, "rx_rpc_stats", MUTEX_DEFAULT, 0);
427     MUTEX_INIT(&rx_freePktQ_lock, "rx_freePktQ_lock", MUTEX_DEFAULT, 0);
428     MUTEX_INIT(&freeSQEList_lock, "freeSQEList lock", MUTEX_DEFAULT, 0);
429     MUTEX_INIT(&rx_freeCallQueue_lock, "rx_freeCallQueue_lock", MUTEX_DEFAULT,
430                0);
431     CV_INIT(&rx_waitingForPackets_cv, "rx_waitingForPackets_cv", CV_DEFAULT,
432             0);
433     MUTEX_INIT(&rx_peerHashTable_lock, "rx_peerHashTable_lock", MUTEX_DEFAULT,
434                0);
435     MUTEX_INIT(&rx_connHashTable_lock, "rx_connHashTable_lock", MUTEX_DEFAULT,
436                0);
437     MUTEX_INIT(&rx_serverPool_lock, "rx_serverPool_lock", MUTEX_DEFAULT, 0);
438 #ifndef KERNEL
439     MUTEX_INIT(&rxi_keyCreate_lock, "rxi_keyCreate_lock", MUTEX_DEFAULT, 0);
440 #endif /* !KERNEL */
441 #if defined(KERNEL) && defined(AFS_HPUX110_ENV)
442     if (!uniprocessor)
443         rx_sleepLock = alloc_spinlock(LAST_HELD_ORDER - 10, "rx_sleepLock");
444 #endif /* KERNEL && AFS_HPUX110_ENV */
445 #else /* RX_ENABLE_LOCKS */
446 #if defined(KERNEL) && defined(AFS_GLOBAL_SUNLOCK) && !defined(AFS_HPUX_ENV) && !defined(AFS_OBSD_ENV)
447     mutex_init(&afs_rxglobal_lock, "afs_rxglobal_lock", MUTEX_DEFAULT, NULL);
448 #endif /* AFS_GLOBAL_SUNLOCK */
449 #endif /* RX_ENABLE_LOCKS */
450
451     rxi_nCalls = 0;
452     rx_connDeadTime = 12;
453     rx_tranquil = 0;            /* reset flag */
454     memset((char *)&rx_stats, 0, sizeof(struct rx_stats));
455     htable = (char *)
456         osi_Alloc(rx_hashTableSize * sizeof(struct rx_connection *));
457     PIN(htable, rx_hashTableSize * sizeof(struct rx_connection *));     /* XXXXX */
458     memset(htable, 0, rx_hashTableSize * sizeof(struct rx_connection *));
459     ptable = (char *)osi_Alloc(rx_hashTableSize * sizeof(struct rx_peer *));
460     PIN(ptable, rx_hashTableSize * sizeof(struct rx_peer *));   /* XXXXX */
461     memset(ptable, 0, rx_hashTableSize * sizeof(struct rx_peer *));
462
463     /* Malloc up a bunch of packets & buffers */
464     rx_nFreePackets = 0;
465     queue_Init(&rx_freePacketQueue);
466     rxi_NeedMorePackets = FALSE;
467 #ifdef RX_ENABLE_TSFPQ
468     rx_nPackets = 0;    /* in TSFPQ version, rx_nPackets is managed by rxi_MorePackets* */
469     rxi_MorePacketsTSFPQ(rx_extraPackets + RX_MAX_QUOTA + 2, RX_TS_FPQ_FLUSH_GLOBAL, 0);
470 #else /* RX_ENABLE_TSFPQ */
471     rx_nPackets = rx_extraPackets + RX_MAX_QUOTA + 2;   /* fudge */
472     rxi_MorePackets(rx_nPackets);
473 #endif /* RX_ENABLE_TSFPQ */
474     rx_CheckPackets();
475
476     NETPRI;
477
478     clock_Init();
479
480 #if defined(AFS_NT40_ENV) && !defined(AFS_PTHREAD_ENV)
481     tv.tv_sec = clock_now.sec;
482     tv.tv_usec = clock_now.usec;
483     srand((unsigned int)tv.tv_usec);
484 #else
485     osi_GetTime(&tv);
486 #endif
487     if (port) {
488         rx_port = port;
489     } else {
490 #if defined(KERNEL) && !defined(UKERNEL)
491         /* Really, this should never happen in a real kernel */
492         rx_port = 0;
493 #else
494         struct sockaddr_in addr;
495         int addrlen = sizeof(addr);
496         if (getsockname((int)rx_socket, (struct sockaddr *)&addr, &addrlen)) {
497             rx_Finalize();
498             return -1;
499         }
500         rx_port = addr.sin_port;
501 #endif
502     }
503     rx_stats.minRtt.sec = 9999999;
504 #ifdef  KERNEL
505     rx_SetEpoch(tv.tv_sec | 0x80000000);
506 #else
507     rx_SetEpoch(tv.tv_sec);     /* Start time of this package, rxkad
508                                  * will provide a randomer value. */
509 #endif
510     MUTEX_ENTER(&rx_stats_mutex);
511     rxi_dataQuota += rx_extraQuota;     /* + extra pkts caller asked to rsrv */
512     MUTEX_EXIT(&rx_stats_mutex);
513     /* *Slightly* random start time for the cid.  This is just to help
514      * out with the hashing function at the peer */
515     rx_nextCid = ((tv.tv_sec ^ tv.tv_usec) << RX_CIDSHIFT);
516     rx_connHashTable = (struct rx_connection **)htable;
517     rx_peerHashTable = (struct rx_peer **)ptable;
518
519     rx_lastAckDelay.sec = 0;
520     rx_lastAckDelay.usec = 400000;      /* 400 milliseconds */
521     rx_hardAckDelay.sec = 0;
522     rx_hardAckDelay.usec = 100000;      /* 100 milliseconds */
523     rx_softAckDelay.sec = 0;
524     rx_softAckDelay.usec = 100000;      /* 100 milliseconds */
525
526     rxevent_Init(20, rxi_ReScheduleEvents);
527
528     /* Initialize various global queues */
529     queue_Init(&rx_idleServerQueue);
530     queue_Init(&rx_incomingCallQueue);
531     queue_Init(&rx_freeCallQueue);
532
533 #if defined(AFS_NT40_ENV) && !defined(KERNEL)
534     /* Initialize our list of usable IP addresses. */
535     rx_GetIFInfo();
536 #endif
537
538     /* Start listener process (exact function is dependent on the
539      * implementation environment--kernel or user space) */
540     rxi_StartListener();
541
542     USERPRI;
543     tmp_status = rxinit_status = 0;
544     UNLOCK_RX_INIT;
545     return tmp_status;
546 }
547
548 int
549 rx_Init(u_int port)
550 {
551     return rx_InitHost(htonl(INADDR_ANY), port);
552 }
553
554 /* called with unincremented nRequestsRunning to see if it is OK to start
555  * a new thread in this service.  Could be "no" for two reasons: over the
556  * max quota, or would prevent others from reaching their min quota.
557  */
558 #ifdef RX_ENABLE_LOCKS
559 /* This verion of QuotaOK reserves quota if it's ok while the
560  * rx_serverPool_lock is held.  Return quota using ReturnToServerPool().
561  */
562 static int
563 QuotaOK(register struct rx_service *aservice)
564 {
565     /* check if over max quota */
566     if (aservice->nRequestsRunning >= aservice->maxProcs) {
567         return 0;
568     }
569
570     /* under min quota, we're OK */
571     /* otherwise, can use only if there are enough to allow everyone
572      * to go to their min quota after this guy starts.
573      */
574     MUTEX_ENTER(&rx_stats_mutex);
575     if ((aservice->nRequestsRunning < aservice->minProcs)
576         || (rxi_availProcs > rxi_minDeficit)) {
577         aservice->nRequestsRunning++;
578         /* just started call in minProcs pool, need fewer to maintain
579          * guarantee */
580         if (aservice->nRequestsRunning <= aservice->minProcs)
581             rxi_minDeficit--;
582         rxi_availProcs--;
583         MUTEX_EXIT(&rx_stats_mutex);
584         return 1;
585     }
586     MUTEX_EXIT(&rx_stats_mutex);
587
588     return 0;
589 }
590
591 static void
592 ReturnToServerPool(register struct rx_service *aservice)
593 {
594     aservice->nRequestsRunning--;
595     MUTEX_ENTER(&rx_stats_mutex);
596     if (aservice->nRequestsRunning < aservice->minProcs)
597         rxi_minDeficit++;
598     rxi_availProcs++;
599     MUTEX_EXIT(&rx_stats_mutex);
600 }
601
602 #else /* RX_ENABLE_LOCKS */
603 static int
604 QuotaOK(register struct rx_service *aservice)
605 {
606     int rc = 0;
607     /* under min quota, we're OK */
608     if (aservice->nRequestsRunning < aservice->minProcs)
609         return 1;
610
611     /* check if over max quota */
612     if (aservice->nRequestsRunning >= aservice->maxProcs)
613         return 0;
614
615     /* otherwise, can use only if there are enough to allow everyone
616      * to go to their min quota after this guy starts.
617      */
618     if (rxi_availProcs > rxi_minDeficit)
619         rc = 1;
620     return rc;
621 }
622 #endif /* RX_ENABLE_LOCKS */
623
624 #ifndef KERNEL
625 /* Called by rx_StartServer to start up lwp's to service calls.
626    NExistingProcs gives the number of procs already existing, and which
627    therefore needn't be created. */
628 void
629 rxi_StartServerProcs(int nExistingProcs)
630 {
631     register struct rx_service *service;
632     register int i;
633     int maxdiff = 0;
634     int nProcs = 0;
635
636     /* For each service, reserve N processes, where N is the "minimum"
637      * number of processes that MUST be able to execute a request in parallel,
638      * at any time, for that process.  Also compute the maximum difference
639      * between any service's maximum number of processes that can run
640      * (i.e. the maximum number that ever will be run, and a guarantee
641      * that this number will run if other services aren't running), and its
642      * minimum number.  The result is the extra number of processes that
643      * we need in order to provide the latter guarantee */
644     for (i = 0; i < RX_MAX_SERVICES; i++) {
645         int diff;
646         service = rx_services[i];
647         if (service == (struct rx_service *)0)
648             break;
649         nProcs += service->minProcs;
650         diff = service->maxProcs - service->minProcs;
651         if (diff > maxdiff)
652             maxdiff = diff;
653     }
654     nProcs += maxdiff;          /* Extra processes needed to allow max number requested to run in any given service, under good conditions */
655     nProcs -= nExistingProcs;   /* Subtract the number of procs that were previously created for use as server procs */
656     for (i = 0; i < nProcs; i++) {
657         rxi_StartServerProc(rx_ServerProc, rx_stackSize);
658     }
659 }
660 #endif /* KERNEL */
661
662 #ifdef AFS_NT40_ENV
663 /* This routine is only required on Windows */
664 void
665 rx_StartClientThread(void)
666 {
667 #ifdef AFS_PTHREAD_ENV
668     int pid;
669     pid = (int) pthread_self();
670 #endif /* AFS_PTHREAD_ENV */
671 }
672 #endif /* AFS_NT40_ENV */
673
674 /* This routine must be called if any services are exported.  If the
675  * donateMe flag is set, the calling process is donated to the server
676  * process pool */
677 void
678 rx_StartServer(int donateMe)
679 {
680     register struct rx_service *service;
681     register int i;
682     SPLVAR;
683     clock_NewTime();
684
685     NETPRI;
686     /* Start server processes, if necessary (exact function is dependent
687      * on the implementation environment--kernel or user space).  DonateMe
688      * will be 1 if there is 1 pre-existing proc, i.e. this one.  In this
689      * case, one less new proc will be created rx_StartServerProcs.
690      */
691     rxi_StartServerProcs(donateMe);
692
693     /* count up the # of threads in minProcs, and add set the min deficit to
694      * be that value, too.
695      */
696     for (i = 0; i < RX_MAX_SERVICES; i++) {
697         service = rx_services[i];
698         if (service == (struct rx_service *)0)
699             break;
700         MUTEX_ENTER(&rx_stats_mutex);
701         rxi_totalMin += service->minProcs;
702         /* below works even if a thread is running, since minDeficit would
703          * still have been decremented and later re-incremented.
704          */
705         rxi_minDeficit += service->minProcs;
706         MUTEX_EXIT(&rx_stats_mutex);
707     }
708
709     /* Turn on reaping of idle server connections */
710     rxi_ReapConnections();
711
712     USERPRI;
713
714     if (donateMe) {
715 #ifndef AFS_NT40_ENV
716 #ifndef KERNEL
717         char name[32];
718         static int nProcs;
719 #ifdef AFS_PTHREAD_ENV
720         pid_t pid;
721         pid = (pid_t) pthread_self();
722 #else /* AFS_PTHREAD_ENV */
723         PROCESS pid;
724         LWP_CurrentProcess(&pid);
725 #endif /* AFS_PTHREAD_ENV */
726
727         sprintf(name, "srv_%d", ++nProcs);
728         if (registerProgram)
729             (*registerProgram) (pid, name);
730 #endif /* KERNEL */
731 #endif /* AFS_NT40_ENV */
732         rx_ServerProc();        /* Never returns */
733     }
734 #ifdef RX_ENABLE_TSFPQ
735     /* no use leaving packets around in this thread's local queue if
736      * it isn't getting donated to the server thread pool. 
737      */
738     rxi_FlushLocalPacketsTSFPQ();
739 #endif /* RX_ENABLE_TSFPQ */
740     return;
741 }
742
743 /* Create a new client connection to the specified service, using the
744  * specified security object to implement the security model for this
745  * connection. */
746 struct rx_connection *
747 rx_NewConnection(register afs_uint32 shost, u_short sport, u_short sservice,
748                  register struct rx_securityClass *securityObject,
749                  int serviceSecurityIndex)
750 {
751     int hashindex;
752     afs_int32 cid;
753     register struct rx_connection *conn;
754
755     SPLVAR;
756
757     clock_NewTime();
758     dpf(("rx_NewConnection(host %x, port %u, service %u, securityObject %x, serviceSecurityIndex %d)\n", shost, sport, sservice, securityObject, serviceSecurityIndex));
759
760     /* Vasilsi said: "NETPRI protects Cid and Alloc", but can this be true in
761      * the case of kmem_alloc? */
762     conn = rxi_AllocConnection();
763 #ifdef  RX_ENABLE_LOCKS
764     MUTEX_INIT(&conn->conn_call_lock, "conn call lock", MUTEX_DEFAULT, 0);
765     MUTEX_INIT(&conn->conn_data_lock, "conn call lock", MUTEX_DEFAULT, 0);
766     CV_INIT(&conn->conn_call_cv, "conn call cv", CV_DEFAULT, 0);
767 #endif
768     NETPRI;
769     MUTEX_ENTER(&rx_connHashTable_lock);
770     cid = (rx_nextCid += RX_MAXCALLS);
771     conn->type = RX_CLIENT_CONNECTION;
772     conn->cid = cid;
773     conn->epoch = rx_epoch;
774     conn->peer = rxi_FindPeer(shost, sport, 0, 1);
775     conn->serviceId = sservice;
776     conn->securityObject = securityObject;
777     /* This doesn't work in all compilers with void (they're buggy), so fake it
778      * with VOID */
779     conn->securityData = (VOID *) 0;
780     conn->securityIndex = serviceSecurityIndex;
781     rx_SetConnDeadTime(conn, rx_connDeadTime);
782     conn->ackRate = RX_FAST_ACK_RATE;
783     conn->nSpecific = 0;
784     conn->specific = NULL;
785     conn->challengeEvent = NULL;
786     conn->delayedAbortEvent = NULL;
787     conn->abortCount = 0;
788     conn->error = 0;
789
790     RXS_NewConnection(securityObject, conn);
791     hashindex =
792         CONN_HASH(shost, sport, conn->cid, conn->epoch, RX_CLIENT_CONNECTION);
793
794     conn->refCount++;           /* no lock required since only this thread knows... */
795     conn->next = rx_connHashTable[hashindex];
796     rx_connHashTable[hashindex] = conn;
797     MUTEX_ENTER(&rx_stats_mutex);
798     rx_stats.nClientConns++;
799     MUTEX_EXIT(&rx_stats_mutex);
800
801     MUTEX_EXIT(&rx_connHashTable_lock);
802     USERPRI;
803     return conn;
804 }
805
806 void
807 rx_SetConnDeadTime(register struct rx_connection *conn, register int seconds)
808 {
809     /* The idea is to set the dead time to a value that allows several
810      * keepalives to be dropped without timing out the connection. */
811     conn->secondsUntilDead = MAX(seconds, 6);
812     conn->secondsUntilPing = conn->secondsUntilDead / 6;
813 }
814
815 int rxi_lowPeerRefCount = 0;
816 int rxi_lowConnRefCount = 0;
817
818 /*
819  * Cleanup a connection that was destroyed in rxi_DestroyConnectioNoLock.
820  * NOTE: must not be called with rx_connHashTable_lock held.
821  */
822 void
823 rxi_CleanupConnection(struct rx_connection *conn)
824 {
825     /* Notify the service exporter, if requested, that this connection
826      * is being destroyed */
827     if (conn->type == RX_SERVER_CONNECTION && conn->service->destroyConnProc)
828         (*conn->service->destroyConnProc) (conn);
829
830     /* Notify the security module that this connection is being destroyed */
831     RXS_DestroyConnection(conn->securityObject, conn);
832
833     /* If this is the last connection using the rx_peer struct, set its
834      * idle time to now. rxi_ReapConnections will reap it if it's still
835      * idle (refCount == 0) after rx_idlePeerTime (60 seconds) have passed.
836      */
837     MUTEX_ENTER(&rx_peerHashTable_lock);
838     if (conn->peer->refCount < 2) {
839         conn->peer->idleWhen = clock_Sec();
840         if (conn->peer->refCount < 1) {
841             conn->peer->refCount = 1;
842             MUTEX_ENTER(&rx_stats_mutex);
843             rxi_lowPeerRefCount++;
844             MUTEX_EXIT(&rx_stats_mutex);
845         }
846     }
847     conn->peer->refCount--;
848     MUTEX_EXIT(&rx_peerHashTable_lock);
849
850     MUTEX_ENTER(&rx_stats_mutex);
851     if (conn->type == RX_SERVER_CONNECTION)
852         rx_stats.nServerConns--;
853     else
854         rx_stats.nClientConns--;
855     MUTEX_EXIT(&rx_stats_mutex);
856
857 #ifndef KERNEL
858     if (conn->specific) {
859         int i;
860         for (i = 0; i < conn->nSpecific; i++) {
861             if (conn->specific[i] && rxi_keyCreate_destructor[i])
862                 (*rxi_keyCreate_destructor[i]) (conn->specific[i]);
863             conn->specific[i] = NULL;
864         }
865         free(conn->specific);
866     }
867     conn->specific = NULL;
868     conn->nSpecific = 0;
869 #endif /* !KERNEL */
870
871     MUTEX_DESTROY(&conn->conn_call_lock);
872     MUTEX_DESTROY(&conn->conn_data_lock);
873     CV_DESTROY(&conn->conn_call_cv);
874
875     rxi_FreeConnection(conn);
876 }
877
878 /* Destroy the specified connection */
879 void
880 rxi_DestroyConnection(register struct rx_connection *conn)
881 {
882     MUTEX_ENTER(&rx_connHashTable_lock);
883     rxi_DestroyConnectionNoLock(conn);
884     /* conn should be at the head of the cleanup list */
885     if (conn == rx_connCleanup_list) {
886         rx_connCleanup_list = rx_connCleanup_list->next;
887         MUTEX_EXIT(&rx_connHashTable_lock);
888         rxi_CleanupConnection(conn);
889     }
890 #ifdef RX_ENABLE_LOCKS
891     else {
892         MUTEX_EXIT(&rx_connHashTable_lock);
893     }
894 #endif /* RX_ENABLE_LOCKS */
895 }
896
897 static void
898 rxi_DestroyConnectionNoLock(register struct rx_connection *conn)
899 {
900     register struct rx_connection **conn_ptr;
901     register int havecalls = 0;
902     struct rx_packet *packet;
903     int i;
904     SPLVAR;
905
906     clock_NewTime();
907
908     NETPRI;
909     MUTEX_ENTER(&conn->conn_data_lock);
910     if (conn->refCount > 0)
911         conn->refCount--;
912     else {
913         MUTEX_ENTER(&rx_stats_mutex);
914         rxi_lowConnRefCount++;
915         MUTEX_EXIT(&rx_stats_mutex);
916     }
917
918     if ((conn->refCount > 0) || (conn->flags & RX_CONN_BUSY)) {
919         /* Busy; wait till the last guy before proceeding */
920         MUTEX_EXIT(&conn->conn_data_lock);
921         USERPRI;
922         return;
923     }
924
925     /* If the client previously called rx_NewCall, but it is still
926      * waiting, treat this as a running call, and wait to destroy the
927      * connection later when the call completes. */
928     if ((conn->type == RX_CLIENT_CONNECTION)
929         && (conn->flags & RX_CONN_MAKECALL_WAITING)) {
930         conn->flags |= RX_CONN_DESTROY_ME;
931         MUTEX_EXIT(&conn->conn_data_lock);
932         USERPRI;
933         return;
934     }
935     MUTEX_EXIT(&conn->conn_data_lock);
936
937     /* Check for extant references to this connection */
938     for (i = 0; i < RX_MAXCALLS; i++) {
939         register struct rx_call *call = conn->call[i];
940         if (call) {
941             havecalls = 1;
942             if (conn->type == RX_CLIENT_CONNECTION) {
943                 MUTEX_ENTER(&call->lock);
944                 if (call->delayedAckEvent) {
945                     /* Push the final acknowledgment out now--there
946                      * won't be a subsequent call to acknowledge the
947                      * last reply packets */
948                     rxevent_Cancel(call->delayedAckEvent, call,
949                                    RX_CALL_REFCOUNT_DELAY);
950                     if (call->state == RX_STATE_PRECALL
951                         || call->state == RX_STATE_ACTIVE) {
952                         rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
953                     } else {
954                         rxi_AckAll(NULL, call, 0);
955                     }
956                 }
957                 MUTEX_EXIT(&call->lock);
958             }
959         }
960     }
961 #ifdef RX_ENABLE_LOCKS
962     if (!havecalls) {
963         if (MUTEX_TRYENTER(&conn->conn_data_lock)) {
964             MUTEX_EXIT(&conn->conn_data_lock);
965         } else {
966             /* Someone is accessing a packet right now. */
967             havecalls = 1;
968         }
969     }
970 #endif /* RX_ENABLE_LOCKS */
971
972     if (havecalls) {
973         /* Don't destroy the connection if there are any call
974          * structures still in use */
975         MUTEX_ENTER(&conn->conn_data_lock);
976         conn->flags |= RX_CONN_DESTROY_ME;
977         MUTEX_EXIT(&conn->conn_data_lock);
978         USERPRI;
979         return;
980     }
981
982     if (conn->delayedAbortEvent) {
983         rxevent_Cancel(conn->delayedAbortEvent, (struct rx_call *)0, 0);
984         packet = rxi_AllocPacket(RX_PACKET_CLASS_SPECIAL);
985         if (packet) {
986             MUTEX_ENTER(&conn->conn_data_lock);
987             rxi_SendConnectionAbort(conn, packet, 0, 1);
988             MUTEX_EXIT(&conn->conn_data_lock);
989             rxi_FreePacket(packet);
990         }
991     }
992
993     /* Remove from connection hash table before proceeding */
994     conn_ptr =
995         &rx_connHashTable[CONN_HASH
996                           (peer->host, peer->port, conn->cid, conn->epoch,
997                            conn->type)];
998     for (; *conn_ptr; conn_ptr = &(*conn_ptr)->next) {
999         if (*conn_ptr == conn) {
1000             *conn_ptr = conn->next;
1001             break;
1002         }
1003     }
1004     /* if the conn that we are destroying was the last connection, then we
1005      * clear rxLastConn as well */
1006     if (rxLastConn == conn)
1007         rxLastConn = 0;
1008
1009     /* Make sure the connection is completely reset before deleting it. */
1010     /* get rid of pending events that could zap us later */
1011     if (conn->challengeEvent)
1012         rxevent_Cancel(conn->challengeEvent, (struct rx_call *)0, 0);
1013     if (conn->checkReachEvent)
1014         rxevent_Cancel(conn->checkReachEvent, (struct rx_call *)0, 0);
1015
1016     /* Add the connection to the list of destroyed connections that
1017      * need to be cleaned up. This is necessary to avoid deadlocks
1018      * in the routines we call to inform others that this connection is
1019      * being destroyed. */
1020     conn->next = rx_connCleanup_list;
1021     rx_connCleanup_list = conn;
1022 }
1023
1024 /* Externally available version */
1025 void
1026 rx_DestroyConnection(register struct rx_connection *conn)
1027 {
1028     SPLVAR;
1029
1030     NETPRI;
1031     rxi_DestroyConnection(conn);
1032     USERPRI;
1033 }
1034
1035 void
1036 rx_GetConnection(register struct rx_connection *conn)
1037 {
1038     SPLVAR;
1039
1040     NETPRI;
1041     MUTEX_ENTER(&conn->conn_data_lock);
1042     conn->refCount++;
1043     MUTEX_EXIT(&conn->conn_data_lock);
1044     USERPRI;
1045 }
1046
1047 /* Start a new rx remote procedure call, on the specified connection.
1048  * If wait is set to 1, wait for a free call channel; otherwise return
1049  * 0.  Maxtime gives the maximum number of seconds this call may take,
1050  * after rx_MakeCall returns.  After this time interval, a call to any
1051  * of rx_SendData, rx_ReadData, etc. will fail with RX_CALL_TIMEOUT.
1052  * For fine grain locking, we hold the conn_call_lock in order to 
1053  * to ensure that we don't get signalle after we found a call in an active
1054  * state and before we go to sleep.
1055  */
1056 struct rx_call *
1057 rx_NewCall(register struct rx_connection *conn)
1058 {
1059     register int i;
1060     register struct rx_call *call;
1061     struct clock queueTime;
1062     SPLVAR;
1063
1064     clock_NewTime();
1065     dpf(("rx_MakeCall(conn %x)\n", conn));
1066
1067     NETPRI;
1068     clock_GetTime(&queueTime);
1069     MUTEX_ENTER(&conn->conn_call_lock);
1070
1071     /*
1072      * Check if there are others waiting for a new call.
1073      * If so, let them go first to avoid starving them.
1074      * This is a fairly simple scheme, and might not be
1075      * a complete solution for large numbers of waiters.
1076      * 
1077      * makeCallWaiters keeps track of the number of 
1078      * threads waiting to make calls and the 
1079      * RX_CONN_MAKECALL_WAITING flag bit is used to 
1080      * indicate that there are indeed calls waiting.
1081      * The flag is set when the waiter is incremented.
1082      * It is only cleared in rx_EndCall when 
1083      * makeCallWaiters is 0.  This prevents us from 
1084      * accidently destroying the connection while it
1085      * is potentially about to be used.
1086      */
1087     MUTEX_ENTER(&conn->conn_data_lock);
1088     if (conn->makeCallWaiters) {
1089         conn->flags |= RX_CONN_MAKECALL_WAITING;
1090         conn->makeCallWaiters++;
1091         MUTEX_EXIT(&conn->conn_data_lock);
1092
1093 #ifdef  RX_ENABLE_LOCKS
1094         CV_WAIT(&conn->conn_call_cv, &conn->conn_call_lock);
1095 #else
1096         osi_rxSleep(conn);
1097 #endif
1098         MUTEX_ENTER(&conn->conn_data_lock);
1099         conn->makeCallWaiters--;
1100     } 
1101     MUTEX_EXIT(&conn->conn_data_lock);
1102
1103     for (;;) {
1104         for (i = 0; i < RX_MAXCALLS; i++) {
1105             call = conn->call[i];
1106             if (call) {
1107                 MUTEX_ENTER(&call->lock);
1108                 if (call->state == RX_STATE_DALLY) {
1109                     rxi_ResetCall(call, 0);
1110                     (*call->callNumber)++;
1111                     break;
1112                 }
1113                 MUTEX_EXIT(&call->lock);
1114             } else {
1115                 call = rxi_NewCall(conn, i);
1116                 break;
1117             }
1118         }
1119         if (i < RX_MAXCALLS) {
1120             break;
1121         }
1122         MUTEX_ENTER(&conn->conn_data_lock);
1123         conn->flags |= RX_CONN_MAKECALL_WAITING;
1124         conn->makeCallWaiters++;
1125         MUTEX_EXIT(&conn->conn_data_lock);
1126
1127 #ifdef  RX_ENABLE_LOCKS
1128         CV_WAIT(&conn->conn_call_cv, &conn->conn_call_lock);
1129 #else
1130         osi_rxSleep(conn);
1131 #endif
1132         MUTEX_ENTER(&conn->conn_data_lock);
1133         conn->makeCallWaiters--;
1134         MUTEX_EXIT(&conn->conn_data_lock);
1135     }
1136     /*
1137      * Wake up anyone else who might be giving us a chance to
1138      * run (see code above that avoids resource starvation).
1139      */
1140 #ifdef  RX_ENABLE_LOCKS
1141     CV_BROADCAST(&conn->conn_call_cv);
1142 #else
1143     osi_rxWakeup(conn);
1144 #endif
1145
1146     CALL_HOLD(call, RX_CALL_REFCOUNT_BEGIN);
1147
1148     /* Client is initially in send mode */
1149     call->state = RX_STATE_ACTIVE;
1150     call->mode = RX_MODE_SENDING;
1151
1152     /* remember start time for call in case we have hard dead time limit */
1153     call->queueTime = queueTime;
1154     clock_GetTime(&call->startTime);
1155     hzero(call->bytesSent);
1156     hzero(call->bytesRcvd);
1157
1158     /* Turn on busy protocol. */
1159     rxi_KeepAliveOn(call);
1160
1161     MUTEX_EXIT(&call->lock);
1162     MUTEX_EXIT(&conn->conn_call_lock);
1163     USERPRI;
1164
1165 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
1166     /* Now, if TQ wasn't cleared earlier, do it now. */
1167     MUTEX_ENTER(&call->lock);
1168     while (call->flags & RX_CALL_TQ_BUSY) {
1169         call->flags |= RX_CALL_TQ_WAIT;
1170 #ifdef RX_ENABLE_LOCKS
1171         CV_WAIT(&call->cv_tq, &call->lock);
1172 #else /* RX_ENABLE_LOCKS */
1173         osi_rxSleep(&call->tq);
1174 #endif /* RX_ENABLE_LOCKS */
1175     }
1176     if (call->flags & RX_CALL_TQ_CLEARME) {
1177         rxi_ClearTransmitQueue(call, 0);
1178         queue_Init(&call->tq);
1179     }
1180     MUTEX_EXIT(&call->lock);
1181 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
1182
1183     return call;
1184 }
1185
1186 int
1187 rxi_HasActiveCalls(register struct rx_connection *aconn)
1188 {
1189     register int i;
1190     register struct rx_call *tcall;
1191     SPLVAR;
1192
1193     NETPRI;
1194     for (i = 0; i < RX_MAXCALLS; i++) {
1195         if ((tcall = aconn->call[i])) {
1196             if ((tcall->state == RX_STATE_ACTIVE)
1197                 || (tcall->state == RX_STATE_PRECALL)) {
1198                 USERPRI;
1199                 return 1;
1200             }
1201         }
1202     }
1203     USERPRI;
1204     return 0;
1205 }
1206
1207 int
1208 rxi_GetCallNumberVector(register struct rx_connection *aconn,
1209                         register afs_int32 * aint32s)
1210 {
1211     register int i;
1212     register struct rx_call *tcall;
1213     SPLVAR;
1214
1215     NETPRI;
1216     for (i = 0; i < RX_MAXCALLS; i++) {
1217         if ((tcall = aconn->call[i]) && (tcall->state == RX_STATE_DALLY))
1218             aint32s[i] = aconn->callNumber[i] + 1;
1219         else
1220             aint32s[i] = aconn->callNumber[i];
1221     }
1222     USERPRI;
1223     return 0;
1224 }
1225
1226 int
1227 rxi_SetCallNumberVector(register struct rx_connection *aconn,
1228                         register afs_int32 * aint32s)
1229 {
1230     register int i;
1231     register struct rx_call *tcall;
1232     SPLVAR;
1233
1234     NETPRI;
1235     for (i = 0; i < RX_MAXCALLS; i++) {
1236         if ((tcall = aconn->call[i]) && (tcall->state == RX_STATE_DALLY))
1237             aconn->callNumber[i] = aint32s[i] - 1;
1238         else
1239             aconn->callNumber[i] = aint32s[i];
1240     }
1241     USERPRI;
1242     return 0;
1243 }
1244
1245 /* Advertise a new service.  A service is named locally by a UDP port
1246  * number plus a 16-bit service id.  Returns (struct rx_service *) 0
1247  * on a failure. 
1248  *
1249      char *serviceName;  Name for identification purposes (e.g. the
1250                          service name might be used for probing for
1251                          statistics) */
1252 struct rx_service *
1253 rx_NewService(u_short port, u_short serviceId, char *serviceName,
1254               struct rx_securityClass **securityObjects, int nSecurityObjects,
1255               afs_int32(*serviceProc) (struct rx_call * acall))
1256 {
1257     osi_socket socket = OSI_NULLSOCKET;
1258     register struct rx_service *tservice;
1259     register int i;
1260     SPLVAR;
1261
1262     clock_NewTime();
1263
1264     if (serviceId == 0) {
1265         (osi_Msg
1266          "rx_NewService:  service id for service %s is not non-zero.\n",
1267          serviceName);
1268         return 0;
1269     }
1270     if (port == 0) {
1271         if (rx_port == 0) {
1272             (osi_Msg
1273              "rx_NewService: A non-zero port must be specified on this call if a non-zero port was not provided at Rx initialization (service %s).\n",
1274              serviceName);
1275             return 0;
1276         }
1277         port = rx_port;
1278         socket = rx_socket;
1279     }
1280
1281     tservice = rxi_AllocService();
1282     NETPRI;
1283     for (i = 0; i < RX_MAX_SERVICES; i++) {
1284         register struct rx_service *service = rx_services[i];
1285         if (service) {
1286             if (port == service->servicePort) {
1287                 if (service->serviceId == serviceId) {
1288                     /* The identical service has already been
1289                      * installed; if the caller was intending to
1290                      * change the security classes used by this
1291                      * service, he/she loses. */
1292                     (osi_Msg
1293                      "rx_NewService: tried to install service %s with service id %d, which is already in use for service %s\n",
1294                      serviceName, serviceId, service->serviceName);
1295                     USERPRI;
1296                     rxi_FreeService(tservice);
1297                     return service;
1298                 }
1299                 /* Different service, same port: re-use the socket
1300                  * which is bound to the same port */
1301                 socket = service->socket;
1302             }
1303         } else {
1304             if (socket == OSI_NULLSOCKET) {
1305                 /* If we don't already have a socket (from another
1306                  * service on same port) get a new one */
1307                 socket = rxi_GetHostUDPSocket(htonl(INADDR_ANY), port);
1308                 if (socket == OSI_NULLSOCKET) {
1309                     USERPRI;
1310                     rxi_FreeService(tservice);
1311                     return 0;
1312                 }
1313             }
1314             service = tservice;
1315             service->socket = socket;
1316             service->servicePort = port;
1317             service->serviceId = serviceId;
1318             service->serviceName = serviceName;
1319             service->nSecurityObjects = nSecurityObjects;
1320             service->securityObjects = securityObjects;
1321             service->minProcs = 0;
1322             service->maxProcs = 1;
1323             service->idleDeadTime = 60;
1324             service->connDeadTime = rx_connDeadTime;
1325             service->executeRequestProc = serviceProc;
1326             service->checkReach = 0;
1327             rx_services[i] = service;   /* not visible until now */
1328             USERPRI;
1329             return service;
1330         }
1331     }
1332     USERPRI;
1333     rxi_FreeService(tservice);
1334     (osi_Msg "rx_NewService: cannot support > %d services\n",
1335      RX_MAX_SERVICES);
1336     return 0;
1337 }
1338
1339 /* Generic request processing loop. This routine should be called
1340  * by the implementation dependent rx_ServerProc. If socketp is
1341  * non-null, it will be set to the file descriptor that this thread
1342  * is now listening on. If socketp is null, this routine will never
1343  * returns. */
1344 void
1345 rxi_ServerProc(int threadID, struct rx_call *newcall, osi_socket * socketp)
1346 {
1347     register struct rx_call *call;
1348     register afs_int32 code;
1349     register struct rx_service *tservice = NULL;
1350
1351     for (;;) {
1352         if (newcall) {
1353             call = newcall;
1354             newcall = NULL;
1355         } else {
1356             call = rx_GetCall(threadID, tservice, socketp);
1357             if (socketp && *socketp != OSI_NULLSOCKET) {
1358                 /* We are now a listener thread */
1359                 return;
1360             }
1361         }
1362
1363         /* if server is restarting( typically smooth shutdown) then do not
1364          * allow any new calls.
1365          */
1366
1367         if (rx_tranquil && (call != NULL)) {
1368             SPLVAR;
1369
1370             NETPRI;
1371             MUTEX_ENTER(&call->lock);
1372
1373             rxi_CallError(call, RX_RESTARTING);
1374             rxi_SendCallAbort(call, (struct rx_packet *)0, 0, 0);
1375
1376             MUTEX_EXIT(&call->lock);
1377             USERPRI;
1378         }
1379 #ifdef  KERNEL
1380         if (afs_termState == AFSOP_STOP_RXCALLBACK) {
1381 #ifdef RX_ENABLE_LOCKS
1382             AFS_GLOCK();
1383 #endif /* RX_ENABLE_LOCKS */
1384             afs_termState = AFSOP_STOP_AFS;
1385             afs_osi_Wakeup(&afs_termState);
1386 #ifdef RX_ENABLE_LOCKS
1387             AFS_GUNLOCK();
1388 #endif /* RX_ENABLE_LOCKS */
1389             return;
1390         }
1391 #endif
1392
1393         tservice = call->conn->service;
1394
1395         if (tservice->beforeProc)
1396             (*tservice->beforeProc) (call);
1397
1398         code = call->conn->service->executeRequestProc(call);
1399
1400         if (tservice->afterProc)
1401             (*tservice->afterProc) (call, code);
1402
1403         rx_EndCall(call, code);
1404         MUTEX_ENTER(&rx_stats_mutex);
1405         rxi_nCalls++;
1406         MUTEX_EXIT(&rx_stats_mutex);
1407     }
1408 }
1409
1410
1411 void
1412 rx_WakeupServerProcs(void)
1413 {
1414     struct rx_serverQueueEntry *np, *tqp;
1415     SPLVAR;
1416
1417     NETPRI;
1418     MUTEX_ENTER(&rx_serverPool_lock);
1419
1420 #ifdef RX_ENABLE_LOCKS
1421     if (rx_waitForPacket)
1422         CV_BROADCAST(&rx_waitForPacket->cv);
1423 #else /* RX_ENABLE_LOCKS */
1424     if (rx_waitForPacket)
1425         osi_rxWakeup(rx_waitForPacket);
1426 #endif /* RX_ENABLE_LOCKS */
1427     MUTEX_ENTER(&freeSQEList_lock);
1428     for (np = rx_FreeSQEList; np; np = tqp) {
1429         tqp = *(struct rx_serverQueueEntry **)np;
1430 #ifdef RX_ENABLE_LOCKS
1431         CV_BROADCAST(&np->cv);
1432 #else /* RX_ENABLE_LOCKS */
1433         osi_rxWakeup(np);
1434 #endif /* RX_ENABLE_LOCKS */
1435     }
1436     MUTEX_EXIT(&freeSQEList_lock);
1437     for (queue_Scan(&rx_idleServerQueue, np, tqp, rx_serverQueueEntry)) {
1438 #ifdef RX_ENABLE_LOCKS
1439         CV_BROADCAST(&np->cv);
1440 #else /* RX_ENABLE_LOCKS */
1441         osi_rxWakeup(np);
1442 #endif /* RX_ENABLE_LOCKS */
1443     }
1444     MUTEX_EXIT(&rx_serverPool_lock);
1445     USERPRI;
1446 }
1447
1448 /* meltdown:
1449  * One thing that seems to happen is that all the server threads get
1450  * tied up on some empty or slow call, and then a whole bunch of calls
1451  * arrive at once, using up the packet pool, so now there are more 
1452  * empty calls.  The most critical resources here are server threads
1453  * and the free packet pool.  The "doreclaim" code seems to help in
1454  * general.  I think that eventually we arrive in this state: there
1455  * are lots of pending calls which do have all their packets present,
1456  * so they won't be reclaimed, are multi-packet calls, so they won't
1457  * be scheduled until later, and thus are tying up most of the free 
1458  * packet pool for a very long time.
1459  * future options:
1460  * 1.  schedule multi-packet calls if all the packets are present.  
1461  * Probably CPU-bound operation, useful to return packets to pool. 
1462  * Do what if there is a full window, but the last packet isn't here?
1463  * 3.  preserve one thread which *only* runs "best" calls, otherwise
1464  * it sleeps and waits for that type of call.
1465  * 4.  Don't necessarily reserve a whole window for each thread.  In fact, 
1466  * the current dataquota business is badly broken.  The quota isn't adjusted
1467  * to reflect how many packets are presently queued for a running call.
1468  * So, when we schedule a queued call with a full window of packets queued
1469  * up for it, that *should* free up a window full of packets for other 2d-class
1470  * calls to be able to use from the packet pool.  But it doesn't.
1471  *
1472  * NB.  Most of the time, this code doesn't run -- since idle server threads
1473  * sit on the idle server queue and are assigned by "...ReceivePacket" as soon
1474  * as a new call arrives.
1475  */
1476 /* Sleep until a call arrives.  Returns a pointer to the call, ready
1477  * for an rx_Read. */
1478 #ifdef RX_ENABLE_LOCKS
1479 struct rx_call *
1480 rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
1481 {
1482     struct rx_serverQueueEntry *sq;
1483     register struct rx_call *call = (struct rx_call *)0;
1484     struct rx_service *service = NULL;
1485     SPLVAR;
1486
1487     MUTEX_ENTER(&freeSQEList_lock);
1488
1489     if ((sq = rx_FreeSQEList)) {
1490         rx_FreeSQEList = *(struct rx_serverQueueEntry **)sq;
1491         MUTEX_EXIT(&freeSQEList_lock);
1492     } else {                    /* otherwise allocate a new one and return that */
1493         MUTEX_EXIT(&freeSQEList_lock);
1494         sq = (struct rx_serverQueueEntry *)
1495             rxi_Alloc(sizeof(struct rx_serverQueueEntry));
1496         MUTEX_INIT(&sq->lock, "server Queue lock", MUTEX_DEFAULT, 0);
1497         CV_INIT(&sq->cv, "server Queue lock", CV_DEFAULT, 0);
1498     }
1499
1500     MUTEX_ENTER(&rx_serverPool_lock);
1501     if (cur_service != NULL) {
1502         ReturnToServerPool(cur_service);
1503     }
1504     while (1) {
1505         if (queue_IsNotEmpty(&rx_incomingCallQueue)) {
1506             register struct rx_call *tcall, *ncall, *choice2 = NULL;
1507
1508             /* Scan for eligible incoming calls.  A call is not eligible
1509              * if the maximum number of calls for its service type are
1510              * already executing */
1511             /* One thread will process calls FCFS (to prevent starvation),
1512              * while the other threads may run ahead looking for calls which
1513              * have all their input data available immediately.  This helps 
1514              * keep threads from blocking, waiting for data from the client. */
1515             for (queue_Scan(&rx_incomingCallQueue, tcall, ncall, rx_call)) {
1516                 service = tcall->conn->service;
1517                 if (!QuotaOK(service)) {
1518                     continue;
1519                 }
1520                 if (tno == rxi_fcfs_thread_num
1521                     || !tcall->queue_item_header.next) {
1522                     /* If we're the fcfs thread , then  we'll just use 
1523                      * this call. If we haven't been able to find an optimal 
1524                      * choice, and we're at the end of the list, then use a 
1525                      * 2d choice if one has been identified.  Otherwise... */
1526                     call = (choice2 ? choice2 : tcall);
1527                     service = call->conn->service;
1528                 } else if (!queue_IsEmpty(&tcall->rq)) {
1529                     struct rx_packet *rp;
1530                     rp = queue_First(&tcall->rq, rx_packet);
1531                     if (rp->header.seq == 1) {
1532                         if (!meltdown_1pkt
1533                             || (rp->header.flags & RX_LAST_PACKET)) {
1534                             call = tcall;
1535                         } else if (rxi_2dchoice && !choice2
1536                                    && !(tcall->flags & RX_CALL_CLEARED)
1537                                    && (tcall->rprev > rxi_HardAckRate)) {
1538                             choice2 = tcall;
1539                         } else
1540                             rxi_md2cnt++;
1541                     }
1542                 }
1543                 if (call) {
1544                     break;
1545                 } else {
1546                     ReturnToServerPool(service);
1547                 }
1548             }
1549         }
1550
1551         if (call) {
1552             queue_Remove(call);
1553             MUTEX_EXIT(&rx_serverPool_lock);
1554             MUTEX_ENTER(&call->lock);
1555
1556             if (call->flags & RX_CALL_WAIT_PROC) {
1557                 call->flags &= ~RX_CALL_WAIT_PROC;
1558                 MUTEX_ENTER(&rx_stats_mutex);
1559                 rx_nWaiting--;
1560                 MUTEX_EXIT(&rx_stats_mutex);
1561             }
1562
1563             if (call->state != RX_STATE_PRECALL || call->error) {
1564                 MUTEX_EXIT(&call->lock);
1565                 MUTEX_ENTER(&rx_serverPool_lock);
1566                 ReturnToServerPool(service);
1567                 call = NULL;
1568                 continue;
1569             }
1570
1571             if (queue_IsEmpty(&call->rq)
1572                 || queue_First(&call->rq, rx_packet)->header.seq != 1)
1573                 rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
1574
1575             CLEAR_CALL_QUEUE_LOCK(call);
1576             break;
1577         } else {
1578             /* If there are no eligible incoming calls, add this process
1579              * to the idle server queue, to wait for one */
1580             sq->newcall = 0;
1581             sq->tno = tno;
1582             if (socketp) {
1583                 *socketp = OSI_NULLSOCKET;
1584             }
1585             sq->socketp = socketp;
1586             queue_Append(&rx_idleServerQueue, sq);
1587 #ifndef AFS_AIX41_ENV
1588             rx_waitForPacket = sq;
1589 #else
1590             rx_waitingForPacket = sq;
1591 #endif /* AFS_AIX41_ENV */
1592             do {
1593                 CV_WAIT(&sq->cv, &rx_serverPool_lock);
1594 #ifdef  KERNEL
1595                 if (afs_termState == AFSOP_STOP_RXCALLBACK) {
1596                     MUTEX_EXIT(&rx_serverPool_lock);
1597                     return (struct rx_call *)0;
1598                 }
1599 #endif
1600             } while (!(call = sq->newcall)
1601                      && !(socketp && *socketp != OSI_NULLSOCKET));
1602             MUTEX_EXIT(&rx_serverPool_lock);
1603             if (call) {
1604                 MUTEX_ENTER(&call->lock);
1605             }
1606             break;
1607         }
1608     }
1609
1610     MUTEX_ENTER(&freeSQEList_lock);
1611     *(struct rx_serverQueueEntry **)sq = rx_FreeSQEList;
1612     rx_FreeSQEList = sq;
1613     MUTEX_EXIT(&freeSQEList_lock);
1614
1615     if (call) {
1616         clock_GetTime(&call->startTime);
1617         call->state = RX_STATE_ACTIVE;
1618         call->mode = RX_MODE_RECEIVING;
1619 #ifdef RX_KERNEL_TRACE
1620         if (ICL_SETACTIVE(afs_iclSetp)) {
1621             int glockOwner = ISAFS_GLOCK();
1622             if (!glockOwner)
1623                 AFS_GLOCK();
1624             afs_Trace3(afs_iclSetp, CM_TRACE_WASHERE, ICL_TYPE_STRING,
1625                        __FILE__, ICL_TYPE_INT32, __LINE__, ICL_TYPE_POINTER,
1626                        call);
1627             if (!glockOwner)
1628                 AFS_GUNLOCK();
1629         }
1630 #endif
1631
1632         rxi_calltrace(RX_CALL_START, call);
1633         dpf(("rx_GetCall(port=%d, service=%d) ==> call %x\n",
1634              call->conn->service->servicePort, call->conn->service->serviceId,
1635              call));
1636
1637         CALL_HOLD(call, RX_CALL_REFCOUNT_BEGIN);
1638         MUTEX_EXIT(&call->lock);
1639     } else {
1640         dpf(("rx_GetCall(socketp=0x%x, *socketp=0x%x)\n", socketp, *socketp));
1641     }
1642
1643     return call;
1644 }
1645 #else /* RX_ENABLE_LOCKS */
1646 struct rx_call *
1647 rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
1648 {
1649     struct rx_serverQueueEntry *sq;
1650     register struct rx_call *call = (struct rx_call *)0, *choice2;
1651     struct rx_service *service = NULL;
1652     SPLVAR;
1653
1654     NETPRI;
1655     MUTEX_ENTER(&freeSQEList_lock);
1656
1657     if ((sq = rx_FreeSQEList)) {
1658         rx_FreeSQEList = *(struct rx_serverQueueEntry **)sq;
1659         MUTEX_EXIT(&freeSQEList_lock);
1660     } else {                    /* otherwise allocate a new one and return that */
1661         MUTEX_EXIT(&freeSQEList_lock);
1662         sq = (struct rx_serverQueueEntry *)
1663             rxi_Alloc(sizeof(struct rx_serverQueueEntry));
1664         MUTEX_INIT(&sq->lock, "server Queue lock", MUTEX_DEFAULT, 0);
1665         CV_INIT(&sq->cv, "server Queue lock", CV_DEFAULT, 0);
1666     }
1667     MUTEX_ENTER(&sq->lock);
1668
1669     if (cur_service != NULL) {
1670         cur_service->nRequestsRunning--;
1671         if (cur_service->nRequestsRunning < cur_service->minProcs)
1672             rxi_minDeficit++;
1673         rxi_availProcs++;
1674     }
1675     if (queue_IsNotEmpty(&rx_incomingCallQueue)) {
1676         register struct rx_call *tcall, *ncall;
1677         /* Scan for eligible incoming calls.  A call is not eligible
1678          * if the maximum number of calls for its service type are
1679          * already executing */
1680         /* One thread will process calls FCFS (to prevent starvation),
1681          * while the other threads may run ahead looking for calls which
1682          * have all their input data available immediately.  This helps 
1683          * keep threads from blocking, waiting for data from the client. */
1684         choice2 = (struct rx_call *)0;
1685         for (queue_Scan(&rx_incomingCallQueue, tcall, ncall, rx_call)) {
1686             service = tcall->conn->service;
1687             if (QuotaOK(service)) {
1688                 if (tno == rxi_fcfs_thread_num
1689                     || !tcall->queue_item_header.next) {
1690                     /* If we're the fcfs thread, then  we'll just use 
1691                      * this call. If we haven't been able to find an optimal 
1692                      * choice, and we're at the end of the list, then use a 
1693                      * 2d choice if one has been identified.  Otherwise... */
1694                     call = (choice2 ? choice2 : tcall);
1695                     service = call->conn->service;
1696                 } else if (!queue_IsEmpty(&tcall->rq)) {
1697                     struct rx_packet *rp;
1698                     rp = queue_First(&tcall->rq, rx_packet);
1699                     if (rp->header.seq == 1
1700                         && (!meltdown_1pkt
1701                             || (rp->header.flags & RX_LAST_PACKET))) {
1702                         call = tcall;
1703                     } else if (rxi_2dchoice && !choice2
1704                                && !(tcall->flags & RX_CALL_CLEARED)
1705                                && (tcall->rprev > rxi_HardAckRate)) {
1706                         choice2 = tcall;
1707                     } else
1708                         rxi_md2cnt++;
1709                 }
1710             }
1711             if (call)
1712                 break;
1713         }
1714     }
1715
1716     if (call) {
1717         queue_Remove(call);
1718         /* we can't schedule a call if there's no data!!! */
1719         /* send an ack if there's no data, if we're missing the
1720          * first packet, or we're missing something between first 
1721          * and last -- there's a "hole" in the incoming data. */
1722         if (queue_IsEmpty(&call->rq)
1723             || queue_First(&call->rq, rx_packet)->header.seq != 1
1724             || call->rprev != queue_Last(&call->rq, rx_packet)->header.seq)
1725             rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
1726
1727         call->flags &= (~RX_CALL_WAIT_PROC);
1728         service->nRequestsRunning++;
1729         /* just started call in minProcs pool, need fewer to maintain
1730          * guarantee */
1731         if (service->nRequestsRunning <= service->minProcs)
1732             rxi_minDeficit--;
1733         rxi_availProcs--;
1734         rx_nWaiting--;
1735         /* MUTEX_EXIT(&call->lock); */
1736     } else {
1737         /* If there are no eligible incoming calls, add this process
1738          * to the idle server queue, to wait for one */
1739         sq->newcall = 0;
1740         if (socketp) {
1741             *socketp = OSI_NULLSOCKET;
1742         }
1743         sq->socketp = socketp;
1744         queue_Append(&rx_idleServerQueue, sq);
1745         do {
1746             osi_rxSleep(sq);
1747 #ifdef  KERNEL
1748             if (afs_termState == AFSOP_STOP_RXCALLBACK) {
1749                 USERPRI;
1750                 rxi_Free(sq, sizeof(struct rx_serverQueueEntry));
1751                 return (struct rx_call *)0;
1752             }
1753 #endif
1754         } while (!(call = sq->newcall)
1755                  && !(socketp && *socketp != OSI_NULLSOCKET));
1756     }
1757     MUTEX_EXIT(&sq->lock);
1758
1759     MUTEX_ENTER(&freeSQEList_lock);
1760     *(struct rx_serverQueueEntry **)sq = rx_FreeSQEList;
1761     rx_FreeSQEList = sq;
1762     MUTEX_EXIT(&freeSQEList_lock);
1763
1764     if (call) {
1765         clock_GetTime(&call->startTime);
1766         call->state = RX_STATE_ACTIVE;
1767         call->mode = RX_MODE_RECEIVING;
1768 #ifdef RX_KERNEL_TRACE
1769         if (ICL_SETACTIVE(afs_iclSetp)) {
1770             int glockOwner = ISAFS_GLOCK();
1771             if (!glockOwner)
1772                 AFS_GLOCK();
1773             afs_Trace3(afs_iclSetp, CM_TRACE_WASHERE, ICL_TYPE_STRING,
1774                        __FILE__, ICL_TYPE_INT32, __LINE__, ICL_TYPE_POINTER,
1775                        call);
1776             if (!glockOwner)
1777                 AFS_GUNLOCK();
1778         }
1779 #endif
1780
1781         rxi_calltrace(RX_CALL_START, call);
1782         dpf(("rx_GetCall(port=%d, service=%d) ==> call %x\n",
1783              call->conn->service->servicePort, call->conn->service->serviceId,
1784              call));
1785     } else {
1786         dpf(("rx_GetCall(socketp=0x%x, *socketp=0x%x)\n", socketp, *socketp));
1787     }
1788
1789     USERPRI;
1790
1791     return call;
1792 }
1793 #endif /* RX_ENABLE_LOCKS */
1794
1795
1796
1797 /* Establish a procedure to be called when a packet arrives for a
1798  * call.  This routine will be called at most once after each call,
1799  * and will also be called if there is an error condition on the or
1800  * the call is complete.  Used by multi rx to build a selection
1801  * function which determines which of several calls is likely to be a
1802  * good one to read from.  
1803  * NOTE: the way this is currently implemented it is probably only a
1804  * good idea to (1) use it immediately after a newcall (clients only)
1805  * and (2) only use it once.  Other uses currently void your warranty
1806  */
1807 void
1808 rx_SetArrivalProc(register struct rx_call *call,
1809                   register void (*proc) (register struct rx_call * call,
1810                                         register VOID * mh,
1811                                         register int index),
1812                   register VOID * handle, register int arg)
1813 {
1814     call->arrivalProc = proc;
1815     call->arrivalProcHandle = handle;
1816     call->arrivalProcArg = arg;
1817 }
1818
1819 /* Call is finished (possibly prematurely).  Return rc to the peer, if
1820  * appropriate, and return the final error code from the conversation
1821  * to the caller */
1822
1823 afs_int32
1824 rx_EndCall(register struct rx_call *call, afs_int32 rc)
1825 {
1826     register struct rx_connection *conn = call->conn;
1827     register struct rx_service *service;
1828     register struct rx_packet *tp;      /* Temporary packet pointer */
1829     register struct rx_packet *nxp;     /* Next packet pointer, for queue_Scan */
1830     afs_int32 error;
1831     SPLVAR;
1832
1833     dpf(("rx_EndCall(call %x)\n", call));
1834
1835     NETPRI;
1836     MUTEX_ENTER(&call->lock);
1837
1838     if (rc == 0 && call->error == 0) {
1839         call->abortCode = 0;
1840         call->abortCount = 0;
1841     }
1842
1843     call->arrivalProc = (void (*)())0;
1844     if (rc && call->error == 0) {
1845         rxi_CallError(call, rc);
1846         /* Send an abort message to the peer if this error code has
1847          * only just been set.  If it was set previously, assume the
1848          * peer has already been sent the error code or will request it 
1849          */
1850         rxi_SendCallAbort(call, (struct rx_packet *)0, 0, 0);
1851     }
1852     if (conn->type == RX_SERVER_CONNECTION) {
1853         /* Make sure reply or at least dummy reply is sent */
1854         if (call->mode == RX_MODE_RECEIVING) {
1855             rxi_WriteProc(call, 0, 0);
1856         }
1857         if (call->mode == RX_MODE_SENDING) {
1858             rxi_FlushWrite(call);
1859         }
1860         service = conn->service;
1861         rxi_calltrace(RX_CALL_END, call);
1862         /* Call goes to hold state until reply packets are acknowledged */
1863         if (call->tfirst + call->nSoftAcked < call->tnext) {
1864             call->state = RX_STATE_HOLD;
1865         } else {
1866             call->state = RX_STATE_DALLY;
1867             rxi_ClearTransmitQueue(call, 0);
1868             rxevent_Cancel(call->resendEvent, call, RX_CALL_REFCOUNT_RESEND);
1869             rxevent_Cancel(call->keepAliveEvent, call,
1870                            RX_CALL_REFCOUNT_ALIVE);
1871         }
1872     } else {                    /* Client connection */
1873         char dummy;
1874         /* Make sure server receives input packets, in the case where
1875          * no reply arguments are expected */
1876         if ((call->mode == RX_MODE_SENDING)
1877             || (call->mode == RX_MODE_RECEIVING && call->rnext == 1)) {
1878             (void)rxi_ReadProc(call, &dummy, 1);
1879         }
1880
1881         /* If we had an outstanding delayed ack, be nice to the server
1882          * and force-send it now.
1883          */
1884         if (call->delayedAckEvent) {
1885             rxevent_Cancel(call->delayedAckEvent, call,
1886                            RX_CALL_REFCOUNT_DELAY);
1887             call->delayedAckEvent = NULL;
1888             rxi_SendDelayedAck(NULL, call, NULL);
1889         }
1890
1891         /* We need to release the call lock since it's lower than the
1892          * conn_call_lock and we don't want to hold the conn_call_lock
1893          * over the rx_ReadProc call. The conn_call_lock needs to be held
1894          * here for the case where rx_NewCall is perusing the calls on
1895          * the connection structure. We don't want to signal until
1896          * rx_NewCall is in a stable state. Otherwise, rx_NewCall may
1897          * have checked this call, found it active and by the time it
1898          * goes to sleep, will have missed the signal.
1899          *
1900          * Do not clear the RX_CONN_MAKECALL_WAITING flag as long as
1901          * there are threads waiting to use the conn object.
1902          */
1903         MUTEX_EXIT(&call->lock);
1904         MUTEX_ENTER(&conn->conn_call_lock);
1905         MUTEX_ENTER(&call->lock);
1906         MUTEX_ENTER(&conn->conn_data_lock);
1907         conn->flags |= RX_CONN_BUSY;
1908         if (conn->flags & RX_CONN_MAKECALL_WAITING) {
1909             if (conn->makeCallWaiters == 0)
1910                 conn->flags &= (~RX_CONN_MAKECALL_WAITING);
1911             MUTEX_EXIT(&conn->conn_data_lock);
1912 #ifdef  RX_ENABLE_LOCKS
1913             CV_BROADCAST(&conn->conn_call_cv);
1914 #else
1915             osi_rxWakeup(conn);
1916 #endif
1917         }
1918 #ifdef RX_ENABLE_LOCKS
1919         else {
1920             MUTEX_EXIT(&conn->conn_data_lock);
1921         }
1922 #endif /* RX_ENABLE_LOCKS */
1923         call->state = RX_STATE_DALLY;
1924     }
1925     error = call->error;
1926
1927     /* currentPacket, nLeft, and NFree must be zeroed here, because
1928      * ResetCall cannot: ResetCall may be called at splnet(), in the
1929      * kernel version, and may interrupt the macros rx_Read or
1930      * rx_Write, which run at normal priority for efficiency. */
1931     if (call->currentPacket) {
1932         queue_Prepend(&call->iovq, call->currentPacket);
1933         call->currentPacket = (struct rx_packet *)0;
1934     }
1935         
1936     call->nLeft = call->nFree = call->curlen = 0;
1937
1938     /* Free any packets from the last call to ReadvProc/WritevProc */
1939     rxi_FreePackets(0, &call->iovq);
1940
1941     CALL_RELE(call, RX_CALL_REFCOUNT_BEGIN);
1942     MUTEX_EXIT(&call->lock);
1943     if (conn->type == RX_CLIENT_CONNECTION) {
1944         MUTEX_EXIT(&conn->conn_call_lock);
1945         conn->flags &= ~RX_CONN_BUSY;
1946     }
1947     USERPRI;
1948     /*
1949      * Map errors to the local host's errno.h format.
1950      */
1951     error = ntoh_syserr_conv(error);
1952     return error;
1953 }
1954
1955 #if !defined(KERNEL)
1956
1957 /* Call this routine when shutting down a server or client (especially
1958  * clients).  This will allow Rx to gracefully garbage collect server
1959  * connections, and reduce the number of retries that a server might
1960  * make to a dead client.
1961  * This is not quite right, since some calls may still be ongoing and
1962  * we can't lock them to destroy them. */
1963 void
1964 rx_Finalize(void)
1965 {
1966     register struct rx_connection **conn_ptr, **conn_end;
1967
1968     INIT_PTHREAD_LOCKS;
1969     LOCK_RX_INIT;
1970     if (rxinit_status == 1) {
1971         UNLOCK_RX_INIT;
1972         return;                 /* Already shutdown. */
1973     }
1974     rxi_DeleteCachedConnections();
1975     if (rx_connHashTable) {
1976         MUTEX_ENTER(&rx_connHashTable_lock);
1977         for (conn_ptr = &rx_connHashTable[0], conn_end =
1978              &rx_connHashTable[rx_hashTableSize]; conn_ptr < conn_end;
1979              conn_ptr++) {
1980             struct rx_connection *conn, *next;
1981             for (conn = *conn_ptr; conn; conn = next) {
1982                 next = conn->next;
1983                 if (conn->type == RX_CLIENT_CONNECTION) {
1984                     /* MUTEX_ENTER(&conn->conn_data_lock); when used in kernel */
1985                     conn->refCount++;
1986                     /* MUTEX_EXIT(&conn->conn_data_lock); when used in kernel */
1987 #ifdef RX_ENABLE_LOCKS
1988                     rxi_DestroyConnectionNoLock(conn);
1989 #else /* RX_ENABLE_LOCKS */
1990                     rxi_DestroyConnection(conn);
1991 #endif /* RX_ENABLE_LOCKS */
1992                 }
1993             }
1994         }
1995 #ifdef RX_ENABLE_LOCKS
1996         while (rx_connCleanup_list) {
1997             struct rx_connection *conn;
1998             conn = rx_connCleanup_list;
1999             rx_connCleanup_list = rx_connCleanup_list->next;
2000             MUTEX_EXIT(&rx_connHashTable_lock);
2001             rxi_CleanupConnection(conn);
2002             MUTEX_ENTER(&rx_connHashTable_lock);
2003         }
2004         MUTEX_EXIT(&rx_connHashTable_lock);
2005 #endif /* RX_ENABLE_LOCKS */
2006     }
2007     rxi_flushtrace();
2008
2009     rxinit_status = 1;
2010     UNLOCK_RX_INIT;
2011 }
2012 #endif
2013
2014 /* if we wakeup packet waiter too often, can get in loop with two
2015     AllocSendPackets each waking each other up (from ReclaimPacket calls) */
2016 void
2017 rxi_PacketsUnWait(void)
2018 {
2019     if (!rx_waitingForPackets) {
2020         return;
2021     }
2022 #ifdef KERNEL
2023     if (rxi_OverQuota(RX_PACKET_CLASS_SEND)) {
2024         return;                 /* still over quota */
2025     }
2026 #endif /* KERNEL */
2027     rx_waitingForPackets = 0;
2028 #ifdef  RX_ENABLE_LOCKS
2029     CV_BROADCAST(&rx_waitingForPackets_cv);
2030 #else
2031     osi_rxWakeup(&rx_waitingForPackets);
2032 #endif
2033     return;
2034 }
2035
2036
2037 /* ------------------Internal interfaces------------------------- */
2038
2039 /* Return this process's service structure for the
2040  * specified socket and service */
2041 struct rx_service *
2042 rxi_FindService(register osi_socket socket, register u_short serviceId)
2043 {
2044     register struct rx_service **sp;
2045     for (sp = &rx_services[0]; *sp; sp++) {
2046         if ((*sp)->serviceId == serviceId && (*sp)->socket == socket)
2047             return *sp;
2048     }
2049     return 0;
2050 }
2051
2052 /* Allocate a call structure, for the indicated channel of the
2053  * supplied connection.  The mode and state of the call must be set by
2054  * the caller. Returns the call with mutex locked. */
2055 struct rx_call *
2056 rxi_NewCall(register struct rx_connection *conn, register int channel)
2057 {
2058     register struct rx_call *call;
2059 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
2060     register struct rx_call *cp;        /* Call pointer temp */
2061     register struct rx_call *nxp;       /* Next call pointer, for queue_Scan */
2062 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
2063
2064     /* Grab an existing call structure, or allocate a new one.
2065      * Existing call structures are assumed to have been left reset by
2066      * rxi_FreeCall */
2067     MUTEX_ENTER(&rx_freeCallQueue_lock);
2068
2069 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
2070     /*
2071      * EXCEPT that the TQ might not yet be cleared out.
2072      * Skip over those with in-use TQs.
2073      */
2074     call = NULL;
2075     for (queue_Scan(&rx_freeCallQueue, cp, nxp, rx_call)) {
2076         if (!(cp->flags & RX_CALL_TQ_BUSY)) {
2077             call = cp;
2078             break;
2079         }
2080     }
2081     if (call) {
2082 #else /* AFS_GLOBAL_RXLOCK_KERNEL */
2083     if (queue_IsNotEmpty(&rx_freeCallQueue)) {
2084         call = queue_First(&rx_freeCallQueue, rx_call);
2085 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
2086         queue_Remove(call);
2087         MUTEX_ENTER(&rx_stats_mutex);
2088         rx_stats.nFreeCallStructs--;
2089         MUTEX_EXIT(&rx_stats_mutex);
2090         MUTEX_EXIT(&rx_freeCallQueue_lock);
2091         MUTEX_ENTER(&call->lock);
2092         CLEAR_CALL_QUEUE_LOCK(call);
2093 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
2094         /* Now, if TQ wasn't cleared earlier, do it now. */
2095         if (call->flags & RX_CALL_TQ_CLEARME) {
2096             rxi_ClearTransmitQueue(call, 0);
2097             queue_Init(&call->tq);
2098         }
2099 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
2100         /* Bind the call to its connection structure */
2101         call->conn = conn;
2102         rxi_ResetCall(call, 1);
2103     } else {
2104         call = (struct rx_call *)rxi_Alloc(sizeof(struct rx_call));
2105
2106         MUTEX_EXIT(&rx_freeCallQueue_lock);
2107         MUTEX_INIT(&call->lock, "call lock", MUTEX_DEFAULT, NULL);
2108         MUTEX_ENTER(&call->lock);
2109         CV_INIT(&call->cv_twind, "call twind", CV_DEFAULT, 0);
2110         CV_INIT(&call->cv_rq, "call rq", CV_DEFAULT, 0);
2111         CV_INIT(&call->cv_tq, "call tq", CV_DEFAULT, 0);
2112
2113         MUTEX_ENTER(&rx_stats_mutex);
2114         rx_stats.nCallStructs++;
2115         MUTEX_EXIT(&rx_stats_mutex);
2116         /* Initialize once-only items */
2117         queue_Init(&call->tq);
2118         queue_Init(&call->rq);
2119         queue_Init(&call->iovq);
2120         /* Bind the call to its connection structure (prereq for reset) */
2121         call->conn = conn;
2122         rxi_ResetCall(call, 1);
2123     }
2124     call->channel = channel;
2125     call->callNumber = &conn->callNumber[channel];
2126     /* Note that the next expected call number is retained (in
2127      * conn->callNumber[i]), even if we reallocate the call structure
2128      */
2129     conn->call[channel] = call;
2130     /* if the channel's never been used (== 0), we should start at 1, otherwise
2131      * the call number is valid from the last time this channel was used */
2132     if (*call->callNumber == 0)
2133         *call->callNumber = 1;
2134
2135     return call;
2136 }
2137
2138 /* A call has been inactive long enough that so we can throw away
2139  * state, including the call structure, which is placed on the call
2140  * free list.
2141  * Call is locked upon entry.
2142  * haveCTLock set if called from rxi_ReapConnections
2143  */
2144 #ifdef RX_ENABLE_LOCKS
2145 void
2146 rxi_FreeCall(register struct rx_call *call, int haveCTLock)
2147 #else /* RX_ENABLE_LOCKS */
2148 void
2149 rxi_FreeCall(register struct rx_call *call)
2150 #endif                          /* RX_ENABLE_LOCKS */
2151 {
2152     register int channel = call->channel;
2153     register struct rx_connection *conn = call->conn;
2154
2155
2156     if (call->state == RX_STATE_DALLY || call->state == RX_STATE_HOLD)
2157         (*call->callNumber)++;
2158     rxi_ResetCall(call, 0);
2159     call->conn->call[channel] = (struct rx_call *)0;
2160
2161     MUTEX_ENTER(&rx_freeCallQueue_lock);
2162     SET_CALL_QUEUE_LOCK(call, &rx_freeCallQueue_lock);
2163 #ifdef AFS_GLOBAL_RXLOCK_KERNEL
2164     /* A call may be free even though its transmit queue is still in use.
2165      * Since we search the call list from head to tail, put busy calls at
2166      * the head of the list, and idle calls at the tail.
2167      */
2168     if (call->flags & RX_CALL_TQ_BUSY)
2169         queue_Prepend(&rx_freeCallQueue, call);
2170     else
2171         queue_Append(&rx_freeCallQueue, call);
2172 #else /* AFS_GLOBAL_RXLOCK_KERNEL */
2173     queue_Append(&rx_freeCallQueue, call);
2174 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
2175     MUTEX_ENTER(&rx_stats_mutex);
2176     rx_stats.nFreeCallStructs++;
2177     MUTEX_EXIT(&rx_stats_mutex);
2178
2179     MUTEX_EXIT(&rx_freeCallQueue_lock);
2180
2181     /* Destroy the connection if it was previously slated for
2182      * destruction, i.e. the Rx client code previously called
2183      * rx_DestroyConnection (client connections), or
2184      * rxi_ReapConnections called the same routine (server
2185      * connections).  Only do this, however, if there are no
2186      * outstanding calls. Note that for fine grain locking, there appears
2187      * to be a deadlock in that rxi_FreeCall has a call locked and
2188      * DestroyConnectionNoLock locks each call in the conn. But note a
2189      * few lines up where we have removed this call from the conn.
2190      * If someone else destroys a connection, they either have no
2191      * call lock held or are going through this section of code.
2192      */
2193     if (conn->flags & RX_CONN_DESTROY_ME && !(conn->flags & RX_CONN_MAKECALL_WAITING)) {
2194         MUTEX_ENTER(&conn->conn_data_lock);
2195         conn->refCount++;
2196         MUTEX_EXIT(&conn->conn_data_lock);
2197 #ifdef RX_ENABLE_LOCKS
2198         if (haveCTLock)
2199             rxi_DestroyConnectionNoLock(conn);
2200         else
2201             rxi_DestroyConnection(conn);
2202 #else /* RX_ENABLE_LOCKS */
2203         rxi_DestroyConnection(conn);
2204 #endif /* RX_ENABLE_LOCKS */
2205     }
2206 }
2207
2208 afs_int32 rxi_Alloccnt = 0, rxi_Allocsize = 0;
2209 char *
2210 rxi_Alloc(register size_t size)
2211 {
2212     register char *p;
2213
2214     MUTEX_ENTER(&rx_stats_mutex);
2215     rxi_Alloccnt++;
2216     rxi_Allocsize += size;
2217     MUTEX_EXIT(&rx_stats_mutex);
2218
2219     p = (char *)osi_Alloc(size);
2220
2221     if (!p)
2222         osi_Panic("rxi_Alloc error");
2223     memset(p, 0, size);
2224     return p;
2225 }
2226
2227 void
2228 rxi_Free(void *addr, register size_t size)
2229 {
2230     MUTEX_ENTER(&rx_stats_mutex);
2231     rxi_Alloccnt--;
2232     rxi_Allocsize -= size;
2233     MUTEX_EXIT(&rx_stats_mutex);
2234
2235     osi_Free(addr, size);
2236 }
2237
2238 /* Find the peer process represented by the supplied (host,port)
2239  * combination.  If there is no appropriate active peer structure, a
2240  * new one will be allocated and initialized 
2241  * The origPeer, if set, is a pointer to a peer structure on which the
2242  * refcount will be be decremented. This is used to replace the peer
2243  * structure hanging off a connection structure */
2244 struct rx_peer *
2245 rxi_FindPeer(register afs_uint32 host, register u_short port,
2246              struct rx_peer *origPeer, int create)
2247 {
2248     register struct rx_peer *pp;
2249     int hashIndex;
2250     hashIndex = PEER_HASH(host, port);
2251     MUTEX_ENTER(&rx_peerHashTable_lock);
2252     for (pp = rx_peerHashTable[hashIndex]; pp; pp = pp->next) {
2253         if ((pp->host == host) && (pp->port == port))
2254             break;
2255     }
2256     if (!pp) {
2257         if (create) {
2258             pp = rxi_AllocPeer();       /* This bzero's *pp */
2259             pp->host = host;    /* set here or in InitPeerParams is zero */
2260             pp->port = port;
2261             MUTEX_INIT(&pp->peer_lock, "peer_lock", MUTEX_DEFAULT, 0);
2262             queue_Init(&pp->congestionQueue);
2263             queue_Init(&pp->rpcStats);
2264             pp->next = rx_peerHashTable[hashIndex];
2265             rx_peerHashTable[hashIndex] = pp;
2266             rxi_InitPeerParams(pp);
2267             MUTEX_ENTER(&rx_stats_mutex);
2268             rx_stats.nPeerStructs++;
2269             MUTEX_EXIT(&rx_stats_mutex);
2270         }
2271     }
2272     if (pp && create) {
2273         pp->refCount++;
2274     }
2275     if (origPeer)
2276         origPeer->refCount--;
2277     MUTEX_EXIT(&rx_peerHashTable_lock);
2278     return pp;
2279 }
2280
2281
2282 /* Find the connection at (host, port) started at epoch, and with the
2283  * given connection id.  Creates the server connection if necessary.
2284  * The type specifies whether a client connection or a server
2285  * connection is desired.  In both cases, (host, port) specify the
2286  * peer's (host, pair) pair.  Client connections are not made
2287  * automatically by this routine.  The parameter socket gives the
2288  * socket descriptor on which the packet was received.  This is used,
2289  * in the case of server connections, to check that *new* connections
2290  * come via a valid (port, serviceId).  Finally, the securityIndex
2291  * parameter must match the existing index for the connection.  If a
2292  * server connection is created, it will be created using the supplied
2293  * index, if the index is valid for this service */
2294 struct rx_connection *
2295 rxi_FindConnection(osi_socket socket, register afs_int32 host,
2296                    register u_short port, u_short serviceId, afs_uint32 cid,
2297                    afs_uint32 epoch, int type, u_int securityIndex)
2298 {
2299     int hashindex, flag;
2300     register struct rx_connection *conn;
2301     hashindex = CONN_HASH(host, port, cid, epoch, type);
2302     MUTEX_ENTER(&rx_connHashTable_lock);
2303     rxLastConn ? (conn = rxLastConn, flag = 0) : (conn =
2304                                                   rx_connHashTable[hashindex],
2305                                                   flag = 1);
2306     for (; conn;) {
2307         if ((conn->type == type) && ((cid & RX_CIDMASK) == conn->cid)
2308             && (epoch == conn->epoch)) {
2309             register struct rx_peer *pp = conn->peer;
2310             if (securityIndex != conn->securityIndex) {
2311                 /* this isn't supposed to happen, but someone could forge a packet
2312                  * like this, and there seems to be some CM bug that makes this
2313                  * happen from time to time -- in which case, the fileserver
2314                  * asserts. */
2315                 MUTEX_EXIT(&rx_connHashTable_lock);
2316                 return (struct rx_connection *)0;
2317             }
2318             if (pp->host == host && pp->port == port)
2319                 break;
2320             if (type == RX_CLIENT_CONNECTION && pp->port == port)
2321                 break;
2322             /* So what happens when it's a callback connection? */
2323             if (                /*type == RX_CLIENT_CONNECTION && */
2324                    (conn->epoch & 0x80000000))
2325                 break;
2326         }
2327         if (!flag) {
2328             /* the connection rxLastConn that was used the last time is not the
2329              ** one we are looking for now. Hence, start searching in the hash */
2330             flag = 1;
2331             conn = rx_connHashTable[hashindex];
2332         } else
2333             conn = conn->next;
2334     }
2335     if (!conn) {
2336         struct rx_service *service;
2337         if (type == RX_CLIENT_CONNECTION) {
2338             MUTEX_EXIT(&rx_connHashTable_lock);
2339             return (struct rx_connection *)0;
2340         }
2341         service = rxi_FindService(socket, serviceId);
2342         if (!service || (securityIndex >= service->nSecurityObjects)
2343             || (service->securityObjects[securityIndex] == 0)) {
2344             MUTEX_EXIT(&rx_connHashTable_lock);
2345             return (struct rx_connection *)0;
2346         }
2347         conn = rxi_AllocConnection();   /* This bzero's the connection */
2348         MUTEX_INIT(&conn->conn_call_lock, "conn call lock", MUTEX_DEFAULT, 0);
2349         MUTEX_INIT(&conn->conn_data_lock, "conn data lock", MUTEX_DEFAULT, 0);
2350         CV_INIT(&conn->conn_call_cv, "conn call cv", CV_DEFAULT, 0);
2351         conn->next = rx_connHashTable[hashindex];
2352         rx_connHashTable[hashindex] = conn;
2353         conn->peer = rxi_FindPeer(host, port, 0, 1);
2354         conn->type = RX_SERVER_CONNECTION;
2355         conn->lastSendTime = clock_Sec();       /* don't GC immediately */
2356         conn->epoch = epoch;
2357         conn->cid = cid & RX_CIDMASK;
2358         /* conn->serial = conn->lastSerial = 0; */
2359         /* conn->timeout = 0; */
2360         conn->ackRate = RX_FAST_ACK_RATE;
2361         conn->service = service;
2362         conn->serviceId = serviceId;
2363         conn->securityIndex = securityIndex;
2364         conn->securityObject = service->securityObjects[securityIndex];
2365         conn->nSpecific = 0;
2366         conn->specific = NULL;
2367         rx_SetConnDeadTime(conn, service->connDeadTime);
2368         rx_SetConnIdleDeadTime(conn, service->idleDeadTime);
2369         /* Notify security object of the new connection */
2370         RXS_NewConnection(conn->securityObject, conn);
2371         /* XXXX Connection timeout? */
2372         if (service->newConnProc)
2373             (*service->newConnProc) (conn);
2374         MUTEX_ENTER(&rx_stats_mutex);
2375         rx_stats.nServerConns++;
2376         MUTEX_EXIT(&rx_stats_mutex);
2377     }
2378
2379     MUTEX_ENTER(&conn->conn_data_lock);
2380     conn->refCount++;
2381     MUTEX_EXIT(&conn->conn_data_lock);
2382
2383     rxLastConn = conn;          /* store this connection as the last conn used */
2384     MUTEX_EXIT(&rx_connHashTable_lock);
2385     return conn;
2386 }
2387
2388 /* There are two packet tracing routines available for testing and monitoring
2389  * Rx.  One is called just after every packet is received and the other is
2390  * called just before every packet is sent.  Received packets, have had their
2391  * headers decoded, and packets to be sent have not yet had their headers
2392  * encoded.  Both take two parameters: a pointer to the packet and a sockaddr
2393  * containing the network address.  Both can be modified.  The return value, if
2394  * non-zero, indicates that the packet should be dropped.  */
2395
2396 int (*rx_justReceived) () = 0;
2397 int (*rx_almostSent) () = 0;
2398
2399 /* A packet has been received off the interface.  Np is the packet, socket is
2400  * the socket number it was received from (useful in determining which service
2401  * this packet corresponds to), and (host, port) reflect the host,port of the
2402  * sender.  This call returns the packet to the caller if it is finished with
2403  * it, rather than de-allocating it, just as a small performance hack */
2404
2405 struct rx_packet *
2406 rxi_ReceivePacket(register struct rx_packet *np, osi_socket socket,
2407                   afs_uint32 host, u_short port, int *tnop,
2408                   struct rx_call **newcallp)
2409 {
2410     register struct rx_call *call;
2411     register struct rx_connection *conn;
2412     int channel;
2413     afs_uint32 currentCallNumber;
2414     int type;
2415     int skew;
2416 #ifdef RXDEBUG
2417     char *packetType;
2418 #endif
2419     struct rx_packet *tnp;
2420
2421 #ifdef RXDEBUG
2422 /* We don't print out the packet until now because (1) the time may not be
2423  * accurate enough until now in the lwp implementation (rx_Listener only gets
2424  * the time after the packet is read) and (2) from a protocol point of view,
2425  * this is the first time the packet has been seen */
2426     packetType = (np->header.type > 0 && np->header.type < RX_N_PACKET_TYPES)
2427         ? rx_packetTypes[np->header.type - 1] : "*UNKNOWN*";
2428     dpf(("R %d %s: %x.%d.%d.%d.%d.%d.%d flags %d, packet %x",
2429          np->header.serial, packetType, host, port, np->header.serviceId,
2430          np->header.epoch, np->header.cid, np->header.callNumber,
2431          np->header.seq, np->header.flags, np));
2432 #endif
2433
2434     if (np->header.type == RX_PACKET_TYPE_VERSION) {
2435         return rxi_ReceiveVersionPacket(np, socket, host, port, 1);
2436     }
2437
2438     if (np->header.type == RX_PACKET_TYPE_DEBUG) {
2439         return rxi_ReceiveDebugPacket(np, socket, host, port, 1);
2440     }
2441 #ifdef RXDEBUG
2442     /* If an input tracer function is defined, call it with the packet and
2443      * network address.  Note this function may modify its arguments. */
2444     if (rx_justReceived) {
2445         struct sockaddr_in addr;
2446         int drop;
2447         addr.sin_family = AF_INET;
2448         addr.sin_port = port;
2449         addr.sin_addr.s_addr = host;
2450 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
2451         addr.sin_len = sizeof(addr);
2452 #endif /* AFS_OSF_ENV */
2453         drop = (*rx_justReceived) (np, &addr);
2454         /* drop packet if return value is non-zero */
2455         if (drop)
2456             return np;
2457         port = addr.sin_port;   /* in case fcn changed addr */
2458         host = addr.sin_addr.s_addr;
2459     }
2460 #endif
2461
2462     /* If packet was not sent by the client, then *we* must be the client */
2463     type = ((np->header.flags & RX_CLIENT_INITIATED) != RX_CLIENT_INITIATED)
2464         ? RX_CLIENT_CONNECTION : RX_SERVER_CONNECTION;
2465
2466     /* Find the connection (or fabricate one, if we're the server & if
2467      * necessary) associated with this packet */
2468     conn =
2469         rxi_FindConnection(socket, host, port, np->header.serviceId,
2470                            np->header.cid, np->header.epoch, type,
2471                            np->header.securityIndex);
2472
2473     if (!conn) {
2474         /* If no connection found or fabricated, just ignore the packet.
2475          * (An argument could be made for sending an abort packet for
2476          * the conn) */
2477         return np;
2478     }
2479
2480     MUTEX_ENTER(&conn->conn_data_lock);
2481     if (conn->maxSerial < np->header.serial)
2482         conn->maxSerial = np->header.serial;
2483     MUTEX_EXIT(&conn->conn_data_lock);
2484
2485     /* If the connection is in an error state, send an abort packet and ignore
2486      * the incoming packet */
2487     if (conn->error) {
2488         /* Don't respond to an abort packet--we don't want loops! */
2489         MUTEX_ENTER(&conn->conn_data_lock);
2490         if (np->header.type != RX_PACKET_TYPE_ABORT)
2491             np = rxi_SendConnectionAbort(conn, np, 1, 0);
2492         conn->refCount--;
2493         MUTEX_EXIT(&conn->conn_data_lock);
2494         return np;
2495     }
2496
2497     /* Check for connection-only requests (i.e. not call specific). */
2498     if (np->header.callNumber == 0) {
2499         switch (np->header.type) {
2500         case RX_PACKET_TYPE_ABORT:
2501             /* What if the supplied error is zero? */
2502             rxi_ConnectionError(conn, ntohl(rx_GetInt32(np, 0)));
2503             MUTEX_ENTER(&conn->conn_data_lock);
2504             conn->refCount--;
2505             MUTEX_EXIT(&conn->conn_data_lock);
2506             return np;
2507         case RX_PACKET_TYPE_CHALLENGE:
2508             tnp = rxi_ReceiveChallengePacket(conn, np, 1);
2509             MUTEX_ENTER(&conn->conn_data_lock);
2510             conn->refCount--;
2511             MUTEX_EXIT(&conn->conn_data_lock);
2512             return tnp;
2513         case RX_PACKET_TYPE_RESPONSE:
2514             tnp = rxi_ReceiveResponsePacket(conn, np, 1);
2515             MUTEX_ENTER(&conn->conn_data_lock);
2516             conn->refCount--;
2517             MUTEX_EXIT(&conn->conn_data_lock);
2518             return tnp;
2519         case RX_PACKET_TYPE_PARAMS:
2520         case RX_PACKET_TYPE_PARAMS + 1:
2521         case RX_PACKET_TYPE_PARAMS + 2:
2522             /* ignore these packet types for now */
2523             MUTEX_ENTER(&conn->conn_data_lock);
2524             conn->refCount--;
2525             MUTEX_EXIT(&conn->conn_data_lock);
2526             return np;
2527
2528
2529         default:
2530             /* Should not reach here, unless the peer is broken: send an
2531              * abort packet */
2532             rxi_ConnectionError(conn, RX_PROTOCOL_ERROR);
2533             MUTEX_ENTER(&conn->conn_data_lock);
2534             tnp = rxi_SendConnectionAbort(conn, np, 1, 0);
2535             conn->refCount--;
2536             MUTEX_EXIT(&conn->conn_data_lock);
2537             return tnp;
2538         }
2539     }
2540
2541     channel = np->header.cid & RX_CHANNELMASK;
2542     call = conn->call[channel];
2543 #ifdef  RX_ENABLE_LOCKS
2544     if (call)
2545         MUTEX_ENTER(&call->lock);
2546     /* Test to see if call struct is still attached to conn. */
2547     if (call != conn->call[channel]) {
2548         if (call)
2549             MUTEX_EXIT(&call->lock);
2550         if (type == RX_SERVER_CONNECTION) {
2551             call = conn->call[channel];
2552             /* If we started with no call attached and there is one now,
2553              * another thread is also running this routine and has gotten
2554              * the connection channel. We should drop this packet in the tests
2555              * below. If there was a call on this connection and it's now
2556              * gone, then we'll be making a new call below.
2557              * If there was previously a call and it's now different then
2558              * the old call was freed and another thread running this routine
2559              * has created a call on this channel. One of these two threads
2560              * has a packet for the old call and the code below handles those
2561              * cases.
2562              */
2563             if (call)
2564                 MUTEX_ENTER(&call->lock);
2565         } else {
2566             /* This packet can't be for this call. If the new call address is
2567              * 0 then no call is running on this channel. If there is a call
2568              * then, since this is a client connection we're getting data for
2569              * it must be for the previous call.
2570              */
2571             MUTEX_ENTER(&rx_stats_mutex);
2572             rx_stats.spuriousPacketsRead++;
2573             MUTEX_EXIT(&rx_stats_mutex);
2574             MUTEX_ENTER(&conn->conn_data_lock);
2575             conn->refCount--;
2576             MUTEX_EXIT(&conn->conn_data_lock);
2577             return np;
2578         }
2579     }
2580 #endif
2581     currentCallNumber = conn->callNumber[channel];
2582
2583     if (type == RX_SERVER_CONNECTION) { /* We're the server */
2584         if (np->header.callNumber < currentCallNumber) {
2585             MUTEX_ENTER(&rx_stats_mutex);
2586             rx_stats.spuriousPacketsRead++;
2587             MUTEX_EXIT(&rx_stats_mutex);
2588 #ifdef  RX_ENABLE_LOCKS
2589             if (call)
2590                 MUTEX_EXIT(&call->lock);
2591 #endif
2592             MUTEX_ENTER(&conn->conn_data_lock);
2593             conn->refCount--;
2594             MUTEX_EXIT(&conn->conn_data_lock);
2595             return np;
2596         }
2597         if (!call) {
2598             MUTEX_ENTER(&conn->conn_call_lock);
2599             call = rxi_NewCall(conn, channel);
2600             MUTEX_EXIT(&conn->conn_call_lock);
2601             *call->callNumber = np->header.callNumber;
2602             call->state = RX_STATE_PRECALL;
2603             clock_GetTime(&call->queueTime);
2604             hzero(call->bytesSent);
2605             hzero(call->bytesRcvd);
2606             rxi_KeepAliveOn(call);
2607         } else if (np->header.callNumber != currentCallNumber) {
2608             /* Wait until the transmit queue is idle before deciding
2609              * whether to reset the current call. Chances are that the
2610              * call will be in ether DALLY or HOLD state once the TQ_BUSY
2611              * flag is cleared.
2612              */
2613 #ifdef AFS_GLOBAL_RXLOCK_KERNEL
2614             while ((call->state == RX_STATE_ACTIVE)
2615                    && (call->flags & RX_CALL_TQ_BUSY)) {
2616                 call->flags |= RX_CALL_TQ_WAIT;
2617 #ifdef RX_ENABLE_LOCKS
2618                 CV_WAIT(&call->cv_tq, &call->lock);
2619 #else /* RX_ENABLE_LOCKS */
2620                 osi_rxSleep(&call->tq);
2621 #endif /* RX_ENABLE_LOCKS */
2622             }
2623 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
2624             /* If the new call cannot be taken right now send a busy and set
2625              * the error condition in this call, so that it terminates as
2626              * quickly as possible */
2627             if (call->state == RX_STATE_ACTIVE) {
2628                 struct rx_packet *tp;
2629
2630                 rxi_CallError(call, RX_CALL_DEAD);
2631                 tp = rxi_SendSpecial(call, conn, np, RX_PACKET_TYPE_BUSY,
2632                                      NULL, 0, 1);
2633                 MUTEX_EXIT(&call->lock);
2634                 MUTEX_ENTER(&conn->conn_data_lock);
2635                 conn->refCount--;
2636                 MUTEX_EXIT(&conn->conn_data_lock);
2637                 return tp;
2638             }
2639             rxi_ResetCall(call, 0);
2640             *call->callNumber = np->header.callNumber;
2641             call->state = RX_STATE_PRECALL;
2642             clock_GetTime(&call->queueTime);
2643             hzero(call->bytesSent);
2644             hzero(call->bytesRcvd);
2645             /*
2646              * If the number of queued calls exceeds the overload
2647              * threshold then abort this call.
2648              */
2649             if ((rx_BusyThreshold > 0) && (rx_nWaiting > rx_BusyThreshold)) {
2650                 struct rx_packet *tp;
2651
2652                 rxi_CallError(call, rx_BusyError);
2653                 tp = rxi_SendCallAbort(call, np, 1, 0);
2654                 MUTEX_EXIT(&call->lock);
2655                 MUTEX_ENTER(&conn->conn_data_lock);
2656                 conn->refCount--;
2657                 MUTEX_EXIT(&conn->conn_data_lock);
2658                 MUTEX_ENTER(&rx_stats_mutex);
2659                 rx_stats.nBusies++;
2660                 MUTEX_EXIT(&rx_stats_mutex);
2661                 return tp;
2662             }
2663             rxi_KeepAliveOn(call);
2664         } else {
2665             /* Continuing call; do nothing here. */
2666         }
2667     } else {                    /* we're the client */
2668         /* Ignore all incoming acknowledgements for calls in DALLY state */
2669         if (call && (call->state == RX_STATE_DALLY)
2670             && (np->header.type == RX_PACKET_TYPE_ACK)) {
2671             MUTEX_ENTER(&rx_stats_mutex);
2672             rx_stats.ignorePacketDally++;
2673             MUTEX_EXIT(&rx_stats_mutex);
2674 #ifdef  RX_ENABLE_LOCKS
2675             if (call) {
2676                 MUTEX_EXIT(&call->lock);
2677             }
2678 #endif
2679             MUTEX_ENTER(&conn->conn_data_lock);
2680             conn->refCount--;
2681             MUTEX_EXIT(&conn->conn_data_lock);
2682             return np;
2683         }
2684
2685         /* Ignore anything that's not relevant to the current call.  If there
2686          * isn't a current call, then no packet is relevant. */
2687         if (!call || (np->header.callNumber != currentCallNumber)) {
2688             MUTEX_ENTER(&rx_stats_mutex);
2689             rx_stats.spuriousPacketsRead++;
2690             MUTEX_EXIT(&rx_stats_mutex);
2691 #ifdef  RX_ENABLE_LOCKS
2692             if (call) {
2693                 MUTEX_EXIT(&call->lock);
2694             }
2695 #endif
2696             MUTEX_ENTER(&conn->conn_data_lock);
2697             conn->refCount--;
2698             MUTEX_EXIT(&conn->conn_data_lock);
2699             return np;
2700         }
2701         /* If the service security object index stamped in the packet does not
2702          * match the connection's security index, ignore the packet */
2703         if (np->header.securityIndex != conn->securityIndex) {
2704 #ifdef  RX_ENABLE_LOCKS
2705             MUTEX_EXIT(&call->lock);
2706 #endif
2707             MUTEX_ENTER(&conn->conn_data_lock);
2708             conn->refCount--;
2709             MUTEX_EXIT(&conn->conn_data_lock);
2710             return np;
2711         }
2712
2713         /* If we're receiving the response, then all transmit packets are
2714          * implicitly acknowledged.  Get rid of them. */
2715         if (np->header.type == RX_PACKET_TYPE_DATA) {
2716 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
2717             /* XXX Hack. Because we must release the global rx lock when
2718              * sending packets (osi_NetSend) we drop all acks while we're
2719              * traversing the tq in rxi_Start sending packets out because
2720              * packets may move to the freePacketQueue as result of being here!
2721              * So we drop these packets until we're safely out of the
2722              * traversing. Really ugly! 
2723              * For fine grain RX locking, we set the acked field in the
2724              * packets and let rxi_Start remove them from the transmit queue.
2725              */
2726             if (call->flags & RX_CALL_TQ_BUSY) {
2727 #ifdef  RX_ENABLE_LOCKS
2728                 rxi_SetAcksInTransmitQueue(call);
2729 #else
2730                 conn->refCount--;
2731                 return np;      /* xmitting; drop packet */
2732 #endif
2733             } else {
2734                 rxi_ClearTransmitQueue(call, 0);
2735             }
2736 #else /* AFS_GLOBAL_RXLOCK_KERNEL */
2737             rxi_ClearTransmitQueue(call, 0);
2738 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
2739         } else {
2740             if (np->header.type == RX_PACKET_TYPE_ACK) {
2741                 /* now check to see if this is an ack packet acknowledging that the
2742                  * server actually *lost* some hard-acked data.  If this happens we
2743                  * ignore this packet, as it may indicate that the server restarted in
2744                  * the middle of a call.  It is also possible that this is an old ack
2745                  * packet.  We don't abort the connection in this case, because this
2746                  * *might* just be an old ack packet.  The right way to detect a server
2747                  * restart in the midst of a call is to notice that the server epoch
2748                  * changed, btw.  */
2749                 /* XXX I'm not sure this is exactly right, since tfirst **IS**
2750                  * XXX unacknowledged.  I think that this is off-by-one, but
2751                  * XXX I don't dare change it just yet, since it will
2752                  * XXX interact badly with the server-restart detection 
2753                  * XXX code in receiveackpacket.  */
2754                 if (ntohl(rx_GetInt32(np, FIRSTACKOFFSET)) < call->tfirst) {
2755                     MUTEX_ENTER(&rx_stats_mutex);
2756                     rx_stats.spuriousPacketsRead++;
2757                     MUTEX_EXIT(&rx_stats_mutex);
2758                     MUTEX_EXIT(&call->lock);
2759                     MUTEX_ENTER(&conn->conn_data_lock);
2760                     conn->refCount--;
2761                     MUTEX_EXIT(&conn->conn_data_lock);
2762                     return np;
2763                 }
2764             }
2765         }                       /* else not a data packet */
2766     }
2767
2768     osirx_AssertMine(&call->lock, "rxi_ReceivePacket middle");
2769     /* Set remote user defined status from packet */
2770     call->remoteStatus = np->header.userStatus;
2771
2772     /* Note the gap between the expected next packet and the actual
2773      * packet that arrived, when the new packet has a smaller serial number
2774      * than expected.  Rioses frequently reorder packets all by themselves,
2775      * so this will be quite important with very large window sizes.
2776      * Skew is checked against 0 here to avoid any dependence on the type of
2777      * inPacketSkew (which may be unsigned).  In C, -1 > (unsigned) 0 is always
2778      * true! 
2779      * The inPacketSkew should be a smoothed running value, not just a maximum.  MTUXXX
2780      * see CalculateRoundTripTime for an example of how to keep smoothed values.
2781      * I think using a beta of 1/8 is probably appropriate.  93.04.21
2782      */
2783     MUTEX_ENTER(&conn->conn_data_lock);
2784     skew = conn->lastSerial - np->header.serial;
2785     conn->lastSerial = np->header.serial;
2786     MUTEX_EXIT(&conn->conn_data_lock);
2787     if (skew > 0) {
2788         register struct rx_peer *peer;
2789         peer = conn->peer;
2790         if (skew > peer->inPacketSkew) {
2791             dpf(("*** In skew changed from %d to %d\n", peer->inPacketSkew,
2792                  skew));
2793             peer->inPacketSkew = skew;
2794         }
2795     }
2796
2797     /* Now do packet type-specific processing */
2798     switch (np->header.type) {
2799     case RX_PACKET_TYPE_DATA:
2800         np = rxi_ReceiveDataPacket(call, np, 1, socket, host, port, tnop,
2801                                    newcallp);
2802         break;
2803     case RX_PACKET_TYPE_ACK:
2804         /* Respond immediately to ack packets requesting acknowledgement
2805          * (ping packets) */
2806         if (np->header.flags & RX_REQUEST_ACK) {
2807             if (call->error)
2808                 (void)rxi_SendCallAbort(call, 0, 1, 0);
2809             else
2810                 (void)rxi_SendAck(call, 0, np->header.serial,
2811                                   RX_ACK_PING_RESPONSE, 1);
2812         }
2813         np = rxi_ReceiveAckPacket(call, np, 1);
2814         break;
2815     case RX_PACKET_TYPE_ABORT:
2816         /* An abort packet: reset the connection, passing the error up to
2817          * the user */
2818         /* What if error is zero? */
2819         rxi_CallError(call, ntohl(*(afs_int32 *) rx_DataOf(np)));
2820         break;
2821     case RX_PACKET_TYPE_BUSY:
2822         /* XXXX */
2823         break;
2824     case RX_PACKET_TYPE_ACKALL:
2825         /* All packets acknowledged, so we can drop all packets previously
2826          * readied for sending */
2827 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
2828         /* XXX Hack. We because we can't release the global rx lock when
2829          * sending packets (osi_NetSend) we drop all ack pkts while we're
2830          * traversing the tq in rxi_Start sending packets out because
2831          * packets may move to the freePacketQueue as result of being
2832          * here! So we drop these packets until we're safely out of the
2833          * traversing. Really ugly! 
2834          * For fine grain RX locking, we set the acked field in the packets
2835          * and let rxi_Start remove the packets from the transmit queue.
2836          */
2837         if (call->flags & RX_CALL_TQ_BUSY) {
2838 #ifdef  RX_ENABLE_LOCKS
2839             rxi_SetAcksInTransmitQueue(call);
2840             break;
2841 #else /* RX_ENABLE_LOCKS */
2842             conn->refCount--;
2843             return np;          /* xmitting; drop packet */
2844 #endif /* RX_ENABLE_LOCKS */
2845         }
2846 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
2847         rxi_ClearTransmitQueue(call, 0);
2848         break;
2849     default:
2850         /* Should not reach here, unless the peer is broken: send an abort
2851          * packet */
2852         rxi_CallError(call, RX_PROTOCOL_ERROR);
2853         np = rxi_SendCallAbort(call, np, 1, 0);
2854         break;
2855     };
2856     /* Note when this last legitimate packet was received, for keep-alive
2857      * processing.  Note, we delay getting the time until now in the hope that
2858      * the packet will be delivered to the user before any get time is required
2859      * (if not, then the time won't actually be re-evaluated here). */
2860     call->lastReceiveTime = clock_Sec();
2861     MUTEX_EXIT(&call->lock);
2862     MUTEX_ENTER(&conn->conn_data_lock);
2863     conn->refCount--;
2864     MUTEX_EXIT(&conn->conn_data_lock);
2865     return np;
2866 }
2867
2868 /* return true if this is an "interesting" connection from the point of view
2869     of someone trying to debug the system */
2870 int
2871 rxi_IsConnInteresting(struct rx_connection *aconn)
2872 {
2873     register int i;
2874     register struct rx_call *tcall;
2875
2876     if (aconn->flags & (RX_CONN_MAKECALL_WAITING | RX_CONN_DESTROY_ME))
2877         return 1;
2878     for (i = 0; i < RX_MAXCALLS; i++) {
2879         tcall = aconn->call[i];
2880         if (tcall) {
2881             if ((tcall->state == RX_STATE_PRECALL)
2882                 || (tcall->state == RX_STATE_ACTIVE))
2883                 return 1;
2884             if ((tcall->mode == RX_MODE_SENDING)
2885                 || (tcall->mode == RX_MODE_RECEIVING))
2886                 return 1;
2887         }
2888     }
2889     return 0;
2890 }
2891
2892 #ifdef KERNEL
2893 /* if this is one of the last few packets AND it wouldn't be used by the
2894    receiving call to immediately satisfy a read request, then drop it on
2895    the floor, since accepting it might prevent a lock-holding thread from
2896    making progress in its reading. If a call has been cleared while in
2897    the precall state then ignore all subsequent packets until the call
2898    is assigned to a thread. */
2899
2900 static int
2901 TooLow(struct rx_packet *ap, struct rx_call *acall)
2902 {
2903     int rc = 0;
2904     MUTEX_ENTER(&rx_stats_mutex);
2905     if (((ap->header.seq != 1) && (acall->flags & RX_CALL_CLEARED)
2906          && (acall->state == RX_STATE_PRECALL))
2907         || ((rx_nFreePackets < rxi_dataQuota + 2)
2908             && !((ap->header.seq < acall->rnext + rx_initSendWindow)
2909                  && (acall->flags & RX_CALL_READER_WAIT)))) {
2910         rc = 1;
2911     }
2912     MUTEX_EXIT(&rx_stats_mutex);
2913     return rc;
2914 }
2915 #endif /* KERNEL */
2916
2917 static void
2918 rxi_CheckReachEvent(struct rxevent *event, struct rx_connection *conn,
2919                     struct rx_call *acall)
2920 {
2921     struct rx_call *call = acall;
2922     struct clock when;
2923     int i, waiting;
2924
2925     MUTEX_ENTER(&conn->conn_data_lock);
2926     conn->checkReachEvent = NULL;
2927     waiting = conn->flags & RX_CONN_ATTACHWAIT;
2928     if (event)
2929         conn->refCount--;
2930     MUTEX_EXIT(&conn->conn_data_lock);
2931
2932     if (waiting) {
2933         if (!call) {
2934             MUTEX_ENTER(&conn->conn_call_lock);
2935             MUTEX_ENTER(&conn->conn_data_lock);
2936             for (i = 0; i < RX_MAXCALLS; i++) {
2937                 struct rx_call *tc = conn->call[i];
2938                 if (tc && tc->state == RX_STATE_PRECALL) {
2939                     call = tc;
2940                     break;
2941                 }
2942             }
2943             if (!call)
2944                 /* Indicate that rxi_CheckReachEvent is no longer running by
2945                  * clearing the flag.  Must be atomic under conn_data_lock to
2946                  * avoid a new call slipping by: rxi_CheckConnReach holds
2947                  * conn_data_lock while checking RX_CONN_ATTACHWAIT.
2948                  */
2949                 conn->flags &= ~RX_CONN_ATTACHWAIT;
2950             MUTEX_EXIT(&conn->conn_data_lock);
2951             MUTEX_EXIT(&conn->conn_call_lock);
2952         }
2953
2954         if (call) {
2955             if (call != acall)
2956                 MUTEX_ENTER(&call->lock);
2957             rxi_SendAck(call, NULL, 0, RX_ACK_PING, 0);
2958             if (call != acall)
2959                 MUTEX_EXIT(&call->lock);
2960
2961             clock_GetTime(&when);
2962             when.sec += RX_CHECKREACH_TIMEOUT;
2963             MUTEX_ENTER(&conn->conn_data_lock);
2964             if (!conn->checkReachEvent) {
2965                 conn->refCount++;
2966                 conn->checkReachEvent =
2967                     rxevent_Post(&when, rxi_CheckReachEvent, conn, NULL);
2968             }
2969             MUTEX_EXIT(&conn->conn_data_lock);
2970         }
2971     }
2972 }
2973
2974 static int
2975 rxi_CheckConnReach(struct rx_connection *conn, struct rx_call *call)
2976 {
2977     struct rx_service *service = conn->service;
2978     struct rx_peer *peer = conn->peer;
2979     afs_uint32 now, lastReach;
2980
2981     if (service->checkReach == 0)
2982         return 0;
2983
2984     now = clock_Sec();
2985     MUTEX_ENTER(&peer->peer_lock);
2986     lastReach = peer->lastReachTime;
2987     MUTEX_EXIT(&peer->peer_lock);
2988     if (now - lastReach < RX_CHECKREACH_TTL)
2989         return 0;
2990
2991     MUTEX_ENTER(&conn->conn_data_lock);
2992     if (conn->flags & RX_CONN_ATTACHWAIT) {
2993         MUTEX_EXIT(&conn->conn_data_lock);
2994         return 1;
2995     }
2996     conn->flags |= RX_CONN_ATTACHWAIT;
2997     MUTEX_EXIT(&conn->conn_data_lock);
2998     if (!conn->checkReachEvent)
2999         rxi_CheckReachEvent(NULL, conn, call);
3000
3001     return 1;
3002 }
3003
3004 /* try to attach call, if authentication is complete */
3005 static void
3006 TryAttach(register struct rx_call *acall, register osi_socket socket,
3007           register int *tnop, register struct rx_call **newcallp,
3008           int reachOverride)
3009 {
3010     struct rx_connection *conn = acall->conn;
3011
3012     if (conn->type == RX_SERVER_CONNECTION
3013         && acall->state == RX_STATE_PRECALL) {
3014         /* Don't attach until we have any req'd. authentication. */
3015         if (RXS_CheckAuthentication(conn->securityObject, conn) == 0) {
3016             if (reachOverride || rxi_CheckConnReach(conn, acall) == 0)
3017                 rxi_AttachServerProc(acall, socket, tnop, newcallp);
3018             /* Note:  this does not necessarily succeed; there
3019              * may not any proc available
3020              */
3021         } else {
3022             rxi_ChallengeOn(acall->conn);
3023         }
3024     }
3025 }
3026
3027 /* A data packet has been received off the interface.  This packet is
3028  * appropriate to the call (the call is in the right state, etc.).  This
3029  * routine can return a packet to the caller, for re-use */
3030
3031 struct rx_packet *
3032 rxi_ReceiveDataPacket(register struct rx_call *call,
3033                       register struct rx_packet *np, int istack,
3034                       osi_socket socket, afs_uint32 host, u_short port,
3035                       int *tnop, struct rx_call **newcallp)
3036 {
3037     int ackNeeded = 0;          /* 0 means no, otherwise ack_reason */
3038     int newPackets = 0;
3039     int didHardAck = 0;
3040     int haveLast = 0;
3041     afs_uint32 seq, serial, flags;
3042     int isFirst;
3043     struct rx_packet *tnp;
3044     struct clock when;
3045     MUTEX_ENTER(&rx_stats_mutex);
3046     rx_stats.dataPacketsRead++;
3047     MUTEX_EXIT(&rx_stats_mutex);
3048
3049 #ifdef KERNEL
3050     /* If there are no packet buffers, drop this new packet, unless we can find
3051      * packet buffers from inactive calls */
3052     if (!call->error
3053         && (rxi_OverQuota(RX_PACKET_CLASS_RECEIVE) || TooLow(np, call))) {
3054         MUTEX_ENTER(&rx_freePktQ_lock);
3055         rxi_NeedMorePackets = TRUE;
3056         MUTEX_EXIT(&rx_freePktQ_lock);
3057         MUTEX_ENTER(&rx_stats_mutex);
3058         rx_stats.noPacketBuffersOnRead++;
3059         MUTEX_EXIT(&rx_stats_mutex);
3060         call->rprev = np->header.serial;
3061         rxi_calltrace(RX_TRACE_DROP, call);
3062         dpf(("packet %x dropped on receipt - quota problems", np));
3063         if (rxi_doreclaim)
3064             rxi_ClearReceiveQueue(call);
3065         clock_GetTime(&when);
3066         clock_Add(&when, &rx_softAckDelay);
3067         if (!call->delayedAckEvent
3068             || clock_Gt(&call->delayedAckEvent->eventTime, &when)) {
3069             rxevent_Cancel(call->delayedAckEvent, call,
3070                            RX_CALL_REFCOUNT_DELAY);
3071             CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
3072             call->delayedAckEvent =
3073                 rxevent_Post(&when, rxi_SendDelayedAck, call, 0);
3074         }
3075         /* we've damaged this call already, might as well do it in. */
3076         return np;
3077     }
3078 #endif /* KERNEL */
3079
3080     /*
3081      * New in AFS 3.5, if the RX_JUMBO_PACKET flag is set then this
3082      * packet is one of several packets transmitted as a single
3083      * datagram. Do not send any soft or hard acks until all packets
3084      * in a jumbogram have been processed. Send negative acks right away.
3085      */
3086     for (isFirst = 1, tnp = NULL; isFirst || tnp; isFirst = 0) {
3087         /* tnp is non-null when there are more packets in the
3088          * current jumbo gram */
3089         if (tnp) {
3090             if (np)
3091                 rxi_FreePacket(np);
3092             np = tnp;
3093         }
3094
3095         seq = np->header.seq;
3096         serial = np->header.serial;
3097         flags = np->header.flags;
3098
3099         /* If the call is in an error state, send an abort message */
3100         if (call->error)
3101             return rxi_SendCallAbort(call, np, istack, 0);
3102
3103         /* The RX_JUMBO_PACKET is set in all but the last packet in each
3104          * AFS 3.5 jumbogram. */
3105         if (flags & RX_JUMBO_PACKET) {
3106             tnp = rxi_SplitJumboPacket(np, host, port, isFirst);
3107         } else {
3108             tnp = NULL;
3109         }
3110
3111         if (np->header.spare != 0) {
3112             MUTEX_ENTER(&call->conn->conn_data_lock);
3113             call->conn->flags |= RX_CONN_USING_PACKET_CKSUM;
3114             MUTEX_EXIT(&call->conn->conn_data_lock);
3115         }
3116
3117         /* The usual case is that this is the expected next packet */
3118         if (seq == call->rnext) {
3119
3120             /* Check to make sure it is not a duplicate of one already queued */
3121             if (queue_IsNotEmpty(&call->rq)
3122                 && queue_First(&call->rq, rx_packet)->header.seq == seq) {
3123                 MUTEX_ENTER(&rx_stats_mutex);
3124                 rx_stats.dupPacketsRead++;
3125                 MUTEX_EXIT(&rx_stats_mutex);
3126                 dpf(("packet %x dropped on receipt - duplicate", np));
3127                 rxevent_Cancel(call->delayedAckEvent, call,
3128                                RX_CALL_REFCOUNT_DELAY);
3129                 np = rxi_SendAck(call, np, serial, RX_ACK_DUPLICATE, istack);
3130                 ackNeeded = 0;
3131                 call->rprev = seq;
3132                 continue;
3133             }
3134
3135             /* It's the next packet. Stick it on the receive queue
3136              * for this call. Set newPackets to make sure we wake
3137              * the reader once all packets have been processed */
3138             queue_Prepend(&call->rq, np);
3139             call->nSoftAcks++;
3140             np = NULL;          /* We can't use this anymore */
3141             newPackets = 1;
3142
3143             /* If an ack is requested then set a flag to make sure we
3144              * send an acknowledgement for this packet */
3145             if (flags & RX_REQUEST_ACK) {
3146                 ackNeeded = RX_ACK_REQUESTED;
3147             }
3148
3149             /* Keep track of whether we have received the last packet */
3150             if (flags & RX_LAST_PACKET) {
3151                 call->flags |= RX_CALL_HAVE_LAST;
3152                 haveLast = 1;
3153             }
3154
3155             /* Check whether we have all of the packets for this call */
3156             if (call->flags & RX_CALL_HAVE_LAST) {
3157                 afs_uint32 tseq;        /* temporary sequence number */
3158                 struct rx_packet *tp;   /* Temporary packet pointer */
3159                 struct rx_packet *nxp;  /* Next pointer, for queue_Scan */
3160
3161                 for (tseq = seq, queue_Scan(&call->rq, tp, nxp, rx_packet)) {
3162                     if (tseq != tp->header.seq)
3163                         break;
3164                     if (tp->header.flags & RX_LAST_PACKET) {
3165                         call->flags |= RX_CALL_RECEIVE_DONE;
3166                         break;
3167                     }
3168                     tseq++;
3169                 }
3170             }
3171
3172             /* Provide asynchronous notification for those who want it
3173              * (e.g. multi rx) */
3174             if (call->arrivalProc) {
3175                 (*call->arrivalProc) (call, call->arrivalProcHandle,
3176                                       call->arrivalProcArg);
3177                 call->arrivalProc = (void (*)())0;
3178             }
3179
3180             /* Update last packet received */
3181             call->rprev = seq;
3182
3183             /* If there is no server process serving this call, grab
3184              * one, if available. We only need to do this once. If a
3185              * server thread is available, this thread becomes a server
3186              * thread and the server thread becomes a listener thread. */
3187             if (isFirst) {
3188                 TryAttach(call, socket, tnop, newcallp, 0);
3189             }
3190         }
3191         /* This is not the expected next packet. */
3192         else {
3193             /* Determine whether this is a new or old packet, and if it's
3194              * a new one, whether it fits into the current receive window.
3195              * Also figure out whether the packet was delivered in sequence.
3196              * We use the prev variable to determine whether the new packet
3197              * is the successor of its immediate predecessor in the
3198              * receive queue, and the missing flag to determine whether
3199              * any of this packets predecessors are missing.  */
3200
3201             afs_uint32 prev;    /* "Previous packet" sequence number */
3202             struct rx_packet *tp;       /* Temporary packet pointer */
3203             struct rx_packet *nxp;      /* Next pointer, for queue_Scan */
3204             int missing;        /* Are any predecessors missing? */
3205
3206             /* If the new packet's sequence number has been sent to the
3207              * application already, then this is a duplicate */
3208             if (seq < call->rnext) {
3209                 MUTEX_ENTER(&rx_stats_mutex);
3210                 rx_stats.dupPacketsRead++;
3211                 MUTEX_EXIT(&rx_stats_mutex);
3212                 rxevent_Cancel(call->delayedAckEvent, call,
3213                                RX_CALL_REFCOUNT_DELAY);
3214                 np = rxi_SendAck(call, np, serial, RX_ACK_DUPLICATE, istack);
3215                 ackNeeded = 0;
3216                 call->rprev = seq;
3217                 continue;
3218             }
3219
3220             /* If the sequence number is greater than what can be
3221              * accomodated by the current window, then send a negative
3222              * acknowledge and drop the packet */
3223             if ((call->rnext + call->rwind) <= seq) {
3224                 rxevent_Cancel(call->delayedAckEvent, call,
3225                                RX_CALL_REFCOUNT_DELAY);
3226                 np = rxi_SendAck(call, np, serial, RX_ACK_EXCEEDS_WINDOW,
3227                                  istack);
3228                 ackNeeded = 0;
3229                 call->rprev = seq;
3230                 continue;
3231             }
3232
3233             /* Look for the packet in the queue of old received packets */
3234             for (prev = call->rnext - 1, missing =
3235                  0, queue_Scan(&call->rq, tp, nxp, rx_packet)) {
3236                 /*Check for duplicate packet */
3237                 if (seq == tp->header.seq) {
3238                     MUTEX_ENTER(&rx_stats_mutex);
3239                     rx_stats.dupPacketsRead++;
3240                     MUTEX_EXIT(&rx_stats_mutex);
3241                     rxevent_Cancel(call->delayedAckEvent, call,
3242                                    RX_CALL_REFCOUNT_DELAY);
3243                     np = rxi_SendAck(call, np, serial, RX_ACK_DUPLICATE,
3244                                      istack);
3245                     ackNeeded = 0;
3246                     call->rprev = seq;
3247                     goto nextloop;
3248                 }
3249                 /* If we find a higher sequence packet, break out and
3250                  * insert the new packet here. */
3251                 if (seq < tp->header.seq)
3252                     break;
3253                 /* Check for missing packet */
3254                 if (tp->header.seq != prev + 1) {
3255                     missing = 1;
3256                 }
3257
3258                 prev = tp->header.seq;
3259             }
3260
3261             /* Keep track of whether we have received the last packet. */
3262             if (flags & RX_LAST_PACKET) {
3263                 call->flags |= RX_CALL_HAVE_LAST;
3264             }
3265
3266             /* It's within the window: add it to the the receive queue.
3267              * tp is left by the previous loop either pointing at the
3268              * packet before which to insert the new packet, or at the
3269              * queue head if the queue is empty or the packet should be
3270              * appended. */
3271             queue_InsertBefore(tp, np);
3272             call->nSoftAcks++;
3273             np = NULL;
3274
3275             /* Check whether we have all of the packets for this call */
3276             if ((call->flags & RX_CALL_HAVE_LAST)
3277                 && !(call->flags & RX_CALL_RECEIVE_DONE)) {
3278                 afs_uint32 tseq;        /* temporary sequence number */
3279
3280                 for (tseq =
3281                      call->rnext, queue_Scan(&call->rq, tp, nxp, rx_packet)) {
3282                     if (tseq != tp->header.seq)
3283                         break;
3284                     if (tp->header.flags & RX_LAST_PACKET) {
3285                         call->flags |= RX_CALL_RECEIVE_DONE;
3286                         break;
3287                     }
3288                     tseq++;
3289                 }
3290             }
3291
3292             /* We need to send an ack of the packet is out of sequence, 
3293              * or if an ack was requested by the peer. */
3294             if (seq != prev + 1 || missing || (flags & RX_REQUEST_ACK)) {
3295                 ackNeeded = RX_ACK_OUT_OF_SEQUENCE;
3296             }
3297
3298             /* Acknowledge the last packet for each call */
3299             if (flags & RX_LAST_PACKET) {
3300                 haveLast = 1;
3301             }
3302
3303             call->rprev = seq;
3304         }
3305       nextloop:;
3306     }
3307
3308     if (newPackets) {
3309         /*
3310          * If the receiver is waiting for an iovec, fill the iovec
3311          * using the data from the receive queue */
3312         if (call->flags & RX_CALL_IOVEC_WAIT) {
3313             didHardAck = rxi_FillReadVec(call, serial);
3314             /* the call may have been aborted */
3315             if (call->error) {
3316                 return NULL;
3317             }
3318             if (didHardAck) {
3319                 ackNeeded = 0;
3320             }
3321         }
3322
3323         /* Wakeup the reader if any */
3324         if ((call->flags & RX_CALL_READER_WAIT)
3325             && (!(call->flags & RX_CALL_IOVEC_WAIT) || !(call->iovNBytes)
3326                 || (call->iovNext >= call->iovMax)
3327                 || (call->flags & RX_CALL_RECEIVE_DONE))) {
3328             call->flags &= ~RX_CALL_READER_WAIT;
3329 #ifdef  RX_ENABLE_LOCKS
3330             CV_BROADCAST(&call->cv_rq);
3331 #else
3332             osi_rxWakeup(&call->rq);
3333 #endif
3334         }
3335     }
3336
3337     /*
3338      * Send an ack when requested by the peer, or once every
3339      * rxi_SoftAckRate packets until the last packet has been
3340      * received. Always send a soft ack for the last packet in
3341      * the server's reply. */
3342     if (ackNeeded) {
3343         rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
3344         np = rxi_SendAck(call, np, serial, ackNeeded, istack);
3345     } else if (call->nSoftAcks > (u_short) rxi_SoftAckRate) {
3346         rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
3347         np = rxi_SendAck(call, np, serial, RX_ACK_IDLE, istack);
3348     } else if (call->nSoftAcks) {
3349         clock_GetTime(&when);
3350         if (haveLast && !(flags & RX_CLIENT_INITIATED)) {
3351             clock_Add(&when, &rx_lastAckDelay);
3352         } else {
3353             clock_Add(&when, &rx_softAckDelay);
3354         }
3355         if (!call->delayedAckEvent
3356             || clock_Gt(&call->delayedAckEvent->eventTime, &when)) {
3357             rxevent_Cancel(call->delayedAckEvent, call,
3358                            RX_CALL_REFCOUNT_DELAY);
3359             CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
3360             call->delayedAckEvent =
3361                 rxevent_Post(&when, rxi_SendDelayedAck, call, 0);
3362         }
3363     } else if (call->flags & RX_CALL_RECEIVE_DONE) {
3364         rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
3365     }
3366
3367     return np;
3368 }
3369
3370 #ifdef  ADAPT_WINDOW
3371 static void rxi_ComputeRate();
3372 #endif
3373
3374 static void
3375 rxi_UpdatePeerReach(struct rx_connection *conn, struct rx_call *acall)
3376 {
3377     struct rx_peer *peer = conn->peer;
3378
3379     MUTEX_ENTER(&peer->peer_lock);
3380     peer->lastReachTime = clock_Sec();
3381     MUTEX_EXIT(&peer->peer_lock);
3382
3383     MUTEX_ENTER(&conn->conn_data_lock);
3384     if (conn->flags & RX_CONN_ATTACHWAIT) {
3385         int i;
3386
3387         conn->flags &= ~RX_CONN_ATTACHWAIT;
3388         MUTEX_EXIT(&conn->conn_data_lock);
3389
3390         for (i = 0; i < RX_MAXCALLS; i++) {
3391             struct rx_call *call = conn->call[i];
3392             if (call) {
3393                 if (call != acall)
3394                     MUTEX_ENTER(&call->lock);
3395                 /* tnop can be null if newcallp is null */
3396                 TryAttach(call, (osi_socket) - 1, NULL, NULL, 1);
3397                 if (call != acall)
3398                     MUTEX_EXIT(&call->lock);
3399             }
3400         }
3401     } else
3402         MUTEX_EXIT(&conn->conn_data_lock);
3403 }
3404
3405 /* rxi_ComputePeerNetStats
3406  *
3407  * Called exclusively by rxi_ReceiveAckPacket to compute network link
3408  * estimates (like RTT and throughput) based on ack packets.  Caller
3409  * must ensure that the packet in question is the right one (i.e.
3410  * serial number matches).
3411  */
3412 static void
3413 rxi_ComputePeerNetStats(struct rx_call *call, struct rx_packet *p,
3414                         struct rx_ackPacket *ap, struct rx_packet *np)
3415 {
3416     struct rx_peer *peer = call->conn->peer;
3417
3418     /* Use RTT if not delayed by client. */
3419     if (ap->reason != RX_ACK_DELAY)
3420         rxi_ComputeRoundTripTime(p, &p->timeSent, peer);
3421 #ifdef ADAPT_WINDOW
3422     rxi_ComputeRate(peer, call, p, np, ap->reason);
3423 #endif
3424 }
3425
3426 /* The real smarts of the whole thing.  */
3427 struct rx_packet *
3428 rxi_ReceiveAckPacket(register struct rx_call *call, struct rx_packet *np,
3429                      int istack)
3430 {
3431     struct rx_ackPacket *ap;
3432     int nAcks;
3433     register struct rx_packet *tp;
3434     register struct rx_packet *nxp;     /* Next packet pointer for queue_Scan */
3435     register struct rx_connection *conn = call->conn;
3436     struct rx_peer *peer = conn->peer;
3437     afs_uint32 first;
3438     afs_uint32 serial;
3439     /* because there are CM's that are bogus, sending weird values for this. */
3440     afs_uint32 skew = 0;
3441     int nbytes;
3442     int missing;
3443     int acked;
3444     int nNacked = 0;
3445     int newAckCount = 0;
3446     u_short maxMTU = 0;         /* Set if peer supports AFS 3.4a jumbo datagrams */
3447     int maxDgramPackets = 0;    /* Set if peer supports AFS 3.5 jumbo datagrams */
3448
3449     MUTEX_ENTER(&rx_stats_mutex);
3450     rx_stats.ackPacketsRead++;
3451     MUTEX_EXIT(&rx_stats_mutex);
3452     ap = (struct rx_ackPacket *)rx_DataOf(np);
3453     nbytes = rx_Contiguous(np) - ((ap->acks) - (u_char *) ap);
3454     if (nbytes < 0)
3455         return np;              /* truncated ack packet */
3456
3457     /* depends on ack packet struct */
3458     nAcks = MIN((unsigned)nbytes, (unsigned)ap->nAcks);
3459     first = ntohl(ap->firstPacket);
3460     serial = ntohl(ap->serial);
3461     /* temporarily disabled -- needs to degrade over time 
3462      * skew = ntohs(ap->maxSkew); */
3463
3464     /* Ignore ack packets received out of order */
3465     if (first < call->tfirst) {
3466         return np;
3467     }
3468
3469     if (np->header.flags & RX_SLOW_START_OK) {
3470         call->flags |= RX_CALL_SLOW_START_OK;
3471     }
3472
3473     if (ap->reason == RX_ACK_PING_RESPONSE)
3474         rxi_UpdatePeerReach(conn, call);
3475
3476 #ifdef RXDEBUG
3477     if (rx_Log) {
3478         fprintf(rx_Log,
3479                 "RACK: reason %x previous %u seq %u serial %u skew %d first %u",
3480                 ap->reason, ntohl(ap->previousPacket),
3481                 (unsigned int)np->header.seq, (unsigned int)serial,
3482                 (unsigned int)skew, ntohl(ap->firstPacket));
3483         if (nAcks) {
3484             int offset;
3485             for (offset = 0; offset < nAcks; offset++)
3486                 putc(ap->acks[offset] == RX_ACK_TYPE_NACK ? '-' : '*',
3487                      rx_Log);
3488         }
3489         putc('\n', rx_Log);
3490     }
3491 #endif
3492
3493     /* Update the outgoing packet skew value to the latest value of
3494      * the peer's incoming packet skew value.  The ack packet, of
3495      * course, could arrive out of order, but that won't affect things
3496      * much */
3497     MUTEX_ENTER(&peer->peer_lock);
3498     peer->outPacketSkew = skew;
3499
3500     /* Check for packets that no longer need to be transmitted, and
3501      * discard them.  This only applies to packets positively
3502      * acknowledged as having been sent to the peer's upper level.
3503      * All other packets must be retained.  So only packets with
3504      * sequence numbers < ap->firstPacket are candidates. */
3505     for (queue_Scan(&call->tq, tp, nxp, rx_packet)) {
3506         if (tp->header.seq >= first)
3507             break;
3508         call->tfirst = tp->header.seq + 1;
3509         if (serial
3510             && (tp->header.serial == serial || tp->firstSerial == serial))
3511             rxi_ComputePeerNetStats(call, tp, ap, np);
3512 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
3513         /* XXX Hack. Because we have to release the global rx lock when sending
3514          * packets (osi_NetSend) we drop all acks while we're traversing the tq
3515          * in rxi_Start sending packets out because packets may move to the
3516          * freePacketQueue as result of being here! So we drop these packets until
3517          * we're safely out of the traversing. Really ugly! 
3518          * To make it even uglier, if we're using fine grain locking, we can
3519          * set the ack bits in the packets and have rxi_Start remove the packets
3520          * when it's done transmitting.
3521          */
3522         if (!(tp->flags & RX_PKTFLAG_ACKED)) {
3523             newAckCount++;
3524         }
3525         if (call->flags & RX_CALL_TQ_BUSY) {
3526 #ifdef RX_ENABLE_LOCKS
3527             tp->flags |= RX_PKTFLAG_ACKED;
3528             call->flags |= RX_CALL_TQ_SOME_ACKED;
3529 #else /* RX_ENABLE_LOCKS */
3530             break;
3531 #endif /* RX_ENABLE_LOCKS */
3532         } else
3533 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
3534         {
3535             queue_Remove(tp);
3536             rxi_FreePacket(tp); /* rxi_FreePacket mustn't wake up anyone, preemptively. */
3537         }
3538     }
3539
3540 #ifdef ADAPT_WINDOW
3541     /* Give rate detector a chance to respond to ping requests */
3542     if (ap->reason == RX_ACK_PING_RESPONSE) {
3543         rxi_ComputeRate(peer, call, 0, np, ap->reason);
3544     }
3545 #endif
3546
3547     /* N.B. we don't turn off any timers here.  They'll go away by themselves, anyway */
3548
3549     /* Now go through explicit acks/nacks and record the results in
3550      * the waiting packets.  These are packets that can't be released
3551      * yet, even with a positive acknowledge.  This positive
3552      * acknowledge only means the packet has been received by the
3553      * peer, not that it will be retained long enough to be sent to
3554      * the peer's upper level.  In addition, reset the transmit timers
3555      * of any missing packets (those packets that must be missing
3556      * because this packet was out of sequence) */
3557
3558     call->nSoftAcked = 0;
3559     for (missing = 0, queue_Scan(&call->tq, tp, nxp, rx_packet)) {
3560         /* Update round trip time if the ack was stimulated on receipt
3561          * of this packet */
3562 #ifdef AFS_GLOBAL_RXLOCK_KERNEL
3563 #ifdef RX_ENABLE_LOCKS
3564         if (tp->header.seq >= first)
3565 #endif /* RX_ENABLE_LOCKS */
3566 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
3567             if (serial
3568                 && (tp->header.serial == serial || tp->firstSerial == serial))
3569                 rxi_ComputePeerNetStats(call, tp, ap, np);
3570
3571         /* Set the acknowledge flag per packet based on the
3572          * information in the ack packet. An acknowlegded packet can
3573          * be downgraded when the server has discarded a packet it
3574          * soacked previously, or when an ack packet is received
3575          * out of sequence. */
3576         if (tp->header.seq < first) {
3577             /* Implicit ack information */
3578             if (!(tp->flags & RX_PKTFLAG_ACKED)) {
3579                 newAckCount++;
3580             }
3581             tp->flags |= RX_PKTFLAG_ACKED;
3582         } else if (tp->header.seq < first + nAcks) {
3583             /* Explicit ack information:  set it in the packet appropriately */
3584             if (ap->acks[tp->header.seq - first] == RX_ACK_TYPE_ACK) {
3585                 if (!(tp->flags & RX_PKTFLAG_ACKED)) {
3586                     newAckCount++;
3587                     tp->flags |= RX_PKTFLAG_ACKED;
3588                 }
3589                 if (missing) {
3590                     nNacked++;
3591                 } else {
3592                     call->nSoftAcked++;
3593                 }
3594             } else {
3595                 tp->flags &= ~RX_PKTFLAG_ACKED;
3596                 missing = 1;
3597             }
3598         } else {
3599             tp->flags &= ~RX_PKTFLAG_ACKED;
3600             missing = 1;
3601         }
3602
3603         /* If packet isn't yet acked, and it has been transmitted at least 
3604          * once, reset retransmit time using latest timeout 
3605          * ie, this should readjust the retransmit timer for all outstanding 
3606          * packets...  So we don't just retransmit when we should know better*/
3607
3608         if (!(tp->flags & RX_PKTFLAG_ACKED) && !clock_IsZero(&tp->retryTime)) {
3609             tp->retryTime = tp->timeSent;
3610             clock_Add(&tp->retryTime, &peer->timeout);
3611             /* shift by eight because one quarter-sec ~ 256 milliseconds */
3612             clock_Addmsec(&(tp->retryTime), ((afs_uint32) tp->backoff) << 8);
3613         }
3614     }
3615
3616     /* If the window has been extended by this acknowledge packet,
3617      * then wakeup a sender waiting in alloc for window space, or try
3618      * sending packets now, if he's been sitting on packets due to
3619      * lack of window space */
3620     if (call->tnext < (call->tfirst + call->twind)) {
3621 #ifdef  RX_ENABLE_LOCKS
3622         CV_SIGNAL(&call->cv_twind);
3623 #else
3624         if (call->flags & RX_CALL_WAIT_WINDOW_ALLOC) {
3625             call->flags &= ~RX_CALL_WAIT_WINDOW_ALLOC;
3626             osi_rxWakeup(&call->twind);
3627         }
3628 #endif
3629         if (call->flags & RX_CALL_WAIT_WINDOW_SEND) {
3630             call->flags &= ~RX_CALL_WAIT_WINDOW_SEND;
3631         }
3632     }
3633
3634     /* if the ack packet has a receivelen field hanging off it,
3635      * update our state */
3636     if (np->length >= rx_AckDataSize(ap->nAcks) + 2 * sizeof(afs_int32)) {
3637         afs_uint32 tSize;
3638
3639         /* If the ack packet has a "recommended" size that is less than 
3640          * what I am using now, reduce my size to match */
3641         rx_packetread(np, rx_AckDataSize(ap->nAcks) + sizeof(afs_int32),
3642                       sizeof(afs_int32), &tSize);
3643         tSize = (afs_uint32) ntohl(tSize);
3644         peer->natMTU = rxi_AdjustIfMTU(MIN(tSize, peer->ifMTU));
3645
3646         /* Get the maximum packet size to send to this peer */
3647         rx_packetread(np, rx_AckDataSize(ap->nAcks), sizeof(afs_int32),
3648                       &tSize);
3649         tSize = (afs_uint32) ntohl(tSize);
3650         tSize = (afs_uint32) MIN(tSize, rx_MyMaxSendSize);
3651         tSize = rxi_AdjustMaxMTU(peer->natMTU, tSize);
3652
3653         /* sanity check - peer might have restarted with different params.
3654          * If peer says "send less", dammit, send less...  Peer should never 
3655          * be unable to accept packets of the size that prior AFS versions would
3656          * send without asking.  */
3657         if (peer->maxMTU != tSize) {
3658             peer->maxMTU = tSize;
3659             peer->MTU = MIN(tSize, peer->MTU);
3660             call->MTU = MIN(call->MTU, tSize);
3661             peer->congestSeq++;
3662         }
3663
3664         if (np->length == rx_AckDataSize(ap->nAcks) + 3 * sizeof(afs_int32)) {
3665             /* AFS 3.4a */
3666             rx_packetread(np,
3667                           rx_AckDataSize(ap->nAcks) + 2 * sizeof(afs_int32),
3668                           sizeof(afs_int32), &tSize);
3669             tSize = (afs_uint32) ntohl(tSize);  /* peer's receive window, if it's */
3670             if (tSize < call->twind) {  /* smaller than our send */
3671                 call->twind = tSize;    /* window, we must send less... */
3672                 call->ssthresh = MIN(call->twind, call->ssthresh);
3673             }
3674
3675             /* Only send jumbograms to 3.4a fileservers. 3.3a RX gets the
3676              * network MTU confused with the loopback MTU. Calculate the
3677              * maximum MTU here for use in the slow start code below.
3678              */
3679             maxMTU = peer->maxMTU;
3680             /* Did peer restart with older RX version? */
3681             if (peer->maxDgramPackets > 1) {
3682                 peer->maxDgramPackets = 1;
3683             }
3684         } else if (np->length >=
3685                    rx_AckDataSize(ap->nAcks) + 4 * sizeof(afs_int32)) {
3686             /* AFS 3.5 */
3687             rx_packetread(np,
3688                           rx_AckDataSize(ap->nAcks) + 2 * sizeof(afs_int32),
3689                           sizeof(afs_int32), &tSize);
3690             tSize = (afs_uint32) ntohl(tSize);
3691             /*
3692              * As of AFS 3.5 we set the send window to match the receive window. 
3693              */
3694             if (tSize < call->twind) {
3695                 call->twind = tSize;
3696                 call->ssthresh = MIN(call->twind, call->ssthresh);
3697             } else if (tSize > call->twind) {
3698                 call->twind = tSize;
3699             }
3700
3701             /*
3702              * As of AFS 3.5, a jumbogram is more than one fixed size
3703              * packet transmitted in a single UDP datagram. If the remote
3704              * MTU is smaller than our local MTU then never send a datagram
3705              * larger than the natural MTU.
3706              */
3707             rx_packetread(np,
3708                           rx_AckDataSize(ap->nAcks) + 3 * sizeof(afs_int32),
3709                           sizeof(afs_int32), &tSize);
3710             maxDgramPackets = (afs_uint32) ntohl(tSize);
3711             maxDgramPackets = MIN(maxDgramPackets, rxi_nDgramPackets);
3712             maxDgramPackets =
3713                 MIN(maxDgramPackets, (int)(peer->ifDgramPackets));
3714             maxDgramPackets = MIN(maxDgramPackets, tSize);
3715             if (maxDgramPackets > 1) {
3716                 peer->maxDgramPackets = maxDgramPackets;
3717                 call->MTU = RX_JUMBOBUFFERSIZE + RX_HEADER_SIZE;
3718             } else {
3719                 peer->maxDgramPackets = 1;
3720                 call->MTU = peer->natMTU;
3721             }
3722         } else if (peer->maxDgramPackets > 1) {
3723             /* Restarted with lower version of RX */
3724             peer->maxDgramPackets = 1;
3725         }
3726     } else if (peer->maxDgramPackets > 1
3727                || peer->maxMTU != OLD_MAX_PACKET_SIZE) {
3728         /* Restarted with lower version of RX */
3729         peer->maxMTU = OLD_MAX_PACKET_SIZE;
3730         peer->natMTU = OLD_MAX_PACKET_SIZE;
3731         peer->MTU = OLD_MAX_PACKET_SIZE;
3732         peer->maxDgramPackets = 1;
3733         peer->nDgramPackets = 1;
3734         peer->congestSeq++;
3735         call->MTU = OLD_MAX_PACKET_SIZE;
3736     }
3737
3738     if (nNacked) {
3739         /*
3740          * Calculate how many datagrams were successfully received after
3741          * the first missing packet and adjust the negative ack counter
3742          * accordingly.
3743          */
3744         call->nAcks = 0;
3745         call->nNacks++;
3746         nNacked = (nNacked + call->nDgramPackets - 1) / call->nDgramPackets;
3747         if (call->nNacks < nNacked) {
3748             call->nNacks = nNacked;
3749         }
3750     } else {
3751         if (newAckCount) {
3752             call->nAcks++;
3753         }
3754         call->nNacks = 0;
3755     }
3756
3757     if (call->flags & RX_CALL_FAST_RECOVER) {
3758         if (nNacked) {
3759             call->cwind = MIN((int)(call->cwind + 1), rx_maxSendWindow);
3760         } else {
3761             call->flags &= ~RX_CALL_FAST_RECOVER;
3762             call->cwind = call->nextCwind;
3763             call->nextCwind = 0;
3764             call->nAcks = 0;
3765         }
3766         call->nCwindAcks = 0;
3767     } else if (nNacked && call->nNacks >= (u_short) rx_nackThreshold) {
3768         /* Three negative acks in a row trigger congestion recovery */
3769 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
3770         MUTEX_EXIT(&peer->peer_lock);
3771         if (call->flags & RX_CALL_FAST_RECOVER_WAIT) {
3772             /* someone else is waiting to start recovery */
3773             return np;
3774         }
3775         call->flags |= RX_CALL_FAST_RECOVER_WAIT;
3776         while (call->flags & RX_CALL_TQ_BUSY) {
3777             call->flags |= RX_CALL_TQ_WAIT;
3778 #ifdef RX_ENABLE_LOCKS
3779             CV_WAIT(&call->cv_tq, &call->lock);
3780 #else /* RX_ENABLE_LOCKS */
3781             osi_rxSleep(&call->tq);
3782 #endif /* RX_ENABLE_LOCKS */
3783         }
3784         MUTEX_ENTER(&peer->peer_lock);
3785 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
3786         call->flags &= ~RX_CALL_FAST_RECOVER_WAIT;
3787         call->flags |= RX_CALL_FAST_RECOVER;
3788         call->ssthresh = MAX(4, MIN((int)call->cwind, (int)call->twind)) >> 1;
3789         call->cwind =
3790             MIN((int)(call->ssthresh + rx_nackThreshold), rx_maxSendWindow);
3791         call->nDgramPackets = MAX(2, (int)call->nDgramPackets) >> 1;
3792         call->nextCwind = call->ssthresh;
3793         call->nAcks = 0;
3794         call->nNacks = 0;
3795         peer->MTU = call->MTU;
3796         peer->cwind = call->nextCwind;
3797         peer->nDgramPackets = call->nDgramPackets;
3798         peer->congestSeq++;
3799         call->congestSeq = peer->congestSeq;
3800         /* Reset the resend times on the packets that were nacked
3801          * so we will retransmit as soon as the window permits*/
3802         for (acked = 0, queue_ScanBackwards(&call->tq, tp, nxp, rx_packet)) {
3803             if (acked) {
3804                 if (!(tp->flags & RX_PKTFLAG_ACKED)) {
3805                     clock_Zero(&tp->retryTime);
3806                 }
3807             } else if (tp->flags & RX_PKTFLAG_ACKED) {
3808                 acked = 1;
3809             }
3810         }
3811     } else {
3812         /* If cwind is smaller than ssthresh, then increase
3813          * the window one packet for each ack we receive (exponential
3814          * growth).
3815          * If cwind is greater than or equal to ssthresh then increase
3816          * the congestion window by one packet for each cwind acks we
3817          * receive (linear growth).  */
3818         if (call->cwind < call->ssthresh) {
3819             call->cwind =
3820                 MIN((int)call->ssthresh, (int)(call->cwind + newAckCount));
3821             call->nCwindAcks = 0;
3822         } else {
3823             call->nCwindAcks += newAckCount;
3824             if (call->nCwindAcks >= call->cwind) {
3825                 call->nCwindAcks = 0;
3826                 call->cwind = MIN((int)(call->cwind + 1), rx_maxSendWindow);
3827             }
3828         }
3829         /*
3830          * If we have received several acknowledgements in a row then
3831          * it is time to increase the size of our datagrams
3832          */
3833         if ((int)call->nAcks > rx_nDgramThreshold) {
3834             if (peer->maxDgramPackets > 1) {
3835                 if (call->nDgramPackets < peer->maxDgramPackets) {
3836                     call->nDgramPackets++;
3837                 }
3838                 call->MTU = RX_HEADER_SIZE + RX_JUMBOBUFFERSIZE;
3839             } else if (call->MTU < peer->maxMTU) {
3840                 call->MTU += peer->natMTU;
3841                 call->MTU = MIN(call->MTU, peer->maxMTU);
3842             }
3843             call->nAcks = 0;
3844         }
3845     }
3846
3847     MUTEX_EXIT(&peer->peer_lock);       /* rxi_Start will lock peer. */
3848
3849     /* Servers need to hold the call until all response packets have
3850      * been acknowledged. Soft acks are good enough since clients
3851      * are not allowed to clear their receive queues. */
3852     if (call->state == RX_STATE_HOLD
3853         && call->tfirst + call->nSoftAcked >= call->tnext) {
3854         call->state = RX_STATE_DALLY;
3855         rxi_ClearTransmitQueue(call, 0);
3856     } else if (!queue_IsEmpty(&call->tq)) {
3857         rxi_Start(0, call, 0, istack);
3858     }
3859     return np;
3860 }
3861
3862 /* Received a response to a challenge packet */
3863 struct rx_packet *
3864 rxi_ReceiveResponsePacket(register struct rx_connection *conn,
3865                           register struct rx_packet *np, int istack)
3866 {
3867     int error;
3868
3869     /* Ignore the packet if we're the client */
3870     if (conn->type == RX_CLIENT_CONNECTION)
3871         return np;
3872
3873     /* If already authenticated, ignore the packet (it's probably a retry) */
3874     if (RXS_CheckAuthentication(conn->securityObject, conn) == 0)
3875         return np;
3876
3877     /* Otherwise, have the security object evaluate the response packet */
3878     error = RXS_CheckResponse(conn->securityObject, conn, np);
3879     if (error) {
3880         /* If the response is invalid, reset the connection, sending
3881          * an abort to the peer */
3882 #ifndef KERNEL
3883         rxi_Delay(1);
3884 #endif
3885         rxi_ConnectionError(conn, error);
3886         MUTEX_ENTER(&conn->conn_data_lock);
3887         np = rxi_SendConnectionAbort(conn, np, istack, 0);
3888         MUTEX_EXIT(&conn->conn_data_lock);
3889         return np;
3890     } else {
3891         /* If the response is valid, any calls waiting to attach
3892          * servers can now do so */
3893         int i;
3894
3895         for (i = 0; i < RX_MAXCALLS; i++) {
3896             struct rx_call *call = conn->call[i];
3897             if (call) {
3898                 MUTEX_ENTER(&call->lock);
3899                 if (call->state == RX_STATE_PRECALL)
3900                     rxi_AttachServerProc(call, (osi_socket) - 1, NULL, NULL);
3901                 /* tnop can be null if newcallp is null */
3902                 MUTEX_EXIT(&call->lock);
3903             }
3904         }
3905
3906         /* Update the peer reachability information, just in case
3907          * some calls went into attach-wait while we were waiting
3908          * for authentication..
3909          */
3910         rxi_UpdatePeerReach(conn, NULL);
3911     }
3912     return np;
3913 }
3914
3915 /* A client has received an authentication challenge: the security
3916  * object is asked to cough up a respectable response packet to send
3917  * back to the server.  The server is responsible for retrying the
3918  * challenge if it fails to get a response. */
3919
3920 struct rx_packet *
3921 rxi_ReceiveChallengePacket(register struct rx_connection *conn,
3922                            register struct rx_packet *np, int istack)
3923 {
3924     int error;
3925
3926     /* Ignore the challenge if we're the server */
3927     if (conn->type == RX_SERVER_CONNECTION)
3928         return np;
3929
3930     /* Ignore the challenge if the connection is otherwise idle; someone's
3931      * trying to use us as an oracle. */
3932     if (!rxi_HasActiveCalls(conn))
3933         return np;
3934
3935     /* Send the security object the challenge packet.  It is expected to fill
3936      * in the response. */
3937     error = RXS_GetResponse(conn->securityObject, conn, np);
3938
3939     /* If the security object is unable to return a valid response, reset the
3940      * connection and send an abort to the peer.  Otherwise send the response
3941      * packet to the peer connection. */
3942     if (error) {
3943         rxi_ConnectionError(conn, error);
3944         MUTEX_ENTER(&conn->conn_data_lock);
3945         np = rxi_SendConnectionAbort(conn, np, istack, 0);
3946         MUTEX_EXIT(&conn->conn_data_lock);
3947     } else {
3948         np = rxi_SendSpecial((struct rx_call *)0, conn, np,
3949                              RX_PACKET_TYPE_RESPONSE, NULL, -1, istack);
3950     }
3951     return np;
3952 }
3953
3954
3955 /* Find an available server process to service the current request in
3956  * the given call structure.  If one isn't available, queue up this
3957  * call so it eventually gets one */
3958 void
3959 rxi_AttachServerProc(register struct rx_call *call,
3960                      register osi_socket socket, register int *tnop,
3961                      register struct rx_call **newcallp)
3962 {
3963     register struct rx_serverQueueEntry *sq;
3964     register struct rx_service *service = call->conn->service;
3965     register int haveQuota = 0;
3966
3967     /* May already be attached */
3968     if (call->state == RX_STATE_ACTIVE)
3969         return;
3970
3971     MUTEX_ENTER(&rx_serverPool_lock);
3972
3973     haveQuota = QuotaOK(service);
3974     if ((!haveQuota) || queue_IsEmpty(&rx_idleServerQueue)) {
3975         /* If there are no processes available to service this call,
3976          * put the call on the incoming call queue (unless it's
3977          * already on the queue).
3978          */
3979 #ifdef RX_ENABLE_LOCKS
3980         if (haveQuota)
3981             ReturnToServerPool(service);
3982 #endif /* RX_ENABLE_LOCKS */
3983
3984         if (!(call->flags & RX_CALL_WAIT_PROC)) {
3985             call->flags |= RX_CALL_WAIT_PROC;
3986             MUTEX_ENTER(&rx_stats_mutex);
3987             rx_nWaiting++;
3988             rx_nWaited++;
3989             MUTEX_EXIT(&rx_stats_mutex);
3990             rxi_calltrace(RX_CALL_ARRIVAL, call);
3991             SET_CALL_QUEUE_LOCK(call, &rx_serverPool_lock);
3992             queue_Append(&rx_incomingCallQueue, call);
3993         }
3994     } else {
3995         sq = queue_First(&rx_idleServerQueue, rx_serverQueueEntry);
3996
3997         /* If hot threads are enabled, and both newcallp and sq->socketp
3998          * are non-null, then this thread will process the call, and the
3999          * idle server thread will start listening on this threads socket.
4000          */
4001         queue_Remove(sq);
4002         if (rx_enable_hot_thread && newcallp && sq->socketp) {
4003             *newcallp = call;
4004             *tnop = sq->tno;
4005             *sq->socketp = socket;
4006             clock_GetTime(&call->startTime);
4007             CALL_HOLD(call, RX_CALL_REFCOUNT_BEGIN);
4008         } else {
4009             sq->newcall = call;
4010         }
4011         if (call->flags & RX_CALL_WAIT_PROC) {
4012             /* Conservative:  I don't think this should happen */
4013             call->flags &= ~RX_CALL_WAIT_PROC;
4014             if (queue_IsOnQueue(call)) {
4015                 queue_Remove(call);
4016                 MUTEX_ENTER(&rx_stats_mutex);
4017                 rx_nWaiting--;
4018                 MUTEX_EXIT(&rx_stats_mutex);
4019             }
4020         }
4021         call->state = RX_STATE_ACTIVE;
4022         call->mode = RX_MODE_RECEIVING;
4023 #ifdef RX_KERNEL_TRACE
4024         {
4025             int glockOwner = ISAFS_GLOCK();
4026             if (!glockOwner)
4027                 AFS_GLOCK();
4028             afs_Trace3(afs_iclSetp, CM_TRACE_WASHERE, ICL_TYPE_STRING,
4029                        __FILE__, ICL_TYPE_INT32, __LINE__, ICL_TYPE_POINTER,
4030                        call);
4031             if (!glockOwner)
4032                 AFS_GUNLOCK();
4033         }
4034 #endif
4035         if (call->flags & RX_CALL_CLEARED) {
4036             /* send an ack now to start the packet flow up again */
4037             call->flags &= ~RX_CALL_CLEARED;
4038             rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
4039         }
4040 #ifdef  RX_ENABLE_LOCKS
4041         CV_SIGNAL(&sq->cv);
4042 #else
4043         service->nRequestsRunning++;
4044         if (service->nRequestsRunning <= service->minProcs)
4045             rxi_minDeficit--;
4046         rxi_availProcs--;
4047         osi_rxWakeup(sq);
4048 #endif
4049     }
4050     MUTEX_EXIT(&rx_serverPool_lock);
4051 }
4052
4053 /* Delay the sending of an acknowledge event for a short while, while
4054  * a new call is being prepared (in the case of a client) or a reply
4055  * is being prepared (in the case of a server).  Rather than sending
4056  * an ack packet, an ACKALL packet is sent. */
4057 void
4058 rxi_AckAll(struct rxevent *event, register struct rx_call *call, char *dummy)
4059 {
4060 #ifdef RX_ENABLE_LOCKS
4061     if (event) {
4062         MUTEX_ENTER(&call->lock);
4063         call->delayedAckEvent = NULL;
4064         CALL_RELE(call, RX_CALL_REFCOUNT_ACKALL);
4065     }
4066     rxi_SendSpecial(call, call->conn, (struct rx_packet *)0,
4067                     RX_PACKET_TYPE_ACKALL, NULL, 0, 0);
4068     if (event)
4069         MUTEX_EXIT(&call->lock);
4070 #else /* RX_ENABLE_LOCKS */
4071     if (event)
4072         call->delayedAckEvent = NULL;
4073     rxi_SendSpecial(call, call->conn, (struct rx_packet *)0,
4074                     RX_PACKET_TYPE_ACKALL, NULL, 0, 0);
4075 #endif /* RX_ENABLE_LOCKS */
4076 }
4077
4078 void
4079 rxi_SendDelayedAck(struct rxevent *event, register struct rx_call *call,
4080                    char *dummy)
4081 {
4082 #ifdef RX_ENABLE_LOCKS
4083     if (event) {
4084         MUTEX_ENTER(&call->lock);
4085         if (event == call->delayedAckEvent)
4086             call->delayedAckEvent = NULL;
4087         CALL_RELE(call, RX_CALL_REFCOUNT_DELAY);
4088     }
4089     (void)rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
4090     if (event)
4091         MUTEX_EXIT(&call->lock);
4092 #else /* RX_ENABLE_LOCKS */
4093     if (event)
4094         call->delayedAckEvent = NULL;
4095     (void)rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
4096 #endif /* RX_ENABLE_LOCKS */
4097 }
4098
4099
4100 #ifdef RX_ENABLE_LOCKS
4101 /* Set ack in all packets in transmit queue. rxi_Start will deal with
4102  * clearing them out.
4103  */
4104 static void
4105 rxi_SetAcksInTransmitQueue(register struct rx_call *call)
4106 {
4107     register struct rx_packet *p, *tp;
4108     int someAcked = 0;
4109
4110     for (queue_Scan(&call->tq, p, tp, rx_packet)) {
4111         p->flags |= RX_PKTFLAG_ACKED;
4112         someAcked = 1;
4113     }
4114     if (someAcked) {
4115         call->flags |= RX_CALL_TQ_CLEARME;
4116         call->flags |= RX_CALL_TQ_SOME_ACKED;
4117     }
4118
4119     rxevent_Cancel(call->resendEvent, call, RX_CALL_REFCOUNT_RESEND);
4120     rxevent_Cancel(call->keepAliveEvent, call, RX_CALL_REFCOUNT_ALIVE);
4121     call->tfirst = call->tnext;
4122     call->nSoftAcked = 0;
4123
4124     if (call->flags & RX_CALL_FAST_RECOVER) {
4125         call->flags &= ~RX_CALL_FAST_RECOVER;
4126         call->cwind = call->nextCwind;
4127         call->nextCwind = 0;
4128     }
4129
4130     CV_SIGNAL(&call->cv_twind);
4131 }
4132 #endif /* RX_ENABLE_LOCKS */
4133
4134 /* Clear out the transmit queue for the current call (all packets have
4135  * been received by peer) */
4136 void
4137 rxi_ClearTransmitQueue(register struct rx_call *call, register int force)
4138 {
4139     register struct rx_packet *p, *tp;
4140
4141 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
4142     if (!force && (call->flags & RX_CALL_TQ_BUSY)) {
4143         int someAcked = 0;
4144         for (queue_Scan(&call->tq, p, tp, rx_packet)) {
4145             p->flags |= RX_PKTFLAG_ACKED;
4146             someAcked = 1;
4147         }
4148         if (someAcked) {
4149             call->flags |= RX_CALL_TQ_CLEARME;
4150             call->flags |= RX_CALL_TQ_SOME_ACKED;
4151         }
4152     } else {
4153 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
4154         rxi_FreePackets(0, &call->tq);
4155 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
4156         call->flags &= ~RX_CALL_TQ_CLEARME;
4157     }
4158 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
4159
4160     rxevent_Cancel(call->resendEvent, call, RX_CALL_REFCOUNT_RESEND);
4161     rxevent_Cancel(call->keepAliveEvent, call, RX_CALL_REFCOUNT_ALIVE);
4162     call->tfirst = call->tnext; /* implicitly acknowledge all data already sent */
4163     call->nSoftAcked = 0;
4164
4165     if (call->flags & RX_CALL_FAST_RECOVER) {
4166         call->flags &= ~RX_CALL_FAST_RECOVER;
4167         call->cwind = call->nextCwind;
4168     }
4169 #ifdef  RX_ENABLE_LOCKS
4170     CV_SIGNAL(&call->cv_twind);
4171 #else
4172     osi_rxWakeup(&call->twind);
4173 #endif
4174 }
4175
4176 void
4177 rxi_ClearReceiveQueue(register struct rx_call *call)
4178 {
4179     if (queue_IsNotEmpty(&call->rq)) {
4180         rx_packetReclaims += rxi_FreePackets(0, &call->rq);
4181         call->flags &= ~(RX_CALL_RECEIVE_DONE | RX_CALL_HAVE_LAST);
4182     }
4183     if (call->state == RX_STATE_PRECALL) {
4184         call->flags |= RX_CALL_CLEARED;
4185     }
4186 }
4187
4188 /* Send an abort packet for the specified call */
4189 struct rx_packet *
4190 rxi_SendCallAbort(register struct rx_call *call, struct rx_packet *packet,
4191                   int istack, int force)
4192 {
4193     afs_int32 error;
4194     struct clock when;
4195
4196     if (!call->error)
4197         return packet;
4198
4199     /* Clients should never delay abort messages */
4200     if (rx_IsClientConn(call->conn))
4201         force = 1;
4202
4203     if (call->abortCode != call->error) {
4204         call->abortCode = call->error;
4205         call->abortCount = 0;
4206     }
4207
4208     if (force || rxi_callAbortThreshhold == 0
4209         || call->abortCount < rxi_callAbortThreshhold) {
4210         if (call->delayedAbortEvent) {
4211             rxevent_Cancel(call->delayedAbortEvent, call,
4212                            RX_CALL_REFCOUNT_ABORT);
4213         }
4214         error = htonl(call->error);
4215         call->abortCount++;
4216         packet =
4217             rxi_SendSpecial(call, call->conn, packet, RX_PACKET_TYPE_ABORT,
4218                             (char *)&error, sizeof(error), istack);
4219     } else if (!call->delayedAbortEvent) {
4220         clock_GetTime(&when);
4221         clock_Addmsec(&when, rxi_callAbortDelay);
4222         CALL_HOLD(call, RX_CALL_REFCOUNT_ABORT);
4223         call->delayedAbortEvent =
4224             rxevent_Post(&when, rxi_SendDelayedCallAbort, call, 0);
4225     }
4226     return packet;
4227 }
4228
4229 /* Send an abort packet for the specified connection.  Packet is an
4230  * optional pointer to a packet that can be used to send the abort.
4231  * Once the number of abort messages reaches the threshhold, an
4232  * event is scheduled to send the abort. Setting the force flag
4233  * overrides sending delayed abort messages.
4234  *
4235  * NOTE: Called with conn_data_lock held. conn_data_lock is dropped
4236  *       to send the abort packet.
4237  */
4238 struct rx_packet *
4239 rxi_SendConnectionAbort(register struct rx_connection *conn,
4240                         struct rx_packet *packet, int istack, int force)
4241 {
4242     afs_int32 error;
4243     struct clock when;
4244
4245     if (!conn->error)
4246         return packet;
4247
4248     /* Clients should never delay abort messages */
4249     if (rx_IsClientConn(conn))
4250         force = 1;
4251
4252     if (force || rxi_connAbortThreshhold == 0
4253         || conn->abortCount < rxi_connAbortThreshhold) {
4254         if (conn->delayedAbortEvent) {
4255             rxevent_Cancel(conn->delayedAbortEvent, (struct rx_call *)0, 0);
4256         }
4257         error = htonl(conn->error);
4258         conn->abortCount++;
4259         MUTEX_EXIT(&conn->conn_data_lock);
4260         packet =
4261             rxi_SendSpecial((struct rx_call *)0, conn, packet,
4262                             RX_PACKET_TYPE_ABORT, (char *)&error,
4263                             sizeof(error), istack);
4264         MUTEX_ENTER(&conn->conn_data_lock);
4265     } else if (!conn->delayedAbortEvent) {
4266         clock_GetTime(&when);
4267         clock_Addmsec(&when, rxi_connAbortDelay);
4268         conn->delayedAbortEvent =
4269             rxevent_Post(&when, rxi_SendDelayedConnAbort, conn, 0);
4270     }
4271     return packet;
4272 }
4273
4274 /* Associate an error all of the calls owned by a connection.  Called
4275  * with error non-zero.  This is only for really fatal things, like
4276  * bad authentication responses.  The connection itself is set in
4277  * error at this point, so that future packets received will be
4278  * rejected. */
4279 void
4280 rxi_ConnectionError(register struct rx_connection *conn,
4281                     register afs_int32 error)
4282 {
4283     if (error) {
4284         register int i;
4285         MUTEX_ENTER(&conn->conn_data_lock);
4286         if (conn->challengeEvent)
4287             rxevent_Cancel(conn->challengeEvent, (struct rx_call *)0, 0);
4288         if (conn->checkReachEvent) {
4289             rxevent_Cancel(conn->checkReachEvent, (struct rx_call *)0, 0);
4290             conn->checkReachEvent = 0;
4291             conn->flags &= ~RX_CONN_ATTACHWAIT;
4292             conn->refCount--;
4293         }
4294         MUTEX_EXIT(&conn->conn_data_lock);
4295         for (i = 0; i < RX_MAXCALLS; i++) {
4296             struct rx_call *call = conn->call[i];
4297             if (call) {
4298                 MUTEX_ENTER(&call->lock);
4299                 rxi_CallError(call, error);
4300                 MUTEX_EXIT(&call->lock);
4301             }
4302         }
4303         conn->error = error;
4304         MUTEX_ENTER(&rx_stats_mutex);
4305         rx_stats.fatalErrors++;
4306         MUTEX_EXIT(&rx_stats_mutex);
4307     }
4308 }
4309
4310 void
4311 rxi_CallError(register struct rx_call *call, afs_int32 error)
4312 {
4313     if (call->error)
4314         error = call->error;
4315 #ifdef RX_GLOBAL_RXLOCK_KERNEL
4316     if (!(call->flags & RX_CALL_TQ_BUSY)) {
4317         rxi_ResetCall(call, 0);
4318     }
4319 #else
4320     rxi_ResetCall(call, 0);
4321 #endif
4322     call->error = error;
4323     call->mode = RX_MODE_ERROR;
4324 }
4325
4326 /* Reset various fields in a call structure, and wakeup waiting
4327  * processes.  Some fields aren't changed: state & mode are not
4328  * touched (these must be set by the caller), and bufptr, nLeft, and
4329  * nFree are not reset, since these fields are manipulated by
4330  * unprotected macros, and may only be reset by non-interrupting code.
4331  */
4332 #ifdef ADAPT_WINDOW
4333 /* this code requires that call->conn be set properly as a pre-condition. */
4334 #endif /* ADAPT_WINDOW */
4335
4336 void
4337 rxi_ResetCall(register struct rx_call *call, register int newcall)
4338 {
4339     register int flags;
4340     register struct rx_peer *peer;
4341     struct rx_packet *packet;
4342
4343     /* Notify anyone who is waiting for asynchronous packet arrival */
4344     if (call->arrivalProc) {
4345         (*call->arrivalProc) (call, call->arrivalProcHandle,
4346                               call->arrivalProcArg);
4347         call->arrivalProc = (void (*)())0;
4348     }
4349
4350     if (call->delayedAbortEvent) {
4351         rxevent_Cancel(call->delayedAbortEvent, call, RX_CALL_REFCOUNT_ABORT);
4352         packet = rxi_AllocPacket(RX_PACKET_CLASS_SPECIAL);
4353         if (packet) {
4354             rxi_SendCallAbort(call, packet, 0, 1);
4355             rxi_FreePacket(packet);
4356         }
4357     }
4358
4359     /*
4360      * Update the peer with the congestion information in this call
4361      * so other calls on this connection can pick up where this call
4362      * left off. If the congestion sequence numbers don't match then
4363      * another call experienced a retransmission.
4364      */
4365     peer = call->conn->peer;
4366     MUTEX_ENTER(&peer->peer_lock);
4367     if (!newcall) {
4368         if (call->congestSeq == peer->congestSeq) {
4369             peer->cwind = MAX(peer->cwind, call->cwind);
4370             peer->MTU = MAX(peer->MTU, call->MTU);
4371             peer->nDgramPackets =
4372                 MAX(peer->nDgramPackets, call->nDgramPackets);
4373         }
4374     } else {
4375         call->abortCode = 0;
4376         call->abortCount = 0;
4377     }
4378     if (peer->maxDgramPackets > 1) {
4379         call->MTU = RX_HEADER_SIZE + RX_JUMBOBUFFERSIZE;
4380     } else {
4381         call->MTU = peer->MTU;
4382     }
4383     call->cwind = MIN((int)peer->cwind, (int)peer->nDgramPackets);
4384     call->ssthresh = rx_maxSendWindow;
4385     call->nDgramPackets = peer->nDgramPackets;
4386     call->congestSeq = peer->congestSeq;
4387     MUTEX_EXIT(&peer->peer_lock);
4388
4389     flags = call->flags;
4390     rxi_ClearReceiveQueue(call);
4391 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
4392     if (call->flags & RX_CALL_TQ_BUSY) {
4393         call->flags = RX_CALL_TQ_CLEARME | RX_CALL_TQ_BUSY;
4394         call->flags |= (flags & RX_CALL_TQ_WAIT);
4395     } else
4396 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
4397     {
4398         rxi_ClearTransmitQueue(call, 0);
4399         queue_Init(&call->tq);
4400         call->flags = 0;
4401     }
4402     queue_Init(&call->rq);
4403     call->error = 0;
4404     call->rwind = rx_initReceiveWindow;
4405     call->twind = rx_initSendWindow;
4406     call->nSoftAcked = 0;
4407     call->nextCwind = 0;
4408     call->nAcks = 0;
4409     call->nNacks = 0;
4410     call->nCwindAcks = 0;
4411     call->nSoftAcks = 0;
4412     call->nHardAcks = 0;
4413
4414     call->tfirst = call->rnext = call->tnext = 1;
4415     call->rprev = 0;
4416     call->lastAcked = 0;
4417     call->localStatus = call->remoteStatus = 0;
4418
4419     if (flags & RX_CALL_READER_WAIT) {
4420 #ifdef  RX_ENABLE_LOCKS
4421         CV_BROADCAST(&call->cv_rq);
4422 #else
4423         osi_rxWakeup(&call->rq);
4424 #endif
4425     }
4426     if (flags & RX_CALL_WAIT_PACKETS) {
4427         MUTEX_ENTER(&rx_freePktQ_lock);
4428         rxi_PacketsUnWait();    /* XXX */
4429         MUTEX_EXIT(&rx_freePktQ_lock);
4430     }
4431 #ifdef  RX_ENABLE_LOCKS
4432     CV_SIGNAL(&call->cv_twind);
4433 #else
4434     if (flags & RX_CALL_WAIT_WINDOW_ALLOC)
4435         osi_rxWakeup(&call->twind);
4436 #endif
4437
4438 #ifdef RX_ENABLE_LOCKS
4439     /* The following ensures that we don't mess with any queue while some
4440      * other thread might also be doing so. The call_queue_lock field is
4441      * is only modified under the call lock. If the call is in the process
4442      * of being removed from a queue, the call is not locked until the
4443      * the queue lock is dropped and only then is the call_queue_lock field
4444      * zero'd out. So it's safe to lock the queue if call_queue_lock is set.
4445      * Note that any other routine which removes a call from a queue has to
4446      * obtain the queue lock before examing the queue and removing the call.
4447      */
4448     if (call->call_queue_lock) {
4449         MUTEX_ENTER(call->call_queue_lock);
4450         if (queue_IsOnQueue(call)) {
4451             queue_Remove(call);
4452             if (flags & RX_CALL_WAIT_PROC) {
4453                 MUTEX_ENTER(&rx_stats_mutex);
4454                 rx_nWaiting--;
4455                 MUTEX_EXIT(&rx_stats_mutex);
4456             }
4457         }
4458         MUTEX_EXIT(call->call_queue_lock);
4459         CLEAR_CALL_QUEUE_LOCK(call);
4460     }
4461 #else /* RX_ENABLE_LOCKS */
4462     if (queue_IsOnQueue(call)) {
4463         queue_Remove(call);
4464         if (flags & RX_CALL_WAIT_PROC)
4465             rx_nWaiting--;
4466     }
4467 #endif /* RX_ENABLE_LOCKS */
4468
4469     rxi_KeepAliveOff(call);
4470     rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
4471 }
4472
4473 /* Send an acknowledge for the indicated packet (seq,serial) of the
4474  * indicated call, for the indicated reason (reason).  This
4475  * acknowledge will specifically acknowledge receiving the packet, and
4476  * will also specify which other packets for this call have been
4477  * received.  This routine returns the packet that was used to the
4478  * caller.  The caller is responsible for freeing it or re-using it.
4479  * This acknowledgement also returns the highest sequence number
4480  * actually read out by the higher level to the sender; the sender
4481  * promises to keep around packets that have not been read by the
4482  * higher level yet (unless, of course, the sender decides to abort
4483  * the call altogether).  Any of p, seq, serial, pflags, or reason may
4484  * be set to zero without ill effect.  That is, if they are zero, they
4485  * will not convey any information.  
4486  * NOW there is a trailer field, after the ack where it will safely be
4487  * ignored by mundanes, which indicates the maximum size packet this 
4488  * host can swallow.  */
4489 /*
4490     register struct rx_packet *optionalPacket;  use to send ack (or null) 
4491     int seq;                     Sequence number of the packet we are acking 
4492     int serial;                  Serial number of the packet 
4493     int pflags;                  Flags field from packet header 
4494     int reason;                  Reason an acknowledge was prompted 
4495 */
4496
4497 struct rx_packet *
4498 rxi_SendAck(register struct rx_call *call,
4499             register struct rx_packet *optionalPacket, int serial, int reason,
4500             int istack)
4501 {
4502     struct rx_ackPacket *ap;
4503     register struct rx_packet *rqp;
4504     register struct rx_packet *nxp;     /* For queue_Scan */
4505     register struct rx_packet *p;
4506     u_char offset;
4507     afs_int32 templ;
4508 #ifdef RX_ENABLE_TSFPQ
4509     struct rx_ts_info_t * rx_ts_info;
4510 #endif
4511
4512     /*
4513      * Open the receive window once a thread starts reading packets
4514      */
4515     if (call->rnext > 1) {
4516         call->rwind = rx_maxReceiveWindow;
4517     }
4518
4519     call->nHardAcks = 0;
4520     call->nSoftAcks = 0;
4521     if (call->rnext > call->lastAcked)
4522         call->lastAcked = call->rnext;
4523     p = optionalPacket;
4524
4525     if (p) {
4526         rx_computelen(p, p->length);    /* reset length, you never know */
4527     } /* where that's been...         */
4528 #ifdef RX_ENABLE_TSFPQ
4529     else {
4530         RX_TS_INFO_GET(rx_ts_info);
4531         if ((p = rx_ts_info->local_special_packet)) {
4532             rx_computelen(p, p->length);
4533         } else if ((p = rxi_AllocPacket(RX_PACKET_CLASS_SPECIAL))) {
4534             rx_ts_info->local_special_packet = p;
4535         } else { /* We won't send the ack, but don't panic. */
4536             return optionalPacket;
4537         }
4538     }
4539 #else
4540     else if (!(p = rxi_AllocPacket(RX_PACKET_CLASS_SPECIAL))) {
4541         /* We won't send the ack, but don't panic. */
4542         return optionalPacket;
4543     }
4544 #endif
4545
4546     templ =
4547         rx_AckDataSize(call->rwind) + 4 * sizeof(afs_int32) -
4548         rx_GetDataSize(p);
4549     if (templ > 0) {
4550         if (rxi_AllocDataBuf(p, templ, RX_PACKET_CLASS_SPECIAL) > 0) {
4551 #ifndef RX_ENABLE_TSFPQ
4552             if (!optionalPacket)
4553                 rxi_FreePacket(p);
4554 #endif
4555             return optionalPacket;
4556         }
4557         templ = rx_AckDataSize(call->rwind) + 2 * sizeof(afs_int32);
4558         if (rx_Contiguous(p) < templ) {
4559 #ifndef RX_ENABLE_TSFPQ
4560             if (!optionalPacket)
4561                 rxi_FreePacket(p);
4562 #endif
4563             return optionalPacket;
4564         }
4565     }
4566
4567
4568     /* MTUXXX failing to send an ack is very serious.  We should */
4569     /* try as hard as possible to send even a partial ack; it's */
4570     /* better than nothing. */
4571     ap = (struct rx_ackPacket *)rx_DataOf(p);
4572     ap->bufferSpace = htonl(0); /* Something should go here, sometime */
4573     ap->reason = reason;
4574
4575     /* The skew computation used to be bogus, I think it's better now. */
4576     /* We should start paying attention to skew.    XXX  */
4577     ap->serial = htonl(serial);
4578     ap->maxSkew = 0;            /* used to be peer->inPacketSkew */
4579
4580     ap->firstPacket = htonl(call->rnext);       /* First packet not yet forwarded to reader */
4581     ap->previousPacket = htonl(call->rprev);    /* Previous packet received */
4582
4583     /* No fear of running out of ack packet here because there can only be at most
4584      * one window full of unacknowledged packets.  The window size must be constrained 
4585      * to be less than the maximum ack size, of course.  Also, an ack should always
4586      * fit into a single packet -- it should not ever be fragmented.  */
4587     for (offset = 0, queue_Scan(&call->rq, rqp, nxp, rx_packet)) {
4588         if (!rqp || !call->rq.next
4589             || (rqp->header.seq > (call->rnext + call->rwind))) {
4590 #ifndef RX_ENABLE_TSFPQ
4591             if (!optionalPacket)
4592                 rxi_FreePacket(p);
4593 #endif
4594             rxi_CallError(call, RX_CALL_DEAD);
4595             return optionalPacket;
4596         }
4597
4598         while (rqp->header.seq > call->rnext + offset)
4599             ap->acks[offset++] = RX_ACK_TYPE_NACK;
4600         ap->acks[offset++] = RX_ACK_TYPE_ACK;
4601
4602         if ((offset > (u_char) rx_maxReceiveWindow) || (offset > call->rwind)) {
4603 #ifndef RX_ENABLE_TSFPQ
4604             if (!optionalPacket)
4605                 rxi_FreePacket(p);
4606 #endif
4607             rxi_CallError(call, RX_CALL_DEAD);
4608             return optionalPacket;
4609         }
4610     }
4611
4612     ap->nAcks = offset;
4613     p->length = rx_AckDataSize(offset) + 4 * sizeof(afs_int32);
4614
4615     /* these are new for AFS 3.3 */
4616     templ = rxi_AdjustMaxMTU(call->conn->peer->ifMTU, rx_maxReceiveSize);
4617     templ = htonl(templ);
4618     rx_packetwrite(p, rx_AckDataSize(offset), sizeof(afs_int32), &templ);
4619     templ = htonl(call->conn->peer->ifMTU);
4620     rx_packetwrite(p, rx_AckDataSize(offset) + sizeof(afs_int32),
4621                    sizeof(afs_int32), &templ);
4622
4623     /* new for AFS 3.4 */
4624     templ = htonl(call->rwind);
4625     rx_packetwrite(p, rx_AckDataSize(offset) + 2 * sizeof(afs_int32),
4626                    sizeof(afs_int32), &templ);
4627
4628     /* new for AFS 3.5 */
4629     templ = htonl(call->conn->peer->ifDgramPackets);
4630     rx_packetwrite(p, rx_AckDataSize(offset) + 3 * sizeof(afs_int32),
4631                    sizeof(afs_int32), &templ);
4632
4633     p->header.serviceId = call->conn->serviceId;
4634     p->header.cid = (call->conn->cid | call->channel);
4635     p->header.callNumber = *call->callNumber;
4636     p->header.seq = 0;
4637     p->header.securityIndex = call->conn->securityIndex;
4638     p->header.epoch = call->conn->epoch;
4639     p->header.type = RX_PACKET_TYPE_ACK;
4640     p->header.flags = RX_SLOW_START_OK;
4641     if (reason == RX_ACK_PING) {
4642         p->header.flags |= RX_REQUEST_ACK;
4643 #ifdef ADAPT_WINDOW
4644         clock_GetTime(&call->pingRequestTime);
4645 #endif
4646     }
4647     if (call->conn->type == RX_CLIENT_CONNECTION)
4648         p->header.flags |= RX_CLIENT_INITIATED;
4649
4650 #ifdef RXDEBUG
4651     if (rx_Log) {
4652         fprintf(rx_Log, "SACK: reason %x previous %u seq %u first %u",
4653                 ap->reason, ntohl(ap->previousPacket),
4654                 (unsigned int)p->header.seq, ntohl(ap->firstPacket));
4655         if (ap->nAcks) {
4656             for (offset = 0; offset < ap->nAcks; offset++)
4657                 putc(ap->acks[offset] == RX_ACK_TYPE_NACK ? '-' : '*',
4658                      rx_Log);
4659         }
4660         putc('\n', rx_Log);
4661     }
4662 #endif
4663
4664     {
4665         register int i, nbytes = p->length;
4666
4667         for (i = 1; i < p->niovecs; i++) {      /* vec 0 is ALWAYS header */
4668             if (nbytes <= p->wirevec[i].iov_len) {
4669                 register int savelen, saven;
4670
4671                 savelen = p->wirevec[i].iov_len;
4672                 saven = p->niovecs;
4673                 p->wirevec[i].iov_len = nbytes;
4674                 p->niovecs = i + 1;
4675                 rxi_Send(call, p, istack);
4676                 p->wirevec[i].iov_len = savelen;
4677                 p->niovecs = saven;
4678                 break;
4679             } else
4680                 nbytes -= p->wirevec[i].iov_len;
4681         }
4682     }
4683     MUTEX_ENTER(&rx_stats_mutex);
4684     rx_stats.ackPacketsSent++;
4685     MUTEX_EXIT(&rx_stats_mutex);
4686 #ifndef RX_ENABLE_TSFPQ
4687     if (!optionalPacket)
4688         rxi_FreePacket(p);
4689 #endif
4690     return optionalPacket;      /* Return packet for re-use by caller */
4691 }
4692
4693 /* Send all of the packets in the list in single datagram */
4694 static void
4695 rxi_SendList(struct rx_call *call, struct rx_packet **list, int len,
4696              int istack, int moreFlag, struct clock *now,
4697              struct clock *retryTime, int resending)
4698 {
4699     int i;
4700     int requestAck = 0;
4701     int lastPacket = 0;
4702     struct rx_connection *conn = call->conn;
4703     struct rx_peer *peer = conn->peer;
4704
4705     MUTEX_ENTER(&peer->peer_lock);
4706     peer->nSent += len;
4707     if (resending)
4708         peer->reSends += len;
4709     MUTEX_ENTER(&rx_stats_mutex);
4710     rx_stats.dataPacketsSent += len;
4711     MUTEX_EXIT(&rx_stats_mutex);
4712     MUTEX_EXIT(&peer->peer_lock);
4713
4714     if (list[len - 1]->header.flags & RX_LAST_PACKET) {
4715         lastPacket = 1;
4716     }
4717
4718     /* Set the packet flags and schedule the resend events */
4719     /* Only request an ack for the last packet in the list */
4720     for (i = 0; i < len; i++) {
4721         list[i]->retryTime = *retryTime;
4722         if (list[i]->header.serial) {
4723             /* Exponentially backoff retry times */
4724             if (list[i]->backoff < MAXBACKOFF) {
4725                 /* so it can't stay == 0 */
4726                 list[i]->backoff = (list[i]->backoff << 1) + 1;
4727             } else
4728                 list[i]->backoff++;
4729             clock_Addmsec(&(list[i]->retryTime),
4730                           ((afs_uint32) list[i]->backoff) << 8);
4731         }
4732
4733         /* Wait a little extra for the ack on the last packet */
4734         if (lastPacket && !(list[i]->header.flags & RX_CLIENT_INITIATED)) {
4735             clock_Addmsec(&(list[i]->retryTime), 400);
4736         }
4737
4738         /* Record the time sent */
4739         list[i]->timeSent = *now;
4740
4741         /* Ask for an ack on retransmitted packets,  on every other packet
4742          * if the peer doesn't support slow start. Ask for an ack on every
4743          * packet until the congestion window reaches the ack rate. */
4744         if (list[i]->header.serial) {
4745             requestAck = 1;
4746             MUTEX_ENTER(&rx_stats_mutex);
4747             rx_stats.dataPacketsReSent++;
4748             MUTEX_EXIT(&rx_stats_mutex);
4749         } else {
4750             /* improved RTO calculation- not Karn */
4751             list[i]->firstSent = *now;
4752             if (!lastPacket && (call->cwind <= (u_short) (conn->ackRate + 1)
4753                                 || (!(call->flags & RX_CALL_SLOW_START_OK)
4754                                     && (list[i]->header.seq & 1)))) {
4755                 requestAck = 1;
4756             }
4757         }
4758
4759         MUTEX_ENTER(&peer->peer_lock);
4760         peer->nSent++;
4761         if (resending)
4762             peer->reSends++;
4763         MUTEX_ENTER(&rx_stats_mutex);
4764         rx_stats.dataPacketsSent++;
4765         MUTEX_EXIT(&rx_stats_mutex);
4766         MUTEX_EXIT(&peer->peer_lock);
4767
4768         /* Tag this packet as not being the last in this group,
4769          * for the receiver's benefit */
4770         if (i < len - 1 || moreFlag) {
4771             list[i]->header.flags |= RX_MORE_PACKETS;
4772         }
4773
4774         /* Install the new retransmit time for the packet, and
4775          * record the time sent */
4776         list[i]->timeSent = *now;
4777     }
4778
4779     if (requestAck) {
4780         list[len - 1]->header.flags |= RX_REQUEST_ACK;
4781     }
4782
4783     /* Since we're about to send a data packet to the peer, it's
4784      * safe to nuke any scheduled end-of-packets ack */
4785     rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
4786
4787     CALL_HOLD(call, RX_CALL_REFCOUNT_SEND);
4788     MUTEX_EXIT(&call->lock);
4789     if (len > 1) {
4790         rxi_SendPacketList(call, conn, list, len, istack);
4791     } else {
4792         rxi_SendPacket(call, conn, list[0], istack);
4793     }
4794     MUTEX_ENTER(&call->lock);
4795     CALL_RELE(call, RX_CALL_REFCOUNT_SEND);
4796
4797     /* Update last send time for this call (for keep-alive
4798      * processing), and for the connection (so that we can discover
4799      * idle connections) */
4800     conn->lastSendTime = call->lastSendTime = clock_Sec();
4801 }
4802
4803 /* When sending packets we need to follow these rules:
4804  * 1. Never send more than maxDgramPackets in a jumbogram.
4805  * 2. Never send a packet with more than two iovecs in a jumbogram.
4806  * 3. Never send a retransmitted packet in a jumbogram.
4807  * 4. Never send more than cwind/4 packets in a jumbogram
4808  * We always keep the last list we should have sent so we
4809  * can set the RX_MORE_PACKETS flags correctly.
4810  */
4811 static void
4812 rxi_SendXmitList(struct rx_call *call, struct rx_packet **list, int len,
4813                  int istack, struct clock *now, struct clock *retryTime,
4814                  int resending)
4815 {
4816     int i, cnt, lastCnt = 0;
4817     struct rx_packet **listP, **lastP = 0;
4818     struct rx_peer *peer = call->conn->peer;
4819     int morePackets = 0;
4820
4821     for (cnt = 0, listP = &list[0], i = 0; i < len; i++) {
4822         /* Does the current packet force us to flush the current list? */
4823         if (cnt > 0
4824             && (list[i]->header.serial || (list[i]->flags & RX_PKTFLAG_ACKED)
4825                 || list[i]->length > RX_JUMBOBUFFERSIZE)) {
4826             if (lastCnt > 0) {
4827                 rxi_SendList(call, lastP, lastCnt, istack, 1, now, retryTime,
4828                              resending);
4829                 /* If the call enters an error state stop sending, or if
4830                  * we entered congestion recovery mode, stop sending */
4831                 if (call->error || (call->flags & RX_CALL_FAST_RECOVER_WAIT))
4832                     return;
4833             }
4834             lastP = listP;
4835             lastCnt = cnt;
4836             listP = &list[i];
4837             cnt = 0;
4838         }
4839         /* Add the current packet to the list if it hasn't been acked.
4840          * Otherwise adjust the list pointer to skip the current packet.  */
4841         if (!(list[i]->flags & RX_PKTFLAG_ACKED)) {
4842             cnt++;
4843             /* Do we need to flush the list? */
4844             if (cnt >= (int)peer->maxDgramPackets
4845                 || cnt >= (int)call->nDgramPackets || cnt >= (int)call->cwind
4846                 || list[i]->header.serial
4847                 || list[i]->length != RX_JUMBOBUFFERSIZE) {
4848                 if (lastCnt > 0) {
4849                     rxi_SendList(call, lastP, lastCnt, istack, 1, now,
4850                                  retryTime, resending);
4851                     /* If the call enters an error state stop sending, or if
4852                      * we entered congestion recovery mode, stop sending */
4853                     if (call->error
4854                         || (call->flags & RX_CALL_FAST_RECOVER_WAIT))
4855                         return;
4856                 }
4857                 lastP = listP;
4858                 lastCnt = cnt;
4859                 listP = &list[i + 1];
4860                 cnt = 0;
4861             }
4862         } else {
4863             if (cnt != 0) {
4864                 osi_Panic("rxi_SendList error");
4865             }
4866             listP = &list[i + 1];
4867         }
4868     }
4869
4870     /* Send the whole list when the call is in receive mode, when
4871      * the call is in eof mode, when we are in fast recovery mode,
4872      * and when we have the last packet */
4873     if ((list[len - 1]->header.flags & RX_LAST_PACKET)
4874         || call->mode == RX_MODE_RECEIVING || call->mode == RX_MODE_EOF
4875         || (call->flags & RX_CALL_FAST_RECOVER)) {
4876         /* Check for the case where the current list contains
4877          * an acked packet. Since we always send retransmissions
4878          * in a separate packet, we only need to check the first
4879          * packet in the list */
4880         if (cnt > 0 && !(listP[0]->flags & RX_PKTFLAG_ACKED)) {
4881             morePackets = 1;
4882         }
4883         if (lastCnt > 0) {
4884             rxi_SendList(call, lastP, lastCnt, istack, morePackets, now,
4885                          retryTime, resending);
4886             /* If the call enters an error state stop sending, or if
4887              * we entered congestion recovery mode, stop sending */
4888             if (call->error || (call->flags & RX_CALL_FAST_RECOVER_WAIT))
4889                 return;
4890         }
4891         if (morePackets) {
4892             rxi_SendList(call, listP, cnt, istack, 0, now, retryTime,
4893                          resending);
4894         }
4895     } else if (lastCnt > 0) {
4896         rxi_SendList(call, lastP, lastCnt, istack, 0, now, retryTime,
4897                      resending);
4898     }
4899 }
4900
4901 #ifdef  RX_ENABLE_LOCKS
4902 /* Call rxi_Start, below, but with the call lock held. */
4903 void
4904 rxi_StartUnlocked(struct rxevent *event, register struct rx_call *call,
4905                   void *arg1, int istack)
4906 {
4907     MUTEX_ENTER(&call->lock);
4908     rxi_Start(event, call, arg1, istack);
4909     MUTEX_EXIT(&call->lock);
4910 }
4911 #endif /* RX_ENABLE_LOCKS */
4912
4913 /* This routine is called when new packets are readied for
4914  * transmission and when retransmission may be necessary, or when the
4915  * transmission window or burst count are favourable.  This should be
4916  * better optimized for new packets, the usual case, now that we've
4917  * got rid of queues of send packets. XXXXXXXXXXX */
4918 void
4919 rxi_Start(struct rxevent *event, register struct rx_call *call,
4920           void *arg1, int istack)
4921 {
4922     struct rx_packet *p;
4923     register struct rx_packet *nxp;     /* Next pointer for queue_Scan */
4924     struct rx_peer *peer = call->conn->peer;
4925     struct clock now, retryTime;
4926     int haveEvent;
4927     int nXmitPackets;
4928     int maxXmitPackets;
4929     struct rx_packet **xmitList;
4930     int resending = 0;
4931
4932     /* If rxi_Start is being called as a result of a resend event,
4933      * then make sure that the event pointer is removed from the call
4934      * structure, since there is no longer a per-call retransmission
4935      * event pending. */
4936     if (event && event == call->resendEvent) {
4937         CALL_RELE(call, RX_CALL_REFCOUNT_RESEND);
4938         call->resendEvent = NULL;
4939         resending = 1;
4940         if (queue_IsEmpty(&call->tq)) {
4941             /* Nothing to do */
4942             return;
4943         }
4944         /* Timeouts trigger congestion recovery */
4945 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
4946         if (call->flags & RX_CALL_FAST_RECOVER_WAIT) {
4947             /* someone else is waiting to start recovery */
4948             return;
4949         }
4950         call->flags |= RX_CALL_FAST_RECOVER_WAIT;
4951         while (call->flags & RX_CALL_TQ_BUSY) {
4952             call->flags |= RX_CALL_TQ_WAIT;
4953 #ifdef RX_ENABLE_LOCKS
4954             CV_WAIT(&call->cv_tq, &call->lock);
4955 #else /* RX_ENABLE_LOCKS */
4956             osi_rxSleep(&call->tq);
4957 #endif /* RX_ENABLE_LOCKS */
4958         }
4959 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
4960         call->flags &= ~RX_CALL_FAST_RECOVER_WAIT;
4961         call->flags |= RX_CALL_FAST_RECOVER;
4962         if (peer->maxDgramPackets > 1) {
4963             call->MTU = RX_JUMBOBUFFERSIZE + RX_HEADER_SIZE;
4964         } else {
4965             call->MTU = MIN(peer->natMTU, peer->maxMTU);
4966         }
4967         call->ssthresh = MAX(4, MIN((int)call->cwind, (int)call->twind)) >> 1;
4968         call->nDgramPackets = 1;
4969         call->cwind = 1;
4970         call->nextCwind = 1;
4971         call->nAcks = 0;
4972         call->nNacks = 0;
4973         MUTEX_ENTER(&peer->peer_lock);
4974         peer->MTU = call->MTU;
4975         peer->cwind = call->cwind;
4976         peer->nDgramPackets = 1;
4977         peer->congestSeq++;
4978         call->congestSeq = peer->congestSeq;
4979         MUTEX_EXIT(&peer->peer_lock);
4980         /* Clear retry times on packets. Otherwise, it's possible for
4981          * some packets in the queue to force resends at rates faster
4982          * than recovery rates.
4983          */
4984         for (queue_Scan(&call->tq, p, nxp, rx_packet)) {
4985             if (!(p->flags & RX_PKTFLAG_ACKED)) {
4986                 clock_Zero(&p->retryTime);
4987             }
4988         }
4989     }
4990     if (call->error) {
4991 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
4992         MUTEX_ENTER(&rx_stats_mutex);
4993         rx_tq_debug.rxi_start_in_error++;
4994         MUTEX_EXIT(&rx_stats_mutex);
4995 #endif
4996         return;
4997     }
4998
4999     if (queue_IsNotEmpty(&call->tq)) {  /* If we have anything to send */
5000         /* Get clock to compute the re-transmit time for any packets
5001          * in this burst.  Note, if we back off, it's reasonable to
5002          * back off all of the packets in the same manner, even if
5003          * some of them have been retransmitted more times than more
5004          * recent additions */
5005         clock_GetTime(&now);
5006         retryTime = now;        /* initialize before use */
5007         MUTEX_ENTER(&peer->peer_lock);
5008         clock_Add(&retryTime, &peer->timeout);
5009         MUTEX_EXIT(&peer->peer_lock);
5010
5011         /* Send (or resend) any packets that need it, subject to
5012          * window restrictions and congestion burst control
5013          * restrictions.  Ask for an ack on the last packet sent in
5014          * this burst.  For now, we're relying upon the window being
5015          * considerably bigger than the largest number of packets that
5016          * are typically sent at once by one initial call to
5017          * rxi_Start.  This is probably bogus (perhaps we should ask
5018          * for an ack when we're half way through the current
5019          * window?).  Also, for non file transfer applications, this
5020          * may end up asking for an ack for every packet.  Bogus. XXXX
5021          */
5022         /*
5023          * But check whether we're here recursively, and let the other guy
5024          * do the work.
5025          */
5026 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
5027         if (!(call->flags & RX_CALL_TQ_BUSY)) {
5028             call->flags |= RX_CALL_TQ_BUSY;
5029             do {
5030 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
5031             restart:
5032 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
5033                 call->flags &= ~RX_CALL_NEED_START;
5034 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
5035                 nXmitPackets = 0;
5036                 maxXmitPackets = MIN(call->twind, call->cwind);
5037                 xmitList = (struct rx_packet **)
5038                     osi_Alloc(maxXmitPackets * sizeof(struct rx_packet *));
5039                 if (xmitList == NULL)
5040                     osi_Panic("rxi_Start, failed to allocate xmit list");
5041                 for (queue_Scan(&call->tq, p, nxp, rx_packet)) {
5042                     if (call->flags & RX_CALL_FAST_RECOVER_WAIT) {
5043                         /* We shouldn't be sending packets if a thread is waiting
5044                          * to initiate congestion recovery */
5045                         break;
5046                     }
5047                     if ((nXmitPackets)
5048                         && (call->flags & RX_CALL_FAST_RECOVER)) {
5049                         /* Only send one packet during fast recovery */
5050                         break;
5051                     }
5052                     if ((p->flags & RX_PKTFLAG_FREE)
5053                         || (!queue_IsEnd(&call->tq, nxp)
5054                             && (nxp->flags & RX_PKTFLAG_FREE))
5055                         || (p == (struct rx_packet *)&rx_freePacketQueue)
5056                         || (nxp == (struct rx_packet *)&rx_freePacketQueue)) {
5057                         osi_Panic("rxi_Start: xmit queue clobbered");
5058                     }
5059                     if (p->flags & RX_PKTFLAG_ACKED) {
5060                         MUTEX_ENTER(&rx_stats_mutex);
5061                         rx_stats.ignoreAckedPacket++;
5062                         MUTEX_EXIT(&rx_stats_mutex);
5063                         continue;       /* Ignore this packet if it has been acknowledged */
5064                     }
5065
5066                     /* Turn off all flags except these ones, which are the same
5067                      * on each transmission */
5068                     p->header.flags &= RX_PRESET_FLAGS;
5069
5070                     if (p->header.seq >=
5071                         call->tfirst + MIN((int)call->twind,
5072                                            (int)(call->nSoftAcked +
5073                                                  call->cwind))) {
5074                         call->flags |= RX_CALL_WAIT_WINDOW_SEND;        /* Wait for transmit window */
5075                         /* Note: if we're waiting for more window space, we can
5076                          * still send retransmits; hence we don't return here, but
5077                          * break out to schedule a retransmit event */
5078                         dpf(("call %d waiting for window",
5079                              *(call->callNumber)));
5080                         break;
5081                     }
5082
5083                     /* Transmit the packet if it needs to be sent. */
5084                     if (!clock_Lt(&now, &p->retryTime)) {
5085                         if (nXmitPackets == maxXmitPackets) {
5086                             rxi_SendXmitList(call, xmitList, nXmitPackets, 
5087                                              istack, &now, &retryTime, 
5088                                              resending);
5089                             osi_Free(xmitList, maxXmitPackets * 
5090                                      sizeof(struct rx_packet *));
5091                             goto restart;
5092                         }
5093                         xmitList[nXmitPackets++] = p;
5094                     }
5095                 }
5096
5097                 /* xmitList now hold pointers to all of the packets that are
5098                  * ready to send. Now we loop to send the packets */
5099                 if (nXmitPackets > 0) {
5100                     rxi_SendXmitList(call, xmitList, nXmitPackets, istack,
5101                                      &now, &retryTime, resending);
5102                 }
5103                 osi_Free(xmitList,
5104                          maxXmitPackets * sizeof(struct rx_packet *));
5105
5106 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
5107                 /*
5108                  * TQ references no longer protected by this flag; they must remain
5109                  * protected by the global lock.
5110                  */
5111                 if (call->flags & RX_CALL_FAST_RECOVER_WAIT) {
5112                     call->flags &= ~RX_CALL_TQ_BUSY;
5113                     if (call->flags & RX_CALL_TQ_WAIT) {
5114                         call->flags &= ~RX_CALL_TQ_WAIT;
5115 #ifdef RX_ENABLE_LOCKS
5116                         CV_BROADCAST(&call->cv_tq);
5117 #else /* RX_ENABLE_LOCKS */
5118                         osi_rxWakeup(&call->tq);
5119 #endif /* RX_ENABLE_LOCKS */
5120                     }
5121                     return;
5122                 }
5123                 if (call->error) {
5124                     /* We went into the error state while sending packets. Now is
5125                      * the time to reset the call. This will also inform the using
5126                      * process that the call is in an error state.
5127                      */
5128                     MUTEX_ENTER(&rx_stats_mutex);
5129                     rx_tq_debug.rxi_start_aborted++;
5130                     MUTEX_EXIT(&rx_stats_mutex);
5131                     call->flags &= ~RX_CALL_TQ_BUSY;
5132                     if (call->flags & RX_CALL_TQ_WAIT) {
5133                         call->flags &= ~RX_CALL_TQ_WAIT;
5134 #ifdef RX_ENABLE_LOCKS
5135                         CV_BROADCAST(&call->cv_tq);
5136 #else /* RX_ENABLE_LOCKS */
5137                         osi_rxWakeup(&call->tq);
5138 #endif /* RX_ENABLE_LOCKS */
5139                     }
5140                     rxi_CallError(call, call->error);
5141                     return;
5142                 }
5143 #ifdef RX_ENABLE_LOCKS
5144                 if (call->flags & RX_CALL_TQ_SOME_ACKED) {
5145                     register int missing;
5146                     call->flags &= ~RX_CALL_TQ_SOME_ACKED;
5147                     /* Some packets have received acks. If they all have, we can clear
5148                      * the transmit queue.
5149                      */
5150                     for (missing =
5151                          0, queue_Scan(&call->tq, p, nxp, rx_packet)) {
5152                         if (p->header.seq < call->tfirst
5153                             && (p->flags & RX_PKTFLAG_ACKED)) {
5154                             queue_Remove(p);
5155                             rxi_FreePacket(p);
5156                         } else
5157                             missing = 1;
5158                     }
5159                     if (!missing)
5160                         call->flags |= RX_CALL_TQ_CLEARME;
5161                 }
5162 #endif /* RX_ENABLE_LOCKS */
5163                 /* Don't bother doing retransmits if the TQ is cleared. */
5164                 if (call->flags & RX_CALL_TQ_CLEARME) {
5165                     rxi_ClearTransmitQueue(call, 1);
5166                 } else
5167 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
5168                 {
5169
5170                     /* Always post a resend event, if there is anything in the
5171                      * queue, and resend is possible.  There should be at least
5172                      * one unacknowledged packet in the queue ... otherwise none
5173                      * of these packets should be on the queue in the first place.
5174                      */
5175                     if (call->resendEvent) {
5176                         /* Cancel the existing event and post a new one */
5177                         rxevent_Cancel(call->resendEvent, call,
5178                                        RX_CALL_REFCOUNT_RESEND);
5179                     }
5180
5181                     /* The retry time is the retry time on the first unacknowledged
5182                      * packet inside the current window */
5183                     for (haveEvent =
5184                          0, queue_Scan(&call->tq, p, nxp, rx_packet)) {
5185                         /* Don't set timers for packets outside the window */
5186                         if (p->header.seq >= call->tfirst + call->twind) {
5187                             break;
5188                         }
5189
5190                         if (!(p->flags & RX_PKTFLAG_ACKED)
5191                             && !clock_IsZero(&p->retryTime)) {
5192                             haveEvent = 1;
5193                             retryTime = p->retryTime;
5194                             break;
5195                         }
5196                     }
5197
5198                     /* Post a new event to re-run rxi_Start when retries may be needed */
5199                     if (haveEvent && !(call->flags & RX_CALL_NEED_START)) {
5200 #ifdef RX_ENABLE_LOCKS
5201                         CALL_HOLD(call, RX_CALL_REFCOUNT_RESEND);
5202                         call->resendEvent =
5203                             rxevent_Post2(&retryTime, rxi_StartUnlocked,
5204                                          (void *)call, 0, istack);
5205 #else /* RX_ENABLE_LOCKS */
5206                         call->resendEvent =
5207                             rxevent_Post2(&retryTime, rxi_Start, (void *)call,
5208                                          0, istack);
5209 #endif /* RX_ENABLE_LOCKS */
5210                     }
5211                 }
5212 #ifdef  AFS_GLOBAL_RXLOCK_KERNEL
5213             } while (call->flags & RX_CALL_NEED_START);
5214             /*
5215              * TQ references no longer protected by this flag; they must remain
5216              * protected by the global lock.
5217              */
5218             call->flags &= ~RX_CALL_TQ_BUSY;
5219             if (call->flags & RX_CALL_TQ_WAIT) {
5220                 call->flags &= ~RX_CALL_TQ_WAIT;
5221 #ifdef RX_ENABLE_LOCKS
5222                 CV_BROADCAST(&call->cv_tq);
5223 #else /* RX_ENABLE_LOCKS */
5224                 osi_rxWakeup(&call->tq);
5225 #endif /* RX_ENABLE_LOCKS */
5226             }
5227         } else {
5228             call->flags |= RX_CALL_NEED_START;
5229         }
5230 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
5231     } else {
5232         if (call->resendEvent) {
5233             rxevent_Cancel(call->resendEvent, call, RX_CALL_REFCOUNT_RESEND);
5234         }
5235     }
5236 }
5237
5238 /* Also adjusts the keep alive parameters for the call, to reflect
5239  * that we have just sent a packet (so keep alives aren't sent
5240  * immediately) */
5241 void
5242 rxi_Send(register struct rx_call *call, register struct rx_packet *p,
5243          int istack)
5244 {
5245     register struct rx_connection *conn = call->conn;
5246
5247     /* Stamp each packet with the user supplied status */
5248     p->header.userStatus = call->localStatus;
5249
5250     /* Allow the security object controlling this call's security to
5251      * make any last-minute changes to the packet */
5252     RXS_SendPacket(conn->securityObject, call, p);
5253
5254     /* Since we're about to send SOME sort of packet to the peer, it's
5255      * safe to nuke any scheduled end-of-packets ack */
5256     rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
5257
5258     /* Actually send the packet, filling in more connection-specific fields */
5259     CALL_HOLD(call, RX_CALL_REFCOUNT_SEND);
5260     MUTEX_EXIT(&call->lock);
5261     rxi_SendPacket(call, conn, p, istack);
5262     MUTEX_ENTER(&call->lock);
5263     CALL_RELE(call, RX_CALL_REFCOUNT_SEND);
5264
5265     /* Update last send time for this call (for keep-alive
5266      * processing), and for the connection (so that we can discover
5267      * idle connections) */
5268     conn->lastSendTime = call->lastSendTime = clock_Sec();
5269 }
5270
5271
5272 /* Check if a call needs to be destroyed.  Called by keep-alive code to ensure
5273  * that things are fine.  Also called periodically to guarantee that nothing
5274  * falls through the cracks (e.g. (error + dally) connections have keepalive
5275  * turned off.  Returns 0 if conn is well, -1 otherwise.  If otherwise, call
5276  *  may be freed!
5277  * haveCTLock Set if calling from rxi_ReapConnections
5278  */
5279 #ifdef RX_ENABLE_LOCKS
5280 int
5281 rxi_CheckCall(register struct rx_call *call, int haveCTLock)
5282 #else /* RX_ENABLE_LOCKS */
5283 int
5284 rxi_CheckCall(register struct rx_call *call)
5285 #endif                          /* RX_ENABLE_LOCKS */
5286 {
5287     register struct rx_connection *conn = call->conn;
5288     afs_uint32 now;
5289     afs_uint32 deadTime;
5290
5291 #ifdef RX_GLOBAL_RXLOCK_KERNEL
5292     if (call->flags & RX_CALL_TQ_BUSY) {
5293         /* Call is active and will be reset by rxi_Start if it's
5294          * in an error state.
5295          */
5296         return 0;
5297     }
5298 #endif
5299     /* dead time + RTT + 8*MDEV, rounded up to next second. */
5300     deadTime =
5301         (((afs_uint32) conn->secondsUntilDead << 10) +
5302          ((afs_uint32) conn->peer->rtt >> 3) +
5303          ((afs_uint32) conn->peer->rtt_dev << 1) + 1023) >> 10;
5304     now = clock_Sec();
5305     /* These are computed to the second (+- 1 second).  But that's
5306      * good enough for these values, which should be a significant
5307      * number of seconds. */
5308     if (now > (call->lastReceiveTime + deadTime)) {
5309         if (call->state == RX_STATE_ACTIVE) {
5310             rxi_CallError(call, RX_CALL_DEAD);
5311             return -1;
5312         } else {
5313 #ifdef RX_ENABLE_LOCKS
5314             /* Cancel pending events */
5315             rxevent_Cancel(call->delayedAckEvent, call,
5316                            RX_CALL_REFCOUNT_DELAY);
5317             rxevent_Cancel(call->resendEvent, call, RX_CALL_REFCOUNT_RESEND);
5318             rxevent_Cancel(call->keepAliveEvent, call,
5319                            RX_CALL_REFCOUNT_ALIVE);
5320             if (call->refCount == 0) {
5321                 rxi_FreeCall(call, haveCTLock);
5322                 return -2;
5323             }
5324             return -1;
5325 #else /* RX_ENABLE_LOCKS */
5326             rxi_FreeCall(call);
5327             return -2;
5328 #endif /* RX_ENABLE_LOCKS */
5329         }
5330         /* Non-active calls are destroyed if they are not responding
5331          * to pings; active calls are simply flagged in error, so the
5332          * attached process can die reasonably gracefully. */
5333     }
5334     /* see if we have a non-activity timeout */
5335     if (call->startWait && conn->idleDeadTime
5336         && ((call->startWait + conn->idleDeadTime) < now)) {
5337         if (call->state == RX_STATE_ACTIVE) {
5338             rxi_CallError(call, RX_CALL_TIMEOUT);
5339             return -1;
5340         }
5341     }
5342     /* see if we have a hard timeout */
5343     if (conn->hardDeadTime
5344         && (now > (conn->hardDeadTime + call->startTime.sec))) {
5345         if (call->state == RX_STATE_ACTIVE)
5346             rxi_CallError(call, RX_CALL_TIMEOUT);
5347         return -1;
5348     }
5349     return 0;
5350 }
5351
5352
5353 /* When a call is in progress, this routine is called occasionally to
5354  * make sure that some traffic has arrived (or been sent to) the peer.
5355  * If nothing has arrived in a reasonable amount of time, the call is
5356  * declared dead; if nothing has been sent for a while, we send a
5357  * keep-alive packet (if we're actually trying to keep the call alive)
5358  */
5359 void
5360 rxi_KeepAliveEvent(struct rxevent *event, register struct rx_call *call,
5361                    char *dummy)
5362 {
5363     struct rx_connection *conn;
5364     afs_uint32 now;
5365
5366     MUTEX_ENTER(&call->lock);
5367     CALL_RELE(call, RX_CALL_REFCOUNT_ALIVE);
5368     if (event == call->keepAliveEvent)
5369         call->keepAliveEvent = NULL;
5370     now = clock_Sec();
5371
5372 #ifdef RX_ENABLE_LOCKS
5373     if (rxi_CheckCall(call, 0)) {
5374         MUTEX_EXIT(&call->lock);
5375         return;
5376     }
5377 #else /* RX_ENABLE_LOCKS */
5378     if (rxi_CheckCall(call))
5379         return;
5380 #endif /* RX_ENABLE_LOCKS */
5381
5382     /* Don't try to keep alive dallying calls */
5383     if (call->state == RX_STATE_DALLY) {
5384         MUTEX_EXIT(&call->lock);
5385         return;
5386     }
5387
5388     conn = call->conn;
5389     if ((now - call->lastSendTime) > conn->secondsUntilPing) {
5390         /* Don't try to send keepalives if there is unacknowledged data */
5391         /* the rexmit code should be good enough, this little hack 
5392          * doesn't quite work XXX */
5393         (void)rxi_SendAck(call, NULL, 0, RX_ACK_PING, 0);
5394     }
5395     rxi_ScheduleKeepAliveEvent(call);
5396     MUTEX_EXIT(&call->lock);
5397 }
5398
5399
5400 void
5401 rxi_ScheduleKeepAliveEvent(register struct rx_call *call)
5402 {
5403     if (!call->keepAliveEvent) {
5404         struct clock when;
5405         clock_GetTime(&when);
5406         when.sec += call->conn->secondsUntilPing;
5407         CALL_HOLD(call, RX_CALL_REFCOUNT_ALIVE);
5408         call->keepAliveEvent =
5409             rxevent_Post(&when, rxi_KeepAliveEvent, call, 0);
5410     }
5411 }
5412
5413 /* N.B. rxi_KeepAliveOff:  is defined earlier as a macro */
5414 void
5415 rxi_KeepAliveOn(register struct rx_call *call)
5416 {
5417     /* Pretend last packet received was received now--i.e. if another
5418      * packet isn't received within the keep alive time, then the call
5419      * will die; Initialize last send time to the current time--even
5420      * if a packet hasn't been sent yet.  This will guarantee that a
5421      * keep-alive is sent within the ping time */
5422     call->lastReceiveTime = call->lastSendTime = clock_Sec();
5423     rxi_ScheduleKeepAliveEvent(call);
5424 }
5425
5426 /* This routine is called to send connection abort messages
5427  * that have been delayed to throttle looping clients. */
5428 void
5429 rxi_SendDelayedConnAbort(struct rxevent *event,
5430                          register struct rx_connection *conn, char *dummy)
5431 {
5432     afs_int32 error;
5433     struct rx_packet *packet;
5434
5435     MUTEX_ENTER(&conn->conn_data_lock);
5436     conn->delayedAbortEvent = NULL;
5437     error = htonl(conn->error);
5438     conn->abortCount++;
5439     MUTEX_EXIT(&conn->conn_data_lock);
5440     packet = rxi_AllocPacket(RX_PACKET_CLASS_SPECIAL);
5441     if (packet) {
5442         packet =
5443             rxi_SendSpecial((struct rx_call *)0, conn, packet,
5444                             RX_PACKET_TYPE_ABORT, (char *)&error,
5445                             sizeof(error), 0);
5446         rxi_FreePacket(packet);
5447     }
5448 }
5449
5450 /* This routine is called to send call abort messages
5451  * that have been delayed to throttle looping clients. */
5452 void
5453 rxi_SendDelayedCallAbort(struct rxevent *event, register struct rx_call *call,
5454                          char *dummy)
5455 {
5456     afs_int32 error;
5457     struct rx_packet *packet;
5458
5459     MUTEX_ENTER(&call->lock);
5460     call->delayedAbortEvent = NULL;
5461     error = htonl(call->error);
5462     call->abortCount++;
5463     packet = rxi_AllocPacket(RX_PACKET_CLASS_SPECIAL);
5464     if (packet) {
5465         packet =
5466             rxi_SendSpecial(call, call->conn, packet, RX_PACKET_TYPE_ABORT,
5467                             (char *)&error, sizeof(error), 0);
5468         rxi_FreePacket(packet);
5469     }
5470     MUTEX_EXIT(&call->lock);
5471 }
5472
5473 /* This routine is called periodically (every RX_AUTH_REQUEST_TIMEOUT
5474  * seconds) to ask the client to authenticate itself.  The routine
5475  * issues a challenge to the client, which is obtained from the
5476  * security object associated with the connection */
5477 void
5478 rxi_ChallengeEvent(struct rxevent *event, register struct rx_connection *conn,
5479                    void *arg1, int tries)
5480 {
5481     conn->challengeEvent = NULL;
5482     if (RXS_CheckAuthentication(conn->securityObject, conn) != 0) {
5483         register struct rx_packet *packet;
5484         struct clock when;
5485
5486         if (tries <= 0) {
5487             /* We've failed to authenticate for too long.
5488              * Reset any calls waiting for authentication;
5489              * they are all in RX_STATE_PRECALL.
5490              */
5491             int i;
5492
5493             MUTEX_ENTER(&conn->conn_call_lock);
5494             for (i = 0; i < RX_MAXCALLS; i++) {
5495                 struct rx_call *call = conn->call[i];
5496                 if (call) {
5497                     MUTEX_ENTER(&call->lock);
5498                     if (call->state == RX_STATE_PRECALL) {
5499                         rxi_CallError(call, RX_CALL_DEAD);
5500                         rxi_SendCallAbort(call, NULL, 0, 0);
5501                     }
5502                     MUTEX_EXIT(&call->lock);
5503                 }
5504             }
5505             MUTEX_EXIT(&conn->conn_call_lock);
5506             return;
5507         }
5508
5509         packet = rxi_AllocPacket(RX_PACKET_CLASS_SPECIAL);
5510         if (packet) {
5511             /* If there's no packet available, do this later. */
5512             RXS_GetChallenge(conn->securityObject, conn, packet);
5513             rxi_SendSpecial((struct rx_call *)0, conn, packet,
5514                             RX_PACKET_TYPE_CHALLENGE, NULL, -1, 0);
5515             rxi_FreePacket(packet);
5516         }
5517         clock_GetTime(&when);
5518         when.sec += RX_CHALLENGE_TIMEOUT;
5519         conn->challengeEvent =
5520             rxevent_Post2(&when, rxi_ChallengeEvent, conn, 0,
5521                          (tries - 1));
5522     }
5523 }
5524
5525 /* Call this routine to start requesting the client to authenticate
5526  * itself.  This will continue until authentication is established,
5527  * the call times out, or an invalid response is returned.  The
5528  * security object associated with the connection is asked to create
5529  * the challenge at this time.  N.B.  rxi_ChallengeOff is a macro,
5530  * defined earlier. */
5531 void
5532 rxi_ChallengeOn(register struct rx_connection *conn)
5533 {
5534     if (!conn->challengeEvent) {
5535         RXS_CreateChallenge(conn->securityObject, conn);
5536         rxi_ChallengeEvent(NULL, conn, 0, RX_CHALLENGE_MAXTRIES);
5537     };
5538 }
5539
5540
5541 /* Compute round trip time of the packet provided, in *rttp.
5542  */
5543
5544 /* rxi_ComputeRoundTripTime is called with peer locked. */
5545 /* sentp and/or peer may be null */
5546 void
5547 rxi_ComputeRoundTripTime(register struct rx_packet *p,
5548                          register struct clock *sentp,
5549                          register struct rx_peer *peer)
5550 {
5551     struct clock thisRtt, *rttp = &thisRtt;
5552
5553     register int rtt_timeout;
5554
5555     clock_GetTime(rttp);
5556
5557     if (clock_Lt(rttp, sentp)) {
5558         clock_Zero(rttp);
5559         return;                 /* somebody set the clock back, don't count this time. */
5560     }
5561     clock_Sub(rttp, sentp);
5562     MUTEX_ENTER(&rx_stats_mutex);
5563     if (clock_Lt(rttp, &rx_stats.minRtt))
5564         rx_stats.minRtt = *rttp;
5565     if (clock_Gt(rttp, &rx_stats.maxRtt)) {
5566         if (rttp->sec > 60) {
5567             MUTEX_EXIT(&rx_stats_mutex);
5568             return;             /* somebody set the clock ahead */
5569         }
5570         rx_stats.maxRtt = *rttp;
5571     }
5572     clock_Add(&rx_stats.totalRtt, rttp);
5573     rx_stats.nRttSamples++;
5574     MUTEX_EXIT(&rx_stats_mutex);
5575
5576     /* better rtt calculation courtesy of UMich crew (dave,larry,peter,?) */
5577
5578     /* Apply VanJacobson round-trip estimations */
5579     if (peer->rtt) {
5580         register int delta;
5581
5582         /*
5583          * srtt (peer->rtt) is in units of one-eighth-milliseconds.
5584          * srtt is stored as fixed point with 3 bits after the binary
5585          * point (i.e., scaled by 8). The following magic is
5586          * equivalent to the smoothing algorithm in rfc793 with an
5587          * alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed point).
5588          * srtt*8 = srtt*8 + rtt - srtt
5589          * srtt = srtt + rtt/8 - srtt/8
5590          */
5591
5592         delta = MSEC(rttp) - (peer->rtt >> 3);
5593         peer->rtt += delta;
5594
5595         /*
5596          * We accumulate a smoothed rtt variance (actually, a smoothed
5597          * mean difference), then set the retransmit timer to smoothed
5598          * rtt + 4 times the smoothed variance (was 2x in van's original
5599          * paper, but 4x works better for me, and apparently for him as
5600          * well).
5601          * rttvar is stored as
5602          * fixed point with 2 bits after the binary point (scaled by
5603          * 4).  The following is equivalent to rfc793 smoothing with
5604          * an alpha of .75 (rttvar = rttvar*3/4 + |delta| / 4).  This
5605          * replaces rfc793's wired-in beta.
5606          * dev*4 = dev*4 + (|actual - expected| - dev)
5607          */
5608
5609         if (delta < 0)
5610             delta = -delta;
5611
5612         delta -= (peer->rtt_dev >> 2);
5613         peer->rtt_dev += delta;
5614     } else {
5615         /* I don't have a stored RTT so I start with this value.  Since I'm
5616          * probably just starting a call, and will be pushing more data down
5617          * this, I expect congestion to increase rapidly.  So I fudge a 
5618          * little, and I set deviance to half the rtt.  In practice,
5619          * deviance tends to approach something a little less than
5620          * half the smoothed rtt. */
5621         peer->rtt = (MSEC(rttp) << 3) + 8;
5622         peer->rtt_dev = peer->rtt >> 2; /* rtt/2: they're scaled differently */
5623     }
5624     /* the timeout is RTT + 4*MDEV + 0.35 sec   This is because one end or
5625      * the other of these connections is usually in a user process, and can
5626      * be switched and/or swapped out.  So on fast, reliable networks, the
5627      * timeout would otherwise be too short.  
5628      */
5629     rtt_timeout = (peer->rtt >> 3) + peer->rtt_dev + 350;
5630     clock_Zero(&(peer->timeout));
5631     clock_Addmsec(&(peer->timeout), rtt_timeout);
5632
5633     dpf(("rxi_ComputeRoundTripTime(rtt=%d ms, srtt=%d ms, rtt_dev=%d ms, timeout=%d.%0.3d sec)\n", MSEC(rttp), peer->rtt >> 3, peer->rtt_dev >> 2, (peer->timeout.sec), (peer->timeout.usec)));
5634 }
5635
5636
5637 /* Find all server connections that have not been active for a long time, and
5638  * toss them */
5639 void
5640 rxi_ReapConnections(void)
5641 {
5642     struct clock now;
5643     clock_GetTime(&now);
5644
5645     /* Find server connection structures that haven't been used for
5646      * greater than rx_idleConnectionTime */
5647     {
5648         struct rx_connection **conn_ptr, **conn_end;
5649         int i, havecalls = 0;
5650         MUTEX_ENTER(&rx_connHashTable_lock);
5651         for (conn_ptr = &rx_connHashTable[0], conn_end =
5652              &rx_connHashTable[rx_hashTableSize]; conn_ptr < conn_end;
5653              conn_ptr++) {
5654             struct rx_connection *conn, *next;
5655             struct rx_call *call;
5656             int result;
5657
5658           rereap:
5659             for (conn = *conn_ptr; conn; conn = next) {
5660                 /* XXX -- Shouldn't the connection be locked? */
5661                 next = conn->next;
5662                 havecalls = 0;
5663                 for (i = 0; i < RX_MAXCALLS; i++) {
5664                     call = conn->call[i];
5665                     if (call) {
5666                         havecalls = 1;
5667                         MUTEX_ENTER(&call->lock);
5668 #ifdef RX_ENABLE_LOCKS
5669                         result = rxi_CheckCall(call, 1);
5670 #else /* RX_ENABLE_LOCKS */
5671                         result = rxi_CheckCall(call);
5672 #endif /* RX_ENABLE_LOCKS */
5673                         MUTEX_EXIT(&call->lock);
5674                         if (result == -2) {
5675                             /* If CheckCall freed the call, it might
5676                              * have destroyed  the connection as well,
5677                              * which screws up the linked lists.
5678                              */
5679                             goto rereap;
5680                         }
5681                     }
5682                 }
5683                 if (conn->type == RX_SERVER_CONNECTION) {
5684                     /* This only actually destroys the connection if
5685                      * there are no outstanding calls */
5686                     MUTEX_ENTER(&conn->conn_data_lock);
5687                     if (!havecalls && !conn->refCount
5688                         && ((conn->lastSendTime + rx_idleConnectionTime) <
5689                             now.sec)) {
5690                         conn->refCount++;       /* it will be decr in rx_DestroyConn */
5691                         MUTEX_EXIT(&conn->conn_data_lock);
5692 #ifdef RX_ENABLE_LOCKS
5693                         rxi_DestroyConnectionNoLock(conn);
5694 #else /* RX_ENABLE_LOCKS */
5695                         rxi_DestroyConnection(conn);
5696 #endif /* RX_ENABLE_LOCKS */
5697                     }
5698 #ifdef RX_ENABLE_LOCKS
5699                     else {
5700                         MUTEX_EXIT(&conn->conn_data_lock);
5701                     }
5702 #endif /* RX_ENABLE_LOCKS */
5703                 }
5704             }
5705         }
5706 #ifdef RX_ENABLE_LOCKS
5707         while (rx_connCleanup_list) {
5708             struct rx_connection *conn;
5709             conn = rx_connCleanup_list;
5710             rx_connCleanup_list = rx_connCleanup_list->next;
5711             MUTEX_EXIT(&rx_connHashTable_lock);
5712             rxi_CleanupConnection(conn);
5713             MUTEX_ENTER(&rx_connHashTable_lock);
5714         }
5715         MUTEX_EXIT(&rx_connHashTable_lock);
5716 #endif /* RX_ENABLE_LOCKS */
5717     }
5718
5719     /* Find any peer structures that haven't been used (haven't had an
5720      * associated connection) for greater than rx_idlePeerTime */
5721     {
5722         struct rx_peer **peer_ptr, **peer_end;
5723         int code;
5724         MUTEX_ENTER(&rx_rpc_stats);
5725         MUTEX_ENTER(&rx_peerHashTable_lock);
5726         for (peer_ptr = &rx_peerHashTable[0], peer_end =
5727              &rx_peerHashTable[rx_hashTableSize]; peer_ptr < peer_end;
5728              peer_ptr++) {
5729             struct rx_peer *peer, *next, *prev;
5730             for (prev = peer = *peer_ptr; peer; peer = next) {
5731                 next = peer->next;
5732                 code = MUTEX_TRYENTER(&peer->peer_lock);
5733                 if ((code) && (peer->refCount == 0)
5734                     && ((peer->idleWhen + rx_idlePeerTime) < now.sec)) {
5735                     rx_interface_stat_p rpc_stat, nrpc_stat;
5736                     size_t space;
5737                     MUTEX_EXIT(&peer->peer_lock);
5738                     MUTEX_DESTROY(&peer->peer_lock);
5739                     for (queue_Scan
5740                          (&peer->rpcStats, rpc_stat, nrpc_stat,
5741                           rx_interface_stat)) {
5742                         unsigned int num_funcs;
5743                         if (!rpc_stat)
5744                             break;
5745                         queue_Remove(&rpc_stat->queue_header);
5746                         queue_Remove(&rpc_stat->all_peers);
5747                         num_funcs = rpc_stat->stats[0].func_total;
5748                         space =
5749                             sizeof(rx_interface_stat_t) +
5750                             rpc_stat->stats[0].func_total *
5751                             sizeof(rx_function_entry_v1_t);
5752
5753                         rxi_Free(rpc_stat, space);
5754                         rxi_rpc_peer_stat_cnt -= num_funcs;
5755                     }
5756                     rxi_FreePeer(peer);
5757                     MUTEX_ENTER(&rx_stats_mutex);
5758                     rx_stats.nPeerStructs--;
5759                     MUTEX_EXIT(&rx_stats_mutex);
5760                     if (peer == *peer_ptr) {
5761                         *peer_ptr = next;
5762                         prev = next;
5763                     } else
5764                         prev->next = next;
5765                 } else {
5766                     if (code) {
5767                         MUTEX_EXIT(&peer->peer_lock);
5768                     }
5769                     prev = peer;
5770                 }
5771             }
5772         }
5773         MUTEX_EXIT(&rx_peerHashTable_lock);
5774         MUTEX_EXIT(&rx_rpc_stats);
5775     }
5776
5777     /* THIS HACK IS A TEMPORARY HACK.  The idea is that the race condition in
5778      * rxi_AllocSendPacket, if it hits, will be handled at the next conn
5779      * GC, just below.  Really, we shouldn't have to keep moving packets from
5780      * one place to another, but instead ought to always know if we can
5781      * afford to hold onto a packet in its particular use.  */
5782     MUTEX_ENTER(&rx_freePktQ_lock);
5783     if (rx_waitingForPackets) {
5784         rx_waitingForPackets = 0;
5785 #ifdef  RX_ENABLE_LOCKS
5786         CV_BROADCAST(&rx_waitingForPackets_cv);
5787 #else
5788         osi_rxWakeup(&rx_waitingForPackets);
5789 #endif
5790     }
5791     MUTEX_EXIT(&rx_freePktQ_lock);
5792
5793     now.sec += RX_REAP_TIME;    /* Check every RX_REAP_TIME seconds */
5794     rxevent_Post(&now, rxi_ReapConnections, 0, 0);
5795 }
5796
5797
5798 /* rxs_Release - This isn't strictly necessary but, since the macro name from
5799  * rx.h is sort of strange this is better.  This is called with a security
5800  * object before it is discarded.  Each connection using a security object has
5801  * its own refcount to the object so it won't actually be freed until the last
5802  * connection is destroyed.
5803  *
5804  * This is the only rxs module call.  A hold could also be written but no one
5805  * needs it. */
5806
5807 int
5808 rxs_Release(struct rx_securityClass *aobj)
5809 {
5810     return RXS_Close(aobj);
5811 }
5812
5813 #ifdef ADAPT_WINDOW
5814 #define RXRATE_PKT_OH   (RX_HEADER_SIZE + RX_IPUDP_SIZE)
5815 #define RXRATE_SMALL_PKT    (RXRATE_PKT_OH + sizeof(struct rx_ackPacket))
5816 #define RXRATE_AVG_SMALL_PKT    (RXRATE_PKT_OH + (sizeof(struct rx_ackPacket)/2))
5817 #define RXRATE_LARGE_PKT    (RXRATE_SMALL_PKT + 256)
5818
5819 /* Adjust our estimate of the transmission rate to this peer, given
5820  * that the packet p was just acked. We can adjust peer->timeout and
5821  * call->twind. Pragmatically, this is called
5822  * only with packets of maximal length.
5823  * Called with peer and call locked.
5824  */
5825
5826 static void
5827 rxi_ComputeRate(register struct rx_peer *peer, register struct rx_call *call,
5828                 struct rx_packet *p, struct rx_packet *ackp, u_char ackReason)
5829 {
5830     afs_int32 xferSize, xferMs;
5831     register afs_int32 minTime;
5832     struct clock newTO;
5833
5834     /* Count down packets */
5835     if (peer->rateFlag > 0)
5836         peer->rateFlag--;
5837     /* Do nothing until we're enabled */
5838     if (peer->rateFlag != 0)
5839         return;
5840     if (!call->conn)
5841         return;
5842
5843     /* Count only when the ack seems legitimate */
5844     switch (ackReason) {
5845     case RX_ACK_REQUESTED:
5846         xferSize =
5847             p->length + RX_HEADER_SIZE + call->conn->securityMaxTrailerSize;
5848         xferMs = peer->rtt;
5849         break;
5850
5851     case RX_ACK_PING_RESPONSE:
5852         if (p)                  /* want the response to ping-request, not data send */
5853             return;
5854         clock_GetTime(&newTO);
5855         if (clock_Gt(&newTO, &call->pingRequestTime)) {
5856             clock_Sub(&newTO, &call->pingRequestTime);
5857             xferMs = (newTO.sec * 1000) + (newTO.usec / 1000);
5858         } else {
5859             return;
5860         }
5861         xferSize = rx_AckDataSize(rx_Window) + RX_HEADER_SIZE;
5862         break;
5863
5864     default:
5865         return;
5866     }
5867
5868     dpf(("CONG peer %lx/%u: sample (%s) size %ld, %ld ms (to %lu.%06lu, rtt %u, ps %u)", ntohl(peer->host), ntohs(peer->port), (ackReason == RX_ACK_REQUESTED ? "dataack" : "pingack"), xferSize, xferMs, peer->timeout.sec, peer->timeout.usec, peer->smRtt, peer->ifMTU));
5869
5870     /* Track only packets that are big enough. */
5871     if ((p->length + RX_HEADER_SIZE + call->conn->securityMaxTrailerSize) <
5872         peer->ifMTU)
5873         return;
5874
5875     /* absorb RTT data (in milliseconds) for these big packets */
5876     if (peer->smRtt == 0) {
5877         peer->smRtt = xferMs;
5878     } else {
5879         peer->smRtt = ((peer->smRtt * 15) + xferMs + 4) >> 4;
5880         if (!peer->smRtt)
5881             peer->smRtt = 1;
5882     }
5883
5884     if (peer->countDown) {
5885         peer->countDown--;
5886         return;
5887     }
5888     peer->countDown = 10;       /* recalculate only every so often */
5889
5890     /* In practice, we can measure only the RTT for full packets,
5891      * because of the way Rx acks the data that it receives.  (If it's
5892      * smaller than a full packet, it often gets implicitly acked
5893      * either by the call response (from a server) or by the next call
5894      * (from a client), and either case confuses transmission times
5895      * with processing times.)  Therefore, replace the above
5896      * more-sophisticated processing with a simpler version, where the
5897      * smoothed RTT is kept for full-size packets, and the time to
5898      * transmit a windowful of full-size packets is simply RTT *
5899      * windowSize. Again, we take two steps:
5900      - ensure the timeout is large enough for a single packet's RTT;
5901      - ensure that the window is small enough to fit in the desired timeout.*/
5902
5903     /* First, the timeout check. */
5904     minTime = peer->smRtt;
5905     /* Get a reasonable estimate for a timeout period */
5906     minTime += minTime;
5907     newTO.sec = minTime / 1000;
5908     newTO.usec = (minTime - (newTO.sec * 1000)) * 1000;
5909
5910     /* Increase the timeout period so that we can always do at least
5911      * one packet exchange */
5912     if (clock_Gt(&newTO, &peer->timeout)) {
5913
5914         dpf(("CONG peer %lx/%u: timeout %lu.%06lu ==> %lu.%06lu (rtt %u, ps %u)", ntohl(peer->host), ntohs(peer->port), peer->timeout.sec, peer->timeout.usec, newTO.sec, newTO.usec, peer->smRtt, peer->packetSize));
5915
5916         peer->timeout = newTO;
5917     }
5918
5919     /* Now, get an estimate for the transmit window size. */
5920     minTime = peer->timeout.sec * 1000 + (peer->timeout.usec / 1000);
5921     /* Now, convert to the number of full packets that could fit in a
5922      * reasonable fraction of that interval */
5923     minTime /= (peer->smRtt << 1);
5924     xferSize = minTime;         /* (make a copy) */
5925
5926     /* Now clamp the size to reasonable bounds. */
5927     if (minTime <= 1)
5928         minTime = 1;
5929     else if (minTime > rx_Window)
5930         minTime = rx_Window;
5931 /*    if (minTime != peer->maxWindow) {
5932       dpf(("CONG peer %lx/%u: windowsize %lu ==> %lu (to %lu.%06lu, rtt %u, ps %u)",
5933              ntohl(peer->host), ntohs(peer->port), peer->maxWindow, minTime,
5934              peer->timeout.sec, peer->timeout.usec, peer->smRtt,
5935              peer->packetSize));
5936       peer->maxWindow = minTime;
5937         elide... call->twind = minTime; 
5938     }
5939 */
5940
5941     /* Cut back on the peer timeout if it had earlier grown unreasonably.
5942      * Discern this by calculating the timeout necessary for rx_Window
5943      * packets. */
5944     if ((xferSize > rx_Window) && (peer->timeout.sec >= 3)) {
5945         /* calculate estimate for transmission interval in milliseconds */
5946         minTime = rx_Window * peer->smRtt;
5947         if (minTime < 1000) {
5948             dpf(("CONG peer %lx/%u: cut TO %lu.%06lu by 0.5 (rtt %u, ps %u)",
5949                  ntohl(peer->host), ntohs(peer->port), peer->timeout.sec,
5950                  peer->timeout.usec, peer->smRtt, peer->packetSize));
5951
5952             newTO.sec = 0;      /* cut back on timeout by half a second */
5953             newTO.usec = 500000;
5954             clock_Sub(&peer->timeout, &newTO);
5955         }
5956     }
5957
5958     return;
5959 }                               /* end of rxi_ComputeRate */
5960 #endif /* ADAPT_WINDOW */
5961
5962
5963
5964
5965
5966
5967 #ifdef RXDEBUG
5968 /* Don't call this debugging routine directly; use dpf */
5969 void
5970 rxi_DebugPrint(char *format, int a1, int a2, int a3, int a4, int a5, int a6,
5971                int a7, int a8, int a9, int a10, int a11, int a12, int a13,
5972                int a14, int a15)
5973 {
5974     struct clock now;
5975     clock_GetTime(&now);
5976     fprintf(rx_Log, " %u.%.3u:", (unsigned int)now.sec,
5977             (unsigned int)now.usec / 1000);
5978     fprintf(rx_Log, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12,
5979             a13, a14, a15);
5980     putc('\n', rx_Log);
5981 }
5982 #endif
5983
5984 #ifdef RXDEBUG
5985 /*
5986  * This function is used to process the rx_stats structure that is local
5987  * to a process as well as an rx_stats structure received from a remote
5988  * process (via rxdebug).  Therefore, it needs to do minimal version
5989  * checking.
5990  */
5991 void
5992 rx_PrintTheseStats(FILE * file, struct rx_stats *s, int size,
5993                    afs_int32 freePackets, char version)
5994 {
5995     int i;
5996
5997     if (size != sizeof(struct rx_stats)) {
5998         fprintf(file,
5999                 "Unexpected size of stats structure: was %d, expected %d\n",
6000                 size, sizeof(struct rx_stats));
6001     }
6002
6003     fprintf(file, "rx stats: free packets %d, allocs %d, ", (int)freePackets,
6004             s->packetRequests);
6005
6006     if (version >= RX_DEBUGI_VERSION_W_NEWPACKETTYPES) {
6007         fprintf(file, "alloc-failures(rcv %d/%d,send %d/%d,ack %d)\n",
6008                 s->receivePktAllocFailures, s->receiveCbufPktAllocFailures,
6009                 s->sendPktAllocFailures, s->sendCbufPktAllocFailures,
6010                 s->specialPktAllocFailures);
6011     } else {
6012         fprintf(file, "alloc-failures(rcv %d,send %d,ack %d)\n",
6013                 s->receivePktAllocFailures, s->sendPktAllocFailures,
6014                 s->specialPktAllocFailures);
6015     }
6016
6017     fprintf(file,
6018             "   greedy %d, " "bogusReads %d (last from host %x), "
6019             "noPackets %d, " "noBuffers %d, " "selects %d, "
6020             "sendSelects %d\n", s->socketGreedy, s->bogusPacketOnRead,
6021             s->bogusHost, s->noPacketOnRead, s->noPacketBuffersOnRead,
6022             s->selects, s->sendSelects);
6023
6024     fprintf(file, "   packets read: ");
6025     for (i = 0; i < RX_N_PACKET_TYPES; i++) {
6026         fprintf(file, "%s %d ", rx_packetTypes[i], s->packetsRead[i]);
6027     }
6028     fprintf(file, "\n");
6029
6030     fprintf(file,
6031             "   other read counters: data %d, " "ack %d, " "dup %d "
6032             "spurious %d " "dally %d\n", s->dataPacketsRead,
6033             s->ackPacketsRead, s->dupPacketsRead, s->spuriousPacketsRead,
6034             s->ignorePacketDally);
6035
6036     fprintf(file, "   packets sent: ");
6037     for (i = 0; i < RX_N_PACKET_TYPES; i++) {
6038         fprintf(file, "%s %d ", rx_packetTypes[i], s->packetsSent[i]);
6039     }
6040     fprintf(file, "\n");
6041
6042     fprintf(file,
6043             "   other send counters: ack %d, " "data %d (not resends), "
6044             "resends %d, " "pushed %d, " "acked&ignored %d\n",
6045             s->ackPacketsSent, s->dataPacketsSent, s->dataPacketsReSent,
6046             s->dataPacketsPushed, s->ignoreAckedPacket);
6047
6048     fprintf(file,
6049             "   \t(these should be small) sendFailed %d, " "fatalErrors %d\n",
6050             s->netSendFailures, (int)s->fatalErrors);
6051
6052     if (s->nRttSamples) {
6053         fprintf(file, "   Average rtt is %0.3f, with %d samples\n",
6054                 clock_Float(&s->totalRtt) / s->nRttSamples, s->nRttSamples);
6055
6056         fprintf(file, "   Minimum rtt is %0.3f, maximum is %0.3f\n",
6057                 clock_Float(&s->minRtt), clock_Float(&s->maxRtt));
6058     }
6059
6060     fprintf(file,
6061             "   %d server connections, " "%d client connections, "
6062             "%d peer structs, " "%d call structs, " "%d free call structs\n",
6063             s->nServerConns, s->nClientConns, s->nPeerStructs,
6064             s->nCallStructs, s->nFreeCallStructs);
6065
6066 #if     !defined(AFS_PTHREAD_ENV) && !defined(AFS_USE_GETTIMEOFDAY)
6067     fprintf(file, "   %d clock updates\n", clock_nUpdates);
6068 #endif
6069
6070 }
6071
6072 /* for backward compatibility */
6073 void
6074 rx_PrintStats(FILE * file)
6075 {
6076     MUTEX_ENTER(&rx_stats_mutex);
6077     rx_PrintTheseStats(file, &rx_stats, sizeof(rx_stats), rx_nFreePackets,
6078                        RX_DEBUGI_VERSION);
6079     MUTEX_EXIT(&rx_stats_mutex);
6080 }
6081
6082 void
6083 rx_PrintPeerStats(FILE * file, struct rx_peer *peer)
6084 {
6085     fprintf(file, "Peer %x.%d.  " "Burst size %d, " "burst wait %u.%d.\n",
6086             ntohl(peer->host), (int)peer->port, (int)peer->burstSize,
6087             (int)peer->burstWait.sec, (int)peer->burstWait.usec);
6088
6089     fprintf(file,
6090             "   Rtt %d, " "retry time %u.%06d, " "total sent %d, "
6091             "resent %d\n", peer->rtt, (int)peer->timeout.sec,
6092             (int)peer->timeout.usec, peer->nSent, peer->reSends);
6093
6094     fprintf(file,
6095             "   Packet size %d, " "max in packet skew %d, "
6096             "max out packet skew %d\n", peer->ifMTU, (int)peer->inPacketSkew,
6097             (int)peer->outPacketSkew);
6098 }
6099
6100 #ifdef AFS_PTHREAD_ENV
6101 /*
6102  * This mutex protects the following static variables:
6103  * counter
6104  */
6105
6106 #define LOCK_RX_DEBUG assert(pthread_mutex_lock(&rx_debug_mutex)==0)
6107 #define UNLOCK_RX_DEBUG assert(pthread_mutex_unlock(&rx_debug_mutex)==0)
6108 #else
6109 #define LOCK_RX_DEBUG
6110 #define UNLOCK_RX_DEBUG
6111 #endif /* AFS_PTHREAD_ENV */
6112
6113 static int
6114 MakeDebugCall(osi_socket socket, afs_uint32 remoteAddr, afs_uint16 remotePort,
6115               u_char type, void *inputData, size_t inputLength,
6116               void *outputData, size_t outputLength)
6117 {
6118     static afs_int32 counter = 100;
6119     afs_int32 endTime;
6120     struct rx_header theader;
6121     char tbuffer[1500];
6122     register afs_int32 code;
6123     struct timeval tv;
6124     struct sockaddr_in taddr, faddr;
6125     int faddrLen;
6126     fd_set imask;
6127     register char *tp;
6128
6129     endTime = time(0) + 20;     /* try for 20 seconds */
6130     LOCK_RX_DEBUG;
6131     counter++;
6132     UNLOCK_RX_DEBUG;
6133     tp = &tbuffer[sizeof(struct rx_header)];
6134     taddr.sin_family = AF_INET;
6135     taddr.sin_port = remotePort;
6136     taddr.sin_addr.s_addr = remoteAddr;
6137 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
6138     taddr.sin_len = sizeof(struct sockaddr_in);
6139 #endif
6140     while (1) {
6141         memset(&theader, 0, sizeof(theader));
6142         theader.epoch = htonl(999);
6143         theader.cid = 0;
6144         theader.callNumber = htonl(counter);
6145         theader.seq = 0;
6146         theader.serial = 0;
6147         theader.type = type;
6148         theader.flags = RX_CLIENT_INITIATED | RX_LAST_PACKET;
6149         theader.serviceId = 0;
6150
6151         memcpy(tbuffer, &theader, sizeof(theader));
6152         memcpy(tp, inputData, inputLength);
6153         code =
6154             sendto(socket, tbuffer, inputLength + sizeof(struct rx_header), 0,
6155                    (struct sockaddr *)&taddr, sizeof(struct sockaddr_in));
6156
6157         /* see if there's a packet available */
6158         FD_ZERO(&imask);
6159         FD_SET(socket, &imask);
6160         tv.tv_sec = 1;
6161         tv.tv_usec = 0;
6162         code = select(socket + 1, &imask, 0, 0, &tv);
6163         if (code == 1 && FD_ISSET(socket, &imask)) {
6164             /* now receive a packet */
6165             faddrLen = sizeof(struct sockaddr_in);
6166             code =
6167                 recvfrom(socket, tbuffer, sizeof(tbuffer), 0,
6168                          (struct sockaddr *)&faddr, &faddrLen);
6169
6170             if (code > 0) {
6171                 memcpy(&theader, tbuffer, sizeof(struct rx_header));
6172                 if (counter == ntohl(theader.callNumber))
6173                     break;
6174             }
6175         }
6176
6177         /* see if we've timed out */
6178         if (endTime < time(0))
6179             return -1;
6180     }
6181     code -= sizeof(struct rx_header);
6182     if (code > outputLength)
6183         code = outputLength;
6184     memcpy(outputData, tp, code);
6185     return code;
6186 }
6187
6188 afs_int32
6189 rx_GetServerDebug(osi_socket socket, afs_uint32 remoteAddr,
6190                   afs_uint16 remotePort, struct rx_debugStats * stat,
6191                   afs_uint32 * supportedValues)
6192 {
6193     struct rx_debugIn in;
6194     afs_int32 rc = 0;
6195
6196     *supportedValues = 0;
6197     in.type = htonl(RX_DEBUGI_GETSTATS);
6198     in.index = 0;
6199
6200     rc = MakeDebugCall(socket, remoteAddr, remotePort, RX_PACKET_TYPE_DEBUG,
6201                        &in, sizeof(in), stat, sizeof(*stat));
6202
6203     /*
6204      * If the call was successful, fixup the version and indicate
6205      * what contents of the stat structure are valid.
6206      * Also do net to host conversion of fields here.
6207      */
6208
6209     if (rc >= 0) {
6210         if (stat->version >= RX_DEBUGI_VERSION_W_SECSTATS) {
6211             *supportedValues |= RX_SERVER_DEBUG_SEC_STATS;
6212         }
6213         if (stat->version >= RX_DEBUGI_VERSION_W_GETALLCONN) {
6214             *supportedValues |= RX_SERVER_DEBUG_ALL_CONN;
6215         }
6216         if (stat->version >= RX_DEBUGI_VERSION_W_RXSTATS) {
6217             *supportedValues |= RX_SERVER_DEBUG_RX_STATS;
6218         }
6219         if (stat->version >= RX_DEBUGI_VERSION_W_WAITERS) {
6220             *supportedValues |= RX_SERVER_DEBUG_WAITER_CNT;
6221         }
6222         if (stat->version >= RX_DEBUGI_VERSION_W_IDLETHREADS) {
6223             *supportedValues |= RX_SERVER_DEBUG_IDLE_THREADS;
6224         }
6225         if (stat->version >= RX_DEBUGI_VERSION_W_NEWPACKETTYPES) {
6226             *supportedValues |= RX_SERVER_DEBUG_NEW_PACKETS;
6227         }
6228         if (stat->version >= RX_DEBUGI_VERSION_W_GETPEER) {
6229             *supportedValues |= RX_SERVER_DEBUG_ALL_PEER;
6230         }
6231         if (stat->version >= RX_DEBUGI_VERSION_W_WAITED) {
6232             *supportedValues |= RX_SERVER_DEBUG_WAITED_CNT;
6233         }
6234
6235         stat->nFreePackets = ntohl(stat->nFreePackets);
6236         stat->packetReclaims = ntohl(stat->packetReclaims);
6237         stat->callsExecuted = ntohl(stat->callsExecuted);
6238         stat->nWaiting = ntohl(stat->nWaiting);
6239         stat->idleThreads = ntohl(stat->idleThreads);
6240     }
6241
6242     return rc;
6243 }
6244
6245 afs_int32
6246 rx_GetServerStats(osi_socket socket, afs_uint32 remoteAddr,
6247                   afs_uint16 remotePort, struct rx_stats * stat,
6248                   afs_uint32 * supportedValues)
6249 {
6250     struct rx_debugIn in;
6251     afs_int32 *lp = (afs_int32 *) stat;
6252     int i;
6253     afs_int32 rc = 0;
6254
6255     /*
6256      * supportedValues is currently unused, but added to allow future
6257      * versioning of this function.
6258      */
6259
6260     *supportedValues = 0;
6261     in.type = htonl(RX_DEBUGI_RXSTATS);
6262     in.index = 0;
6263     memset(stat, 0, sizeof(*stat));
6264
6265     rc = MakeDebugCall(socket, remoteAddr, remotePort, RX_PACKET_TYPE_DEBUG,
6266                        &in, sizeof(in), stat, sizeof(*stat));
6267
6268     if (rc >= 0) {
6269
6270         /*
6271          * Do net to host conversion here
6272          */
6273
6274         for (i = 0; i < sizeof(*stat) / sizeof(afs_int32); i++, lp++) {
6275             *lp = ntohl(*lp);
6276         }
6277     }
6278
6279     return rc;
6280 }
6281
6282 afs_int32
6283 rx_GetServerVersion(osi_socket socket, afs_uint32 remoteAddr,
6284                     afs_uint16 remotePort, size_t version_length,
6285                     char *version)
6286 {
6287     char a[1] = { 0 };
6288     return MakeDebugCall(socket, remoteAddr, remotePort,
6289                          RX_PACKET_TYPE_VERSION, a, 1, version,
6290                          version_length);
6291 }
6292
6293 afs_int32
6294 rx_GetServerConnections(osi_socket socket, afs_uint32 remoteAddr,
6295                         afs_uint16 remotePort, afs_int32 * nextConnection,
6296                         int allConnections, afs_uint32 debugSupportedValues,
6297                         struct rx_debugConn * conn,
6298                         afs_uint32 * supportedValues)
6299 {
6300     struct rx_debugIn in;
6301     afs_int32 rc = 0;
6302     int i;
6303
6304     /*
6305      * supportedValues is currently unused, but added to allow future
6306      * versioning of this function.
6307      */
6308
6309     *supportedValues = 0;
6310     if (allConnections) {
6311         in.type = htonl(RX_DEBUGI_GETALLCONN);
6312     } else {
6313         in.type = htonl(RX_DEBUGI_GETCONN);
6314     }
6315     in.index = htonl(*nextConnection);
6316     memset(conn, 0, sizeof(*conn));
6317
6318     rc = MakeDebugCall(socket, remoteAddr, remotePort, RX_PACKET_TYPE_DEBUG,
6319                        &in, sizeof(in), conn, sizeof(*conn));
6320
6321     if (rc >= 0) {
6322         *nextConnection += 1;
6323
6324         /*
6325          * Convert old connection format to new structure.
6326          */
6327
6328         if (debugSupportedValues & RX_SERVER_DEBUG_OLD_CONN) {
6329             struct rx_debugConn_vL *vL = (struct rx_debugConn_vL *)conn;
6330 #define MOVEvL(a) (conn->a = vL->a)
6331
6332             /* any old or unrecognized version... */
6333             for (i = 0; i < RX_MAXCALLS; i++) {
6334                 MOVEvL(callState[i]);
6335                 MOVEvL(callMode[i]);
6336                 MOVEvL(callFlags[i]);
6337                 MOVEvL(callOther[i]);
6338             }
6339             if (debugSupportedValues & RX_SERVER_DEBUG_SEC_STATS) {
6340                 MOVEvL(secStats.type);
6341                 MOVEvL(secStats.level);
6342                 MOVEvL(secStats.flags);
6343                 MOVEvL(secStats.expires);
6344                 MOVEvL(secStats.packetsReceived);
6345                 MOVEvL(secStats.packetsSent);
6346                 MOVEvL(secStats.bytesReceived);
6347                 MOVEvL(secStats.bytesSent);
6348             }
6349         }
6350
6351         /*
6352          * Do net to host conversion here
6353          * NOTE:
6354          *    I don't convert host or port since we are most likely
6355          *    going to want these in NBO.
6356          */
6357         conn->cid = ntohl(conn->cid);
6358         conn->serial = ntohl(conn->serial);
6359         for (i = 0; i < RX_MAXCALLS; i++) {
6360             conn->callNumber[i] = ntohl(conn->callNumber[i]);
6361         }
6362         conn->error = ntohl(conn->error);
6363         conn->secStats.flags = ntohl(conn->secStats.flags);
6364         conn->secStats.expires = ntohl(conn->secStats.expires);
6365         conn->secStats.packetsReceived =
6366             ntohl(conn->secStats.packetsReceived);
6367         conn->secStats.packetsSent = ntohl(conn->secStats.packetsSent);
6368         conn->secStats.bytesReceived = ntohl(conn->secStats.bytesReceived);
6369         conn->secStats.bytesSent = ntohl(conn->secStats.bytesSent);
6370         conn->epoch = ntohl(conn->epoch);
6371         conn->natMTU = ntohl(conn->natMTU);
6372     }
6373
6374     return rc;
6375 }
6376
6377 afs_int32
6378 rx_GetServerPeers(osi_socket socket, afs_uint32 remoteAddr,
6379                   afs_uint16 remotePort, afs_int32 * nextPeer,
6380                   afs_uint32 debugSupportedValues, struct rx_debugPeer * peer,
6381                   afs_uint32 * supportedValues)
6382 {
6383     struct rx_debugIn in;
6384     afs_int32 rc = 0;
6385
6386     /*
6387      * supportedValues is currently unused, but added to allow future
6388      * versioning of this function.
6389      */
6390
6391     *supportedValues = 0;
6392     in.type = htonl(RX_DEBUGI_GETPEER);
6393     in.index = htonl(*nextPeer);
6394     memset(peer, 0, sizeof(*peer));
6395
6396     rc = MakeDebugCall(socket, remoteAddr, remotePort, RX_PACKET_TYPE_DEBUG,
6397                        &in, sizeof(in), peer, sizeof(*peer));
6398
6399     if (rc >= 0) {
6400         *nextPeer += 1;
6401
6402         /*
6403          * Do net to host conversion here
6404          * NOTE:
6405          *    I don't convert host or port since we are most likely
6406          *    going to want these in NBO.
6407          */
6408         peer->ifMTU = ntohs(peer->ifMTU);
6409         peer->idleWhen = ntohl(peer->idleWhen);
6410         peer->refCount = ntohs(peer->refCount);
6411         peer->burstWait.sec = ntohl(peer->burstWait.sec);
6412         peer->burstWait.usec = ntohl(peer->burstWait.usec);
6413         peer->rtt = ntohl(peer->rtt);
6414         peer->rtt_dev = ntohl(peer->rtt_dev);
6415         peer->timeout.sec = ntohl(peer->timeout.sec);
6416         peer->timeout.usec = ntohl(peer->timeout.usec);
6417         peer->nSent = ntohl(peer->nSent);
6418         peer->reSends = ntohl(peer->reSends);
6419         peer->inPacketSkew = ntohl(peer->inPacketSkew);
6420         peer->outPacketSkew = ntohl(peer->outPacketSkew);
6421         peer->rateFlag = ntohl(peer->rateFlag);
6422         peer->natMTU = ntohs(peer->natMTU);
6423         peer->maxMTU = ntohs(peer->maxMTU);
6424         peer->maxDgramPackets = ntohs(peer->maxDgramPackets);
6425         peer->ifDgramPackets = ntohs(peer->ifDgramPackets);
6426         peer->MTU = ntohs(peer->MTU);
6427         peer->cwind = ntohs(peer->cwind);
6428         peer->nDgramPackets = ntohs(peer->nDgramPackets);
6429         peer->congestSeq = ntohs(peer->congestSeq);
6430         peer->bytesSent.high = ntohl(peer->bytesSent.high);
6431         peer->bytesSent.low = ntohl(peer->bytesSent.low);
6432         peer->bytesReceived.high = ntohl(peer->bytesReceived.high);
6433         peer->bytesReceived.low = ntohl(peer->bytesReceived.low);
6434     }
6435
6436     return rc;
6437 }
6438 #endif /* RXDEBUG */
6439
6440 void
6441 shutdown_rx(void)
6442 {
6443     struct rx_serverQueueEntry *np;
6444     register int i, j;
6445 #ifndef KERNEL
6446     register struct rx_call *call;
6447     register struct rx_serverQueueEntry *sq;
6448 #endif /* KERNEL */
6449
6450     LOCK_RX_INIT;
6451     if (rxinit_status == 1) {
6452         UNLOCK_RX_INIT;
6453         return;                 /* Already shutdown. */
6454     }
6455 #ifndef KERNEL
6456     rx_port = 0;
6457 #ifndef AFS_PTHREAD_ENV
6458     FD_ZERO(&rx_selectMask);
6459 #endif /* AFS_PTHREAD_ENV */
6460     rxi_dataQuota = RX_MAX_QUOTA;
6461 #ifndef AFS_PTHREAD_ENV
6462     rxi_StopListener();
6463 #endif /* AFS_PTHREAD_ENV */
6464     shutdown_rxevent();
6465     rx_SetEpoch(0);
6466 #ifndef AFS_PTHREAD_ENV
6467 #ifndef AFS_USE_GETTIMEOFDAY
6468     clock_UnInit();
6469 #endif /* AFS_USE_GETTIMEOFDAY */
6470 #endif /* AFS_PTHREAD_ENV */
6471
6472     while (!queue_IsEmpty(&rx_freeCallQueue)) {
6473         call = queue_First(&rx_freeCallQueue, rx_call);
6474         queue_Remove(call);
6475         rxi_Free(call, sizeof(struct rx_call));
6476     }
6477
6478     while (!queue_IsEmpty(&rx_idleServerQueue)) {
6479         sq = queue_First(&rx_idleServerQueue, rx_serverQueueEntry);
6480         queue_Remove(sq);
6481     }
6482 #endif /* KERNEL */
6483
6484     {
6485         struct rx_peer **peer_ptr, **peer_end;
6486         for (peer_ptr = &rx_peerHashTable[0], peer_end =
6487              &rx_peerHashTable[rx_hashTableSize]; peer_ptr < peer_end;
6488              peer_ptr++) {
6489             struct rx_peer *peer, *next;
6490             for (peer = *peer_ptr; peer; peer = next) {
6491                 rx_interface_stat_p rpc_stat, nrpc_stat;
6492                 size_t space;
6493                 for (queue_Scan
6494                      (&peer->rpcStats, rpc_stat, nrpc_stat,
6495                       rx_interface_stat)) {
6496                     unsigned int num_funcs;
6497                     if (!rpc_stat)
6498                         break;
6499                     queue_Remove(&rpc_stat->queue_header);
6500                     queue_Remove(&rpc_stat->all_peers);
6501                     num_funcs = rpc_stat->stats[0].func_total;
6502                     space =
6503                         sizeof(rx_interface_stat_t) +
6504                         rpc_stat->stats[0].func_total *
6505                         sizeof(rx_function_entry_v1_t);
6506
6507                     rxi_Free(rpc_stat, space);
6508                     MUTEX_ENTER(&rx_rpc_stats);
6509                     rxi_rpc_peer_stat_cnt -= num_funcs;
6510                     MUTEX_EXIT(&rx_rpc_stats);
6511                 }
6512                 next = peer->next;
6513                 rxi_FreePeer(peer);
6514                 MUTEX_ENTER(&rx_stats_mutex);
6515                 rx_stats.nPeerStructs--;
6516                 MUTEX_EXIT(&rx_stats_mutex);
6517             }
6518         }
6519     }
6520     for (i = 0; i < RX_MAX_SERVICES; i++) {
6521         if (rx_services[i])
6522             rxi_Free(rx_services[i], sizeof(*rx_services[i]));
6523     }
6524     for (i = 0; i < rx_hashTableSize; i++) {
6525         register struct rx_connection *tc, *ntc;
6526         MUTEX_ENTER(&rx_connHashTable_lock);
6527         for (tc = rx_connHashTable[i]; tc; tc = ntc) {
6528             ntc = tc->next;
6529             for (j = 0; j < RX_MAXCALLS; j++) {
6530                 if (tc->call[j]) {
6531                     rxi_Free(tc->call[j], sizeof(*tc->call[j]));
6532                 }
6533             }
6534             rxi_Free(tc, sizeof(*tc));
6535         }
6536         MUTEX_EXIT(&rx_connHashTable_lock);
6537     }
6538
6539     MUTEX_ENTER(&freeSQEList_lock);
6540
6541     while ((np = rx_FreeSQEList)) {
6542         rx_FreeSQEList = *(struct rx_serverQueueEntry **)np;
6543         MUTEX_DESTROY(&np->lock);
6544         rxi_Free(np, sizeof(*np));
6545     }
6546
6547     MUTEX_EXIT(&freeSQEList_lock);
6548     MUTEX_DESTROY(&freeSQEList_lock);
6549     MUTEX_DESTROY(&rx_freeCallQueue_lock);
6550     MUTEX_DESTROY(&rx_connHashTable_lock);
6551     MUTEX_DESTROY(&rx_peerHashTable_lock);
6552     MUTEX_DESTROY(&rx_serverPool_lock);
6553
6554     osi_Free(rx_connHashTable,
6555              rx_hashTableSize * sizeof(struct rx_connection *));
6556     osi_Free(rx_peerHashTable, rx_hashTableSize * sizeof(struct rx_peer *));
6557
6558     UNPIN(rx_connHashTable,
6559           rx_hashTableSize * sizeof(struct rx_connection *));
6560     UNPIN(rx_peerHashTable, rx_hashTableSize * sizeof(struct rx_peer *));
6561
6562     rxi_FreeAllPackets();
6563
6564     MUTEX_ENTER(&rx_stats_mutex);
6565     rxi_dataQuota = RX_MAX_QUOTA;
6566     rxi_availProcs = rxi_totalMin = rxi_minDeficit = 0;
6567     MUTEX_EXIT(&rx_stats_mutex);
6568
6569     rxinit_status = 1;
6570     UNLOCK_RX_INIT;
6571 }
6572
6573 #ifdef RX_ENABLE_LOCKS
6574 void
6575 osirx_AssertMine(afs_kmutex_t * lockaddr, char *msg)
6576 {
6577     if (!MUTEX_ISMINE(lockaddr))
6578         osi_Panic("Lock not held: %s", msg);
6579 }
6580 #endif /* RX_ENABLE_LOCKS */
6581
6582 #ifndef KERNEL
6583
6584 /*
6585  * Routines to implement connection specific data.
6586  */
6587
6588 int
6589 rx_KeyCreate(rx_destructor_t rtn)
6590 {
6591     int key;
6592     MUTEX_ENTER(&rxi_keyCreate_lock);
6593     key = rxi_keyCreate_counter++;
6594     rxi_keyCreate_destructor = (rx_destructor_t *)
6595         realloc((void *)rxi_keyCreate_destructor,
6596                 (key + 1) * sizeof(rx_destructor_t));
6597     rxi_keyCreate_destructor[key] = rtn;
6598     MUTEX_EXIT(&rxi_keyCreate_lock);
6599     return key;
6600 }
6601
6602 void
6603 rx_SetSpecific(struct rx_connection *conn, int key, void *ptr)
6604 {
6605     int i;
6606     MUTEX_ENTER(&conn->conn_data_lock);
6607     if (!conn->specific) {
6608         conn->specific = (void **)malloc((key + 1) * sizeof(void *));
6609         for (i = 0; i < key; i++)
6610             conn->specific[i] = NULL;
6611         conn->nSpecific = key + 1;
6612         conn->specific[key] = ptr;
6613     } else if (key >= conn->nSpecific) {
6614         conn->specific = (void **)
6615             realloc(conn->specific, (key + 1) * sizeof(void *));
6616         for (i = conn->nSpecific; i < key; i++)
6617             conn->specific[i] = NULL;
6618         conn->nSpecific = key + 1;
6619         conn->specific[key] = ptr;
6620     } else {
6621         if (conn->specific[key] && rxi_keyCreate_destructor[key])
6622             (*rxi_keyCreate_destructor[key]) (conn->specific[key]);
6623         conn->specific[key] = ptr;
6624     }
6625     MUTEX_EXIT(&conn->conn_data_lock);
6626 }
6627
6628 void *
6629 rx_GetSpecific(struct rx_connection *conn, int key)
6630 {
6631     void *ptr;
6632     MUTEX_ENTER(&conn->conn_data_lock);
6633     if (key >= conn->nSpecific)
6634         ptr = NULL;
6635     else
6636         ptr = conn->specific[key];
6637     MUTEX_EXIT(&conn->conn_data_lock);
6638     return ptr;
6639 }
6640
6641 #endif /* !KERNEL */
6642
6643 /*
6644  * processStats is a queue used to store the statistics for the local
6645  * process.  Its contents are similar to the contents of the rpcStats
6646  * queue on a rx_peer structure, but the actual data stored within
6647  * this queue contains totals across the lifetime of the process (assuming
6648  * the stats have not been reset) - unlike the per peer structures
6649  * which can come and go based upon the peer lifetime.
6650  */
6651
6652 static struct rx_queue processStats = { &processStats, &processStats };
6653
6654 /*
6655  * peerStats is a queue used to store the statistics for all peer structs.
6656  * Its contents are the union of all the peer rpcStats queues.
6657  */
6658
6659 static struct rx_queue peerStats = { &peerStats, &peerStats };
6660
6661 /*
6662  * rxi_monitor_processStats is used to turn process wide stat collection
6663  * on and off
6664  */
6665
6666 static int rxi_monitor_processStats = 0;
6667
6668 /*
6669  * rxi_monitor_peerStats is used to turn per peer stat collection on and off
6670  */
6671
6672 static int rxi_monitor_peerStats = 0;
6673
6674 /*
6675  * rxi_AddRpcStat - given all of the information for a particular rpc
6676  * call, create (if needed) and update the stat totals for the rpc.
6677  *
6678  * PARAMETERS
6679  *
6680  * IN stats - the queue of stats that will be updated with the new value
6681  *
6682  * IN rxInterface - a unique number that identifies the rpc interface
6683  *
6684  * IN currentFunc - the index of the function being invoked
6685  *
6686  * IN totalFunc - the total number of functions in this interface
6687  *
6688  * IN queueTime - the amount of time this function waited for a thread
6689  *
6690  * IN execTime - the amount of time this function invocation took to execute
6691  *
6692  * IN bytesSent - the number bytes sent by this invocation
6693  *
6694  * IN bytesRcvd - the number bytes received by this invocation
6695  *
6696  * IN isServer - if true, this invocation was made to a server
6697  *
6698  * IN remoteHost - the ip address of the remote host
6699  *
6700  * IN remotePort - the port of the remote host
6701  *
6702  * IN addToPeerList - if != 0, add newly created stat to the global peer list
6703  *
6704  * INOUT counter - if a new stats structure is allocated, the counter will
6705  * be updated with the new number of allocated stat structures
6706  *
6707  * RETURN CODES
6708  *
6709  * Returns void.
6710  */
6711
6712 static int
6713 rxi_AddRpcStat(struct rx_queue *stats, afs_uint32 rxInterface,
6714                afs_uint32 currentFunc, afs_uint32 totalFunc,
6715                struct clock *queueTime, struct clock *execTime,
6716                afs_hyper_t * bytesSent, afs_hyper_t * bytesRcvd, int isServer,
6717                afs_uint32 remoteHost, afs_uint32 remotePort,
6718                int addToPeerList, unsigned int *counter)
6719 {
6720     int rc = 0;
6721     rx_interface_stat_p rpc_stat, nrpc_stat;
6722
6723     /*
6724      * See if there's already a structure for this interface
6725      */
6726
6727     for (queue_Scan(stats, rpc_stat, nrpc_stat, rx_interface_stat)) {
6728         if ((rpc_stat->stats[0].interfaceId == rxInterface)
6729             && (rpc_stat->stats[0].remote_is_server == isServer))
6730             break;
6731     }
6732
6733     /*
6734      * Didn't find a match so allocate a new structure and add it to the
6735      * queue.
6736      */
6737
6738     if (queue_IsEnd(stats, rpc_stat) || (rpc_stat == NULL)
6739         || (rpc_stat->stats[0].interfaceId != rxInterface)
6740         || (rpc_stat->stats[0].remote_is_server != isServer)) {
6741         int i;
6742         size_t space;
6743
6744         space =
6745             sizeof(rx_interface_stat_t) +
6746             totalFunc * sizeof(rx_function_entry_v1_t);
6747
6748         rpc_stat = (rx_interface_stat_p) rxi_Alloc(space);
6749         if (rpc_stat == NULL) {
6750             rc = 1;
6751             goto fail;
6752         }
6753         *counter += totalFunc;
6754         for (i = 0; i < totalFunc; i++) {
6755             rpc_stat->stats[i].remote_peer = remoteHost;
6756             rpc_stat->stats[i].remote_port = remotePort;
6757             rpc_stat->stats[i].remote_is_server = isServer;
6758             rpc_stat->stats[i].interfaceId = rxInterface;
6759             rpc_stat->stats[i].func_total = totalFunc;
6760             rpc_stat->stats[i].func_index = i;
6761             hzero(rpc_stat->stats[i].invocations);
6762             hzero(rpc_stat->stats[i].bytes_sent);
6763             hzero(rpc_stat->stats[i].bytes_rcvd);
6764             rpc_stat->stats[i].queue_time_sum.sec = 0;
6765             rpc_stat->stats[i].queue_time_sum.usec = 0;
6766             rpc_stat->stats[i].queue_time_sum_sqr.sec = 0;
6767             rpc_stat->stats[i].queue_time_sum_sqr.usec = 0;
6768             rpc_stat->stats[i].queue_time_min.sec = 9999999;
6769             rpc_stat->stats[i].queue_time_min.usec = 9999999;
6770             rpc_stat->stats[i].queue_time_max.sec = 0;
6771             rpc_stat->stats[i].queue_time_max.usec = 0;
6772             rpc_stat->stats[i].execution_time_sum.sec = 0;
6773             rpc_stat->stats[i].execution_time_sum.usec = 0;
6774             rpc_stat->stats[i].execution_time_sum_sqr.sec = 0;
6775             rpc_stat->stats[i].execution_time_sum_sqr.usec = 0;
6776             rpc_stat->stats[i].execution_time_min.sec = 9999999;
6777             rpc_stat->stats[i].execution_time_min.usec = 9999999;
6778             rpc_stat->stats[i].execution_time_max.sec = 0;
6779             rpc_stat->stats[i].execution_time_max.usec = 0;
6780         }
6781         queue_Prepend(stats, rpc_stat);
6782         if (addToPeerList) {
6783             queue_Prepend(&peerStats, &rpc_stat->all_peers);
6784         }
6785     }
6786
6787     /*
6788      * Increment the stats for this function
6789      */
6790
6791     hadd32(rpc_stat->stats[currentFunc].invocations, 1);
6792     hadd(rpc_stat->stats[currentFunc].bytes_sent, *bytesSent);
6793     hadd(rpc_stat->stats[currentFunc].bytes_rcvd, *bytesRcvd);
6794     clock_Add(&rpc_stat->stats[currentFunc].queue_time_sum, queueTime);
6795     clock_AddSq(&rpc_stat->stats[currentFunc].queue_time_sum_sqr, queueTime);
6796     if (clock_Lt(queueTime, &rpc_stat->stats[currentFunc].queue_time_min)) {
6797         rpc_stat->stats[currentFunc].queue_time_min = *queueTime;
6798     }
6799     if (clock_Gt(queueTime, &rpc_stat->stats[currentFunc].queue_time_max)) {
6800         rpc_stat->stats[currentFunc].queue_time_max = *queueTime;
6801     }
6802     clock_Add(&rpc_stat->stats[currentFunc].execution_time_sum, execTime);
6803     clock_AddSq(&rpc_stat->stats[currentFunc].execution_time_sum_sqr,
6804                 execTime);
6805     if (clock_Lt(execTime, &rpc_stat->stats[currentFunc].execution_time_min)) {
6806         rpc_stat->stats[currentFunc].execution_time_min = *execTime;
6807     }
6808     if (clock_Gt(execTime, &rpc_stat->stats[currentFunc].execution_time_max)) {
6809         rpc_stat->stats[currentFunc].execution_time_max = *execTime;
6810     }
6811
6812   fail:
6813     return rc;
6814 }
6815
6816 /*
6817  * rx_IncrementTimeAndCount - increment the times and count for a particular
6818  * rpc function.
6819  *
6820  * PARAMETERS
6821  *
6822  * IN peer - the peer who invoked the rpc
6823  *
6824  * IN rxInterface - a unique number that identifies the rpc interface
6825  *
6826  * IN currentFunc - the index of the function being invoked
6827  *
6828  * IN totalFunc - the total number of functions in this interface
6829  *
6830  * IN queueTime - the amount of time this function waited for a thread
6831  *
6832  * IN execTime - the amount of time this function invocation took to execute
6833  *
6834  * IN bytesSent - the number bytes sent by this invocation
6835  *
6836  * IN bytesRcvd - the number bytes received by this invocation
6837  *
6838  * IN isServer - if true, this invocation was made to a server
6839  *
6840  * RETURN CODES
6841  *
6842  * Returns void.
6843  */
6844
6845 void
6846 rx_IncrementTimeAndCount(struct rx_peer *peer, afs_uint32 rxInterface,
6847                          afs_uint32 currentFunc, afs_uint32 totalFunc,
6848                          struct clock *queueTime, struct clock *execTime,
6849                          afs_hyper_t * bytesSent, afs_hyper_t * bytesRcvd,
6850                          int isServer)
6851 {
6852
6853     MUTEX_ENTER(&rx_rpc_stats);
6854     MUTEX_ENTER(&peer->peer_lock);
6855
6856     if (rxi_monitor_peerStats) {
6857         rxi_AddRpcStat(&peer->rpcStats, rxInterface, currentFunc, totalFunc,
6858                        queueTime, execTime, bytesSent, bytesRcvd, isServer,
6859                        peer->host, peer->port, 1, &rxi_rpc_peer_stat_cnt);
6860     }
6861
6862     if (rxi_monitor_processStats) {
6863         rxi_AddRpcStat(&processStats, rxInterface, currentFunc, totalFunc,
6864                        queueTime, execTime, bytesSent, bytesRcvd, isServer,
6865                        0xffffffff, 0xffffffff, 0, &rxi_rpc_process_stat_cnt);
6866     }
6867
6868     MUTEX_EXIT(&peer->peer_lock);
6869     MUTEX_EXIT(&rx_rpc_stats);
6870
6871 }
6872
6873 /*
6874  * rx_MarshallProcessRPCStats - marshall an array of rpc statistics
6875  *
6876  * PARAMETERS
6877  *
6878  * IN callerVersion - the rpc stat version of the caller.
6879  *
6880  * IN count - the number of entries to marshall.
6881  *
6882  * IN stats - pointer to stats to be marshalled.
6883  *
6884  * OUT ptr - Where to store the marshalled data.
6885  *
6886  * RETURN CODES
6887  *
6888  * Returns void.
6889  */
6890 void
6891 rx_MarshallProcessRPCStats(afs_uint32 callerVersion, int count,
6892                            rx_function_entry_v1_t * stats, afs_uint32 ** ptrP)
6893 {
6894     int i;
6895     afs_uint32 *ptr;
6896
6897     /*
6898      * We only support the first version
6899      */
6900     for (ptr = *ptrP, i = 0; i < count; i++, stats++) {
6901         *(ptr++) = stats->remote_peer;
6902         *(ptr++) = stats->remote_port;
6903         *(ptr++) = stats->remote_is_server;
6904         *(ptr++) = stats->interfaceId;
6905         *(ptr++) = stats->func_total;
6906         *(ptr++) = stats->func_index;
6907         *(ptr++) = hgethi(stats->invocations);
6908         *(ptr++) = hgetlo(stats->invocations);
6909         *(ptr++) = hgethi(stats->bytes_sent);
6910         *(ptr++) = hgetlo(stats->bytes_sent);
6911         *(ptr++) = hgethi(stats->bytes_rcvd);
6912         *(ptr++) = hgetlo(stats->bytes_rcvd);
6913         *(ptr++) = stats->queue_time_sum.sec;
6914         *(ptr++) = stats->queue_time_sum.usec;
6915         *(ptr++) = stats->queue_time_sum_sqr.sec;
6916         *(ptr++) = stats->queue_time_sum_sqr.usec;
6917         *(ptr++) = stats->queue_time_min.sec;
6918         *(ptr++) = stats->queue_time_min.usec;
6919         *(ptr++) = stats->queue_time_max.sec;
6920         *(ptr++) = stats->queue_time_max.usec;
6921         *(ptr++) = stats->execution_time_sum.sec;
6922         *(ptr++) = stats->execution_time_sum.usec;
6923         *(ptr++) = stats->execution_time_sum_sqr.sec;
6924         *(ptr++) = stats->execution_time_sum_sqr.usec;
6925         *(ptr++) = stats->execution_time_min.sec;
6926         *(ptr++) = stats->execution_time_min.usec;
6927         *(ptr++) = stats->execution_time_max.sec;
6928         *(ptr++) = stats->execution_time_max.usec;
6929     }
6930     *ptrP = ptr;
6931 }
6932
6933 /*
6934  * rx_RetrieveProcessRPCStats - retrieve all of the rpc statistics for
6935  * this process
6936  *
6937  * PARAMETERS
6938  *
6939  * IN callerVersion - the rpc stat version of the caller
6940  *
6941  * OUT myVersion - the rpc stat version of this function
6942  *
6943  * OUT clock_sec - local time seconds
6944  *
6945  * OUT clock_usec - local time microseconds
6946  *
6947  * OUT allocSize - the number of bytes allocated to contain stats
6948  *
6949  * OUT statCount - the number stats retrieved from this process.
6950  *
6951  * OUT stats - the actual stats retrieved from this process.
6952  *
6953  * RETURN CODES
6954  *
6955  * Returns void.  If successful, stats will != NULL.
6956  */
6957
6958 int
6959 rx_RetrieveProcessRPCStats(afs_uint32 callerVersion, afs_uint32 * myVersion,
6960                            afs_uint32 * clock_sec, afs_uint32 * clock_usec,
6961                            size_t * allocSize, afs_uint32 * statCount,
6962                            afs_uint32 ** stats)
6963 {
6964     size_t space = 0;
6965     afs_uint32 *ptr;
6966     struct clock now;
6967     int rc = 0;
6968
6969     *stats = 0;
6970     *allocSize = 0;
6971     *statCount = 0;
6972     *myVersion = RX_STATS_RETRIEVAL_VERSION;
6973
6974     /*
6975      * Check to see if stats are enabled
6976      */
6977
6978     MUTEX_ENTER(&rx_rpc_stats);
6979     if (!rxi_monitor_processStats) {
6980         MUTEX_EXIT(&rx_rpc_stats);
6981         return rc;
6982     }
6983
6984     clock_GetTime(&now);
6985     *clock_sec = now.sec;
6986     *clock_usec = now.usec;
6987
6988     /*
6989      * Allocate the space based upon the caller version
6990      *
6991      * If the client is at an older version than we are,
6992      * we return the statistic data in the older data format, but
6993      * we still return our version number so the client knows we
6994      * are maintaining more data than it can retrieve.
6995      */
6996
6997     if (callerVersion >= RX_STATS_RETRIEVAL_FIRST_EDITION) {
6998         space = rxi_rpc_process_stat_cnt * sizeof(rx_function_entry_v1_t);
6999         *statCount = rxi_rpc_process_stat_cnt;
7000     } else {
7001         /*
7002          * This can't happen yet, but in the future version changes
7003          * can be handled by adding additional code here
7004          */
7005     }
7006
7007     if (space > (size_t) 0) {
7008         *allocSize = space;
7009         ptr = *stats = (afs_uint32 *) rxi_Alloc(space);
7010
7011         if (ptr != NULL) {
7012             rx_interface_stat_p rpc_stat, nrpc_stat;
7013
7014
7015             for (queue_Scan
7016                  (&processStats, rpc_stat, nrpc_stat, rx_interface_stat)) {
7017                 /*
7018                  * Copy the data based upon the caller version
7019                  */
7020                 rx_MarshallProcessRPCStats(callerVersion,
7021                                            rpc_stat->stats[0].func_total,
7022                                            rpc_stat->stats, &ptr);
7023             }
7024         } else {
7025             rc = ENOMEM;
7026         }
7027     }
7028     MUTEX_EXIT(&rx_rpc_stats);
7029     return rc;
7030 }
7031
7032 /*
7033  * rx_RetrievePeerRPCStats - retrieve all of the rpc statistics for the peers
7034  *
7035  * PARAMETERS
7036  *
7037  * IN callerVersion - the rpc stat version of the caller
7038  *
7039  * OUT myVersion - the rpc stat version of this function
7040  *
7041  * OUT clock_sec - local time seconds
7042  *
7043  * OUT clock_usec - local time microseconds
7044  *
7045  * OUT allocSize - the number of bytes allocated to contain stats
7046  *
7047  * OUT statCount - the number of stats retrieved from the individual
7048  * peer structures.
7049  *
7050  * OUT stats - the actual stats retrieved from the individual peer structures.
7051  *
7052  * RETURN CODES
7053  *
7054  * Returns void.  If successful, stats will != NULL.
7055  */
7056
7057 int
7058 rx_RetrievePeerRPCStats(afs_uint32 callerVersion, afs_uint32 * myVersion,
7059                         afs_uint32 * clock_sec, afs_uint32 * clock_usec,
7060                         size_t * allocSize, afs_uint32 * statCount,
7061                         afs_uint32 ** stats)
7062 {
7063     size_t space = 0;
7064     afs_uint32 *ptr;
7065     struct clock now;
7066     int rc = 0;
7067
7068     *stats = 0;
7069     *statCount = 0;
7070     *allocSize = 0;
7071     *myVersion = RX_STATS_RETRIEVAL_VERSION;
7072
7073     /*
7074      * Check to see if stats are enabled
7075      */
7076
7077     MUTEX_ENTER(&rx_rpc_stats);
7078     if (!rxi_monitor_peerStats) {
7079         MUTEX_EXIT(&rx_rpc_stats);
7080         return rc;
7081     }
7082
7083     clock_GetTime(&now);
7084     *clock_sec = now.sec;
7085     *clock_usec = now.usec;
7086
7087     /*
7088      * Allocate the space based upon the caller version
7089      *
7090      * If the client is at an older version than we are,
7091      * we return the statistic data in the older data format, but
7092      * we still return our version number so the client knows we
7093      * are maintaining more data than it can retrieve.
7094      */
7095
7096     if (callerVersion >= RX_STATS_RETRIEVAL_FIRST_EDITION) {
7097         space = rxi_rpc_peer_stat_cnt * sizeof(rx_function_entry_v1_t);
7098         *statCount = rxi_rpc_peer_stat_cnt;
7099     } else {
7100         /*
7101          * This can't happen yet, but in the future version changes
7102          * can be handled by adding additional code here
7103          */
7104     }
7105
7106     if (space > (size_t) 0) {
7107         *allocSize = space;
7108         ptr = *stats = (afs_uint32 *) rxi_Alloc(space);
7109
7110         if (ptr != NULL) {
7111             rx_interface_stat_p rpc_stat, nrpc_stat;
7112             char *fix_offset;
7113
7114             for (queue_Scan
7115                  (&peerStats, rpc_stat, nrpc_stat, rx_interface_stat)) {
7116                 /*
7117                  * We have to fix the offset of rpc_stat since we are
7118                  * keeping this structure on two rx_queues.  The rx_queue
7119                  * package assumes that the rx_queue member is the first
7120                  * member of the structure.  That is, rx_queue assumes that
7121                  * any one item is only on one queue at a time.  We are
7122                  * breaking that assumption and so we have to do a little
7123                  * math to fix our pointers.
7124                  */
7125
7126                 fix_offset = (char *)rpc_stat;
7127                 fix_offset -= offsetof(rx_interface_stat_t, all_peers);
7128                 rpc_stat = (rx_interface_stat_p) fix_offset;
7129
7130                 /*
7131                  * Copy the data based upon the caller version
7132                  */
7133                 rx_MarshallProcessRPCStats(callerVersion,
7134                                            rpc_stat->stats[0].func_total,
7135                                            rpc_stat->stats, &ptr);
7136             }
7137         } else {
7138             rc = ENOMEM;
7139         }
7140     }
7141     MUTEX_EXIT(&rx_rpc_stats);
7142     return rc;
7143 }
7144
7145 /*
7146  * rx_FreeRPCStats - free memory allocated by
7147  *                   rx_RetrieveProcessRPCStats and rx_RetrievePeerRPCStats
7148  *
7149  * PARAMETERS
7150  *
7151  * IN stats - stats previously returned by rx_RetrieveProcessRPCStats or
7152  * rx_RetrievePeerRPCStats
7153  *
7154  * IN allocSize - the number of bytes in stats.
7155  *
7156  * RETURN CODES
7157  *
7158  * Returns void.
7159  */
7160
7161 void
7162 rx_FreeRPCStats(afs_uint32 * stats, size_t allocSize)
7163 {
7164     rxi_Free(stats, allocSize);
7165 }
7166
7167 /*
7168  * rx_queryProcessRPCStats - see if process rpc stat collection is
7169  * currently enabled.
7170  *
7171  * PARAMETERS
7172  *
7173  * RETURN CODES
7174  *
7175  * Returns 0 if stats are not enabled != 0 otherwise
7176  */
7177
7178 int
7179 rx_queryProcessRPCStats(void)
7180 {
7181     int rc;
7182     MUTEX_ENTER(&rx_rpc_stats);
7183     rc = rxi_monitor_processStats;
7184     MUTEX_EXIT(&rx_rpc_stats);
7185     return rc;
7186 }
7187
7188 /*
7189  * rx_queryPeerRPCStats - see if peer stat collection is currently enabled.
7190  *
7191  * PARAMETERS
7192  *
7193  * RETURN CODES
7194  *
7195  * Returns 0 if stats are not enabled != 0 otherwise
7196  */
7197
7198 int
7199 rx_queryPeerRPCStats(void)
7200 {
7201     int rc;
7202     MUTEX_ENTER(&rx_rpc_stats);
7203     rc = rxi_monitor_peerStats;
7204     MUTEX_EXIT(&rx_rpc_stats);
7205     return rc;
7206 }
7207
7208 /*
7209  * rx_enableProcessRPCStats - begin rpc stat collection for entire process
7210  *
7211  * PARAMETERS
7212  *
7213  * RETURN CODES
7214  *
7215  * Returns void.
7216  */
7217
7218 void
7219 rx_enableProcessRPCStats(void)
7220 {
7221     MUTEX_ENTER(&rx_rpc_stats);
7222     rx_enable_stats = 1;
7223     rxi_monitor_processStats = 1;
7224     MUTEX_EXIT(&rx_rpc_stats);
7225 }
7226
7227 /*
7228  * rx_enablePeerRPCStats - begin rpc stat collection per peer structure
7229  *
7230  * PARAMETERS
7231  *
7232  * RETURN CODES
7233  *
7234  * Returns void.
7235  */
7236
7237 void
7238 rx_enablePeerRPCStats(void)
7239 {
7240     MUTEX_ENTER(&rx_rpc_stats);
7241     rx_enable_stats = 1;
7242     rxi_monitor_peerStats = 1;
7243     MUTEX_EXIT(&rx_rpc_stats);
7244 }
7245
7246 /*
7247  * rx_disableProcessRPCStats - stop rpc stat collection for entire process
7248  *
7249  * PARAMETERS
7250  *
7251  * RETURN CODES
7252  *
7253  * Returns void.
7254  */
7255
7256 void
7257 rx_disableProcessRPCStats(void)
7258 {
7259     rx_interface_stat_p rpc_stat, nrpc_stat;
7260     size_t space;
7261
7262     MUTEX_ENTER(&rx_rpc_stats);
7263
7264     /*
7265      * Turn off process statistics and if peer stats is also off, turn
7266      * off everything
7267      */
7268
7269     rxi_monitor_processStats = 0;
7270     if (rxi_monitor_peerStats == 0) {
7271         rx_enable_stats = 0;
7272     }
7273
7274     for (queue_Scan(&processStats, rpc_stat, nrpc_stat, rx_interface_stat)) {
7275         unsigned int num_funcs = 0;
7276         if (!rpc_stat)
7277             break;
7278         queue_Remove(rpc_stat);
7279         num_funcs = rpc_stat->stats[0].func_total;
7280         space =
7281             sizeof(rx_interface_stat_t) +
7282             rpc_stat->stats[0].func_total * sizeof(rx_function_entry_v1_t);
7283
7284         rxi_Free(rpc_stat, space);
7285         rxi_rpc_process_stat_cnt -= num_funcs;
7286     }
7287     MUTEX_EXIT(&rx_rpc_stats);
7288 }
7289
7290 /*
7291  * rx_disablePeerRPCStats - stop rpc stat collection for peers
7292  *
7293  * PARAMETERS
7294  *
7295  * RETURN CODES
7296  *
7297  * Returns void.
7298  */
7299
7300 void
7301 rx_disablePeerRPCStats(void)
7302 {
7303     struct rx_peer **peer_ptr, **peer_end;
7304     int code;
7305
7306     MUTEX_ENTER(&rx_rpc_stats);
7307
7308     /*
7309      * Turn off peer statistics and if process stats is also off, turn
7310      * off everything
7311      */
7312
7313     rxi_monitor_peerStats = 0;
7314     if (rxi_monitor_processStats == 0) {
7315         rx_enable_stats = 0;
7316     }
7317
7318     MUTEX_ENTER(&rx_peerHashTable_lock);
7319     for (peer_ptr = &rx_peerHashTable[0], peer_end =
7320          &rx_peerHashTable[rx_hashTableSize]; peer_ptr < peer_end;
7321          peer_ptr++) {
7322         struct rx_peer *peer, *next, *prev;
7323         for (prev = peer = *peer_ptr; peer; peer = next) {
7324             next = peer->next;
7325             code = MUTEX_TRYENTER(&peer->peer_lock);
7326             if (code) {
7327                 rx_interface_stat_p rpc_stat, nrpc_stat;
7328                 size_t space;
7329                 for (queue_Scan
7330                      (&peer->rpcStats, rpc_stat, nrpc_stat,
7331                       rx_interface_stat)) {
7332                     unsigned int num_funcs = 0;
7333                     if (!rpc_stat)
7334                         break;
7335                     queue_Remove(&rpc_stat->queue_header);
7336                     queue_Remove(&rpc_stat->all_peers);
7337                     num_funcs = rpc_stat->stats[0].func_total;
7338                     space =
7339                         sizeof(rx_interface_stat_t) +
7340                         rpc_stat->stats[0].func_total *
7341                         sizeof(rx_function_entry_v1_t);
7342
7343                     rxi_Free(rpc_stat, space);
7344                     rxi_rpc_peer_stat_cnt -= num_funcs;
7345                 }
7346                 MUTEX_EXIT(&peer->peer_lock);
7347                 if (prev == *peer_ptr) {
7348                     *peer_ptr = next;
7349                     prev = next;
7350                 } else
7351                     prev->next = next;
7352             } else {
7353                 prev = peer;
7354             }
7355         }
7356     }
7357     MUTEX_EXIT(&rx_peerHashTable_lock);
7358     MUTEX_EXIT(&rx_rpc_stats);
7359 }
7360
7361 /*
7362  * rx_clearProcessRPCStats - clear the contents of the rpc stats according
7363  * to clearFlag
7364  *
7365  * PARAMETERS
7366  *
7367  * IN clearFlag - flag indicating which stats to clear
7368  *
7369  * RETURN CODES
7370  *
7371  * Returns void.
7372  */
7373
7374 void
7375 rx_clearProcessRPCStats(afs_uint32 clearFlag)
7376 {
7377     rx_interface_stat_p rpc_stat, nrpc_stat;
7378
7379     MUTEX_ENTER(&rx_rpc_stats);
7380
7381     for (queue_Scan(&processStats, rpc_stat, nrpc_stat, rx_interface_stat)) {
7382         unsigned int num_funcs = 0, i;
7383         num_funcs = rpc_stat->stats[0].func_total;
7384         for (i = 0; i < num_funcs; i++) {
7385             if (clearFlag & AFS_RX_STATS_CLEAR_INVOCATIONS) {
7386                 hzero(rpc_stat->stats[i].invocations);
7387             }
7388             if (clearFlag & AFS_RX_STATS_CLEAR_BYTES_SENT) {
7389                 hzero(rpc_stat->stats[i].bytes_sent);
7390             }
7391             if (clearFlag & AFS_RX_STATS_CLEAR_BYTES_RCVD) {
7392                 hzero(rpc_stat->stats[i].bytes_rcvd);
7393             }
7394             if (clearFlag & AFS_RX_STATS_CLEAR_QUEUE_TIME_SUM) {
7395                 rpc_stat->stats[i].queue_time_sum.sec = 0;
7396                 rpc_stat->stats[i].queue_time_sum.usec = 0;
7397             }
7398             if (clearFlag & AFS_RX_STATS_CLEAR_QUEUE_TIME_SQUARE) {
7399                 rpc_stat->stats[i].queue_time_sum_sqr.sec = 0;
7400                 rpc_stat->stats[i].queue_time_sum_sqr.usec = 0;
7401             }
7402             if (clearFlag & AFS_RX_STATS_CLEAR_QUEUE_TIME_MIN) {
7403                 rpc_stat->stats[i].queue_time_min.sec = 9999999;
7404                 rpc_stat->stats[i].queue_time_min.usec = 9999999;
7405             }
7406             if (clearFlag & AFS_RX_STATS_CLEAR_QUEUE_TIME_MAX) {
7407                 rpc_stat->stats[i].queue_time_max.sec = 0;
7408                 rpc_stat->stats[i].queue_time_max.usec = 0;
7409             }
7410             if (clearFlag & AFS_RX_STATS_CLEAR_EXEC_TIME_SUM) {
7411                 rpc_stat->stats[i].execution_time_sum.sec = 0;
7412                 rpc_stat->stats[i].execution_time_sum.usec = 0;
7413             }
7414             if (clearFlag & AFS_RX_STATS_CLEAR_EXEC_TIME_SQUARE) {
7415                 rpc_stat->stats[i].execution_time_sum_sqr.sec = 0;
7416                 rpc_stat->stats[i].execution_time_sum_sqr.usec = 0;
7417             }
7418             if (clearFlag & AFS_RX_STATS_CLEAR_EXEC_TIME_MIN) {
7419                 rpc_stat->stats[i].execution_time_min.sec = 9999999;
7420                 rpc_stat->stats[i].execution_time_min.usec = 9999999;
7421             }
7422             if (clearFlag & AFS_RX_STATS_CLEAR_EXEC_TIME_MAX) {
7423                 rpc_stat->stats[i].execution_time_max.sec = 0;
7424                 rpc_stat->stats[i].execution_time_max.usec = 0;
7425             }
7426         }
7427     }
7428
7429     MUTEX_EXIT(&rx_rpc_stats);
7430 }
7431
7432 /*
7433  * rx_clearPeerRPCStats - clear the contents of the rpc stats according
7434  * to clearFlag
7435  *
7436  * PARAMETERS
7437  *
7438  * IN clearFlag - flag indicating which stats to clear
7439  *
7440  * RETURN CODES
7441  *
7442  * Returns void.
7443  */
7444
7445 void
7446 rx_clearPeerRPCStats(afs_uint32 clearFlag)
7447 {
7448     rx_interface_stat_p rpc_stat, nrpc_stat;
7449
7450     MUTEX_ENTER(&rx_rpc_stats);
7451
7452     for (queue_Scan(&peerStats, rpc_stat, nrpc_stat, rx_interface_stat)) {
7453         unsigned int num_funcs = 0, i;
7454         char *fix_offset;
7455         /*
7456          * We have to fix the offset of rpc_stat since we are
7457          * keeping this structure on two rx_queues.  The rx_queue
7458          * package assumes that the rx_queue member is the first
7459          * member of the structure.  That is, rx_queue assumes that
7460          * any one item is only on one queue at a time.  We are
7461          * breaking that assumption and so we have to do a little
7462          * math to fix our pointers.
7463          */
7464
7465         fix_offset = (char *)rpc_stat;
7466         fix_offset -= offsetof(rx_interface_stat_t, all_peers);
7467         rpc_stat = (rx_interface_stat_p) fix_offset;
7468
7469         num_funcs = rpc_stat->stats[0].func_total;
7470         for (i = 0; i < num_funcs; i++) {
7471             if (clearFlag & AFS_RX_STATS_CLEAR_INVOCATIONS) {
7472                 hzero(rpc_stat->stats[i].invocations);
7473             }
7474             if (clearFlag & AFS_RX_STATS_CLEAR_BYTES_SENT) {
7475                 hzero(rpc_stat->stats[i].bytes_sent);
7476             }
7477             if (clearFlag & AFS_RX_STATS_CLEAR_BYTES_RCVD) {
7478                 hzero(rpc_stat->stats[i].bytes_rcvd);
7479             }
7480             if (clearFlag & AFS_RX_STATS_CLEAR_QUEUE_TIME_SUM) {
7481                 rpc_stat->stats[i].queue_time_sum.sec = 0;
7482                 rpc_stat->stats[i].queue_time_sum.usec = 0;
7483             }
7484             if (clearFlag & AFS_RX_STATS_CLEAR_QUEUE_TIME_SQUARE) {
7485                 rpc_stat->stats[i].queue_time_sum_sqr.sec = 0;
7486                 rpc_stat->stats[i].queue_time_sum_sqr.usec = 0;
7487             }
7488             if (clearFlag & AFS_RX_STATS_CLEAR_QUEUE_TIME_MIN) {
7489                 rpc_stat->stats[i].queue_time_min.sec = 9999999;
7490                 rpc_stat->stats[i].queue_time_min.usec = 9999999;
7491             }
7492             if (clearFlag & AFS_RX_STATS_CLEAR_QUEUE_TIME_MAX) {
7493                 rpc_stat->stats[i].queue_time_max.sec = 0;
7494                 rpc_stat->stats[i].queue_time_max.usec = 0;
7495             }
7496             if (clearFlag & AFS_RX_STATS_CLEAR_EXEC_TIME_SUM) {
7497                 rpc_stat->stats[i].execution_time_sum.sec = 0;
7498                 rpc_stat->stats[i].execution_time_sum.usec = 0;
7499             }
7500             if (clearFlag & AFS_RX_STATS_CLEAR_EXEC_TIME_SQUARE) {
7501                 rpc_stat->stats[i].execution_time_sum_sqr.sec = 0;
7502                 rpc_stat->stats[i].execution_time_sum_sqr.usec = 0;
7503             }
7504             if (clearFlag & AFS_RX_STATS_CLEAR_EXEC_TIME_MIN) {
7505                 rpc_stat->stats[i].execution_time_min.sec = 9999999;
7506                 rpc_stat->stats[i].execution_time_min.usec = 9999999;
7507             }
7508             if (clearFlag & AFS_RX_STATS_CLEAR_EXEC_TIME_MAX) {
7509                 rpc_stat->stats[i].execution_time_max.sec = 0;
7510                 rpc_stat->stats[i].execution_time_max.usec = 0;
7511             }
7512         }
7513     }
7514
7515     MUTEX_EXIT(&rx_rpc_stats);
7516 }
7517
7518 /*
7519  * rxi_rxstat_userok points to a routine that returns 1 if the caller
7520  * is authorized to enable/disable/clear RX statistics.
7521  */
7522 static int (*rxi_rxstat_userok) (struct rx_call * call) = NULL;
7523
7524 void
7525 rx_SetRxStatUserOk(int (*proc) (struct rx_call * call))
7526 {
7527     rxi_rxstat_userok = proc;
7528 }
7529
7530 int
7531 rx_RxStatUserOk(struct rx_call *call)
7532 {
7533     if (!rxi_rxstat_userok)
7534         return 0;
7535     return rxi_rxstat_userok(call);
7536 }