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

网络编程

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994
  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_input.c 8.5 (Berkeley) 4/10/94
  34.  */
  35. #ifndef TUBA_INCLUDE
  36. #include <sys/param.h>
  37. #include <sys/systm.h>
  38. #include <sys/malloc.h>
  39. #include <sys/mbuf.h>
  40. #include <sys/protosw.h>
  41. #include <sys/socket.h>
  42. #include <sys/socketvar.h>
  43. #include <sys/errno.h>
  44. #include <net/if.h>
  45. #include <net/route.h>
  46. #include <netinet/in.h>
  47. #include <netinet/in_systm.h>
  48. #include <netinet/ip.h>
  49. #include <netinet/in_pcb.h>
  50. #include <netinet/ip_var.h>
  51. #include <netinet/tcp.h>
  52. #include <netinet/tcp_fsm.h>
  53. #include <netinet/tcp_seq.h>
  54. #include <netinet/tcp_timer.h>
  55. #include <netinet/tcp_var.h>
  56. #include <netinet/tcpip.h>
  57. #include <netinet/tcp_debug.h>
  58. int tcprexmtthresh = 3;
  59. struct tcpiphdr tcp_saveti;
  60. struct inpcb *tcp_last_inpcb = &tcb;
  61. extern u_long sb_max;
  62. #endif /* TUBA_INCLUDE */
  63. #define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ)
  64. /* for modulo comparisons of timestamps */
  65. #define TSTMP_LT(a,b) ((int)((a)-(b)) < 0)
  66. #define TSTMP_GEQ(a,b) ((int)((a)-(b)) >= 0)
  67. /*
  68.  * Insert segment ti into reassembly queue of tcp with
  69.  * control block tp.  Return TH_FIN if reassembly now includes
  70.  * a segment with FIN.  The macro form does the common case inline
  71.  * (segment is the next to be received on an established connection,
  72.  * and the queue is empty), avoiding linkage into and removal
  73.  * from the queue and repetition of various conversions.
  74.  * Set DELACK for segments received in order, but ack immediately
  75.  * when segments are out of order (so fast retransmit can work).
  76.  */
  77. #define TCP_REASS(tp, ti, m, so, flags) { 
  78. if ((ti)->ti_seq == (tp)->rcv_nxt && 
  79.     (tp)->seg_next == (struct tcpiphdr *)(tp) && 
  80.     (tp)->t_state == TCPS_ESTABLISHED) { 
  81. tp->t_flags |= TF_DELACK; 
  82. (tp)->rcv_nxt += (ti)->ti_len; 
  83. flags = (ti)->ti_flags & TH_FIN; 
  84. tcpstat.tcps_rcvpack++;
  85. tcpstat.tcps_rcvbyte += (ti)->ti_len;
  86. sbappend(&(so)->so_rcv, (m)); 
  87. sorwakeup(so); 
  88. } else { 
  89. (flags) = tcp_reass((tp), (ti), (m)); 
  90. tp->t_flags |= TF_ACKNOW; 
  91. }
  92. #ifndef TUBA_INCLUDE
  93. int
  94. tcp_reass(tp, ti, m)
  95. register struct tcpcb *tp;
  96. register struct tcpiphdr *ti;
  97. struct mbuf *m;
  98. {
  99. register struct tcpiphdr *q;
  100. struct socket *so = tp->t_inpcb->inp_socket;
  101. int flags;
  102. /*
  103.  * Call with ti==0 after become established to
  104.  * force pre-ESTABLISHED data up to user socket.
  105.  */
  106. if (ti == 0)
  107. goto present;
  108. /*
  109.  * Find a segment which begins after this one does.
  110.  */
  111. for (q = tp->seg_next; q != (struct tcpiphdr *)tp;
  112.     q = (struct tcpiphdr *)q->ti_next)
  113. if (SEQ_GT(q->ti_seq, ti->ti_seq))
  114. break;
  115. /*
  116.  * If there is a preceding segment, it may provide some of
  117.  * our data already.  If so, drop the data from the incoming
  118.  * segment.  If it provides all of our data, drop us.
  119.  */
  120. if ((struct tcpiphdr *)q->ti_prev != (struct tcpiphdr *)tp) {
  121. register int i;
  122. q = (struct tcpiphdr *)q->ti_prev;
  123. /* conversion to int (in i) handles seq wraparound */
  124. i = q->ti_seq + q->ti_len - ti->ti_seq;
  125. if (i > 0) {
  126. if (i >= ti->ti_len) {
  127. tcpstat.tcps_rcvduppack++;
  128. tcpstat.tcps_rcvdupbyte += ti->ti_len;
  129. m_freem(m);
  130. return (0);
  131. }
  132. m_adj(m, i);
  133. ti->ti_len -= i;
  134. ti->ti_seq += i;
  135. }
  136. q = (struct tcpiphdr *)(q->ti_next);
  137. }
  138. tcpstat.tcps_rcvoopack++;
  139. tcpstat.tcps_rcvoobyte += ti->ti_len;
  140. REASS_MBUF(ti) = m; /* XXX */
  141. /*
  142.  * While we overlap succeeding segments trim them or,
  143.  * if they are completely covered, dequeue them.
  144.  */
  145. while (q != (struct tcpiphdr *)tp) {
  146. register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq;
  147. if (i <= 0)
  148. break;
  149. if (i < q->ti_len) {
  150. q->ti_seq += i;
  151. q->ti_len -= i;
  152. m_adj(REASS_MBUF(q), i);
  153. break;
  154. }
  155. q = (struct tcpiphdr *)q->ti_next;
  156. m = REASS_MBUF((struct tcpiphdr *)q->ti_prev);
  157. remque(q->ti_prev);
  158. m_freem(m);
  159. }
  160. /*
  161.  * Stick new segment in its place.
  162.  */
  163. insque(ti, q->ti_prev);
  164. present:
  165. /*
  166.  * Present data to user, advancing rcv_nxt through
  167.  * completed sequence space.
  168.  */
  169. if (TCPS_HAVERCVDSYN(tp->t_state) == 0)
  170. return (0);
  171. ti = tp->seg_next;
  172. if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt)
  173. return (0);
  174. if (tp->t_state == TCPS_SYN_RECEIVED && ti->ti_len)
  175. return (0);
  176. do {
  177. tp->rcv_nxt += ti->ti_len;
  178. flags = ti->ti_flags & TH_FIN;
  179. remque(ti);
  180. m = REASS_MBUF(ti);
  181. ti = (struct tcpiphdr *)ti->ti_next;
  182. if (so->so_state & SS_CANTRCVMORE)
  183. m_freem(m);
  184. else
  185. sbappend(&so->so_rcv, m);
  186. } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt);
  187. sorwakeup(so);
  188. return (flags);
  189. }
  190. /*
  191.  * TCP input routine, follows pages 65-76 of the
  192.  * protocol specification dated September, 1981 very closely.
  193.  */
  194. void
  195. tcp_input(m, iphlen)
  196. register struct mbuf *m;
  197. int iphlen;
  198. {
  199. register struct tcpiphdr *ti;
  200. register struct inpcb *inp;
  201. caddr_t optp = NULL;
  202. int optlen;
  203. int len, tlen, off;
  204. register struct tcpcb *tp = 0;
  205. register int tiflags;
  206. struct socket *so;
  207. int todrop, acked, ourfinisacked, needoutput = 0;
  208. short ostate;
  209. struct in_addr laddr;
  210. int dropsocket = 0;
  211. int iss = 0;
  212. u_long tiwin, ts_val, ts_ecr;
  213. int ts_present = 0;
  214. tcpstat.tcps_rcvtotal++;
  215. /*
  216.  * Get IP and TCP header together in first mbuf.
  217.  * Note: IP leaves IP header in first mbuf.
  218.  */
  219. ti = mtod(m, struct tcpiphdr *);
  220. if (iphlen > sizeof (struct ip))
  221. ip_stripoptions(m, (struct mbuf *)0);
  222. if (m->m_len < sizeof (struct tcpiphdr)) {
  223. if ((m = m_pullup(m, sizeof (struct tcpiphdr))) == 0) {
  224. tcpstat.tcps_rcvshort++;
  225. return;
  226. }
  227. ti = mtod(m, struct tcpiphdr *);
  228. }
  229. /*
  230.  * Checksum extended TCP header and data.
  231.  */
  232. tlen = ((struct ip *)ti)->ip_len;
  233. len = sizeof (struct ip) + tlen;
  234. ti->ti_next = ti->ti_prev = 0;
  235. ti->ti_x1 = 0;
  236. ti->ti_len = (u_short)tlen;
  237. HTONS(ti->ti_len);
  238. if (ti->ti_sum = in_cksum(m, len)) {
  239. tcpstat.tcps_rcvbadsum++;
  240. goto drop;
  241. }
  242. #endif /* TUBA_INCLUDE */
  243. /*
  244.  * Check that TCP offset makes sense,
  245.  * pull out TCP options and adjust length. XXX
  246.  */
  247. off = ti->ti_off << 2;
  248. if (off < sizeof (struct tcphdr) || off > tlen) {
  249. tcpstat.tcps_rcvbadoff++;
  250. goto drop;
  251. }
  252. tlen -= off;
  253. ti->ti_len = tlen;
  254. if (off > sizeof (struct tcphdr)) {
  255. if (m->m_len < sizeof(struct ip) + off) {
  256. if ((m = m_pullup(m, sizeof (struct ip) + off)) == 0) {
  257. tcpstat.tcps_rcvshort++;
  258. return;
  259. }
  260. ti = mtod(m, struct tcpiphdr *);
  261. }
  262. optlen = off - sizeof (struct tcphdr);
  263. optp = mtod(m, caddr_t) + sizeof (struct tcpiphdr);
  264. /* 
  265.  * Do quick retrieval of timestamp options ("options
  266.  * prediction?").  If timestamp is the only option and it's
  267.  * formatted as recommended in RFC 1323 appendix A, we
  268.  * quickly get the values now and not bother calling
  269.  * tcp_dooptions(), etc.
  270.  */
  271. if ((optlen == TCPOLEN_TSTAMP_APPA ||
  272.      (optlen > TCPOLEN_TSTAMP_APPA &&
  273. optp[TCPOLEN_TSTAMP_APPA] == TCPOPT_EOL)) &&
  274.      *(u_long *)optp == htonl(TCPOPT_TSTAMP_HDR) &&
  275.      (ti->ti_flags & TH_SYN) == 0) {
  276. ts_present = 1;
  277. ts_val = ntohl(*(u_long *)(optp + 4));
  278. ts_ecr = ntohl(*(u_long *)(optp + 8));
  279. optp = NULL; /* we've parsed the options */
  280. }
  281. }
  282. tiflags = ti->ti_flags;
  283. /*
  284.  * Convert TCP protocol specific fields to host format.
  285.  */
  286. NTOHL(ti->ti_seq);
  287. NTOHL(ti->ti_ack);
  288. NTOHS(ti->ti_win);
  289. NTOHS(ti->ti_urp);
  290. /*
  291.  * Locate pcb for segment.
  292.  */
  293. findpcb:
  294. inp = tcp_last_inpcb;
  295. if (inp->inp_lport != ti->ti_dport ||
  296.     inp->inp_fport != ti->ti_sport ||
  297.     inp->inp_faddr.s_addr != ti->ti_src.s_addr ||
  298.     inp->inp_laddr.s_addr != ti->ti_dst.s_addr) {
  299. inp = in_pcblookup(&tcb, ti->ti_src, ti->ti_sport,
  300.     ti->ti_dst, ti->ti_dport, INPLOOKUP_WILDCARD);
  301. if (inp)
  302. tcp_last_inpcb = inp;
  303. ++tcpstat.tcps_pcbcachemiss;
  304. }
  305. /*
  306.  * If the state is CLOSED (i.e., TCB does not exist) then
  307.  * all data in the incoming segment is discarded.
  308.  * If the TCB exists but is in CLOSED state, it is embryonic,
  309.  * but should either do a listen or a connect soon.
  310.  */
  311. if (inp == 0)
  312. goto dropwithreset;
  313. tp = intotcpcb(inp);
  314. if (tp == 0)
  315. goto dropwithreset;
  316. if (tp->t_state == TCPS_CLOSED)
  317. goto drop;
  318. /* Unscale the window into a 32-bit value. */
  319. if ((tiflags & TH_SYN) == 0)
  320. tiwin = ti->ti_win << tp->snd_scale;
  321. else
  322. tiwin = ti->ti_win;
  323. so = inp->inp_socket;
  324. if (so->so_options & (SO_DEBUG|SO_ACCEPTCONN)) {
  325. if (so->so_options & SO_DEBUG) {
  326. ostate = tp->t_state;
  327. tcp_saveti = *ti;
  328. }
  329. if (so->so_options & SO_ACCEPTCONN) {
  330. so = sonewconn(so, 0);
  331. if (so == 0)
  332. goto drop;
  333. /*
  334.  * This is ugly, but ....
  335.  *
  336.  * Mark socket as temporary until we're
  337.  * committed to keeping it.  The code at
  338.  * ``drop'' and ``dropwithreset'' check the
  339.  * flag dropsocket to see if the temporary
  340.  * socket created here should be discarded.
  341.  * We mark the socket as discardable until
  342.  * we're committed to it below in TCPS_LISTEN.
  343.  */
  344. dropsocket++;
  345. inp = (struct inpcb *)so->so_pcb;
  346. inp->inp_laddr = ti->ti_dst;
  347. inp->inp_lport = ti->ti_dport;
  348. #if BSD>=43
  349. inp->inp_options = ip_srcroute();
  350. #endif
  351. tp = intotcpcb(inp);
  352. tp->t_state = TCPS_LISTEN;
  353. /* Compute proper scaling value from buffer space
  354.  */
  355. while (tp->request_r_scale < TCP_MAX_WINSHIFT &&
  356.    TCP_MAXWIN << tp->request_r_scale < so->so_rcv.sb_hiwat)
  357. tp->request_r_scale++;
  358. }
  359. }
  360. /*
  361.  * Segment received on connection.
  362.  * Reset idle time and keep-alive timer.
  363.  */
  364. tp->t_idle = 0;
  365. tp->t_timer[TCPT_KEEP] = tcp_keepidle;
  366. /*
  367.  * Process options if not in LISTEN state,
  368.  * else do it below (after getting remote address).
  369.  */
  370. if (optp && tp->t_state != TCPS_LISTEN)
  371. tcp_dooptions(tp, optp, optlen, ti,
  372. &ts_present, &ts_val, &ts_ecr);
  373. /* 
  374.  * Header prediction: check for the two common cases
  375.  * of a uni-directional data xfer.  If the packet has
  376.  * no control flags, is in-sequence, the window didn't
  377.  * change and we're not retransmitting, it's a
  378.  * candidate.  If the length is zero and the ack moved
  379.  * forward, we're the sender side of the xfer.  Just
  380.  * free the data acked & wake any higher level process
  381.  * that was blocked waiting for space.  If the length
  382.  * is non-zero and the ack didn't move, we're the
  383.  * receiver side.  If we're getting packets in-order
  384.  * (the reassembly queue is empty), add the data to
  385.  * the socket buffer and note that we need a delayed ack.
  386.  */
  387. if (tp->t_state == TCPS_ESTABLISHED &&
  388.     (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK &&
  389.     (!ts_present || TSTMP_GEQ(ts_val, tp->ts_recent)) &&
  390.     ti->ti_seq == tp->rcv_nxt &&
  391.     tiwin && tiwin == tp->snd_wnd &&
  392.     tp->snd_nxt == tp->snd_max) {
  393. /* 
  394.  * If last ACK falls within this segment's sequence numbers,
  395.  *  record the timestamp.
  396.  */
  397. if (ts_present && SEQ_LEQ(ti->ti_seq, tp->last_ack_sent) &&
  398.    SEQ_LT(tp->last_ack_sent, ti->ti_seq + ti->ti_len)) {
  399. tp->ts_recent_age = tcp_now;
  400. tp->ts_recent = ts_val;
  401. }
  402. if (ti->ti_len == 0) {
  403. if (SEQ_GT(ti->ti_ack, tp->snd_una) &&
  404.     SEQ_LEQ(ti->ti_ack, tp->snd_max) &&
  405.     tp->snd_cwnd >= tp->snd_wnd) {
  406. /*
  407.  * this is a pure ack for outstanding data.
  408.  */
  409. ++tcpstat.tcps_predack;
  410. if (ts_present)
  411. tcp_xmit_timer(tp, tcp_now-ts_ecr+1);
  412. else if (tp->t_rtt &&
  413.     SEQ_GT(ti->ti_ack, tp->t_rtseq))
  414. tcp_xmit_timer(tp, tp->t_rtt);
  415. acked = ti->ti_ack - tp->snd_una;
  416. tcpstat.tcps_rcvackpack++;
  417. tcpstat.tcps_rcvackbyte += acked;
  418. sbdrop(&so->so_snd, acked);
  419. tp->snd_una = ti->ti_ack;
  420. m_freem(m);
  421. /*
  422.  * If all outstanding data are acked, stop
  423.  * retransmit timer, otherwise restart timer
  424.  * using current (possibly backed-off) value.
  425.  * If process is waiting for space,
  426.  * wakeup/selwakeup/signal.  If data
  427.  * are ready to send, let tcp_output
  428.  * decide between more output or persist.
  429.  */
  430. if (tp->snd_una == tp->snd_max)
  431. tp->t_timer[TCPT_REXMT] = 0;
  432. else if (tp->t_timer[TCPT_PERSIST] == 0)
  433. tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
  434. if (so->so_snd.sb_flags & SB_NOTIFY)
  435. sowwakeup(so);
  436. if (so->so_snd.sb_cc)
  437. (void) tcp_output(tp);
  438. return;
  439. }
  440. } else if (ti->ti_ack == tp->snd_una &&
  441.     tp->seg_next == (struct tcpiphdr *)tp &&
  442.     ti->ti_len <= sbspace(&so->so_rcv)) {
  443. /*
  444.  * this is a pure, in-sequence data packet
  445.  * with nothing on the reassembly queue and
  446.  * we have enough buffer space to take it.
  447.  */
  448. ++tcpstat.tcps_preddat;
  449. tp->rcv_nxt += ti->ti_len;
  450. tcpstat.tcps_rcvpack++;
  451. tcpstat.tcps_rcvbyte += ti->ti_len;
  452. /*
  453.  * Drop TCP, IP headers and TCP options then add data
  454.  * to socket buffer.
  455.  */
  456. m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
  457. m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
  458. sbappend(&so->so_rcv, m);
  459. sorwakeup(so);
  460. tp->t_flags |= TF_DELACK;
  461. return;
  462. }
  463. }
  464. /*
  465.  * Drop TCP, IP headers and TCP options.
  466.  */
  467. m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
  468. m->m_len  -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
  469. /*
  470.  * Calculate amount of space in receive window,
  471.  * and then do TCP input processing.
  472.  * Receive window is amount of space in rcv queue,
  473.  * but not less than advertised window.
  474.  */
  475. { int win;
  476. win = sbspace(&so->so_rcv);
  477. if (win < 0)
  478. win = 0;
  479. tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt));
  480. }
  481. switch (tp->t_state) {
  482. /*
  483.  * If the state is LISTEN then ignore segment if it contains an RST.
  484.  * If the segment contains an ACK then it is bad and send a RST.
  485.  * If it does not contain a SYN then it is not interesting; drop it.
  486.  * Don't bother responding if the destination was a broadcast.
  487.  * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial
  488.  * tp->iss, and send a segment:
  489.  *     <SEQ=ISS><ACK=RCV_NXT><CTL=SYN,ACK>
  490.  * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss.
  491.  * Fill in remote peer address fields if not previously specified.
  492.  * Enter SYN_RECEIVED state, and process any other fields of this
  493.  * segment in this state.
  494.  */
  495. case TCPS_LISTEN: {
  496. struct mbuf *am;
  497. register struct sockaddr_in *sin;
  498. if (tiflags & TH_RST)
  499. goto drop;
  500. if (tiflags & TH_ACK)
  501. goto dropwithreset;
  502. if ((tiflags & TH_SYN) == 0)
  503. goto drop;
  504. /*
  505.  * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN
  506.  * in_broadcast() should never return true on a received
  507.  * packet with M_BCAST not set.
  508.  */
  509. if (m->m_flags & (M_BCAST|M_MCAST) ||
  510.     IN_MULTICAST(ti->ti_dst.s_addr))
  511. goto drop;
  512. am = m_get(M_DONTWAIT, MT_SONAME); /* XXX */
  513. if (am == NULL)
  514. goto drop;
  515. am->m_len = sizeof (struct sockaddr_in);
  516. sin = mtod(am, struct sockaddr_in *);
  517. sin->sin_family = AF_INET;
  518. sin->sin_len = sizeof(*sin);
  519. sin->sin_addr = ti->ti_src;
  520. sin->sin_port = ti->ti_sport;
  521. bzero((caddr_t)sin->sin_zero, sizeof(sin->sin_zero));
  522. laddr = inp->inp_laddr;
  523. if (inp->inp_laddr.s_addr == INADDR_ANY)
  524. inp->inp_laddr = ti->ti_dst;
  525. if (in_pcbconnect(inp, am)) {
  526. inp->inp_laddr = laddr;
  527. (void) m_free(am);
  528. goto drop;
  529. }
  530. (void) m_free(am);
  531. tp->t_template = tcp_template(tp);
  532. if (tp->t_template == 0) {
  533. tp = tcp_drop(tp, ENOBUFS);
  534. dropsocket = 0; /* socket is already gone */
  535. goto drop;
  536. }
  537. if (optp)
  538. tcp_dooptions(tp, optp, optlen, ti,
  539. &ts_present, &ts_val, &ts_ecr);
  540. if (iss)
  541. tp->iss = iss;
  542. else
  543. tp->iss = tcp_iss;
  544. tcp_iss += TCP_ISSINCR/2;
  545. tp->irs = ti->ti_seq;
  546. tcp_sendseqinit(tp);
  547. tcp_rcvseqinit(tp);
  548. tp->t_flags |= TF_ACKNOW;
  549. tp->t_state = TCPS_SYN_RECEIVED;
  550. tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
  551. dropsocket = 0; /* committed to socket */
  552. tcpstat.tcps_accepts++;
  553. goto trimthenstep6;
  554. }
  555. /*
  556.  * If the state is SYN_SENT:
  557.  * if seg contains an ACK, but not for our SYN, drop the input.
  558.  * if seg contains a RST, then drop the connection.
  559.  * if seg does not contain SYN, then drop it.
  560.  * Otherwise this is an acceptable SYN segment
  561.  * initialize tp->rcv_nxt and tp->irs
  562.  * if seg contains ack then advance tp->snd_una
  563.  * if SYN has been acked change to ESTABLISHED else SYN_RCVD state
  564.  * arrange for segment to be acked (eventually)
  565.  * continue processing rest of data/controls, beginning with URG
  566.  */
  567. case TCPS_SYN_SENT:
  568. if ((tiflags & TH_ACK) &&
  569.     (SEQ_LEQ(ti->ti_ack, tp->iss) ||
  570.      SEQ_GT(ti->ti_ack, tp->snd_max)))
  571. goto dropwithreset;
  572. if (tiflags & TH_RST) {
  573. if (tiflags & TH_ACK)
  574. tp = tcp_drop(tp, ECONNREFUSED);
  575. goto drop;
  576. }
  577. if ((tiflags & TH_SYN) == 0)
  578. goto drop;
  579. if (tiflags & TH_ACK) {
  580. tp->snd_una = ti->ti_ack;
  581. if (SEQ_LT(tp->snd_nxt, tp->snd_una))
  582. tp->snd_nxt = tp->snd_una;
  583. }
  584. tp->t_timer[TCPT_REXMT] = 0;
  585. tp->irs = ti->ti_seq;
  586. tcp_rcvseqinit(tp);
  587. tp->t_flags |= TF_ACKNOW;
  588. if (tiflags & TH_ACK && SEQ_GT(tp->snd_una, tp->iss)) {
  589. tcpstat.tcps_connects++;
  590. soisconnected(so);
  591. tp->t_state = TCPS_ESTABLISHED;
  592. /* Do window scaling on this connection? */
  593. if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
  594. (TF_RCVD_SCALE|TF_REQ_SCALE)) {
  595. tp->snd_scale = tp->requested_s_scale;
  596. tp->rcv_scale = tp->request_r_scale;
  597. }
  598. (void) tcp_reass(tp, (struct tcpiphdr *)0,
  599. (struct mbuf *)0);
  600. /*
  601.  * if we didn't have to retransmit the SYN,
  602.  * use its rtt as our initial srtt & rtt var.
  603.  */
  604. if (tp->t_rtt)
  605. tcp_xmit_timer(tp, tp->t_rtt);
  606. } else
  607. tp->t_state = TCPS_SYN_RECEIVED;
  608. trimthenstep6:
  609. /*
  610.  * Advance ti->ti_seq to correspond to first data byte.
  611.  * If data, trim to stay within window,
  612.  * dropping FIN if necessary.
  613.  */
  614. ti->ti_seq++;
  615. if (ti->ti_len > tp->rcv_wnd) {
  616. todrop = ti->ti_len - tp->rcv_wnd;
  617. m_adj(m, -todrop);
  618. ti->ti_len = tp->rcv_wnd;
  619. tiflags &= ~TH_FIN;
  620. tcpstat.tcps_rcvpackafterwin++;
  621. tcpstat.tcps_rcvbyteafterwin += todrop;
  622. }
  623. tp->snd_wl1 = ti->ti_seq - 1;
  624. tp->rcv_up = ti->ti_seq;
  625. goto step6;
  626. }
  627. /*
  628.  * States other than LISTEN or SYN_SENT.
  629.  * First check timestamp, if present.
  630.  * Then check that at least some bytes of segment are within 
  631.  * receive window.  If segment begins before rcv_nxt,
  632.  * drop leading data (and SYN); if nothing left, just ack.
  633.  * 
  634.  * RFC 1323 PAWS: If we have a timestamp reply on this segment
  635.  * and it's less than ts_recent, drop it.
  636.  */
  637. if (ts_present && (tiflags & TH_RST) == 0 && tp->ts_recent &&
  638.     TSTMP_LT(ts_val, tp->ts_recent)) {
  639. /* Check to see if ts_recent is over 24 days old.  */
  640. if ((int)(tcp_now - tp->ts_recent_age) > TCP_PAWS_IDLE) {
  641. /*
  642.  * Invalidate ts_recent.  If this segment updates
  643.  * ts_recent, the age will be reset later and ts_recent
  644.  * will get a valid value.  If it does not, setting
  645.  * ts_recent to zero will at least satisfy the
  646.  * requirement that zero be placed in the timestamp
  647.  * echo reply when ts_recent isn't valid.  The
  648.  * age isn't reset until we get a valid ts_recent
  649.  * because we don't want out-of-order segments to be
  650.  * dropped when ts_recent is old.
  651.  */
  652. tp->ts_recent = 0;
  653. } else {
  654. tcpstat.tcps_rcvduppack++;
  655. tcpstat.tcps_rcvdupbyte += ti->ti_len;
  656. tcpstat.tcps_pawsdrop++;
  657. goto dropafterack;
  658. }
  659. }
  660. todrop = tp->rcv_nxt - ti->ti_seq;
  661. if (todrop > 0) {
  662. if (tiflags & TH_SYN) {
  663. tiflags &= ~TH_SYN;
  664. ti->ti_seq++;
  665. if (ti->ti_urp > 1) 
  666. ti->ti_urp--;
  667. else
  668. tiflags &= ~TH_URG;
  669. todrop--;
  670. }
  671. if (todrop >= ti->ti_len) {
  672. tcpstat.tcps_rcvduppack++;
  673. tcpstat.tcps_rcvdupbyte += ti->ti_len;
  674. /*
  675.  * If segment is just one to the left of the window,
  676.  * check two special cases:
  677.  * 1. Don't toss RST in response to 4.2-style keepalive.
  678.  * 2. If the only thing to drop is a FIN, we can drop
  679.  *    it, but check the ACK or we will get into FIN
  680.  *    wars if our FINs crossed (both CLOSING).
  681.  * In either case, send ACK to resynchronize,
  682.  * but keep on processing for RST or ACK.
  683.  */
  684. if ((tiflags & TH_FIN && todrop == ti->ti_len + 1)
  685. #ifdef TCP_COMPAT_42
  686.   || (tiflags & TH_RST && ti->ti_seq == tp->rcv_nxt - 1)
  687. #endif
  688.    ) {
  689. todrop = ti->ti_len;
  690. tiflags &= ~TH_FIN;
  691. tp->t_flags |= TF_ACKNOW;
  692. } else {
  693. /*
  694.  * Handle the case when a bound socket connects
  695.  * to itself. Allow packets with a SYN and
  696.  * an ACK to continue with the processing.
  697.  */
  698. if (todrop != 0 || (tiflags & TH_ACK) == 0)
  699. goto dropafterack;
  700. }
  701. } else {
  702. tcpstat.tcps_rcvpartduppack++;
  703. tcpstat.tcps_rcvpartdupbyte += todrop;
  704. }
  705. m_adj(m, todrop);
  706. ti->ti_seq += todrop;
  707. ti->ti_len -= todrop;
  708. if (ti->ti_urp > todrop)
  709. ti->ti_urp -= todrop;
  710. else {
  711. tiflags &= ~TH_URG;
  712. ti->ti_urp = 0;
  713. }
  714. }
  715. /*
  716.  * If new data are received on a connection after the
  717.  * user processes are gone, then RST the other end.
  718.  */
  719. if ((so->so_state & SS_NOFDREF) &&
  720.     tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) {
  721. tp = tcp_close(tp);
  722. tcpstat.tcps_rcvafterclose++;
  723. goto dropwithreset;
  724. }
  725. /*
  726.  * If segment ends after window, drop trailing data
  727.  * (and PUSH and FIN); if nothing left, just ACK.
  728.  */
  729. todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd);
  730. if (todrop > 0) {
  731. tcpstat.tcps_rcvpackafterwin++;
  732. if (todrop >= ti->ti_len) {
  733. tcpstat.tcps_rcvbyteafterwin += ti->ti_len;
  734. /*
  735.  * If a new connection request is received
  736.  * while in TIME_WAIT, drop the old connection
  737.  * and start over if the sequence numbers
  738.  * are above the previous ones.
  739.  */
  740. if (tiflags & TH_SYN &&
  741.     tp->t_state == TCPS_TIME_WAIT &&
  742.     SEQ_GT(ti->ti_seq, tp->rcv_nxt)) {
  743. iss = tp->rcv_nxt + TCP_ISSINCR;
  744. tp = tcp_close(tp);
  745. goto findpcb;
  746. }
  747. /*
  748.  * If window is closed can only take segments at
  749.  * window edge, and have to drop data and PUSH from
  750.  * incoming segments.  Continue processing, but
  751.  * remember to ack.  Otherwise, drop segment
  752.  * and ack.
  753.  */
  754. if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) {
  755. tp->t_flags |= TF_ACKNOW;
  756. tcpstat.tcps_rcvwinprobe++;
  757. } else
  758. goto dropafterack;
  759. } else
  760. tcpstat.tcps_rcvbyteafterwin += todrop;
  761. m_adj(m, -todrop);
  762. ti->ti_len -= todrop;
  763. tiflags &= ~(TH_PUSH|TH_FIN);
  764. }
  765. /*
  766.  * If last ACK falls within this segment's sequence numbers,
  767.  * record its timestamp.
  768.  */
  769. if (ts_present && SEQ_LEQ(ti->ti_seq, tp->last_ack_sent) &&
  770.     SEQ_LT(tp->last_ack_sent, ti->ti_seq + ti->ti_len +
  771.    ((tiflags & (TH_SYN|TH_FIN)) != 0))) {
  772. tp->ts_recent_age = tcp_now;
  773. tp->ts_recent = ts_val;
  774. }
  775. /*
  776.  * If the RST bit is set examine the state:
  777.  *    SYN_RECEIVED STATE:
  778.  * If passive open, return to LISTEN state.
  779.  * If active open, inform user that connection was refused.
  780.  *    ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES:
  781.  * Inform user that connection was reset, and close tcb.
  782.  *    CLOSING, LAST_ACK, TIME_WAIT STATES
  783.  * Close the tcb.
  784.  */
  785. if (tiflags&TH_RST) switch (tp->t_state) {
  786. case TCPS_SYN_RECEIVED:
  787. so->so_error = ECONNREFUSED;
  788. goto close;
  789. case TCPS_ESTABLISHED:
  790. case TCPS_FIN_WAIT_1:
  791. case TCPS_FIN_WAIT_2:
  792. case TCPS_CLOSE_WAIT:
  793. so->so_error = ECONNRESET;
  794. close:
  795. tp->t_state = TCPS_CLOSED;
  796. tcpstat.tcps_drops++;
  797. tp = tcp_close(tp);
  798. goto drop;
  799. case TCPS_CLOSING:
  800. case TCPS_LAST_ACK:
  801. case TCPS_TIME_WAIT:
  802. tp = tcp_close(tp);
  803. goto drop;
  804. }
  805. /*
  806.  * If a SYN is in the window, then this is an
  807.  * error and we send an RST and drop the connection.
  808.  */
  809. if (tiflags & TH_SYN) {
  810. tp = tcp_drop(tp, ECONNRESET);
  811. goto dropwithreset;
  812. }
  813. /*
  814.  * If the ACK bit is off we drop the segment and return.
  815.  */
  816. if ((tiflags & TH_ACK) == 0)
  817. goto drop;
  818. /*
  819.  * Ack processing.
  820.  */
  821. switch (tp->t_state) {
  822. /*
  823.  * In SYN_RECEIVED state if the ack ACKs our SYN then enter
  824.  * ESTABLISHED state and continue processing, otherwise
  825.  * send an RST.
  826.  */
  827. case TCPS_SYN_RECEIVED:
  828. if (SEQ_GT(tp->snd_una, ti->ti_ack) ||
  829.     SEQ_GT(ti->ti_ack, tp->snd_max))
  830. goto dropwithreset;
  831. tcpstat.tcps_connects++;
  832. soisconnected(so);
  833. tp->t_state = TCPS_ESTABLISHED;
  834. /* Do window scaling? */
  835. if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
  836. (TF_RCVD_SCALE|TF_REQ_SCALE)) {
  837. tp->snd_scale = tp->requested_s_scale;
  838. tp->rcv_scale = tp->request_r_scale;
  839. }
  840. (void) tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0);
  841. tp->snd_wl1 = ti->ti_seq - 1;
  842. /* fall into ... */
  843. /*
  844.  * In ESTABLISHED state: drop duplicate ACKs; ACK out of range
  845.  * ACKs.  If the ack is in the range
  846.  * tp->snd_una < ti->ti_ack <= tp->snd_max
  847.  * then advance tp->snd_una to ti->ti_ack and drop
  848.  * data from the retransmission queue.  If this ACK reflects
  849.  * more up to date window information we update our window information.
  850.  */
  851. case TCPS_ESTABLISHED:
  852. case TCPS_FIN_WAIT_1:
  853. case TCPS_FIN_WAIT_2:
  854. case TCPS_CLOSE_WAIT:
  855. case TCPS_CLOSING:
  856. case TCPS_LAST_ACK:
  857. case TCPS_TIME_WAIT:
  858. if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) {
  859. if (ti->ti_len == 0 && tiwin == tp->snd_wnd) {
  860. tcpstat.tcps_rcvdupack++;
  861. /*
  862.  * If we have outstanding data (other than
  863.  * a window probe), this is a completely
  864.  * duplicate ack (ie, window info didn't
  865.  * change), the ack is the biggest we've
  866.  * seen and we've seen exactly our rexmt
  867.  * threshhold of them, assume a packet
  868.  * has been dropped and retransmit it.
  869.  * Kludge snd_nxt & the congestion
  870.  * window so we send only this one
  871.  * packet.
  872.  *
  873.  * We know we're losing at the current
  874.  * window size so do congestion avoidance
  875.  * (set ssthresh to half the current window
  876.  * and pull our congestion window back to
  877.  * the new ssthresh).
  878.  *
  879.  * Dup acks mean that packets have left the
  880.  * network (they're now cached at the receiver) 
  881.  * so bump cwnd by the amount in the receiver
  882.  * to keep a constant cwnd packets in the
  883.  * network.
  884.  */
  885. if (tp->t_timer[TCPT_REXMT] == 0 ||
  886.     ti->ti_ack != tp->snd_una)
  887. tp->t_dupacks = 0;
  888. else if (++tp->t_dupacks == tcprexmtthresh) {
  889. tcp_seq onxt = tp->snd_nxt;
  890. u_int win =
  891.     min(tp->snd_wnd, tp->snd_cwnd) / 2 /
  892. tp->t_maxseg;
  893. if (win < 2)
  894. win = 2;
  895. tp->snd_ssthresh = win * tp->t_maxseg;
  896. tp->t_timer[TCPT_REXMT] = 0;
  897. tp->t_rtt = 0;
  898. tp->snd_nxt = ti->ti_ack;
  899. tp->snd_cwnd = tp->t_maxseg;
  900. (void) tcp_output(tp);
  901. tp->snd_cwnd = tp->snd_ssthresh +
  902.        tp->t_maxseg * tp->t_dupacks;
  903. if (SEQ_GT(onxt, tp->snd_nxt))
  904. tp->snd_nxt = onxt;
  905. goto drop;
  906. } else if (tp->t_dupacks > tcprexmtthresh) {
  907. tp->snd_cwnd += tp->t_maxseg;
  908. (void) tcp_output(tp);
  909. goto drop;
  910. }
  911. } else
  912. tp->t_dupacks = 0;
  913. break;
  914. }
  915. /*
  916.  * If the congestion window was inflated to account
  917.  * for the other side's cached packets, retract it.
  918.  */
  919. if (tp->t_dupacks > tcprexmtthresh &&
  920.     tp->snd_cwnd > tp->snd_ssthresh)
  921. tp->snd_cwnd = tp->snd_ssthresh;
  922. tp->t_dupacks = 0;
  923. if (SEQ_GT(ti->ti_ack, tp->snd_max)) {
  924. tcpstat.tcps_rcvacktoomuch++;
  925. goto dropafterack;
  926. }
  927. acked = ti->ti_ack - tp->snd_una;
  928. tcpstat.tcps_rcvackpack++;
  929. tcpstat.tcps_rcvackbyte += acked;
  930. /*
  931.  * If we have a timestamp reply, update smoothed
  932.  * round trip time.  If no timestamp is present but
  933.  * transmit timer is running and timed sequence
  934.  * number was acked, update smoothed round trip time.
  935.  * Since we now have an rtt measurement, cancel the
  936.  * timer backoff (cf., Phil Karn's retransmit alg.).
  937.  * Recompute the initial retransmit timer.
  938.  */
  939. if (ts_present)
  940. tcp_xmit_timer(tp, tcp_now-ts_ecr+1);
  941. else if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq))
  942. tcp_xmit_timer(tp,tp->t_rtt);
  943. /*
  944.  * If all outstanding data is acked, stop retransmit
  945.  * timer and remember to restart (more output or persist).
  946.  * If there is more data to be acked, restart retransmit
  947.  * timer, using current (possibly backed-off) value.
  948.  */
  949. if (ti->ti_ack == tp->snd_max) {
  950. tp->t_timer[TCPT_REXMT] = 0;
  951. needoutput = 1;
  952. } else if (tp->t_timer[TCPT_PERSIST] == 0)
  953. tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
  954. /*
  955.  * When new data is acked, open the congestion window.
  956.  * If the window gives us less than ssthresh packets
  957.  * in flight, open exponentially (maxseg per packet).
  958.  * Otherwise open linearly: maxseg per window
  959.  * (maxseg^2 / cwnd per packet), plus a constant
  960.  * fraction of a packet (maxseg/8) to help larger windows
  961.  * open quickly enough.
  962.  */
  963. {
  964. register u_int cw = tp->snd_cwnd;
  965. register u_int incr = tp->t_maxseg;
  966. if (cw > tp->snd_ssthresh)
  967. incr = incr * incr / cw + incr / 8;
  968. tp->snd_cwnd = min(cw + incr, TCP_MAXWIN<<tp->snd_scale);
  969. }
  970. if (acked > so->so_snd.sb_cc) {
  971. tp->snd_wnd -= so->so_snd.sb_cc;
  972. sbdrop(&so->so_snd, (int)so->so_snd.sb_cc);
  973. ourfinisacked = 1;
  974. } else {
  975. sbdrop(&so->so_snd, acked);
  976. tp->snd_wnd -= acked;
  977. ourfinisacked = 0;
  978. }
  979. if (so->so_snd.sb_flags & SB_NOTIFY)
  980. sowwakeup(so);
  981. tp->snd_una = ti->ti_ack;
  982. if (SEQ_LT(tp->snd_nxt, tp->snd_una))
  983. tp->snd_nxt = tp->snd_una;
  984. switch (tp->t_state) {
  985. /*
  986.  * In FIN_WAIT_1 STATE in addition to the processing
  987.  * for the ESTABLISHED state if our FIN is now acknowledged
  988.  * then enter FIN_WAIT_2.
  989.  */
  990. case TCPS_FIN_WAIT_1:
  991. if (ourfinisacked) {
  992. /*
  993.  * If we can't receive any more
  994.  * data, then closing user can proceed.
  995.  * Starting the timer is contrary to the
  996.  * specification, but if we don't get a FIN
  997.  * we'll hang forever.
  998.  */
  999. if (so->so_state & SS_CANTRCVMORE) {
  1000. soisdisconnected(so);
  1001. tp->t_timer[TCPT_2MSL] = tcp_maxidle;
  1002. }
  1003. tp->t_state = TCPS_FIN_WAIT_2;
  1004. }
  1005. break;
  1006.   /*
  1007.  * In CLOSING STATE in addition to the processing for
  1008.  * the ESTABLISHED state if the ACK acknowledges our FIN
  1009.  * then enter the TIME-WAIT state, otherwise ignore
  1010.  * the segment.
  1011.  */
  1012. case TCPS_CLOSING:
  1013. if (ourfinisacked) {
  1014. tp->t_state = TCPS_TIME_WAIT;
  1015. tcp_canceltimers(tp);
  1016. tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  1017. soisdisconnected(so);
  1018. }
  1019. break;
  1020. /*
  1021.  * In LAST_ACK, we may still be waiting for data to drain
  1022.  * and/or to be acked, as well as for the ack of our FIN.
  1023.  * If our FIN is now acknowledged, delete the TCB,
  1024.  * enter the closed state and return.
  1025.  */
  1026. case TCPS_LAST_ACK:
  1027. if (ourfinisacked) {
  1028. tp = tcp_close(tp);
  1029. goto drop;
  1030. }
  1031. break;
  1032. /*
  1033.  * In TIME_WAIT state the only thing that should arrive
  1034.  * is a retransmission of the remote FIN.  Acknowledge
  1035.  * it and restart the finack timer.
  1036.  */
  1037. case TCPS_TIME_WAIT:
  1038. tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  1039. goto dropafterack;
  1040. }
  1041. }
  1042. step6:
  1043. /*
  1044.  * Update window information.
  1045.  * Don't look at window if no ACK: TAC's send garbage on first SYN.
  1046.  */
  1047. if ((tiflags & TH_ACK) &&
  1048.     (SEQ_LT(tp->snd_wl1, ti->ti_seq) || tp->snd_wl1 == ti->ti_seq &&
  1049.     (SEQ_LT(tp->snd_wl2, ti->ti_ack) ||
  1050.      tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))) {
  1051. /* keep track of pure window updates */
  1052. if (ti->ti_len == 0 &&
  1053.     tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd)
  1054. tcpstat.tcps_rcvwinupd++;
  1055. tp->snd_wnd = tiwin;
  1056. tp->snd_wl1 = ti->ti_seq;
  1057. tp->snd_wl2 = ti->ti_ack;
  1058. if (tp->snd_wnd > tp->max_sndwnd)
  1059. tp->max_sndwnd = tp->snd_wnd;
  1060. needoutput = 1;
  1061. }
  1062. /*
  1063.  * Process segments with URG.
  1064.  */
  1065. if ((tiflags & TH_URG) && ti->ti_urp &&
  1066.     TCPS_HAVERCVDFIN(tp->t_state) == 0) {
  1067. /*
  1068.  * This is a kludge, but if we receive and accept
  1069.  * random urgent pointers, we'll crash in
  1070.  * soreceive.  It's hard to imagine someone
  1071.  * actually wanting to send this much urgent data.
  1072.  */
  1073. if (ti->ti_urp + so->so_rcv.sb_cc > sb_max) {
  1074. ti->ti_urp = 0; /* XXX */
  1075. tiflags &= ~TH_URG; /* XXX */
  1076. goto dodata; /* XXX */
  1077. }
  1078. /*
  1079.  * If this segment advances the known urgent pointer,
  1080.  * then mark the data stream.  This should not happen
  1081.  * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since
  1082.  * a FIN has been received from the remote side. 
  1083.  * In these states we ignore the URG.
  1084.  *
  1085.  * According to RFC961 (Assigned Protocols),
  1086.  * the urgent pointer points to the last octet
  1087.  * of urgent data.  We continue, however,
  1088.  * to consider it to indicate the first octet
  1089.  * of data past the urgent section as the original 
  1090.  * spec states (in one of two places).
  1091.  */
  1092. if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) {
  1093. tp->rcv_up = ti->ti_seq + ti->ti_urp;
  1094. so->so_oobmark = so->so_rcv.sb_cc +
  1095.     (tp->rcv_up - tp->rcv_nxt) - 1;
  1096. if (so->so_oobmark == 0)
  1097. so->so_state |= SS_RCVATMARK;
  1098. sohasoutofband(so);
  1099. tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
  1100. }
  1101. /*
  1102.  * Remove out of band data so doesn't get presented to user.
  1103.  * This can happen independent of advancing the URG pointer,
  1104.  * but if two URG's are pending at once, some out-of-band
  1105.  * data may creep in... ick.
  1106.  */
  1107. if (ti->ti_urp <= ti->ti_len
  1108. #ifdef SO_OOBINLINE
  1109.      && (so->so_options & SO_OOBINLINE) == 0
  1110. #endif
  1111.      )
  1112. tcp_pulloutofband(so, ti, m);
  1113. } else
  1114. /*
  1115.  * If no out of band data is expected,
  1116.  * pull receive urgent pointer along
  1117.  * with the receive window.
  1118.  */
  1119. if (SEQ_GT(tp->rcv_nxt, tp->rcv_up))
  1120. tp->rcv_up = tp->rcv_nxt;
  1121. dodata: /* XXX */
  1122. /*
  1123.  * Process the segment text, merging it into the TCP sequencing queue,
  1124.  * and arranging for acknowledgment of receipt if necessary.
  1125.  * This process logically involves adjusting tp->rcv_wnd as data
  1126.  * is presented to the user (this happens in tcp_usrreq.c,
  1127.  * case PRU_RCVD).  If a FIN has already been received on this
  1128.  * connection then we just ignore the text.
  1129.  */
  1130. if ((ti->ti_len || (tiflags&TH_FIN)) &&
  1131.     TCPS_HAVERCVDFIN(tp->t_state) == 0) {
  1132. TCP_REASS(tp, ti, m, so, tiflags);
  1133. /*
  1134.  * Note the amount of data that peer has sent into
  1135.  * our window, in order to estimate the sender's
  1136.  * buffer size.
  1137.  */
  1138. len = so->so_rcv.sb_hiwat - (tp->rcv_adv - tp->rcv_nxt);
  1139. } else {
  1140. m_freem(m);
  1141. tiflags &= ~TH_FIN;
  1142. }
  1143. /*
  1144.  * If FIN is received ACK the FIN and let the user know
  1145.  * that the connection is closing.
  1146.  */
  1147. if (tiflags & TH_FIN) {
  1148. if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
  1149. socantrcvmore(so);
  1150. tp->t_flags |= TF_ACKNOW;
  1151. tp->rcv_nxt++;
  1152. }
  1153. switch (tp->t_state) {
  1154.   /*
  1155.  * In SYN_RECEIVED and ESTABLISHED STATES
  1156.  * enter the CLOSE_WAIT state.
  1157.  */
  1158. case TCPS_SYN_RECEIVED:
  1159. case TCPS_ESTABLISHED:
  1160. tp->t_state = TCPS_CLOSE_WAIT;
  1161. break;
  1162.   /*
  1163.  * If still in FIN_WAIT_1 STATE FIN has not been acked so
  1164.  * enter the CLOSING state.
  1165.  */
  1166. case TCPS_FIN_WAIT_1:
  1167. tp->t_state = TCPS_CLOSING;
  1168. break;
  1169.   /*
  1170.  * In FIN_WAIT_2 state enter the TIME_WAIT state,
  1171.  * starting the time-wait timer, turning off the other 
  1172.  * standard timers.
  1173.  */
  1174. case TCPS_FIN_WAIT_2:
  1175. tp->t_state = TCPS_TIME_WAIT;
  1176. tcp_canceltimers(tp);
  1177. tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  1178. soisdisconnected(so);
  1179. break;
  1180. /*
  1181.  * In TIME_WAIT state restart the 2 MSL time_wait timer.
  1182.  */
  1183. case TCPS_TIME_WAIT:
  1184. tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  1185. break;
  1186. }
  1187. }
  1188. if (so->so_options & SO_DEBUG)
  1189. tcp_trace(TA_INPUT, ostate, tp, &tcp_saveti, 0);
  1190. /*
  1191.  * Return any desired output.
  1192.  */
  1193. if (needoutput || (tp->t_flags & TF_ACKNOW))
  1194. (void) tcp_output(tp);
  1195. return;
  1196. dropafterack:
  1197. /*
  1198.  * Generate an ACK dropping incoming segment if it occupies
  1199.  * sequence space, where the ACK reflects our state.
  1200.  */
  1201. if (tiflags & TH_RST)
  1202. goto drop;
  1203. m_freem(m);
  1204. tp->t_flags |= TF_ACKNOW;
  1205. (void) tcp_output(tp);
  1206. return;
  1207. dropwithreset:
  1208. /*
  1209.  * Generate a RST, dropping incoming segment.
  1210.  * Make ACK acceptable to originator of segment.
  1211.  * Don't bother to respond if destination was broadcast/multicast.
  1212.  */
  1213. if ((tiflags & TH_RST) || m->m_flags & (M_BCAST|M_MCAST) ||
  1214.     IN_MULTICAST(ti->ti_dst.s_addr))
  1215. goto drop;
  1216. if (tiflags & TH_ACK)
  1217. tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST);
  1218. else {
  1219. if (tiflags & TH_SYN)
  1220. ti->ti_len++;
  1221. tcp_respond(tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0,
  1222.     TH_RST|TH_ACK);
  1223. }
  1224. /* destroy temporarily created socket */
  1225. if (dropsocket)
  1226. (void) soabort(so);
  1227. return;
  1228. drop:
  1229. /*
  1230.  * Drop space held by incoming segment and return.
  1231.  */
  1232. if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
  1233. tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0);
  1234. m_freem(m);
  1235. /* destroy temporarily created socket */
  1236. if (dropsocket)
  1237. (void) soabort(so);
  1238. return;
  1239. #ifndef TUBA_INCLUDE
  1240. }
  1241. void
  1242. tcp_dooptions(tp, cp, cnt, ti, ts_present, ts_val, ts_ecr)
  1243. struct tcpcb *tp;
  1244. u_char *cp;
  1245. int cnt;
  1246. struct tcpiphdr *ti;
  1247. int *ts_present;
  1248. u_long *ts_val, *ts_ecr;
  1249. {
  1250. u_short mss;
  1251. int opt, optlen;
  1252. for (; cnt > 0; cnt -= optlen, cp += optlen) {
  1253. opt = cp[0];
  1254. if (opt == TCPOPT_EOL)
  1255. break;
  1256. if (opt == TCPOPT_NOP)
  1257. optlen = 1;
  1258. else {
  1259. optlen = cp[1];
  1260. if (optlen <= 0)
  1261. break;
  1262. }
  1263. switch (opt) {
  1264. default:
  1265. continue;
  1266. case TCPOPT_MAXSEG:
  1267. if (optlen != TCPOLEN_MAXSEG)
  1268. continue;
  1269. if (!(ti->ti_flags & TH_SYN))
  1270. continue;
  1271. bcopy((char *) cp + 2, (char *) &mss, sizeof(mss));
  1272. NTOHS(mss);
  1273. (void) tcp_mss(tp, mss); /* sets t_maxseg */
  1274. break;
  1275. case TCPOPT_WINDOW:
  1276. if (optlen != TCPOLEN_WINDOW)
  1277. continue;
  1278. if (!(ti->ti_flags & TH_SYN))
  1279. continue;
  1280. tp->t_flags |= TF_RCVD_SCALE;
  1281. tp->requested_s_scale = min(cp[2], TCP_MAX_WINSHIFT);
  1282. break;
  1283. case TCPOPT_TIMESTAMP:
  1284. if (optlen != TCPOLEN_TIMESTAMP)
  1285. continue;
  1286. *ts_present = 1;
  1287. bcopy((char *)cp + 2, (char *) ts_val, sizeof(*ts_val));
  1288. NTOHL(*ts_val);
  1289. bcopy((char *)cp + 6, (char *) ts_ecr, sizeof(*ts_ecr));
  1290. NTOHL(*ts_ecr);
  1291. /* 
  1292.  * A timestamp received in a SYN makes
  1293.  * it ok to send timestamp requests and replies.
  1294.  */
  1295. if (ti->ti_flags & TH_SYN) {
  1296. tp->t_flags |= TF_RCVD_TSTMP;
  1297. tp->ts_recent = *ts_val;
  1298. tp->ts_recent_age = tcp_now;
  1299. }
  1300. break;
  1301. }
  1302. }
  1303. }
  1304. /*
  1305.  * Pull out of band byte out of a segment so
  1306.  * it doesn't appear in the user's data queue.
  1307.  * It is still reflected in the segment length for
  1308.  * sequencing purposes.
  1309.  */
  1310. void
  1311. tcp_pulloutofband(so, ti, m)
  1312. struct socket *so;
  1313. struct tcpiphdr *ti;
  1314. register struct mbuf *m;
  1315. {
  1316. int cnt = ti->ti_urp - 1;
  1317. while (cnt >= 0) {
  1318. if (m->m_len > cnt) {
  1319. char *cp = mtod(m, caddr_t) + cnt;
  1320. struct tcpcb *tp = sototcpcb(so);
  1321. tp->t_iobc = *cp;
  1322. tp->t_oobflags |= TCPOOB_HAVEDATA;
  1323. bcopy(cp+1, cp, (unsigned)(m->m_len - cnt - 1));
  1324. m->m_len--;
  1325. return;
  1326. }
  1327. cnt -= m->m_len;
  1328. m = m->m_next;
  1329. if (m == 0)
  1330. break;
  1331. }
  1332. panic("tcp_pulloutofband");
  1333. }
  1334. /*
  1335.  * Collect new round-trip time estimate
  1336.  * and update averages and current timeout.
  1337.  */
  1338. void
  1339. tcp_xmit_timer(tp, rtt)
  1340. register struct tcpcb *tp;
  1341. short rtt;
  1342. {
  1343. register short delta;
  1344. tcpstat.tcps_rttupdated++;
  1345. if (tp->t_srtt != 0) {
  1346. /*
  1347.  * srtt is stored as fixed point with 3 bits after the
  1348.  * binary point (i.e., scaled by 8).  The following magic
  1349.  * is equivalent to the smoothing algorithm in rfc793 with
  1350.  * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed
  1351.  * point).  Adjust rtt to origin 0.
  1352.  */
  1353. delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT);
  1354. if ((tp->t_srtt += delta) <= 0)
  1355. tp->t_srtt = 1;
  1356. /*
  1357.  * We accumulate a smoothed rtt variance (actually, a
  1358.  * smoothed mean difference), then set the retransmit
  1359.  * timer to smoothed rtt + 4 times the smoothed variance.
  1360.  * rttvar is stored as fixed point with 2 bits after the
  1361.  * binary point (scaled by 4).  The following is
  1362.  * equivalent to rfc793 smoothing with an alpha of .75
  1363.  * (rttvar = rttvar*3/4 + |delta| / 4).  This replaces
  1364.  * rfc793's wired-in beta.
  1365.  */
  1366. if (delta < 0)
  1367. delta = -delta;
  1368. delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT);
  1369. if ((tp->t_rttvar += delta) <= 0)
  1370. tp->t_rttvar = 1;
  1371. } else {
  1372. /* 
  1373.  * No rtt measurement yet - use the unsmoothed rtt.
  1374.  * Set the variance to half the rtt (so our first
  1375.  * retransmit happens at 3*rtt).
  1376.  */
  1377. tp->t_srtt = rtt << TCP_RTT_SHIFT;
  1378. tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1);
  1379. }
  1380. tp->t_rtt = 0;
  1381. tp->t_rxtshift = 0;
  1382. /*
  1383.  * the retransmit should happen at rtt + 4 * rttvar.
  1384.  * Because of the way we do the smoothing, srtt and rttvar
  1385.  * will each average +1/2 tick of bias.  When we compute
  1386.  * the retransmit timer, we want 1/2 tick of rounding and
  1387.  * 1 extra tick because of +-1/2 tick uncertainty in the
  1388.  * firing of the timer.  The bias will give us exactly the
  1389.  * 1.5 tick we need.  But, because the bias is
  1390.  * statistical, we have to test that we don't drop below
  1391.  * the minimum feasible timer (which is 2 ticks).
  1392.  */
  1393. TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp),
  1394.     tp->t_rttmin, TCPTV_REXMTMAX);
  1395. /*
  1396.  * We received an ack for a packet that wasn't retransmitted;
  1397.  * it is probably safe to discard any error indications we've
  1398.  * received recently.  This isn't quite right, but close enough
  1399.  * for now (a route might have failed after we sent a segment,
  1400.  * and the return path might not be symmetrical).
  1401.  */
  1402. tp->t_softerror = 0;
  1403. }
  1404. /*
  1405.  * Determine a reasonable value for maxseg size.
  1406.  * If the route is known, check route for mtu.
  1407.  * If none, use an mss that can be handled on the outgoing
  1408.  * interface without forcing IP to fragment; if bigger than
  1409.  * an mbuf cluster (MCLBYTES), round down to nearest multiple of MCLBYTES
  1410.  * to utilize large mbufs.  If no route is found, route has no mtu,
  1411.  * or the destination isn't local, use a default, hopefully conservative
  1412.  * size (usually 512 or the default IP max size, but no more than the mtu
  1413.  * of the interface), as we can't discover anything about intervening
  1414.  * gateways or networks.  We also initialize the congestion/slow start
  1415.  * window to be a single segment if the destination isn't local.
  1416.  * While looking at the routing entry, we also initialize other path-dependent
  1417.  * parameters from pre-set or cached values in the routing entry.
  1418.  */
  1419. int
  1420. tcp_mss(tp, offer)
  1421. register struct tcpcb *tp;
  1422. u_int offer;
  1423. {
  1424. struct route *ro;
  1425. register struct rtentry *rt;
  1426. struct ifnet *ifp;
  1427. register int rtt, mss;
  1428. u_long bufsize;
  1429. struct inpcb *inp;
  1430. struct socket *so;
  1431. extern int tcp_mssdflt;
  1432. inp = tp->t_inpcb;
  1433. ro = &inp->inp_route;
  1434. if ((rt = ro->ro_rt) == (struct rtentry *)0) {
  1435. /* No route yet, so try to acquire one */
  1436. if (inp->inp_faddr.s_addr != INADDR_ANY) {
  1437. ro->ro_dst.sa_family = AF_INET;
  1438. ro->ro_dst.sa_len = sizeof(ro->ro_dst);
  1439. ((struct sockaddr_in *) &ro->ro_dst)->sin_addr =
  1440. inp->inp_faddr;
  1441. rtalloc(ro);
  1442. }
  1443. if ((rt = ro->ro_rt) == (struct rtentry *)0)
  1444. return (tcp_mssdflt);
  1445. }
  1446. ifp = rt->rt_ifp;
  1447. so = inp->inp_socket;
  1448. #ifdef RTV_MTU /* if route characteristics exist ... */
  1449. /*
  1450.  * While we're here, check if there's an initial rtt
  1451.  * or rttvar.  Convert from the route-table units
  1452.  * to scaled multiples of the slow timeout timer.
  1453.  */
  1454. if (tp->t_srtt == 0 && (rtt = rt->rt_rmx.rmx_rtt)) {
  1455. /*
  1456.  * XXX the lock bit for MTU indicates that the value
  1457.  * is also a minimum value; this is subject to time.
  1458.  */
  1459. if (rt->rt_rmx.rmx_locks & RTV_RTT)
  1460. tp->t_rttmin = rtt / (RTM_RTTUNIT / PR_SLOWHZ);
  1461. tp->t_srtt = rtt / (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTT_SCALE));
  1462. if (rt->rt_rmx.rmx_rttvar)
  1463. tp->t_rttvar = rt->rt_rmx.rmx_rttvar /
  1464.     (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTTVAR_SCALE));
  1465. else
  1466. /* default variation is +- 1 rtt */
  1467. tp->t_rttvar =
  1468.     tp->t_srtt * TCP_RTTVAR_SCALE / TCP_RTT_SCALE;
  1469. TCPT_RANGESET(tp->t_rxtcur,
  1470.     ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1,
  1471.     tp->t_rttmin, TCPTV_REXMTMAX);
  1472. }
  1473. /*
  1474.  * if there's an mtu associated with the route, use it
  1475.  */
  1476. if (rt->rt_rmx.rmx_mtu)
  1477. mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr);
  1478. else
  1479. #endif /* RTV_MTU */
  1480. {
  1481. mss = ifp->if_mtu - sizeof(struct tcpiphdr);
  1482. #if (MCLBYTES & (MCLBYTES - 1)) == 0
  1483. if (mss > MCLBYTES)
  1484. mss &= ~(MCLBYTES-1);
  1485. #else
  1486. if (mss > MCLBYTES)
  1487. mss = mss / MCLBYTES * MCLBYTES;
  1488. #endif
  1489. if (!in_localaddr(inp->inp_faddr))
  1490. mss = min(mss, tcp_mssdflt);
  1491. }
  1492. /*
  1493.  * The current mss, t_maxseg, is initialized to the default value.
  1494.  * If we compute a smaller value, reduce the current mss.
  1495.  * If we compute a larger value, return it for use in sending
  1496.  * a max seg size option, but don't store it for use
  1497.  * unless we received an offer at least that large from peer.
  1498.  * However, do not accept offers under 32 bytes.
  1499.  */
  1500. if (offer)
  1501. mss = min(mss, offer);
  1502. mss = max(mss, 32); /* sanity */
  1503. if (mss < tp->t_maxseg || offer != 0) {
  1504. /*
  1505.  * If there's a pipesize, change the socket buffer
  1506.  * to that size.  Make the socket buffers an integral
  1507.  * number of mss units; if the mss is larger than
  1508.  * the socket buffer, decrease the mss.
  1509.  */
  1510. #ifdef RTV_SPIPE
  1511. if ((bufsize = rt->rt_rmx.rmx_sendpipe) == 0)
  1512. #endif
  1513. bufsize = so->so_snd.sb_hiwat;
  1514. if (bufsize < mss)
  1515. mss = bufsize;
  1516. else {
  1517. bufsize = roundup(bufsize, mss);
  1518. if (bufsize > sb_max)
  1519. bufsize = sb_max;
  1520. (void)sbreserve(&so->so_snd, bufsize);
  1521. }
  1522. tp->t_maxseg = mss;
  1523. #ifdef RTV_RPIPE
  1524. if ((bufsize = rt->rt_rmx.rmx_recvpipe) == 0)
  1525. #endif
  1526. bufsize = so->so_rcv.sb_hiwat;
  1527. if (bufsize > mss) {
  1528. bufsize = roundup(bufsize, mss);
  1529. if (bufsize > sb_max)
  1530. bufsize = sb_max;
  1531. (void)sbreserve(&so->so_rcv, bufsize);
  1532. }
  1533. }
  1534. tp->snd_cwnd = mss;
  1535. #ifdef RTV_SSTHRESH
  1536. if (rt->rt_rmx.rmx_ssthresh) {
  1537. /*
  1538.  * There's some sort of gateway or interface
  1539.  * buffer limit on the path.  Use this to set
  1540.  * the slow start threshhold, but set the
  1541.  * threshold to no less than 2*mss.
  1542.  */
  1543. tp->snd_ssthresh = max(2 * mss, rt->rt_rmx.rmx_ssthresh);
  1544. }
  1545. #endif /* RTV_MTU */
  1546. return (mss);
  1547. }
  1548. #endif /* TUBA_INCLUDE */