xref: /csrg-svn/sys/netccitt/pk_timer.c (revision 49934)
141709Ssklower /*
241709Ssklower  * Copyright (c) University of British Columbia, 1984
341709Ssklower  * Copyright (c) 1990 The Regents of the University of California.
441709Ssklower  * All rights reserved.
541709Ssklower  *
641709Ssklower  * This code is derived from software contributed to Berkeley by
741709Ssklower  * the Laboratory for Computation Vision and the Computer Science Department
841709Ssklower  * of the University of British Columbia.
941709Ssklower  *
1041709Ssklower  * %sccs.include.redist.c%
1141709Ssklower  *
12*49934Ssklower  *	@(#)pk_timer.c	7.5 (Berkeley) 05/29/91
1341709Ssklower  */
1441594Ssklower 
1545165Ssklower #include "param.h"
1645165Ssklower #include "systm.h"
1745165Ssklower #include "mbuf.h"
1845165Ssklower #include "socket.h"
1945165Ssklower #include "protosw.h"
2045165Ssklower #include "socketvar.h"
2145165Ssklower #include "errno.h"
2241594Ssklower 
2341594Ssklower #include "../net/if.h"
2441594Ssklower 
2545165Ssklower #include "x25.h"
2645165Ssklower #include "pk.h"
2745165Ssklower #include "pk_var.h"
2841594Ssklower 
2941594Ssklower /*
3041594Ssklower  * Various timer values.  They can be adjusted
3141594Ssklower  * by patching the binary with adb if necessary.
3241594Ssklower  */
3341594Ssklower int	pk_t20 = 18 * PR_SLOWHZ;	/* restart timer */
3441594Ssklower int	pk_t21 = 20 * PR_SLOWHZ;	/* call timer */
3541594Ssklower /* XXX pk_t22 is never used */
3641594Ssklower int	pk_t22 = 18 * PR_SLOWHZ;	/* reset timer */
3741594Ssklower int	pk_t23 = 18 * PR_SLOWHZ;	/* clear timer */
3841594Ssklower 
3941594Ssklower pk_timer ()
4041594Ssklower {
4141594Ssklower 	register struct pkcb *pkp;
4241594Ssklower 	register struct pklcd *lcp, **pp;
4341594Ssklower 	register int lcns_jammed, cant_restart;
4441594Ssklower 
4541594Ssklower 	for (pkp = pkcbhead; pkp; pkp = pkp->pk_next) {
4641594Ssklower 		switch (pkp -> pk_state) {
4741594Ssklower 		case DTE_SENT_RESTART:
4841594Ssklower 			lcp = pkp -> pk_chan[0];
4941594Ssklower 			/*
5041594Ssklower 			 * If restart failures are common, a link level
5141594Ssklower 			 * reset should be initiated here.
5241594Ssklower 			 */
5341594Ssklower 			if (lcp -> lcd_timer && --lcp -> lcd_timer == 0)
5441594Ssklower 				pk_message (0, pkp -> pk_xcp,
5541594Ssklower 					"packet level restart failed");
5641594Ssklower 			break;
5741594Ssklower 
5841594Ssklower 		case DTE_READY:
5941594Ssklower 			lcns_jammed = cant_restart = 0;
6041594Ssklower 			for (pp = &pkp -> pk_chan[1]; pp <= &pkp -> pk_chan[pkp -> pk_maxlcn]; pp++) {
6141594Ssklower 				if ((lcp = *pp) == 0)
6241594Ssklower 					continue;
6341594Ssklower 				switch (lcp -> lcd_state) {
6441594Ssklower 				case SENT_CALL:
6541594Ssklower 					if (--lcp -> lcd_timer == 0) {
66*49934Ssklower 					    if (lcp -> lcd_so)
6741594Ssklower 						lcp -> lcd_so -> so_error = ETIMEDOUT;
68*49934Ssklower 					    pk_clear (lcp, 49, 1);
6941594Ssklower 					}
7041594Ssklower 					break;
7141594Ssklower 
7241594Ssklower 				case SENT_CLEAR:
7341594Ssklower 					if (lcp -> lcd_retry >= 3)
7441594Ssklower 						lcns_jammed++;
7541594Ssklower 					else
7641594Ssklower 						if (--lcp -> lcd_timer == 0)
7745894Ssklower 							pk_clear (lcp, 50, 1);
7841594Ssklower 					break;
7941594Ssklower 
8041594Ssklower 				case DATA_TRANSFER:	/* lcn active */
8141594Ssklower 					cant_restart++;
8241594Ssklower 					break;
8341594Ssklower 				}
8441594Ssklower 			}
8541594Ssklower 			if (lcns_jammed > pkp -> pk_maxlcn / 2 && cant_restart == 0) {
8641594Ssklower 				pk_message (0, pkp -> pk_xcp, "%d lcns jammed: attempting restart", lcns_jammed);
8741594Ssklower 				pk_restart (pkp, 0);
8841594Ssklower 			}
8941594Ssklower 		}
9041594Ssklower 	}
9141594Ssklower }
92