Diff for /qemu/slirp/tcp_timer.c between versions 1.1.1.3 and 1.1.1.4

version 1.1.1.3, 2018/04/24 16:54:26 version 1.1.1.4, 2018/04/24 17:25:33
Line 32 Line 32
   
 #include <slirp.h>  #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);  static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer);
   
 /*  /*
  * Fast timeout routine for processing delayed acks   * Fast timeout routine for processing delayed acks
  */   */
 void  void
 tcp_fasttimo()  tcp_fasttimo(Slirp *slirp)
 {  {
         register struct socket *so;          register struct socket *so;
         register struct tcpcb *tp;          register struct tcpcb *tp;
   
         DEBUG_CALL("tcp_fasttimo");          DEBUG_CALL("tcp_fasttimo");
   
         so = tcb.so_next;          so = slirp->tcb.so_next;
         if (so)          if (so)
         for (; so != &tcb; so = so->so_next)          for (; so != &slirp->tcb; so = so->so_next)
                 if ((tp = (struct tcpcb *)so->so_tcpcb) &&                  if ((tp = (struct tcpcb *)so->so_tcpcb) &&
                     (tp->t_flags & TF_DELACK)) {                      (tp->t_flags & TF_DELACK)) {
                         tp->t_flags &= ~TF_DELACK;                          tp->t_flags &= ~TF_DELACK;
                         tp->t_flags |= TF_ACKNOW;                          tp->t_flags |= TF_ACKNOW;
                         STAT(tcpstat.tcps_delack++);  
                         (void) tcp_output(tp);                          (void) tcp_output(tp);
                 }                  }
 }  }
