xref: /csrg-svn/sys/netccitt/pk_timer.c (revision 41709)
1*41709Ssklower /*
2*41709Ssklower  * Copyright (c) University of British Columbia, 1984
3*41709Ssklower  * Copyright (c) 1990 The Regents of the University of California.
4*41709Ssklower  * All rights reserved.
5*41709Ssklower  *
6*41709Ssklower  * This code is derived from software contributed to Berkeley by
7*41709Ssklower  * the Laboratory for Computation Vision and the Computer Science Department
8*41709Ssklower  * of the University of British Columbia.
9*41709Ssklower  *
10*41709Ssklower  * %sccs.include.redist.c%
11*41709Ssklower  *
12*41709Ssklower  *	@(#)pk_timer.c	7.2 (Berkeley) 05/11/90
13*41709Ssklower  */
1441594Ssklower 
1541594Ssklower #include "../h/param.h"
1641594Ssklower #include "../h/systm.h"
1741594Ssklower #include "../h/mbuf.h"
1841594Ssklower #include "../h/socket.h"
1941594Ssklower #include "../h/protosw.h"
2041594Ssklower #include "../h/socketvar.h"
2141594Ssklower #include "../h/errno.h"
2241594Ssklower 
2341594Ssklower #include "../net/if.h"
2441594Ssklower 
2541594Ssklower #include "../netccitt/pk.h"
2641594Ssklower #include "../netccitt/pk_var.h"
2741594Ssklower 
2841594Ssklower /*
2941594Ssklower  * Various timer values.  They can be adjusted
3041594Ssklower  * by patching the binary with adb if necessary.
3141594Ssklower  */
3241594Ssklower int	pk_t20 = 18 * PR_SLOWHZ;	/* restart timer */
3341594Ssklower int	pk_t21 = 20 * PR_SLOWHZ;	/* call timer */
3441594Ssklower /* XXX pk_t22 is never used */
3541594Ssklower int	pk_t22 = 18 * PR_SLOWHZ;	/* reset timer */
3641594Ssklower int	pk_t23 = 18 * PR_SLOWHZ;	/* clear timer */
3741594Ssklower 
3841594Ssklower pk_timer ()
3941594Ssklower {
4041594Ssklower 	register struct pkcb *pkp;
4141594Ssklower 	register struct pklcd *lcp, **pp;
4241594Ssklower 	register int lcns_jammed, cant_restart;
4341594Ssklower 
4441594Ssklower 	for (pkp = pkcbhead; pkp; pkp = pkp->pk_next) {
4541594Ssklower 		switch (pkp -> pk_state) {
4641594Ssklower 		case DTE_SENT_RESTART:
4741594Ssklower 			lcp = pkp -> pk_chan[0];
4841594Ssklower 			/*
4941594Ssklower 			 * If restart failures are common, a link level
5041594Ssklower 			 * reset should be initiated here.
5141594Ssklower 			 */
5241594Ssklower 			if (lcp -> lcd_timer && --lcp -> lcd_timer == 0)
5341594Ssklower 				pk_message (0, pkp -> pk_xcp,
5441594Ssklower 					"packet level restart failed");
5541594Ssklower 			break;
5641594Ssklower 
5741594Ssklower 		case DTE_READY:
5841594Ssklower 			lcns_jammed = cant_restart = 0;
5941594Ssklower 			for (pp = &pkp -> pk_chan[1]; pp <= &pkp -> pk_chan[pkp -> pk_maxlcn]; pp++) {
6041594Ssklower 				if ((lcp = *pp) == 0)
6141594Ssklower 					continue;
6241594Ssklower 				switch (lcp -> lcd_state) {
6341594Ssklower 				case SENT_CALL:
6441594Ssklower 					if (--lcp -> lcd_timer == 0) {
6541594Ssklower 						lcp -> lcd_so -> so_error = ETIMEDOUT;
6641594Ssklower 						pk_clear (lcp);
6741594Ssklower 					}
6841594Ssklower 					break;
6941594Ssklower 
7041594Ssklower 				case SENT_CLEAR:
7141594Ssklower 					if (lcp -> lcd_retry >= 3)
7241594Ssklower 						lcns_jammed++;
7341594Ssklower 					else
7441594Ssklower 						if (--lcp -> lcd_timer == 0)
7541594Ssklower 							pk_clear (lcp);
7641594Ssklower 					break;
7741594Ssklower 
7841594Ssklower 				case DATA_TRANSFER:	/* lcn active */
7941594Ssklower 					cant_restart++;
8041594Ssklower 					break;
8141594Ssklower 				}
8241594Ssklower 			}
8341594Ssklower 			if (lcns_jammed > pkp -> pk_maxlcn / 2 && cant_restart == 0) {
8441594Ssklower 				pk_message (0, pkp -> pk_xcp, "%d lcns jammed: attempting restart", lcns_jammed);
8541594Ssklower 				pk_restart (pkp, 0);
8641594Ssklower 			}
8741594Ssklower 		}
8841594Ssklower 	}
8941594Ssklower }
90