#include <slirp.h>
-#ifdef LOG_ENABLED
-struct tcpstat tcpstat; /* tcp statistics */
-#endif
-
-u_int32_t tcp_now; /* for RFC 1323 timestamps */
-
static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer);
/*
* Fast timeout routine for processing delayed acks
*/
void
-tcp_fasttimo(void)
+tcp_fasttimo(Slirp *slirp)
{
register struct socket *so;
register struct tcpcb *tp;
DEBUG_CALL("tcp_fasttimo");
- so = tcb.so_next;
+ so = slirp->tcb.so_next;
if (so)
- for (; so != &tcb; so = so->so_next)
+ for (; so != &slirp->tcb; so = so->so_next)
if ((tp = (struct tcpcb *)so->so_tcpcb) &&
(tp->t_flags & TF_DELACK)) {
tp->t_flags &= ~TF_DELACK;
tp->t_flags |= TF_ACKNOW;
- STAT(tcpstat.tcps_delack++);
(void) tcp_output(tp);
}
}
* causes finite state machine actions if timers expire.
*/
void
-tcp_slowtimo(void)
+tcp_slowtimo(Slirp *slirp)
{
register struct socket *ip, *ipnxt;
register struct tcpcb *tp;
/*
* Search through tcb's and update active timers.
*/
- ip = tcb.so_next;
- if (ip == 0)
- return;
- for (; ip != &tcb; ip = ipnxt) {
+ ip = slirp->tcb.so_next;
+ if (ip == NULL) {
+ return;
+ }
+ for (; ip != &slirp->tcb; ip = ipnxt) {
ipnxt = ip->so_next;
tp = sototcpcb(ip);
- if (tp == 0)
- continue;
+ if (tp == NULL) {
+ continue;
+ }
for (i = 0; i < TCPT_NTIMERS; i++) {
if (tp->t_timer[i] && --tp->t_timer[i] == 0) {
tcp_timers(tp,i);
tpgone:
;
}
- tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */
- tcp_now++; /* for timestamps */
+ slirp->tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */
+ slirp->tcp_now++; /* for timestamps */
}
/*
* We tried our best, now the connection must die!
*/
tp->t_rxtshift = TCP_MAXRXTSHIFT;
- STAT(tcpstat.tcps_timeoutdrop++);
tp = tcp_drop(tp, tp->t_softerror);
/* tp->t_softerror : ETIMEDOUT); */ /* XXX */
return (tp); /* XXX */
*/
tp->t_rxtshift = 6;
}
- STAT(tcpstat.tcps_rexmttimeo++);
rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];
TCPT_RANGESET(tp->t_rxtcur, rexmt,
(short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */
* Force a byte to be output, if possible.
*/
case TCPT_PERSIST:
- STAT(tcpstat.tcps_persisttimeo++);
tcp_setpersist(tp);
tp->t_force = 1;
(void) tcp_output(tp);
* or drop connection if idle for too long.
*/
case TCPT_KEEP:
- STAT(tcpstat.tcps_keeptimeo++);
if (tp->t_state < TCPS_ESTABLISHED)
goto dropit;
* by the protocol spec, this requires the
* correspondent TCP to respond.
*/
- STAT(tcpstat.tcps_keepprobe++);
tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL,
tp->rcv_nxt, tp->snd_una - 1, 0);
tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
break;
dropit:
- STAT(tcpstat.tcps_keepdrops++);
tp = tcp_drop(tp, 0);
break;
}