- tp->waited_2_ml = TRUE;
-
- break;
-
- case TREXMT: /* retransmission timer */
-
- /* set up for a retransmission, increase rexmt time
- in case of multiple retransmissions. */
+ case TREXMT: /* retransmission timer */
+ if (tp->t_rexmt_val > tp->snd_una) { /* 34 */
+ /*
+ * Set so for a retransmission, increase rexmt time
+ * in case of multiple retransmissions.
+ */
+ tp->snd_nxt = tp->snd_una;
+ tp->tc_flags |= TC_REXMT;
+ tp->t_xmtime = tp->t_xmtime << 1;
+ if (tp->t_xmtime > T_REMAX)
+ tp->t_xmtime = T_REMAX;
+ (void) tcp_send(tp);
+ }
+ return (SAME);
+
+ case TREXMTTL: /* retransmit too long */
+ if (tp->t_rtl_val > tp->snd_una) /* 36 */
+ tcp_error(tp, EIO); /* URXTIMO !?! */
+ /*
+ * If user has already closed, abort the connection.
+ */
+ if (tp->tc_flags & TC_USR_CLOSED) {
+ tcp_abort(tp);
+ return (CLOSED);
+ }
+ return (SAME);
+
+ case TPERSIST: /* persist timer */
+ /*
+ * Force a byte send through closed window.
+ */
+ tp->tc_flags |= TC_FORCE_ONE;
+ (void) tcp_send(tp);
+ return (SAME);
+ }
+ panic("tcp_timers");
+ /*NOTREACHED*/
+}