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