tcp_output.c
上传用户:tjbfgc
上传日期:2013-03-31
资源大小:140k
文件大小:18k
源码类别:

网络编程

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 1982, 1986, 1988, 1990, 1993
  3.  * The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the University of
  16.  * California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#)tcp_output.c 8.3 (Berkeley) 12/30/93
  34.  */
  35. #include <sys/param.h>
  36. #include <sys/systm.h>
  37. #include <sys/malloc.h>
  38. #include <sys/mbuf.h>
  39. #include <sys/protosw.h>
  40. #include <sys/socket.h>
  41. #include <sys/socketvar.h>
  42. #include <sys/errno.h>
  43. #include <net/route.h>
  44. #include <netinet/in.h>
  45. #include <netinet/in_systm.h>
  46. #include <netinet/ip.h>
  47. #include <netinet/in_pcb.h>
  48. #include <netinet/ip_var.h>
  49. #include <netinet/tcp.h>
  50. #define TCPOUTFLAGS
  51. #include <netinet/tcp_fsm.h>
  52. #include <netinet/tcp_seq.h>
  53. #include <netinet/tcp_timer.h>
  54. #include <netinet/tcp_var.h>
  55. #include <netinet/tcpip.h>
  56. #include <netinet/tcp_debug.h>
  57. #ifdef notyet
  58. extern struct mbuf *m_copypack();
  59. #endif
  60. #define MAX_TCPOPTLEN 32 /* max # bytes that go in options */
  61. /*
  62.  * Tcp output routine: figure out what should be sent and send it.
  63.  */
  64. int
  65. tcp_output(tp)
  66. register struct tcpcb *tp;
  67. {
  68. register struct socket *so = tp->t_inpcb->inp_socket;
  69. register long len, win;
  70. int off, flags, error;
  71. register struct mbuf *m;
  72. register struct tcpiphdr *ti;
  73. u_char opt[MAX_TCPOPTLEN];
  74. unsigned optlen, hdrlen;
  75. int idle, sendalot;
  76. /*
  77.  * Determine length of data that should be transmitted,
  78.  * and flags that will be used.
  79.  * If there is some data or critical controls (SYN, RST)
  80.  * to send, then transmit; otherwise, investigate further.
  81.  */
  82. idle = (tp->snd_max == tp->snd_una);
  83. if (idle && tp->t_idle >= tp->t_rxtcur)
  84. /*
  85.  * We have been idle for "a while" and no acks are
  86.  * expected to clock out any data we send --
  87.  * slow start to get ack "clock" running again.
  88.  */
  89. tp->snd_cwnd = tp->t_maxseg;
  90. again:
  91. sendalot = 0;
  92. off = tp->snd_nxt - tp->snd_una;
  93. win = min(tp->snd_wnd, tp->snd_cwnd);
  94. flags = tcp_outflags[tp->t_state];
  95. /*
  96.  * If in persist timeout with window of 0, send 1 byte.
  97.  * Otherwise, if window is small but nonzero
  98.  * and timer expired, we will send what we can
  99.  * and go to transmit state.
  100.  */
  101. if (tp->t_force) {
  102. if (win == 0) {
  103. /*
  104.  * If we still have some data to send, then
  105.  * clear the FIN bit.  Usually this would
  106.  * happen below when it realizes that we
  107.  * aren't sending all the data.  However,
  108.  * if we have exactly 1 byte of unset data,
  109.  * then it won't clear the FIN bit below,
  110.  * and if we are in persist state, we wind
  111.  * up sending the packet without recording
  112.  * that we sent the FIN bit.
  113.  *
  114.  * We can't just blindly clear the FIN bit,
  115.  * because if we don't have any more data
  116.  * to send then the probe will be the FIN
  117.  * itself.
  118.  */
  119. if (off < so->so_snd.sb_cc)
  120. flags &= ~TH_FIN;
  121. win = 1;
  122. } else {
  123. tp->t_timer[TCPT_PERSIST] = 0;
  124. tp->t_rxtshift = 0;
  125. }
  126. }
  127. len = min(so->so_snd.sb_cc, win) - off;
  128. if (len < 0) {
  129. /*
  130.  * If FIN has been sent but not acked,
  131.  * but we haven't been called to retransmit,
  132.  * len will be -1.  Otherwise, window shrank
  133.  * after we sent into it.  If window shrank to 0,
  134.  * cancel pending retransmit and pull snd_nxt
  135.  * back to (closed) window.  We will enter persist
  136.  * state below.  If the window didn't close completely,
  137.  * just wait for an ACK.
  138.  */
  139. len = 0;
  140. if (win == 0) {
  141. tp->t_timer[TCPT_REXMT] = 0;
  142. tp->snd_nxt = tp->snd_una;
  143. }
  144. }
  145. if (len > tp->t_maxseg) {
  146. len = tp->t_maxseg;
  147. sendalot = 1;
  148. }
  149. if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc))
  150. flags &= ~TH_FIN;
  151. win = sbspace(&so->so_rcv);
  152. /*
  153.  * Sender silly window avoidance.  If connection is idle
  154.  * and can send all data, a maximum segment,
  155.  * at least a maximum default-size segment do it,
  156.  * or are forced, do it; otherwise don't bother.
  157.  * If peer's buffer is tiny, then send
  158.  * when window is at least half open.
  159.  * If retransmitting (possibly after persist timer forced us
  160.  * to send into a small window), then must resend.
  161.  */
  162. if (len) {
  163. if (len == tp->t_maxseg)
  164. goto send;
  165. if ((idle || tp->t_flags & TF_NODELAY) &&
  166.     len + off >= so->so_snd.sb_cc)
  167. goto send;
  168. if (tp->t_force)
  169. goto send;
  170. if (len >= tp->max_sndwnd / 2)
  171. goto send;
  172. if (SEQ_LT(tp->snd_nxt, tp->snd_max))
  173. goto send;
  174. }
  175. /*
  176.  * Compare available window to amount of window
  177.  * known to peer (as advertised window less
  178.  * next expected input).  If the difference is at least two
  179.  * max size segments, or at least 50% of the maximum possible
  180.  * window, then want to send a window update to peer.
  181.  */
  182. if (win > 0) {
  183. /* 
  184.  * "adv" is the amount we can increase the window,
  185.  * taking into account that we are limited by
  186.  * TCP_MAXWIN << tp->rcv_scale.
  187.  */
  188. long adv = min(win, (long)TCP_MAXWIN << tp->rcv_scale) -
  189. (tp->rcv_adv - tp->rcv_nxt);
  190. if (adv >= (long) (2 * tp->t_maxseg))
  191. goto send;
  192. if (2 * adv >= (long) so->so_rcv.sb_hiwat)
  193. goto send;
  194. }
  195. /*
  196.  * Send if we owe peer an ACK.
  197.  */
  198. if (tp->t_flags & TF_ACKNOW)
  199. goto send;
  200. if (flags & (TH_SYN|TH_RST))
  201. goto send;
  202. if (SEQ_GT(tp->snd_up, tp->snd_una))
  203. goto send;
  204. /*
  205.  * If our state indicates that FIN should be sent
  206.  * and we have not yet done so, or we're retransmitting the FIN,
  207.  * then we need to send.
  208.  */
  209. if (flags & TH_FIN &&
  210.     ((tp->t_flags & TF_SENTFIN) == 0 || tp->snd_nxt == tp->snd_una))
  211. goto send;
  212. /*
  213.  * TCP window updates are not reliable, rather a polling protocol
  214.  * using ``persist'' packets is used to insure receipt of window
  215.  * updates.  The three ``states'' for the output side are:
  216.  * idle not doing retransmits or persists
  217.  * persisting to move a small or zero window
  218.  * (re)transmitting and thereby not persisting
  219.  *
  220.  * tp->t_timer[TCPT_PERSIST]
  221.  * is set when we are in persist state.
  222.  * tp->t_force
  223.  * is set when we are called to send a persist packet.
  224.  * tp->t_timer[TCPT_REXMT]
  225.  * is set when we are retransmitting
  226.  * The output side is idle when both timers are zero.
  227.  *
  228.  * If send window is too small, there is data to transmit, and no
  229.  * retransmit or persist is pending, then go to persist state.
  230.  * If nothing happens soon, send when timer expires:
  231.  * if window is nonzero, transmit what we can,
  232.  * otherwise force out a byte.
  233.  */
  234. if (so->so_snd.sb_cc && tp->t_timer[TCPT_REXMT] == 0 &&
  235.     tp->t_timer[TCPT_PERSIST] == 0) {
  236. tp->t_rxtshift = 0;
  237. tcp_setpersist(tp);
  238. }
  239. /*
  240.  * No reason to send a segment, just return.
  241.  */
  242. return (0);
  243. send:
  244. /*
  245.  * Before ESTABLISHED, force sending of initial options
  246.  * unless TCP set not to do any options.
  247.  * NOTE: we assume that the IP/TCP header plus TCP options
  248.  * always fit in a single mbuf, leaving room for a maximum
  249.  * link header, i.e.
  250.  * max_linkhdr + sizeof (struct tcpiphdr) + optlen <= MHLEN
  251.  */
  252. optlen = 0;
  253. hdrlen = sizeof (struct tcpiphdr);
  254. if (flags & TH_SYN) {
  255. tp->snd_nxt = tp->iss;
  256. if ((tp->t_flags & TF_NOOPT) == 0) {
  257. u_short mss;
  258. opt[0] = TCPOPT_MAXSEG;
  259. opt[1] = 4;
  260. mss = htons((u_short) tcp_mss(tp, 0));
  261. bcopy((caddr_t)&mss, (caddr_t)(opt + 2), sizeof(mss));
  262. optlen = 4;
  263.  
  264. if ((tp->t_flags & TF_REQ_SCALE) &&
  265.     ((flags & TH_ACK) == 0 ||
  266.     (tp->t_flags & TF_RCVD_SCALE))) {
  267. *((u_long *) (opt + optlen)) = htonl(
  268. TCPOPT_NOP << 24 |
  269. TCPOPT_WINDOW << 16 |
  270. TCPOLEN_WINDOW << 8 |
  271. tp->request_r_scale);
  272. optlen += 4;
  273. }
  274. }
  275.   }
  276.  
  277.   /*
  278.  * Send a timestamp and echo-reply if this is a SYN and our side 
  279.  * wants to use timestamps (TF_REQ_TSTMP is set) or both our side
  280.  * and our peer have sent timestamps in our SYN's.
  281.    */
  282.   if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP &&
  283.        (flags & TH_RST) == 0 &&
  284.       ((flags & (TH_SYN|TH_ACK)) == TH_SYN ||
  285.      (tp->t_flags & TF_RCVD_TSTMP))) {
  286. u_long *lp = (u_long *)(opt + optlen);
  287.  
  288.   /* Form timestamp option as shown in appendix A of RFC 1323. */
  289.   *lp++ = htonl(TCPOPT_TSTAMP_HDR);
  290.   *lp++ = htonl(tcp_now);
  291.   *lp   = htonl(tp->ts_recent);
  292.   optlen += TCPOLEN_TSTAMP_APPA;
  293.   }
  294.   hdrlen += optlen;
  295.  
  296. /*
  297.  * Adjust data length if insertion of options will
  298.  * bump the packet length beyond the t_maxseg length.
  299.  */
  300.  if (len > tp->t_maxseg - optlen) {
  301. len = tp->t_maxseg - optlen;
  302. sendalot = 1;
  303.  }
  304. #ifdef DIAGNOSTIC
  305.   if (max_linkhdr + hdrlen > MHLEN)
  306. panic("tcphdr too big");
  307. #endif
  308. /*
  309.  * Grab a header mbuf, attaching a copy of data to
  310.  * be transmitted, and initialize the header from
  311.  * the template for sends on this connection.
  312.  */
  313. if (len) {
  314. if (tp->t_force && len == 1)
  315. tcpstat.tcps_sndprobe++;
  316. else if (SEQ_LT(tp->snd_nxt, tp->snd_max)) {
  317. tcpstat.tcps_sndrexmitpack++;
  318. tcpstat.tcps_sndrexmitbyte += len;
  319. } else {
  320. tcpstat.tcps_sndpack++;
  321. tcpstat.tcps_sndbyte += len;
  322. }
  323. #ifdef notyet
  324. if ((m = m_copypack(so->so_snd.sb_mb, off,
  325.     (int)len, max_linkhdr + hdrlen)) == 0) {
  326. error = ENOBUFS;
  327. goto out;
  328. }
  329. /*
  330.  * m_copypack left space for our hdr; use it.
  331.  */
  332. m->m_len += hdrlen;
  333. m->m_data -= hdrlen;
  334. #else
  335. MGETHDR(m, M_DONTWAIT, MT_HEADER);
  336. if (m == NULL) {
  337. error = ENOBUFS;
  338. goto out;
  339. }
  340. m->m_data += max_linkhdr;
  341. m->m_len = hdrlen;
  342. if (len <= MHLEN - hdrlen - max_linkhdr) {
  343. m_copydata(so->so_snd.sb_mb, off, (int) len,
  344.     mtod(m, caddr_t) + hdrlen);
  345. m->m_len += len;
  346. } else {
  347. m->m_next = m_copy(so->so_snd.sb_mb, off, (int) len);
  348. if (m->m_next == 0)
  349. len = 0;
  350. }
  351. #endif
  352. /*
  353.  * If we're sending everything we've got, set PUSH.
  354.  * (This will keep happy those implementations which only
  355.  * give data to the user when a buffer fills or
  356.  * a PUSH comes in.)
  357.  */
  358. if (off + len == so->so_snd.sb_cc)
  359. flags |= TH_PUSH;
  360. } else {
  361. if (tp->t_flags & TF_ACKNOW)
  362. tcpstat.tcps_sndacks++;
  363. else if (flags & (TH_SYN|TH_FIN|TH_RST))
  364. tcpstat.tcps_sndctrl++;
  365. else if (SEQ_GT(tp->snd_up, tp->snd_una))
  366. tcpstat.tcps_sndurg++;
  367. else
  368. tcpstat.tcps_sndwinup++;
  369. MGETHDR(m, M_DONTWAIT, MT_HEADER);
  370. if (m == NULL) {
  371. error = ENOBUFS;
  372. goto out;
  373. }
  374. m->m_data += max_linkhdr;
  375. m->m_len = hdrlen;
  376. }
  377. m->m_pkthdr.rcvif = (struct ifnet *)0;
  378. ti = mtod(m, struct tcpiphdr *);
  379. if (tp->t_template == 0)
  380. panic("tcp_output");
  381. bcopy((caddr_t)tp->t_template, (caddr_t)ti, sizeof (struct tcpiphdr));
  382. /*
  383.  * Fill in fields, remembering maximum advertised
  384.  * window for use in delaying messages about window sizes.
  385.  * If resending a FIN, be sure not to use a new sequence number.
  386.  */
  387. if (flags & TH_FIN && tp->t_flags & TF_SENTFIN && 
  388.     tp->snd_nxt == tp->snd_max)
  389. tp->snd_nxt--;
  390. /*
  391.  * If we are doing retransmissions, then snd_nxt will
  392.  * not reflect the first unsent octet.  For ACK only
  393.  * packets, we do not want the sequence number of the
  394.  * retransmitted packet, we want the sequence number
  395.  * of the next unsent octet.  So, if there is no data
  396.  * (and no SYN or FIN), use snd_max instead of snd_nxt
  397.  * when filling in ti_seq.  But if we are in persist
  398.  * state, snd_max might reflect one byte beyond the
  399.  * right edge of the window, so use snd_nxt in that
  400.  * case, since we know we aren't doing a retransmission.
  401.  * (retransmit and persist are mutually exclusive...)
  402.  */
  403. if (len || (flags & (TH_SYN|TH_FIN)) || tp->t_timer[TCPT_PERSIST])
  404. ti->ti_seq = htonl(tp->snd_nxt);
  405. else
  406. ti->ti_seq = htonl(tp->snd_max);
  407. ti->ti_ack = htonl(tp->rcv_nxt);
  408. if (optlen) {
  409. bcopy((caddr_t)opt, (caddr_t)(ti + 1), optlen);
  410. ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2;
  411. }
  412. ti->ti_flags = flags;
  413. /*
  414.  * Calculate receive window.  Don't shrink window,
  415.  * but avoid silly window syndrome.
  416.  */
  417. if (win < (long)(so->so_rcv.sb_hiwat / 4) && win < (long)tp->t_maxseg)
  418. win = 0;
  419. if (win > (long)TCP_MAXWIN << tp->rcv_scale)
  420. win = (long)TCP_MAXWIN << tp->rcv_scale;
  421. if (win < (long)(tp->rcv_adv - tp->rcv_nxt))
  422. win = (long)(tp->rcv_adv - tp->rcv_nxt);
  423. ti->ti_win = htons((u_short) (win>>tp->rcv_scale));
  424. if (SEQ_GT(tp->snd_up, tp->snd_nxt)) {
  425. ti->ti_urp = htons((u_short)(tp->snd_up - tp->snd_nxt));
  426. ti->ti_flags |= TH_URG;
  427. } else
  428. /*
  429.  * If no urgent pointer to send, then we pull
  430.  * the urgent pointer to the left edge of the send window
  431.  * so that it doesn't drift into the send window on sequence
  432.  * number wraparound.
  433.  */
  434. tp->snd_up = tp->snd_una; /* drag it along */
  435. /*
  436.  * Put TCP length in extended header, and then
  437.  * checksum extended header and data.
  438.  */
  439. if (len + optlen)
  440. ti->ti_len = htons((u_short)(sizeof (struct tcphdr) +
  441.     optlen + len));
  442. ti->ti_sum = in_cksum(m, (int)(hdrlen + len));
  443. /*
  444.  * In transmit state, time the transmission and arrange for
  445.  * the retransmit.  In persist state, just set snd_max.
  446.  */
  447. if (tp->t_force == 0 || tp->t_timer[TCPT_PERSIST] == 0) {
  448. tcp_seq startseq = tp->snd_nxt;
  449. /*
  450.  * Advance snd_nxt over sequence space of this segment.
  451.  */
  452. if (flags & (TH_SYN|TH_FIN)) {
  453. if (flags & TH_SYN)
  454. tp->snd_nxt++;
  455. if (flags & TH_FIN) {
  456. tp->snd_nxt++;
  457. tp->t_flags |= TF_SENTFIN;
  458. }
  459. }
  460. tp->snd_nxt += len;
  461. if (SEQ_GT(tp->snd_nxt, tp->snd_max)) {
  462. tp->snd_max = tp->snd_nxt;
  463. /*
  464.  * Time this transmission if not a retransmission and
  465.  * not currently timing anything.
  466.  */
  467. if (tp->t_rtt == 0) {
  468. tp->t_rtt = 1;
  469. tp->t_rtseq = startseq;
  470. tcpstat.tcps_segstimed++;
  471. }
  472. }
  473. /*
  474.  * Set retransmit timer if not currently set,
  475.  * and not doing an ack or a keep-alive probe.
  476.  * Initial value for retransmit timer is smoothed
  477.  * round-trip time + 2 * round-trip time variance.
  478.  * Initialize shift counter which is used for backoff
  479.  * of retransmit time.
  480.  */
  481. if (tp->t_timer[TCPT_REXMT] == 0 &&
  482.     tp->snd_nxt != tp->snd_una) {
  483. tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
  484. if (tp->t_timer[TCPT_PERSIST]) {
  485. tp->t_timer[TCPT_PERSIST] = 0;
  486. tp->t_rxtshift = 0;
  487. }
  488. }
  489. } else
  490. if (SEQ_GT(tp->snd_nxt + len, tp->snd_max))
  491. tp->snd_max = tp->snd_nxt + len;
  492. /*
  493.  * Trace.
  494.  */
  495. if (so->so_options & SO_DEBUG)
  496. tcp_trace(TA_OUTPUT, tp->t_state, tp, ti, 0);
  497. /*
  498.  * Fill in IP length and desired time to live and
  499.  * send to IP level.  There should be a better way
  500.  * to handle ttl and tos; we could keep them in
  501.  * the template, but need a way to checksum without them.
  502.  */
  503. m->m_pkthdr.len = hdrlen + len;
  504. #ifdef TUBA
  505. if (tp->t_tuba_pcb)
  506. error = tuba_output(m, tp);
  507. else
  508. #endif
  509.     {
  510. ((struct ip *)ti)->ip_len = m->m_pkthdr.len;
  511. ((struct ip *)ti)->ip_ttl = tp->t_inpcb->inp_ip.ip_ttl; /* XXX */
  512. ((struct ip *)ti)->ip_tos = tp->t_inpcb->inp_ip.ip_tos; /* XXX */
  513. #if BSD >= 43
  514. error = ip_output(m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route,
  515.     so->so_options & SO_DONTROUTE, 0);
  516. #else
  517. error = ip_output(m, (struct mbuf *)0, &tp->t_inpcb->inp_route, 
  518.     so->so_options & SO_DONTROUTE);
  519. #endif
  520.     }
  521. if (error) {
  522. out:
  523. if (error == ENOBUFS) {
  524. tcp_quench(tp->t_inpcb, 0);
  525. return (0);
  526. }
  527. if ((error == EHOSTUNREACH || error == ENETDOWN)
  528.     && TCPS_HAVERCVDSYN(tp->t_state)) {
  529. tp->t_softerror = error;
  530. return (0);
  531. }
  532. return (error);
  533. }
  534. tcpstat.tcps_sndtotal++;
  535. /*
  536.  * Data sent (as far as we can tell).
  537.  * If this advertises a larger window than any other segment,
  538.  * then remember the size of the advertised window.
  539.  * Any pending ACK has now been sent.
  540.  */
  541. if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv))
  542. tp->rcv_adv = tp->rcv_nxt + win;
  543. tp->last_ack_sent = tp->rcv_nxt;
  544. tp->t_flags &= ~(TF_ACKNOW|TF_DELACK);
  545. if (sendalot)
  546. goto again;
  547. return (0);
  548. }
  549. void
  550. tcp_setpersist(tp)
  551. register struct tcpcb *tp;
  552. {
  553. register t = ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1;
  554. if (tp->t_timer[TCPT_REXMT])
  555. panic("tcp_output REXMT");
  556. /*
  557.  * Start/restart persistance timer.
  558.  */
  559. TCPT_RANGESET(tp->t_timer[TCPT_PERSIST],
  560.     t * tcp_backoff[tp->t_rxtshift],
  561.     TCPTV_PERSMIN, TCPTV_PERSMAX);
  562. if (tp->t_rxtshift < TCP_MAXRXTSHIFT)
  563. tp->t_rxtshift++;
  564. }