/* * Tcp protocol timeout routine called every 500 ms. * Updates the timers in all active tcb's and * causes finite state machine actions if timers expire. */ void tcp_slowtimo() { register struct inpcb *ip, *ipnxt; register struct tcpcb *tp; int s; register long i; s = splsoftnet(); tcp_maxidle = TCPTV_KEEPCNT * tcp_keepintvl; /* * Search through tcb's and update active timers. */ ip = tcbtable.inpt_queue.cqh_first; if (ip == (struct inpcb *)0) { /* XXX */ splx(s); return; } for (; ip != (struct inpcb *)&tcbtable.inpt_queue; ip = ipnxt) { ipnxt = ip->inp_queue.cqe_next; tp = intotcpcb(ip); if (tp == 0 || tp->t_state == TCPS_LISTEN) continue; for (i = 0; i < TCPT_NTIMERS; i++) { if (tp->t_timer[i] && --tp->t_timer[i] == 0) { (void) tcp_usrreq(tp->t_inpcb->inp_socket, PRU_SLOWTIMO, (struct mbuf *)0, (struct mbuf *)i, (struct mbuf *)0); /* XXX NOT MP SAFE */ if ((ipnxt == (void *)&tcbtable.inpt_queue && tcbtable.inpt_queue.cqh_last != ip) || ipnxt->inp_queue.cqe_prev != ip) goto tpgone; } } tp->t_idle++; if (tp->t_rtt) tp->t_rtt++; tpgone: ; } #ifdef TCP_COMPAT_42 tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ if ((int)tcp_iss < 0) tcp_iss = 0; /* XXX */ #else /* TCP_COMPAT_42 */ tcp_iss += arc4random() % (2 * TCP_ISSINCR / PR_SLOWHZ) + 1; /* increment iss */ #endif /* !TCP_COMPAT_42 */ tcp_now++; /* for timestamps */ splx(s); }
/* * Tcp protocol timeout routine called every 500 ms. * Updates the timers in all active tcb's and * causes finite state machine actions if timers expire. */ void tcp_slowtimo() { struct inpcb *ip, *ipnxt; struct tcpcb *tp; //int s = splnet(); u_long i; //tcp_maxidle = tcp_keepcnt * tcp_keepintvl; /* * Search through tcb's and update active timers. */ ip = g_tcb.inp_next; if (ip == 0) { //splx(s); goto update; return; } for (; ip != &g_tcb; ip = ipnxt) { ipnxt = ip->inp_next; tp = intotcpcb(ip); if (tp == 0 || tp->t_state == TCPS_LISTEN) continue; for (i = 0; i < TCPT_NTIMERS; i++) { if (tp->t_timer[i] && --tp->t_timer[i] == 0) { (void) tcp_usrreq(tp->t_inpcb->inp_socket, PRU_SLOWTIMO, (usn_mbuf_t *)0, (usn_mbuf_t *)i, (usn_mbuf_t *)0); if (ipnxt->inp_prev != ip) goto tpgone; } } tp->t_idle++; if (tp->t_rtt) tp->t_rtt++; tpgone: ; } update: g_tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ #ifdef TCP_COMPAT_42 if ((int)tcp_iss < 0) g_tcp_iss = TCP_ISSINCR; /* XXX */ #endif g_tcp_now++; /* for timestamps */ //splx(s); }
/* * Tcp protocol timeout routine called every 500 ms. * Updates the timers in all active tcb's and * causes finite state machine actions if timers expire. */ tcp_slowtimo() { register struct inpcb *ip, *ipnxt; register struct tcpcb *tp; int s = splnet(); register int i; /* * Search through tcb's and update active timers. */ ip = tcb.inp_next; if (ip == 0) { splx(s); return; } for (; ip != &tcb; ip = ipnxt) { ipnxt = ip->inp_next; tp = intotcpcb(ip); if (tp == 0) continue; for (i = 0; i < TCPT_NTIMERS; i++) { if (tp->t_timer[i] && --tp->t_timer[i] == 0) { (void) tcp_usrreq(tp->t_inpcb->inp_socket, PRU_SLOWTIMO, (struct mbuf *)0, (struct mbuf *)i, (struct mbuf *)0); if (ipnxt->inp_prev != ip) goto tpgone; } } tp->t_idle++; if (tp->t_rtt) tp->t_rtt++; tpgone: ; } tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ #ifdef TCP_COMPAT_42 if ((int)tcp_iss < 0) tcp_iss = 0; /* XXX */ #endif splx(s); }