Line 69  tcp_fasttimo() Line 62  tcp_fasttimo()
  * causes finite state machine actions if timers expire.   * causes finite state machine actions if timers expire.
  */   */
 void  void
 tcp_slowtimo()  tcp_slowtimo(Slirp *slirp)
 {  {
         register struct socket *ip, *ipnxt;          register struct socket *ip, *ipnxt;
         register struct tcpcb *tp;          register struct tcpcb *tp;
Line 80  tcp_slowtimo() Line 73  tcp_slowtimo()
         /*          /*
          * Search through tcb's and update active timers.           * Search through tcb's and update active timers.
          */           */
         ip = tcb.so_next;          ip = slirp->tcb.so_next;
         if (ip == 0)          if (ip == NULL) {
            return;              return;
         for (; ip != &tcb; ip = ipnxt) {          }
           for (; ip != &slirp->tcb; ip = ipnxt) {
                 ipnxt = ip->so_next;                  ipnxt = ip->so_next;
                 tp = sototcpcb(ip);                  tp = sototcpcb(ip);
                 if (tp == 0)                  if (tp == NULL) {
                         continue;                          continue;
                   }
                 for (i = 0; i < TCPT_NTIMERS; i++) {                  for (i = 0; i < TCPT_NTIMERS; i++) {
                         if (tp->t_timer[i] && --tp->t_timer[i] == 0) {                          if (tp->t_timer[i] && --tp->t_timer[i] == 0) {
                                 tcp_timers(tp,i);                                  tcp_timers(tp,i);
Line 101  tcp_slowtimo() Line 96  tcp_slowtimo()
 tpgone:  tpgone:
                 ;                  ;
         }          }
         tcp_iss += TCP_ISSINCR/PR_SLOWHZ;               /* increment iss */          slirp->tcp_iss += TCP_ISSINCR/PR_SLOWHZ;        /* increment iss */
 #ifdef TCP_COMPAT_42          slirp->tcp_now++;                               /* for timestamps */
         if ((int)tcp_iss < 0)  
                 tcp_iss = 0;                            /* XXX */  
 #endif  
         tcp_now++;                                      /* for timestamps */  
 }  }
   
 /*  /*
  * Cancel all timers for TCP tp.   * Cancel all timers for TCP tp.
  */   */
 void  void
 tcp_canceltimers(tp)  tcp_canceltimers(struct tcpcb *tp)
         struct tcpcb *tp;  
 {  {
         register int i;          register int i;
   
Line 185  tcp_timers(register struct tcpcb *tp, in Line 175  tcp_timers(register struct tcpcb *tp, in
                                  * We tried our best, now the connection must die!                                   * We tried our best, now the connection must die!
                                  */                                   */
                                 tp->t_rxtshift = TCP_MAXRXTSHIFT;                                  tp->t_rxtshift = TCP_MAXRXTSHIFT;
                                 STAT(tcpstat.tcps_timeoutdrop++);  
                                 tp = tcp_drop(tp, tp->t_softerror);                                  tp = tcp_drop(tp, tp->t_softerror);
                                 /* tp->t_softerror : ETIMEDOUT); */ /* XXX */                                  /* tp->t_softerror : ETIMEDOUT); */ /* XXX */
                                 return (tp); /* XXX */                                  return (tp); /* XXX */
Line 197  tcp_timers(register struct tcpcb *tp, in Line 186  tcp_timers(register struct tcpcb *tp, in
                          */                           */
                         tp->t_rxtshift = 6;                          tp->t_rxtshift = 6;
                 }                  }
                 STAT(tcpstat.tcps_rexmttimeo++);  
                 rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];                  rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];
                 TCPT_RANGESET(tp->t_rxtcur, rexmt,                  TCPT_RANGESET(tp->t_rxtcur, rexmt,
                     (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */                      (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */
Line 211  tcp_timers(register struct tcpcb *tp, in Line 199  tcp_timers(register struct tcpcb *tp, in
                  * retransmit times until then.                   * retransmit times until then.
                  */                   */
                 if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) {                  if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) {
 /*                      in_losing(tp->t_inpcb); */  
                         tp->t_rttvar += (tp->t_srtt >> TCP_RTT_SHIFT);                          tp->t_rttvar += (tp->t_srtt >> TCP_RTT_SHIFT);
                         tp->t_srtt = 0;                          tp->t_srtt = 0;
                 }                  }
Line 260  tcp_timers(register struct tcpcb *tp, in Line 247  tcp_timers(register struct tcpcb *tp, in
          * Force a byte to be output, if possible.           * Force a byte to be output, if possible.
          */           */
         case TCPT_PERSIST:          case TCPT_PERSIST:
                 STAT(tcpstat.tcps_persisttimeo++);  
                 tcp_setpersist(tp);                  tcp_setpersist(tp);
                 tp->t_force = 1;                  tp->t_force = 1;
                 (void) tcp_output(tp);                  (void) tcp_output(tp);
Line 272  tcp_timers(register struct tcpcb *tp, in Line 258  tcp_timers(register struct tcpcb *tp, in
          * or drop connection if idle for too long.           * or drop connection if idle for too long.
          */           */
         case TCPT_KEEP:          case TCPT_KEEP:
                 STAT(tcpstat.tcps_keeptimeo++);  
                 if (tp->t_state < TCPS_ESTABLISHED)                  if (tp->t_state < TCPS_ESTABLISHED)
                         goto dropit;                          goto dropit;
   
 /*              if (tp->t_socket->so_options & SO_KEEPALIVE && */  
                 if ((SO_OPTIONS) && tp->t_state <= TCPS_CLOSE_WAIT) {                  if ((SO_OPTIONS) && tp->t_state <= TCPS_CLOSE_WAIT) {
                         if (tp->t_idle >= TCPTV_KEEP_IDLE + TCP_MAXIDLE)                          if (tp->t_idle >= TCPTV_KEEP_IDLE + TCP_MAXIDLE)
                                 goto dropit;                                  goto dropit;
Line 292  tcp_timers(register struct tcpcb *tp, in Line 276  tcp_timers(register struct tcpcb *tp, in
                          * by the protocol spec, this requires the                           * by the protocol spec, this requires the
                          * correspondent TCP to respond.                           * correspondent TCP to respond.
                          */                           */
                         STAT(tcpstat.tcps_keepprobe++);  
 #ifdef TCP_COMPAT_42  
                         /*  
                          * The keepalive packet must have nonzero length  
                          * to get a 4.2 host to respond.  
                          */  
                         tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL,  
                             tp->rcv_nxt - 1, tp->snd_una - 1, 0);  
 #else  
                         tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL,                          tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL,
                             tp->rcv_nxt, tp->snd_una - 1, 0);                              tp->rcv_nxt, tp->snd_una - 1, 0);
 #endif  
                         tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;                          tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
                 } else                  } else
                         tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;                          tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
                 break;                  break;
   
         dropit:          dropit:
                 STAT(tcpstat.tcps_keepdrops++);                  tp = tcp_drop(tp, 0);
                 tp = tcp_drop(tp, 0); /* ETIMEDOUT); */  
                 break;                  break;
         }          }
   

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4


unix.superglobalmegacorp.com