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*45165Ssklower * @(#)pk_timer.c 7.3 (Berkeley) 08/30/90 1341709Ssklower */ 1441594Ssklower 15*45165Ssklower #include "param.h" 16*45165Ssklower #include "systm.h" 17*45165Ssklower #include "mbuf.h" 18*45165Ssklower #include "socket.h" 19*45165Ssklower #include "protosw.h" 20*45165Ssklower #include "socketvar.h" 21*45165Ssklower #include "errno.h" 2241594Ssklower 2341594Ssklower #include "../net/if.h" 2441594Ssklower 25*45165Ssklower #include "x25.h" 26*45165Ssklower #include "pk.h" 27*45165Ssklower #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) { 6641594Ssklower lcp -> lcd_so -> so_error = ETIMEDOUT; 6741594Ssklower pk_clear (lcp); 6841594Ssklower } 6941594Ssklower break; 7041594Ssklower 7141594Ssklower case SENT_CLEAR: 7241594Ssklower if (lcp -> lcd_retry >= 3) 7341594Ssklower lcns_jammed++; 7441594Ssklower else 7541594Ssklower if (--lcp -> lcd_timer == 0) 7641594Ssklower pk_clear (lcp); 7741594Ssklower break; 7841594Ssklower 7941594Ssklower case DATA_TRANSFER: /* lcn active */ 8041594Ssklower cant_restart++; 8141594Ssklower break; 8241594Ssklower } 8341594Ssklower } 8441594Ssklower if (lcns_jammed > pkp -> pk_maxlcn / 2 && cant_restart == 0) { 8541594Ssklower pk_message (0, pkp -> pk_xcp, "%d lcns jammed: attempting restart", lcns_jammed); 8641594Ssklower pk_restart (pkp, 0); 8741594Ssklower } 8841594Ssklower } 8941594Ssklower } 9041594Ssklower } 91