1*41594Ssklower /* Copyright (c) University of British Columbia, 1984 */ 2*41594Ssklower 3*41594Ssklower #include "../h/param.h" 4*41594Ssklower #include "../h/systm.h" 5*41594Ssklower #include "../h/mbuf.h" 6*41594Ssklower #include "../h/socket.h" 7*41594Ssklower #include "../h/protosw.h" 8*41594Ssklower #include "../h/socketvar.h" 9*41594Ssklower #include "../h/errno.h" 10*41594Ssklower 11*41594Ssklower #include "../net/if.h" 12*41594Ssklower 13*41594Ssklower #include "../netccitt/pk.h" 14*41594Ssklower #include "../netccitt/pk_var.h" 15*41594Ssklower 16*41594Ssklower /* 17*41594Ssklower * Various timer values. They can be adjusted 18*41594Ssklower * by patching the binary with adb if necessary. 19*41594Ssklower */ 20*41594Ssklower int pk_t20 = 18 * PR_SLOWHZ; /* restart timer */ 21*41594Ssklower int pk_t21 = 20 * PR_SLOWHZ; /* call timer */ 22*41594Ssklower /* XXX pk_t22 is never used */ 23*41594Ssklower int pk_t22 = 18 * PR_SLOWHZ; /* reset timer */ 24*41594Ssklower int pk_t23 = 18 * PR_SLOWHZ; /* clear timer */ 25*41594Ssklower 26*41594Ssklower pk_timer () 27*41594Ssklower { 28*41594Ssklower register struct pkcb *pkp; 29*41594Ssklower register struct pklcd *lcp, **pp; 30*41594Ssklower register int lcns_jammed, cant_restart; 31*41594Ssklower 32*41594Ssklower for (pkp = pkcbhead; pkp; pkp = pkp->pk_next) { 33*41594Ssklower switch (pkp -> pk_state) { 34*41594Ssklower case DTE_SENT_RESTART: 35*41594Ssklower lcp = pkp -> pk_chan[0]; 36*41594Ssklower /* 37*41594Ssklower * If restart failures are common, a link level 38*41594Ssklower * reset should be initiated here. 39*41594Ssklower */ 40*41594Ssklower if (lcp -> lcd_timer && --lcp -> lcd_timer == 0) 41*41594Ssklower pk_message (0, pkp -> pk_xcp, 42*41594Ssklower "packet level restart failed"); 43*41594Ssklower break; 44*41594Ssklower 45*41594Ssklower case DTE_READY: 46*41594Ssklower lcns_jammed = cant_restart = 0; 47*41594Ssklower for (pp = &pkp -> pk_chan[1]; pp <= &pkp -> pk_chan[pkp -> pk_maxlcn]; pp++) { 48*41594Ssklower if ((lcp = *pp) == 0) 49*41594Ssklower continue; 50*41594Ssklower switch (lcp -> lcd_state) { 51*41594Ssklower case SENT_CALL: 52*41594Ssklower if (--lcp -> lcd_timer == 0) { 53*41594Ssklower lcp -> lcd_so -> so_error = ETIMEDOUT; 54*41594Ssklower pk_clear (lcp); 55*41594Ssklower } 56*41594Ssklower break; 57*41594Ssklower 58*41594Ssklower case SENT_CLEAR: 59*41594Ssklower if (lcp -> lcd_retry >= 3) 60*41594Ssklower lcns_jammed++; 61*41594Ssklower else 62*41594Ssklower if (--lcp -> lcd_timer == 0) 63*41594Ssklower pk_clear (lcp); 64*41594Ssklower break; 65*41594Ssklower 66*41594Ssklower case DATA_TRANSFER: /* lcn active */ 67*41594Ssklower cant_restart++; 68*41594Ssklower break; 69*41594Ssklower } 70*41594Ssklower } 71*41594Ssklower if (lcns_jammed > pkp -> pk_maxlcn / 2 && cant_restart == 0) { 72*41594Ssklower pk_message (0, pkp -> pk_xcp, "%d lcns jammed: attempting restart", lcns_jammed); 73*41594Ssklower pk_restart (pkp, 0); 74*41594Ssklower } 75*41594Ssklower } 76*41594Ssklower } 77*41594Ssklower } 78