xref: /csrg-svn/sys/netccitt/pk_timer.c (revision 41594)
1*41594Ssklower /* Copyright (c) University of British Columbia, 1984 */
2*41594Ssklower 
3*41594Ssklower #include "../h/param.h"
4*41594Ssklower #include "../h/systm.h"
5*41594Ssklower #include "../h/mbuf.h"
6*41594Ssklower #include "../h/socket.h"
7*41594Ssklower #include "../h/protosw.h"
8*41594Ssklower #include "../h/socketvar.h"
9*41594Ssklower #include "../h/errno.h"
10*41594Ssklower 
11*41594Ssklower #include "../net/if.h"
12*41594Ssklower 
13*41594Ssklower #include "../netccitt/pk.h"
14*41594Ssklower #include "../netccitt/pk_var.h"
15*41594Ssklower 
16*41594Ssklower /*
17*41594Ssklower  * Various timer values.  They can be adjusted
18*41594Ssklower  * by patching the binary with adb if necessary.
19*41594Ssklower  */
20*41594Ssklower int	pk_t20 = 18 * PR_SLOWHZ;	/* restart timer */
21*41594Ssklower int	pk_t21 = 20 * PR_SLOWHZ;	/* call timer */
22*41594Ssklower /* XXX pk_t22 is never used */
23*41594Ssklower int	pk_t22 = 18 * PR_SLOWHZ;	/* reset timer */
24*41594Ssklower int	pk_t23 = 18 * PR_SLOWHZ;	/* clear timer */
25*41594Ssklower 
26*41594Ssklower pk_timer ()
27*41594Ssklower {
28*41594Ssklower 	register struct pkcb *pkp;
29*41594Ssklower 	register struct pklcd *lcp, **pp;
30*41594Ssklower 	register int lcns_jammed, cant_restart;
31*41594Ssklower 
32*41594Ssklower 	for (pkp = pkcbhead; pkp; pkp = pkp->pk_next) {
33*41594Ssklower 		switch (pkp -> pk_state) {
34*41594Ssklower 		case DTE_SENT_RESTART:
35*41594Ssklower 			lcp = pkp -> pk_chan[0];
36*41594Ssklower 			/*
37*41594Ssklower 			 * If restart failures are common, a link level
38*41594Ssklower 			 * reset should be initiated here.
39*41594Ssklower 			 */
40*41594Ssklower 			if (lcp -> lcd_timer && --lcp -> lcd_timer == 0)
41*41594Ssklower 				pk_message (0, pkp -> pk_xcp,
42*41594Ssklower 					"packet level restart failed");
43*41594Ssklower 			break;
44*41594Ssklower 
45*41594Ssklower 		case DTE_READY:
46*41594Ssklower 			lcns_jammed = cant_restart = 0;
47*41594Ssklower 			for (pp = &pkp -> pk_chan[1]; pp <= &pkp -> pk_chan[pkp -> pk_maxlcn]; pp++) {
48*41594Ssklower 				if ((lcp = *pp) == 0)
49*41594Ssklower 					continue;
50*41594Ssklower 				switch (lcp -> lcd_state) {
51*41594Ssklower 				case SENT_CALL:
52*41594Ssklower 					if (--lcp -> lcd_timer == 0) {
53*41594Ssklower 						lcp -> lcd_so -> so_error = ETIMEDOUT;
54*41594Ssklower 						pk_clear (lcp);
55*41594Ssklower 					}
56*41594Ssklower 					break;
57*41594Ssklower 
58*41594Ssklower 				case SENT_CLEAR:
59*41594Ssklower 					if (lcp -> lcd_retry >= 3)
60*41594Ssklower 						lcns_jammed++;
61*41594Ssklower 					else
62*41594Ssklower 						if (--lcp -> lcd_timer == 0)
63*41594Ssklower 							pk_clear (lcp);
64*41594Ssklower 					break;
65*41594Ssklower 
66*41594Ssklower 				case DATA_TRANSFER:	/* lcn active */
67*41594Ssklower 					cant_restart++;
68*41594Ssklower 					break;
69*41594Ssklower 				}
70*41594Ssklower 			}
71*41594Ssklower 			if (lcns_jammed > pkp -> pk_maxlcn / 2 && cant_restart == 0) {
72*41594Ssklower 				pk_message (0, pkp -> pk_xcp, "%d lcns jammed: attempting restart", lcns_jammed);
73*41594Ssklower 				pk_restart (pkp, 0);
74*41594Ssklower 			}
75*41594Ssklower 		}
76*41594Ssklower 	}
77*41594Ssklower }
78