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*56530Sbostic * @(#)pk_timer.c 7.6 (Berkeley) 10/11/92 1341709Ssklower */ 1441594Ssklower 15*56530Sbostic #include <sys/param.h> 16*56530Sbostic #include <sys/systm.h> 17*56530Sbostic #include <sys/mbuf.h> 18*56530Sbostic #include <sys/socket.h> 19*56530Sbostic #include <sys/protosw.h> 20*56530Sbostic #include <sys/socketvar.h> 21*56530Sbostic #include <sys/errno.h> 2241594Ssklower 23*56530Sbostic #include <net/if.h> 2441594Ssklower 25*56530Sbostic #include <netccitt/x25.h> 26*56530Sbostic #include <netccitt/pk.h> 27*56530Sbostic #include <netccitt/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) { 6649934Ssklower if (lcp -> lcd_so) 6741594Ssklower lcp -> lcd_so -> so_error = ETIMEDOUT; 6849934Ssklower 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