tcp_input.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:62k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* tcp_input.c - TCP input routines */
  2. /* Copyright 1984 - 2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994, 1995
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  * This product includes software developed by the University of
  19.  * California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  * @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
  37.  */
  38. /*
  39. modification history
  40. --------------------
  41. 01i,06mar02,vvv  fixed tcp_input to wake application only when space in send
  42.  buffer exceeds low water mark (SPR #72177)
  43. 01h,12oct01,rae  merge from truestack ver 01n, base o1f (SPRs 69629, 70328,
  44.                  70329, WindView, cleanup)
  45. 01g,11oct00,gnn  enabled LAND fix by default.
  46. 01f,09jan98,vin  added LAND attack fix.
  47. 01e,26sep97,sgv  Removed check for PUSH flag in TCP_REASS macro
  48. 01d,07jul97,vin  fixed additional bugs. 
  49.  (timestamp echo fix Stevens VolII Sec 26.6 fig 26.20,
  50.                  connection timer bug Stevens VolII sec 28.6 fig 28.20,
  51.                  simultaneous bug fix Stevens VolII sec 28.8 fig 28.30,
  52.                  removed unnecessary code Stevens VolII sec 29.9 fig 29.22)
  53. 01c,08mar97,vin  added changes to accomodate changes in pcb structure for
  54.  hash look ups.
  55. 01c,05feb97,rjc  changes for tos routing
  56. 01b,22nov96,vin  added cluster support replaced m_get(..) with mBufClGet(..).
  57. 01a,03mar96,vin  created from BSD4.4lite2. integrated some wrs changes from
  58.  02q of tcp_input.c
  59. */
  60. #include "vxWorks.h"
  61. #include "net/systm.h"
  62. #include "net/mbuf.h"
  63. #include "net/protosw.h"
  64. #include "sys/socket.h"
  65. #include "net/socketvar.h"
  66. #include "errno.h"
  67. #include "net/if.h"
  68. #include "net/route.h"
  69. #include "netinet/in.h"
  70. #include "netinet/in_pcb.h"
  71. #include "netinet/in_systm.h"
  72. #include "netinet/ip.h"
  73. #include "netinet/ip_var.h"
  74. #include "netinet/tcp.h"
  75. #include "netinet/tcp_fsm.h"
  76. #include "netinet/tcp_seq.h"
  77. #include "netinet/tcp_timer.h"
  78. #include "netinet/tcp_var.h"
  79. #include "netinet/tcpip.h"
  80. #ifdef BSDDEBUG
  81. #include "netinet/tcp_debug.h"
  82. #endif /* BSDDEBUG */
  83. #ifdef WV_INSTRUMENTATION
  84. #ifdef INCLUDE_WVNET
  85. #include "wvNetLib.h"
  86. #endif
  87. #endif
  88. #ifdef VIRTUAL_STACK
  89. #include "netinet/vsLib.h"
  90. #else
  91. extern u_long sb_max;
  92. IMPORT int tcp_keepinit;
  93. IMPORT int tcp_mssdflt;
  94. #endif /* VIRTUAL_STACK */
  95. IMPORT unsigned long (*pTcpRandHook)(void);
  96. extern void _remque ();
  97. extern void _insque ();
  98. /* XXX LAND attack safe remove this after thorough investigation */
  99. UCHAR _landAttackSafe = 1;
  100. /*
  101.  *  MIB-II support counts the number of TCP packets sent with the Reset Flag
  102.  *  set.
  103.  */
  104. #ifndef VIRTUAL_STACK
  105. long   tcpOutRsts;
  106. tcp_seq tcp_iss; /* tcp initial send seq # */
  107. unsigned tcp_alpha, tcp_beta; /* retransmission smoothing constants */
  108. struct inpcbhead tcb;           /* head of queue of active tcpcb's */
  109. struct inpcbinfo tcbinfo;
  110. struct  tcpstat tcpstat; /* tcp statistics */
  111. int tcprexmtthresh = 3;     /* overridden during protocol initialization */
  112. struct tcpiphdr tcp_saveti;
  113. struct inpcb *tcp_last_inpcb = NULL;
  114. u_long  tcp_now; /* for RFC 1323 timestamps */
  115. #endif /* VIRTUAL_STACK */
  116. #ifdef WV_INSTRUMENTATION
  117. #ifdef INCLUDE_WVNET
  118.     /* Set common fields of event identifiers for this module. */
  119. LOCAL UCHAR wvNetModuleId = WV_NET_TCPINPUT_MODULE; /* Value for tcp_input.c */
  120. LOCAL UCHAR wvNetLocalFilter = WV_NET_NONE;     /* Available event filter */
  121. LOCAL ULONG wvNetEventId;       /* Event identifier: see wvNetLib.h */
  122. #endif    /* INCLUDE_WVNET */
  123. #endif
  124. #define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ)
  125. /* for modulo comparisons of timestamps */
  126. #define TSTMP_LT(a,b) ((int)((a)-(b)) < 0)
  127. #define TSTMP_GEQ(a,b) ((int)((a)-(b)) >= 0)
  128. /*
  129.  * Insert segment ti into reassembly queue of tcp with
  130.  * control block tp.  Return TH_FIN if reassembly now includes
  131.  * a segment with FIN.  The macro form does the common case inline
  132.  * (segment is the next to be received on an established connection,
  133.  * and the queue is empty), avoiding linkage into and removal
  134.  * from the queue and repetition of various conversions.
  135.  * Set DELACK for segments received in order, but ack immediately
  136.  * when segments are out of order (so fast retransmit can work).
  137.  */
  138. #define TCP_REASS(tp, ti, m, so, flags) { 
  139. if ((ti)->ti_seq == (tp)->rcv_nxt && 
  140.     (tp)->seg_next == (struct tcpiphdr *)(tp) && 
  141.     (tp)->t_state == TCPS_ESTABLISHED) { 
  142. (tp)->t_flags |= TF_DELACK; 
  143. (tp)->rcv_nxt += (ti)->ti_len; 
  144. flags = (ti)->ti_flags & TH_FIN; 
  145. tcpstat.tcps_rcvpack++;
  146. tcpstat.tcps_rcvbyte += (ti)->ti_len;
  147. sbappend(&(so)->so_rcv, (m)); 
  148. sorwakeup(so); 
  149. } else { 
  150. (flags) = tcp_reass((tp), (ti), (m)); 
  151. tp->t_flags |= TF_ACKNOW; 
  152. }
  153. int
  154. tcp_reass(tp, ti, m)
  155. register struct tcpcb *tp;
  156. register struct tcpiphdr *ti;
  157. struct mbuf *m;
  158. {
  159. register struct tcpiphdr *q;
  160. struct socket *so = tp->t_inpcb->inp_socket;
  161. int flags;
  162. /*
  163.  * Call with ti==0 after become established to
  164.  * force pre-ESTABLISHED data up to user socket.
  165.  */
  166. if (ti == 0)
  167. goto present;
  168. /*
  169.  * Find a segment which begins after this one does.
  170.  */
  171. for (q = tp->seg_next; q != (struct tcpiphdr *)tp;
  172.     q = (struct tcpiphdr *)q->ti_next)
  173. if (SEQ_GT(q->ti_seq, ti->ti_seq))
  174. break;
  175. /*
  176.  * If there is a preceding segment, it may provide some of
  177.  * our data already.  If so, drop the data from the incoming
  178.  * segment.  If it provides all of our data, drop us.
  179.  */
  180. if ((struct tcpiphdr *)q->ti_prev != (struct tcpiphdr *)tp) {
  181. register int i;
  182. q = (struct tcpiphdr *)q->ti_prev;
  183. /* conversion to int (in i) handles seq wraparound */
  184. i = q->ti_seq + q->ti_len - ti->ti_seq;
  185. if (i > 0) {
  186. if (i >= ti->ti_len) {
  187. #ifdef WV_INSTRUMENTATION
  188. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  189.             WV_NET_PORTIN_EVENT_3 (NET_CORE_EVENT, WV_NET_INFO, 26, 8,
  190.                                tp->t_inpcb->inp_fport, tp->t_inpcb->inp_lport,
  191.                                    WV_NETEVENT_TCPIN_DUPSEG, WV_NET_RECV,
  192.                                    so->so_fd, ti->ti_seq, ti->ti_len)
  193. #endif  /* INCLUDE_WVNET */
  194. #endif
  195. tcpstat.tcps_rcvduppack++;
  196. tcpstat.tcps_rcvdupbyte += ti->ti_len;
  197. m_freem(m);
  198. return (0);
  199. }
  200. m_adj(m, i);
  201. ti->ti_len -= i;
  202. ti->ti_seq += i;
  203. }
  204. q = (struct tcpiphdr *)(q->ti_next);
  205. }
  206. tcpstat.tcps_rcvoopack++;
  207. tcpstat.tcps_rcvoobyte += ti->ti_len;
  208. REASS_MBUF(ti) = m; /* XXX */
  209. /*
  210.  * While we overlap succeeding segments trim them or,
  211.  * if they are completely covered, dequeue them.
  212.  */
  213. while (q != (struct tcpiphdr *)tp) {
  214. register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq;
  215. if (i <= 0)
  216. break;
  217. if (i < q->ti_len) {
  218. q->ti_seq += i;
  219. q->ti_len -= i;
  220. m_adj(REASS_MBUF(q), i);
  221. break;
  222. }
  223. q = (struct tcpiphdr *)q->ti_next;
  224. m = REASS_MBUF((struct tcpiphdr *)q->ti_prev);
  225. #ifdef WV_INSTRUMENTATION
  226. #ifdef INCLUDE_WVNET    /* WV_NET_VERBOSE event */
  227.         WV_NET_PORTIN_EVENT_4 (NET_CORE_EVENT, WV_NET_VERBOSE, 37, 20,
  228.                                tp->t_inpcb->inp_fport, tp->t_inpcb->inp_lport,
  229.                                WV_NETEVENT_TCPIN_DUPDATA, WV_NET_RECV, 
  230.                                so->so_fd, ti->ti_seq,
  231.                                ((struct tcpiphdr *)q->ti_prev)->ti_seq,
  232.                                ((struct tcpiphdr *)q->ti_prev)->ti_len)
  233. #endif  /* INCLUDE_WVNET */
  234. #endif
  235. remque(q->ti_prev);
  236. m_freem(m);
  237. }
  238. /*
  239.  * Stick new segment in its place.
  240.  */
  241. insque(ti, q->ti_prev);
  242. present:
  243. /*
  244.  * Present data to user, advancing rcv_nxt through
  245.  * completed sequence space.
  246.  */
  247. if (TCPS_HAVERCVDSYN(tp->t_state) == 0)
  248. return (0);
  249. ti = tp->seg_next;
  250. if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt)
  251. return (0);
  252. if (tp->t_state == TCPS_SYN_RECEIVED && ti->ti_len)
  253. return (0);
  254. do {
  255. tp->rcv_nxt += ti->ti_len;
  256. flags = ti->ti_flags & TH_FIN;
  257. remque(ti);
  258. m = REASS_MBUF(ti);
  259. ti = (struct tcpiphdr *)ti->ti_next;
  260. if (so->so_state & SS_CANTRCVMORE)
  261. m_freem(m);
  262. else
  263. sbappend(&so->so_rcv, m);
  264. } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt);
  265. sorwakeup(so);
  266. return (flags);
  267. }
  268. /*
  269.  * TCP input routine, follows pages 65-76 of the
  270.  * protocol specification dated September, 1981 very closely.
  271.  */
  272. void
  273. tcp_input(m, iphlen)
  274. register struct mbuf *m;
  275. int iphlen;
  276. {
  277. register struct tcpiphdr *ti;
  278. register struct inpcb *inp;
  279. u_char *optp = NULL;
  280. int optlen = 0;
  281. int len, tlen, off;
  282. register struct tcpcb *tp = 0;
  283. register int tiflags;
  284. struct socket *so = NULL;
  285. int todrop, acked, ourfinisacked, needoutput = 0;
  286. short ostate = 0;
  287. struct in_addr laddr;
  288. int dropsocket = 0;
  289. int iss = 0;
  290. u_long tiwin, ts_val, ts_ecr;
  291. int ts_present = 0;
  292. #ifdef WV_INSTRUMENTATION
  293. #ifdef INCLUDE_WVNET    /* WV_NET_NOTICE event */
  294.         WV_NET_EVENT_0 (NET_CORE_EVENT, WV_NET_NOTICE, 18, 7,
  295.                         WV_NETEVENT_TCPIN_START, WV_NET_RECV)
  296. #endif  /* INCLUDE_WVNET */
  297. #endif
  298. tcpstat.tcps_rcvtotal++;
  299. /*
  300.  * Get IP and TCP header together in first mbuf.
  301.  * Note: IP leaves IP header in first mbuf.
  302.  */
  303. ti = mtod(m, struct tcpiphdr *);
  304. if (iphlen > sizeof (struct ip))
  305. ip_stripoptions(m, (struct mbuf *)0);
  306. if (m->m_len < sizeof (struct tcpiphdr)) {
  307. if ((m = m_pullup(m, sizeof (struct tcpiphdr))) == 0) {
  308. tcpstat.tcps_rcvshort++;
  309. #ifdef WV_INSTRUMENTATION
  310. #ifdef INCLUDE_WVNET    /* WV_NET_VERBOSE event */
  311.             WV_NET_EVENT_0 (NET_CORE_EVENT, WV_NET_VERBOSE, 38, 21,
  312.                             WV_NETEVENT_TCPIN_SHORTSEG, WV_NET_RECV)
  313. #endif  /* INCLUDE_WVNET */
  314. #endif
  315. return;
  316. }
  317. ti = mtod(m, struct tcpiphdr *);
  318. }
  319. /*
  320.  * Checksum extended TCP header and data.
  321.  */
  322. tlen = ((struct ip *)ti)->ip_len;
  323. len = sizeof (struct ip) + tlen;
  324. ti->ti_next = ti->ti_prev = 0;
  325. ti->ti_x1 = 0;
  326. ti->ti_len = (u_short)tlen;
  327. HTONS(ti->ti_len);
  328. if ((ti->ti_sum = in_cksum(m, len))) {
  329. #ifdef WV_INSTRUMENTATION
  330. #ifdef INCLUDE_WVNET    /* WV_NET_CRITICAL event */
  331.             WV_NET_EVENT_0 (NET_CORE_EVENT, WV_NET_CRITICAL, 30, 2,
  332.                             WV_NETEVENT_TCPIN_BADSUM, WV_NET_RECV)
  333. #endif  /* INCLUDE_WVNET */
  334. #endif
  335. tcpstat.tcps_rcvbadsum++;
  336. goto drop;
  337. }
  338. /*
  339.  * Check that TCP offset makes sense,
  340.  * pull out TCP options and adjust length. XXX
  341.  */
  342. off = ti->ti_off << 2;
  343. if (off < sizeof (struct tcphdr) || off > tlen) {
  344. #ifdef WV_INSTRUMENTATION
  345. #ifdef INCLUDE_WVNET    /* WV_NET_CRITICAL event */
  346.             WV_NET_PORTIN_EVENT_1 (NET_CORE_EVENT, WV_NET_CRITICAL, 31, 3,
  347.                                    ti->ti_sport, ti->ti_dport,
  348.                                    WV_NETEVENT_TCPIN_BADSEG, WV_NET_RECV, 
  349.                                    off)
  350. #endif  /* INCLUDE_WVNET */
  351. #endif
  352. tcpstat.tcps_rcvbadoff++;
  353. goto drop;
  354. }
  355. tlen -= off;
  356. ti->ti_len = tlen;
  357. if (off > sizeof (struct tcphdr)) {
  358. if (m->m_len < sizeof(struct ip) + off) {
  359. if ((m = m_pullup(m, sizeof (struct ip) + off)) == 0) {
  360. #ifdef WV_INSTRUMENTATION
  361. #ifdef INCLUDE_WVNET    /* WV_NET_VERBOSE event */
  362.                 WV_NET_PORTIN_EVENT_0 (NET_CORE_EVENT, WV_NET_VERBOSE, 38, 21,
  363.                                        ti->ti_sport, ti->ti_dport,
  364.                                        WV_NETEVENT_TCPIN_SHORTSEG, WV_NET_RECV)
  365. #endif  /* INCLUDE_WVNET */
  366. #endif
  367. tcpstat.tcps_rcvshort++;
  368. return;
  369. }
  370. ti = mtod(m, struct tcpiphdr *);
  371. }
  372. optlen = off - sizeof (struct tcphdr);
  373. optp = mtod(m, u_char *) + sizeof (struct tcpiphdr);
  374. /* 
  375.  * Do quick retrieval of timestamp options ("options
  376.  * prediction?").  If timestamp is the only option and it's
  377.  * formatted as recommended in RFC 1323 appendix A, we
  378.  * quickly get the values now and not bother calling
  379.  * tcp_dooptions(), etc.
  380.  */
  381. if ((optlen == TCPOLEN_TSTAMP_APPA ||
  382.      (optlen > TCPOLEN_TSTAMP_APPA &&
  383. optp[TCPOLEN_TSTAMP_APPA] == TCPOPT_EOL)) &&
  384.      *(u_long *)optp == htonl(TCPOPT_TSTAMP_HDR) &&
  385.      (ti->ti_flags & TH_SYN) == 0) {
  386. ts_present = 1;
  387. ts_val = ntohl(*(u_long *)(optp + 4));
  388. ts_ecr = ntohl(*(u_long *)(optp + 8));
  389. optp = NULL; /* we've parsed the options */
  390. }
  391. }
  392. tiflags = ti->ti_flags;
  393. /*
  394.  * Convert TCP protocol specific fields to host format.
  395.  */
  396. NTOHL(ti->ti_seq);
  397. NTOHL(ti->ti_ack);
  398. NTOHS(ti->ti_win);
  399. NTOHS(ti->ti_urp);
  400. /*
  401.  * Locate pcb for segment.
  402.  */
  403. findpcb:
  404. inp = tcp_last_inpcb;
  405.         if ((inp != NULL) &&
  406.             (inp->inp_lport == ti->ti_dport) &&
  407.     (inp->inp_fport == ti->ti_sport) &&
  408.     (inp->inp_faddr.s_addr == ti->ti_src.s_addr) &&
  409.             (inp->inp_laddr.s_addr == ti->ti_dst.s_addr))
  410.             {
  411.             goto pcbMatchFound;
  412.             }
  413.         else
  414.             {
  415.             ++tcpstat.tcps_pcbcachemiss;
  416.             /*
  417.              * Search the hash table of pcbs.
  418.              */
  419.             inp = in_pcblookuphash (&tcbinfo, ti->ti_src, ti->ti_sport,
  420.                                     ti->ti_dst, ti->ti_dport, 1);
  421.             /*
  422.              * ...and if that fails, drop the packet.
  423.              */
  424.             if (inp == NULL)
  425.                 {
  426. #ifdef WV_INSTRUMENTATION
  427. #ifdef INCLUDE_WVNET    /* WV_NET_WARNING event */
  428.             WV_NET_PORTIN_EVENT_4 (NET_CORE_EVENT, WV_NET_WARNING, 11, 4,
  429.                                    ti->ti_sport, ti->ti_dport,
  430.                                    WV_NETEVENT_TCPIN_SEARCHFAIL, WV_NET_RECV, 
  431.                                    ti->ti_src.s_addr, ti->ti_sport,
  432.                                    ti->ti_dst.s_addr, ti->ti_dport)
  433. #endif  /* INCLUDE_WVNET */
  434. #endif
  435.                 /*
  436.                  * If the state is CLOSED (i.e., TCB does not exist) then
  437.                  * all data in the incoming segment is discarded.
  438.                  * If the TCB exists but is in CLOSED state, it is embryonic,
  439.                  * but should either do a listen or a connect soon.
  440.                  */
  441.                 goto dropwithreset;
  442.                 }
  443.             }
  444.         tcp_last_inpcb = inp; /* update the cache */
  445. pcbMatchFound:
  446. tp = intotcpcb(inp);
  447. if (tp == 0)
  448. goto dropwithreset;
  449. if (tp->t_state == TCPS_CLOSED)
  450. goto drop;
  451. /* Unscale the window into a 32-bit value. */
  452. if ((tiflags & TH_SYN) == 0)
  453. tiwin = ti->ti_win << tp->snd_scale;
  454. else
  455. tiwin = ti->ti_win;
  456. so = inp->inp_socket;
  457. if (so->so_options & (SO_DEBUG|SO_ACCEPTCONN)) {
  458. if (so->so_options & SO_DEBUG) {
  459. ostate = tp->t_state;
  460. tcp_saveti = *ti;
  461. }
  462. if (so->so_options & SO_ACCEPTCONN) {
  463. if ((tiflags & (TH_RST|TH_ACK|TH_SYN)) != TH_SYN) {
  464. /*
  465.  * Note: dropwithreset makes sure we don't
  466.  * send a reset in response to a RST.
  467.  */
  468. if (tiflags & TH_ACK) {
  469. tcpstat.tcps_badsyn++;
  470. goto dropwithreset;
  471. }
  472. goto drop;
  473. }
  474. so = sonewconn(so, 0);
  475. if (so == 0)
  476. goto drop;
  477. /*
  478.  * This is ugly, but ....
  479.  *
  480.  * Mark socket as temporary until we're
  481.  * committed to keeping it.  The code at
  482.  * ``drop'' and ``dropwithreset'' check the
  483.  * flag dropsocket to see if the temporary
  484.  * socket created here should be discarded.
  485.  * We mark the socket as discardable until
  486.  * we're committed to it below in TCPS_LISTEN.
  487.  */
  488. dropsocket++;
  489. inp = (struct inpcb *)so->so_pcb;
  490. inp->inp_laddr = ti->ti_dst;
  491. inp->inp_lport = ti->ti_dport;
  492.                         in_pcbrehash(inp);
  493. #ifdef SRCRT
  494. #if BSD>=43
  495. inp->inp_options = ip_srcroute();
  496. #endif
  497. #endif /* SRCRT */
  498. tp = intotcpcb(inp);
  499. tp->t_state = TCPS_LISTEN;
  500. /* Compute proper scaling value from buffer space
  501.  */
  502. while (tp->request_r_scale < TCP_MAX_WINSHIFT &&
  503.    TCP_MAXWIN << tp->request_r_scale < so->so_rcv.sb_hiwat)
  504. tp->request_r_scale++;
  505. }
  506. }
  507. /*
  508.  * Segment received on connection.
  509.  * Reset idle time and keep-alive timer.
  510.  */
  511. tp->t_idle = 0;
  512. tp->t_timer[TCPT_KEEP] = tcp_keepidle;
  513. /*
  514.  * Process options if not in LISTEN state,
  515.  * else do it below (after getting remote address).
  516.  */
  517. if (optp && tp->t_state != TCPS_LISTEN)
  518. tcp_dooptions(tp, optp, optlen, ti,
  519. &ts_present, &ts_val, &ts_ecr);
  520. /* 
  521.  * Header prediction: check for the two common cases
  522.  * of a uni-directional data xfer.  If the packet has
  523.  * no control flags, is in-sequence, the window didn't
  524.  * change and we're not retransmitting, it's a
  525.  * candidate.  If the length is zero and the ack moved
  526.  * forward, we're the sender side of the xfer.  Just
  527.  * free the data acked & wake any higher level process
  528.  * that was blocked waiting for space.  If the length
  529.  * is non-zero and the ack didn't move, we're the
  530.  * receiver side.  If we're getting packets in-order
  531.  * (the reassembly queue is empty), add the data to
  532.  * the socket buffer and note that we need a delayed ack.
  533.  */
  534. if (tp->t_state == TCPS_ESTABLISHED &&
  535.     (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK &&
  536.     (!ts_present || TSTMP_GEQ(ts_val, tp->ts_recent)) &&
  537.     ti->ti_seq == tp->rcv_nxt &&
  538.     tiwin && tiwin == tp->snd_wnd &&
  539.     tp->snd_nxt == tp->snd_max) {
  540. /* 
  541.  * If last ACK falls within this segment's sequence numbers,
  542.  *  record the timestamp.
  543.  */
  544. if (ts_present && SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)) {
  545. tp->ts_recent_age = tcp_now;
  546. tp->ts_recent = ts_val;
  547. }
  548. if (ti->ti_len == 0) {
  549. if (SEQ_GT(ti->ti_ack, tp->snd_una) &&
  550.     SEQ_LEQ(ti->ti_ack, tp->snd_max) &&
  551.     tp->snd_cwnd >= tp->snd_wnd) {
  552. /*
  553.  * this is a pure ack for outstanding data.
  554.  */
  555. ++tcpstat.tcps_predack;
  556. if (ts_present)
  557. tcp_xmit_timer(tp, tcp_now-ts_ecr+1);
  558. else if (tp->t_rtt &&
  559.     SEQ_GT(ti->ti_ack, tp->t_rtseq))
  560. tcp_xmit_timer(tp, tp->t_rtt);
  561. acked = ti->ti_ack - tp->snd_una;
  562. #ifdef WV_INSTRUMENTATION
  563. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  564.             WV_NET_PORTIN_EVENT_3 (NET_CORE_EVENT, WV_NET_INFO, 27, 9,
  565.                                    ti->ti_sport, ti->ti_dport,
  566.                                    WV_NETEVENT_TCPIN_PUREACK, WV_NET_RECV, 
  567.                                    so->so_fd, tp->snd_una, ti->ti_ack)
  568. #endif  /* INCLUDE_WVNET */
  569. #endif
  570. tcpstat.tcps_rcvackpack++;
  571. tcpstat.tcps_rcvackbyte += acked;
  572. sbdrop(&so->so_snd, acked);
  573. tp->snd_una = ti->ti_ack;
  574. m_freem(m);
  575. /*
  576.  * If all outstanding data are acked, stop
  577.  * retransmit timer, otherwise restart timer
  578.  * using current (possibly backed-off) value.
  579.  * If process is waiting for space,
  580.  * wakeup/selwakeup/signal.  If data
  581.  * are ready to send, let tcp_output
  582.  * decide between more output or persist.
  583.  */
  584. if (tp->snd_una == tp->snd_max)
  585. tp->t_timer[TCPT_REXMT] = 0;
  586. else if (tp->t_timer[TCPT_PERSIST] == 0)
  587. tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
  588. if ((so->so_snd.sb_want > 0) ||
  589.     (so->so_snd.sb_sel)      ||
  590.     (sowakeupHook != NULL))
  591.     {
  592.     if (sbspace (&so->so_snd) >= 
  593. so->so_snd.sb_lowat) 
  594. sowwakeup(so);
  595.     }
  596. if (so->so_snd.sb_cc)
  597. (void) tcp_output(tp);
  598. return;
  599. }
  600. } else if (ti->ti_ack == tp->snd_una &&
  601.     tp->seg_next == (struct tcpiphdr *)tp &&
  602.     ti->ti_len <= sbspace(&so->so_rcv)) {
  603. /*
  604.  * this is a pure, in-sequence data packet
  605.  * with nothing on the reassembly queue and
  606.  * we have enough buffer space to take it.
  607.  */
  608. #ifdef WV_INSTRUMENTATION
  609. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  610.         WV_NET_PORTIN_EVENT_3 (NET_CORE_EVENT, WV_NET_INFO, 28, 10,
  611.                                ti->ti_sport, ti->ti_dport,
  612.                                WV_NETEVENT_TCPIN_PUREDATA, WV_NET_RECV, 
  613.                                so->so_fd, ti->ti_seq, ti->ti_len)
  614. #endif  /* INCLUDE_WVNET */
  615. #endif
  616. ++tcpstat.tcps_preddat;
  617. tp->rcv_nxt += ti->ti_len;
  618. tcpstat.tcps_rcvpack++;
  619. tcpstat.tcps_rcvbyte += ti->ti_len;
  620. /*
  621.  * Drop TCP, IP headers and TCP options then add data
  622.  * to socket buffer.
  623.  */
  624. m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
  625. m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
  626. sbappend(&so->so_rcv, m);
  627. sorwakeup(so);
  628. if (ti->ti_flags & TH_PUSH)
  629. tp->t_flags |= TF_ACKNOW;
  630. else
  631. tp->t_flags |= TF_DELACK;
  632. return;
  633. }
  634. }
  635. /*
  636.  * Drop TCP, IP headers and TCP options.
  637.  */
  638. m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
  639. m->m_len  -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
  640. /*
  641.  * Calculate amount of space in receive window,
  642.  * and then do TCP input processing.
  643.  * Receive window is amount of space in rcv queue,
  644.  * but not less than advertised window.
  645.  */
  646. { int win;
  647. win = sbspace(&so->so_rcv);
  648. if (win < 0)
  649. win = 0;
  650. tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt));
  651. }
  652. switch (tp->t_state) {
  653. /*
  654.  * If the state is LISTEN then ignore segment if it contains an RST.
  655.  * If the segment contains an ACK then it is bad and send a RST.
  656.  * If it does not contain a SYN then it is not interesting; drop it.
  657.  * Don't bother responding if the destination was a broadcast.
  658.  * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial
  659.  * tp->iss, and send a segment:
  660.  *     <SEQ=ISS><ACK=RCV_NXT><CTL=SYN,ACK>
  661.  * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss.
  662.  * Fill in remote peer address fields if not previously specified.
  663.  * Enter SYN_RECEIVED state, and process any other fields of this
  664.  * segment in this state.
  665.  */
  666. case TCPS_LISTEN: {
  667. struct mbuf *am;
  668. register struct sockaddr_in *sin;
  669. #ifdef already_done
  670. if (tiflags & TH_RST)
  671. goto drop;
  672. if (tiflags & TH_ACK)
  673. goto dropwithreset;
  674. if ((tiflags & TH_SYN) == 0)
  675. goto drop;
  676. #endif
  677. /*
  678.  * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN
  679.  * in_broadcast() should never return true on a received
  680.  * packet with M_BCAST not set.
  681.  */
  682. if (m->m_flags & (M_BCAST|M_MCAST) ||
  683.     IN_MULTICAST(ntohl(ti->ti_dst.s_addr)))
  684. goto drop;
  685.                 /* XXX land bug attack fix */
  686.                 if (_landAttackSafe)
  687.                     if ((ti->ti_sport == ti->ti_dport) &&
  688.                         (ti->ti_src.s_addr == ti->ti_dst.s_addr))
  689.                         goto drop;
  690.                 
  691. /* XXX */
  692. am = mBufClGet(M_DONTWAIT, MT_SONAME, CL_SIZE_128, TRUE);
  693. if (am == NULL)
  694. goto drop;
  695. am->m_len = sizeof (struct sockaddr_in);
  696. sin = mtod(am, struct sockaddr_in *);
  697. sin->sin_family = AF_INET;
  698. sin->sin_len = sizeof(*sin);
  699. sin->sin_addr = ti->ti_src;
  700. sin->sin_port = ti->ti_sport;
  701. bzero((caddr_t)sin->sin_zero, sizeof(sin->sin_zero));
  702. laddr = inp->inp_laddr;
  703. if (inp->inp_laddr.s_addr == INADDR_ANY)
  704. inp->inp_laddr = ti->ti_dst;
  705. if (in_pcbconnect(inp, am)) {
  706. inp->inp_laddr = laddr;
  707. (void) m_free(am);
  708. goto drop;
  709. }
  710. (void) m_free(am);
  711. tp->t_template = tcp_template(tp);
  712. if (tp->t_template == 0) {
  713. tp = tcp_drop(tp, ENOBUFS);
  714. dropsocket = 0; /* socket is already gone */
  715. goto drop;
  716. }
  717. if (optp)
  718. tcp_dooptions(tp, optp, optlen, ti,
  719. &ts_present, &ts_val, &ts_ecr);
  720. if (iss)
  721. tp->iss = iss;
  722. else
  723. tp->iss = tcp_iss;
  724. tcp_iss += TCP_ISSINCR/4 + ((0x0000ffff) & (pTcpRandHook() >> 16));
  725. tp->irs = ti->ti_seq;
  726. tcp_sendseqinit(tp);
  727. tcp_rcvseqinit(tp);
  728. tp->t_flags |= TF_ACKNOW;
  729. tp->t_state = TCPS_SYN_RECEIVED;
  730. tp->t_timer[TCPT_KEEP] = tcp_keepinit;
  731. dropsocket = 0; /* committed to socket */
  732. tcpstat.tcps_accepts++;
  733. #ifdef WV_INSTRUMENTATION
  734. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  735.             WV_NET_PORTIN_EVENT_3 (NET_AUX_EVENT, WV_NET_INFO, 29, 11,
  736.                                    ti->ti_sport, ti->ti_dport,
  737.                                    WV_NETEVENT_TCPIN_ACCEPT, WV_NET_RECV, 
  738.                                    so->so_fd, tp->snd_nxt, tp->rcv_nxt)
  739. #endif  /* INCLUDE_WVNET */
  740. #endif
  741. goto trimthenstep6;
  742. }
  743. /*
  744.  * If the state is SYN_SENT:
  745.  * if seg contains an ACK, but not for our SYN, drop the input.
  746.  * if seg contains a RST, then drop the connection.
  747.  * if seg does not contain SYN, then drop it.
  748.  * Otherwise this is an acceptable SYN segment
  749.  * initialize tp->rcv_nxt and tp->irs
  750.  * if seg contains ack then advance tp->snd_una
  751.  * if SYN has been acked change to ESTABLISHED else SYN_RCVD state
  752.  * arrange for segment to be acked (eventually)
  753.  * continue processing rest of data/controls, beginning with URG
  754.  */
  755. case TCPS_SYN_SENT:
  756. if ((tiflags & TH_ACK) &&
  757.     (SEQ_LEQ(ti->ti_ack, tp->iss) ||
  758.      SEQ_GT(ti->ti_ack, tp->snd_max)))
  759. goto dropwithreset;
  760. if (tiflags & TH_RST) {
  761. if (tiflags & TH_ACK)
  762. tp = tcp_drop(tp, ECONNREFUSED);
  763. goto drop;
  764. }
  765. if ((tiflags & TH_SYN) == 0)
  766. goto drop;
  767. if (tiflags & TH_ACK) {
  768. tp->snd_una = ti->ti_ack;
  769. if (SEQ_LT(tp->snd_nxt, tp->snd_una))
  770. tp->snd_nxt = tp->snd_una;
  771.                         tp->t_timer[TCPT_REXMT] = 0;
  772. }
  773. tp->irs = ti->ti_seq;
  774. tcp_rcvseqinit(tp);
  775. tp->t_flags |= TF_ACKNOW;
  776. if (tiflags & TH_ACK ) {
  777. tcpstat.tcps_connects++;
  778. #ifdef WV_INSTRUMENTATION
  779. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  780.             WV_NET_PORTIN_EVENT_3 (NET_AUX_EVENT, WV_NET_INFO, 30, 12,
  781.                                    ti->ti_sport, ti->ti_dport,
  782.                                    WV_NETEVENT_TCPIN_CONNECT, WV_NET_RECV, 
  783.                                    so->so_fd, tp->snd_nxt, tp->rcv_nxt)
  784. #endif  /* INCLUDE_WVNET */
  785. #endif
  786. soisconnected(so);
  787. tp->t_state = TCPS_ESTABLISHED;
  788. /* Do window scaling on this connection? */
  789. if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
  790. (TF_RCVD_SCALE|TF_REQ_SCALE)) {
  791. tp->snd_scale = tp->requested_s_scale;
  792. tp->rcv_scale = tp->request_r_scale;
  793. }
  794. (void) tcp_reass(tp, (struct tcpiphdr *)0,
  795. (struct mbuf *)0);
  796. /*
  797.  * if we didn't have to retransmit the SYN,
  798.  * use its rtt as our initial srtt & rtt var.
  799.  */
  800. if (tp->t_rtt)
  801. tcp_xmit_timer(tp, tp->t_rtt);
  802. } else
  803. tp->t_state = TCPS_SYN_RECEIVED;
  804. trimthenstep6:
  805. /*
  806.  * Advance ti->ti_seq to correspond to first data byte.
  807.  * If data, trim to stay within window,
  808.  * dropping FIN if necessary.
  809.  */
  810. ti->ti_seq++;
  811. if (ti->ti_len > tp->rcv_wnd) {
  812. todrop = ti->ti_len - tp->rcv_wnd;
  813. m_adj(m, -todrop);
  814. ti->ti_len = tp->rcv_wnd;
  815. tiflags &= ~TH_FIN;
  816. tcpstat.tcps_rcvpackafterwin++;
  817. tcpstat.tcps_rcvbyteafterwin += todrop;
  818. }
  819. tp->snd_wl1 = ti->ti_seq - 1;
  820. tp->rcv_up = ti->ti_seq;
  821. goto step6;
  822. }
  823. /*
  824.  * States other than LISTEN or SYN_SENT.
  825.  * First check timestamp, if present.
  826.  * Then check that at least some bytes of segment are within 
  827.  * receive window.  If segment begins before rcv_nxt,
  828.  * drop leading data (and SYN); if nothing left, just ack.
  829.  * 
  830.  * RFC 1323 PAWS: If we have a timestamp reply on this segment
  831.  * and it's less than ts_recent, drop it.
  832.  */
  833. if (ts_present && (tiflags & TH_RST) == 0 && tp->ts_recent &&
  834.     TSTMP_LT(ts_val, tp->ts_recent)) {
  835. /* Check to see if ts_recent is over 24 days old.  */
  836. if ((int)(tcp_now - tp->ts_recent_age) > TCP_PAWS_IDLE) {
  837. /*
  838.  * Invalidate ts_recent.  If this segment updates
  839.  * ts_recent, the age will be reset later and ts_recent
  840.  * will get a valid value.  If it does not, setting
  841.  * ts_recent to zero will at least satisfy the
  842.  * requirement that zero be placed in the timestamp
  843.  * echo reply when ts_recent isn't valid.  The
  844.  * age isn't reset until we get a valid ts_recent
  845.  * because we don't want out-of-order segments to be
  846.  * dropped when ts_recent is old.
  847.  */
  848. tp->ts_recent = 0;
  849. } else {
  850. tcpstat.tcps_rcvduppack++;
  851. tcpstat.tcps_rcvdupbyte += ti->ti_len;
  852. tcpstat.tcps_pawsdrop++;
  853. goto dropafterack;
  854. }
  855. }
  856. todrop = tp->rcv_nxt - ti->ti_seq;
  857. if (todrop > 0) {
  858. if (tiflags & TH_SYN) {
  859. tiflags &= ~TH_SYN;
  860. ti->ti_seq++;
  861. if (ti->ti_urp > 1) 
  862. ti->ti_urp--;
  863. else
  864. tiflags &= ~TH_URG;
  865. todrop--;
  866. }
  867. #if 0  /* simultaneous open bug  */              
  868. if (todrop >= ti->ti_len) {
  869. tcpstat.tcps_rcvduppack++;
  870. tcpstat.tcps_rcvdupbyte += ti->ti_len;
  871. /*
  872.  * If segment is just one to the left of the window,
  873.  * check two special cases:
  874.  * 1. Don't toss RST in response to 4.2-style keepalive.
  875.  * 2. If the only thing to drop is a FIN, we can drop
  876.  *    it, but check the ACK or we will get into FIN
  877.  *    wars if our FINs crossed (both CLOSING).
  878.  * In either case, send ACK to resynchronize,
  879.  * but keep on processing for RST or ACK.
  880.  */
  881. if ((tiflags & TH_FIN && todrop == ti->ti_len + 1)
  882. #ifdef TCP_COMPAT_42
  883.   || (tiflags & TH_RST && ti->ti_seq == tp->rcv_nxt - 1)
  884. #endif
  885.    ) {
  886. todrop = ti->ti_len;
  887. tiflags &= ~TH_FIN;
  888. } else {
  889. /*
  890.  * Handle the case when a bound socket connects
  891.  * to itself. Allow packets with a SYN and
  892.  * an ACK to continue with the processing.
  893.  */
  894. if (todrop != 0 || (tiflags & TH_ACK) == 0)
  895. goto dropafterack;
  896. }
  897. tp->t_flags |= TF_ACKNOW;
  898. } else {
  899. tcpstat.tcps_rcvpartduppack++;
  900. tcpstat.tcps_rcvpartdupbyte += todrop;
  901. }
  902. #else /* XXX  simultaneous open bug fix Steven vol II sec 28.8 fig 28.30 */
  903.                 if (todrop > ti->ti_len ||
  904.                     (todrop == ti->ti_len && (tiflags & TH_FIN) == 0)) {
  905.                     /*
  906.                      * Any valid Fin must be to the left of the window.
  907.                      * At this point the FIN must be a duplicate or
  908.                      * out of sequence; drop it.
  909.                      */
  910.                      tiflags &= ~TH_FIN;
  911.                     /*
  912.                      * Send an ACK to resynchronize and drop any data.
  913.                      * But keep on processing for RST or ACK.
  914.                      */
  915.                     tp->t_flags |= TF_ACKNOW;
  916.                     todrop = ti->ti_len;
  917.                 }
  918.                 tcpstat.tcps_rcvdupbyte += todrop;
  919.                 tcpstat.tcps_rcvduppack++;
  920. #endif /* simultaneous open bug fix */                   
  921. m_adj(m, todrop);
  922. ti->ti_seq += todrop;
  923. ti->ti_len -= todrop;
  924. if (ti->ti_urp > todrop)
  925. ti->ti_urp -= todrop;
  926. else {
  927. tiflags &= ~TH_URG;
  928. ti->ti_urp = 0;
  929. }
  930. }
  931. /*
  932.  * If new data are received on a connection after the
  933.  * user processes are gone, then RST the other end.
  934.  */
  935. if ((so->so_state & SS_NOFDREF) &&
  936.     tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) {
  937. tp = tcp_close(tp);
  938. tcpstat.tcps_rcvafterclose++;
  939. #ifdef WV_INSTRUMENTATION
  940. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  941.         WV_NET_PORTIN_EVENT_3 (NET_CORE_EVENT, WV_NET_INFO, 31, 13,
  942.                                ti->ti_sport, ti->ti_dport,
  943.                                WV_NETEVENT_TCPIN_DATACLOSED, WV_NET_RECV, 
  944.                                so->so_fd, ti->ti_seq, ti->ti_len)
  945. #endif  /* INCLUDE_WVNET */
  946. #endif
  947. goto dropwithreset;
  948. }
  949. /*
  950.  * If segment ends after window, drop trailing data
  951.  * (and PUSH and FIN); if nothing left, just ACK.
  952.  */
  953. todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd);
  954. if (todrop > 0) {
  955. tcpstat.tcps_rcvpackafterwin++;
  956. if (todrop >= ti->ti_len) {
  957. tcpstat.tcps_rcvbyteafterwin += ti->ti_len;
  958. /*
  959.  * If a new connection request is received
  960.  * while in TIME_WAIT, drop the old connection
  961.  * and start over if the sequence numbers
  962.  * are above the previous ones.
  963.  */
  964. if (tiflags & TH_SYN &&
  965.     tp->t_state == TCPS_TIME_WAIT &&
  966.     SEQ_GT(ti->ti_seq, tp->rcv_nxt)) {
  967. iss = tp->snd_nxt + TCP_ISSINCR;
  968. tp = tcp_close(tp);
  969. goto findpcb;
  970. }
  971. /*
  972.  * If window is closed can only take segments at
  973.  * window edge, and have to drop data and PUSH from
  974.  * incoming segments.  Continue processing, but
  975.  * remember to ack.  Otherwise, drop segment
  976.  * and ack.
  977.  */
  978. if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) {
  979. tp->t_flags |= TF_ACKNOW;
  980. tcpstat.tcps_rcvwinprobe++;
  981. } else
  982. goto dropafterack;
  983. } else
  984. tcpstat.tcps_rcvbyteafterwin += todrop;
  985. m_adj(m, -todrop);
  986. ti->ti_len -= todrop;
  987. tiflags &= ~(TH_PUSH|TH_FIN);
  988. }
  989. /*
  990.  * If last ACK falls within this segment's sequence numbers,
  991.  * record its timestamp.
  992.  */
  993. if (ts_present && TSTMP_GEQ(ts_val, tp->ts_recent) &&
  994.             SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)) {
  995. tp->ts_recent_age = tcp_now;
  996. tp->ts_recent = ts_val;
  997. }
  998. /*
  999.  * If the RST bit is set examine the state:
  1000.  *    SYN_RECEIVED STATE:
  1001.  * If passive open, return to LISTEN state.
  1002.  * If active open, inform user that connection was refused.
  1003.  *    ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES:
  1004.  * Inform user that connection was reset, and close tcb.
  1005.  *    CLOSING, LAST_ACK, TIME_WAIT STATES
  1006.  * Close the tcb.
  1007.  */
  1008. if (tiflags&TH_RST) switch (tp->t_state) {
  1009. case TCPS_SYN_RECEIVED:
  1010. so->so_error = ECONNREFUSED;
  1011. goto close;
  1012. case TCPS_ESTABLISHED:
  1013. case TCPS_FIN_WAIT_1:
  1014. case TCPS_FIN_WAIT_2:
  1015. case TCPS_CLOSE_WAIT:
  1016. so->so_error = ECONNRESET;
  1017. close:
  1018. #ifdef WV_INSTRUMENTATION
  1019. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1020.         WV_NET_PORTIN_EVENT_1 (NET_AUX_EVENT, WV_NET_INFO, 32, 14,
  1021.                                ti->ti_sport, ti->ti_dport,
  1022.                                WV_NETEVENT_TCPIN_RESET, WV_NET_RECV, 
  1023.                                so->so_fd)
  1024. #endif  /* INCLUDE_WVNET */
  1025. #endif
  1026. tp->t_state = TCPS_CLOSED;
  1027. tcpstat.tcps_drops++;
  1028. tp = tcp_close(tp);
  1029. goto drop;
  1030. case TCPS_CLOSING:
  1031. case TCPS_LAST_ACK:
  1032. case TCPS_TIME_WAIT:
  1033. tp = tcp_close(tp);
  1034. goto drop;
  1035. }
  1036. /*
  1037.  * If a SYN is in the window, then this is an
  1038.  * error and we send an RST and drop the connection.
  1039.  */
  1040. if (tiflags & TH_SYN) {
  1041. #ifdef WV_INSTRUMENTATION
  1042. #ifdef INCLUDE_WVNET    /* WV_NET_WARNING event */
  1043.         WV_NET_PORTIN_EVENT_1 (NET_CORE_EVENT, WV_NET_WARNING, 12, 5,
  1044.                                ti->ti_sport, ti->ti_dport,
  1045.                                WV_NETEVENT_TCPIN_BADSYNC, WV_NET_RECV, 
  1046.                                so->so_fd)
  1047. #endif  /* INCLUDE_WVNET */
  1048. #endif
  1049. tp = tcp_drop(tp, ECONNRESET);
  1050. goto dropwithreset;
  1051. }
  1052. /*
  1053.  * If the ACK bit is off we drop the segment and return.
  1054.  */
  1055. if ((tiflags & TH_ACK) == 0)
  1056. goto drop;
  1057. /*
  1058.  * Ack processing.
  1059.  */
  1060. switch (tp->t_state) {
  1061. /*
  1062.  * In SYN_RECEIVED state if the ack ACKs our SYN then enter
  1063.  * ESTABLISHED state and continue processing, otherwise
  1064.  * send an RST.
  1065.  */
  1066. case TCPS_SYN_RECEIVED:
  1067. if (SEQ_GT(tp->snd_una, ti->ti_ack) ||
  1068.     SEQ_GT(ti->ti_ack, tp->snd_max))
  1069. goto dropwithreset;
  1070. #ifdef WV_INSTRUMENTATION
  1071. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1072.             WV_NET_PORTIN_EVENT_3 (NET_AUX_EVENT, WV_NET_INFO, 30, 12,
  1073.                                    ti->ti_sport, ti->ti_dport,
  1074.                                    WV_NETEVENT_TCPIN_CONNECT, WV_NET_RECV, 
  1075.                                    so->so_fd, tp->snd_nxt, tp->rcv_nxt)
  1076. #endif  /* INCLUDE_WVNET */
  1077. #endif
  1078. tcpstat.tcps_connects++;
  1079. soisconnected(so);
  1080. tp->t_state = TCPS_ESTABLISHED;
  1081. /* Do window scaling? */
  1082. if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
  1083. (TF_RCVD_SCALE|TF_REQ_SCALE)) {
  1084. tp->snd_scale = tp->requested_s_scale;
  1085. tp->rcv_scale = tp->request_r_scale;
  1086. }
  1087. (void) tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0);
  1088. tp->snd_wl1 = ti->ti_seq - 1;
  1089. /* fall into ... */
  1090. /*
  1091.  * In ESTABLISHED state: drop duplicate ACKs; ACK out of range
  1092.  * ACKs.  If the ack is in the range
  1093.  * tp->snd_una < ti->ti_ack <= tp->snd_max
  1094.  * then advance tp->snd_una to ti->ti_ack and drop
  1095.  * data from the retransmission queue.  If this ACK reflects
  1096.  * more up to date window information we update our window information.
  1097.  */
  1098. case TCPS_ESTABLISHED:
  1099. case TCPS_FIN_WAIT_1:
  1100. case TCPS_FIN_WAIT_2:
  1101. case TCPS_CLOSE_WAIT:
  1102. case TCPS_CLOSING:
  1103. case TCPS_LAST_ACK:
  1104. case TCPS_TIME_WAIT:
  1105. if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) {
  1106. if (ti->ti_len == 0 && tiwin == tp->snd_wnd) {
  1107. tcpstat.tcps_rcvdupack++;
  1108. /*
  1109.  * If we have outstanding data (other than
  1110.  * a window probe), this is a completely
  1111.  * duplicate ack (ie, window info didn't
  1112.  * change), the ack is the biggest we've
  1113.  * seen and we've seen exactly our rexmt
  1114.  * threshhold of them, assume a packet
  1115.  * has been dropped and retransmit it.
  1116.  * Kludge snd_nxt & the congestion
  1117.  * window so we send only this one
  1118.  * packet.
  1119.  *
  1120.  * We know we're losing at the current
  1121.  * window size so do congestion avoidance
  1122.  * (set ssthresh to half the current window
  1123.  * and pull our congestion window back to
  1124.  * the new ssthresh).
  1125.  *
  1126.  * Dup acks mean that packets have left the
  1127.  * network (they're now cached at the receiver) 
  1128.  * so bump cwnd by the amount in the receiver
  1129.  * to keep a constant cwnd packets in the
  1130.  * network.
  1131.  */
  1132. if (tp->t_timer[TCPT_REXMT] == 0 ||
  1133.     ti->ti_ack != tp->snd_una)
  1134. tp->t_dupacks = 0;
  1135. else if (++tp->t_dupacks == tcprexmtthresh) {
  1136. tcp_seq onxt = tp->snd_nxt;
  1137. u_int win =
  1138.     min(tp->snd_wnd, tp->snd_cwnd) / 2 /
  1139. tp->t_maxseg;
  1140. if (win < 2)
  1141. win = 2;
  1142. tp->snd_ssthresh = win * tp->t_maxseg;
  1143. tp->t_timer[TCPT_REXMT] = 0;
  1144. tp->t_rtt = 0;
  1145. tp->snd_nxt = ti->ti_ack;
  1146. tp->snd_cwnd = tp->t_maxseg;
  1147. #ifdef WV_INSTRUMENTATION
  1148. #ifdef INCLUDE_WVNET    /* WV_NET_WARNING event */
  1149.             WV_NET_PORTOUT_EVENT_2 (NET_CORE_EVENT, WV_NET_WARNING, 13, 6,
  1150.                               tp->t_inpcb->inp_lport, tp->t_inpcb->inp_fport,
  1151.                                    WV_NETEVENT_TCPIN_SENDFAIL, WV_NET_RECV, 
  1152.                                    so->so_fd, tp->t_dupacks)
  1153. #endif  /* INCLUDE_WVNET */
  1154. #endif
  1155. (void) tcp_output(tp);
  1156. tp->snd_cwnd = tp->snd_ssthresh +
  1157.        tp->t_maxseg * tp->t_dupacks;
  1158. if (SEQ_GT(onxt, tp->snd_nxt))
  1159. tp->snd_nxt = onxt;
  1160. goto drop;
  1161. } else if (tp->t_dupacks > tcprexmtthresh) {
  1162. tp->snd_cwnd += tp->t_maxseg;
  1163. #ifdef WV_INSTRUMENTATION
  1164. #ifdef INCLUDE_WVNET    /* WV_NET_WARNING event */
  1165.             WV_NET_PORTOUT_EVENT_2 (NET_CORE_EVENT, WV_NET_WARNING, 13, 6,
  1166.                               tp->t_inpcb->inp_lport, tp->t_inpcb->inp_fport,
  1167.                                    WV_NETEVENT_TCPIN_SENDFAIL, WV_NET_RECV, 
  1168.                                    so->so_fd, tp->t_dupacks)
  1169. #endif  /* INCLUDE_WVNET */
  1170. #endif
  1171. (void) tcp_output(tp);
  1172. goto drop;
  1173. }
  1174. } else
  1175. tp->t_dupacks = 0;
  1176. break;
  1177. }
  1178. /*
  1179.  * If the congestion window was inflated to account
  1180.  * for the other side's cached packets, retract it.
  1181.  */
  1182. if (tp->t_dupacks > tcprexmtthresh &&
  1183.     tp->snd_cwnd > tp->snd_ssthresh)
  1184. tp->snd_cwnd = tp->snd_ssthresh;
  1185. tp->t_dupacks = 0;
  1186. if (SEQ_GT(ti->ti_ack, tp->snd_max)) {
  1187. tcpstat.tcps_rcvacktoomuch++;
  1188. goto dropafterack;
  1189. }
  1190. acked = ti->ti_ack - tp->snd_una;
  1191. tcpstat.tcps_rcvackpack++;
  1192. tcpstat.tcps_rcvackbyte += acked;
  1193. /*
  1194.  * If we have a timestamp reply, update smoothed
  1195.  * round trip time.  If no timestamp is present but
  1196.  * transmit timer is running and timed sequence
  1197.  * number was acked, update smoothed round trip time.
  1198.  * Since we now have an rtt measurement, cancel the
  1199.  * timer backoff (cf., Phil Karn's retransmit alg.).
  1200.  * Recompute the initial retransmit timer.
  1201.  */
  1202. if (ts_present)
  1203. tcp_xmit_timer(tp, tcp_now-ts_ecr+1);
  1204. else if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq))
  1205. tcp_xmit_timer(tp,tp->t_rtt);
  1206. /*
  1207.  * If all outstanding data is acked, stop retransmit
  1208.  * timer and remember to restart (more output or persist).
  1209.  * If there is more data to be acked, restart retransmit
  1210.  * timer, using current (possibly backed-off) value.
  1211.  */
  1212. if (ti->ti_ack == tp->snd_max) {
  1213. tp->t_timer[TCPT_REXMT] = 0;
  1214. needoutput = 1;
  1215. } else if (tp->t_timer[TCPT_PERSIST] == 0)
  1216. tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
  1217. /*
  1218.  * When new data is acked, open the congestion window.
  1219.  * If the window gives us less than ssthresh packets
  1220.  * in flight, open exponentially (maxseg per packet).
  1221.  * Otherwise open linearly: maxseg per window
  1222.  * (maxseg * (maxseg / cwnd) per packet).
  1223.  */
  1224. {
  1225. register u_int cw = tp->snd_cwnd;
  1226. register u_int incr = tp->t_maxseg;
  1227. if (cw > tp->snd_ssthresh)
  1228. incr = incr * incr / cw;
  1229. tp->snd_cwnd = min(cw + incr, TCP_MAXWIN<<tp->snd_scale);
  1230. }
  1231. if (acked > so->so_snd.sb_cc) {
  1232. tp->snd_wnd -= so->so_snd.sb_cc;
  1233. sbdrop(&so->so_snd, (int)so->so_snd.sb_cc);
  1234. ourfinisacked = 1;
  1235. } else {
  1236. sbdrop(&so->so_snd, acked);
  1237. tp->snd_wnd -= acked;
  1238. ourfinisacked = 0;
  1239. }
  1240. if ((so->so_snd.sb_want > 0) || (so->so_snd.sb_sel) ||
  1241.     (sowakeupHook != NULL))
  1242.     {
  1243.     if (sbspace (&so->so_snd) >= so->so_snd.sb_lowat)
  1244. sowwakeup(so);
  1245.                     }
  1246. tp->snd_una = ti->ti_ack;
  1247. if (SEQ_LT(tp->snd_nxt, tp->snd_una))
  1248. tp->snd_nxt = tp->snd_una;
  1249. switch (tp->t_state) {
  1250. /*
  1251.  * In FIN_WAIT_1 STATE in addition to the processing
  1252.  * for the ESTABLISHED state if our FIN is now acknowledged
  1253.  * then enter FIN_WAIT_2.
  1254.  */
  1255. case TCPS_FIN_WAIT_1:
  1256. if (ourfinisacked) {
  1257. /*
  1258.  * If we can't receive any more
  1259.  * data, then closing user can proceed.
  1260.  * Starting the timer is contrary to the
  1261.  * specification, but if we don't get a FIN
  1262.  * we'll hang forever.
  1263.  */
  1264. if (so->so_state & SS_CANTRCVMORE) {
  1265. soisdisconnected(so);
  1266. tp->t_timer[TCPT_2MSL] = tcp_maxidle;
  1267. }
  1268. #ifdef WV_INSTRUMENTATION
  1269. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1270.             WV_NET_PORTIN_EVENT_1 (NET_AUX_EVENT, WV_NET_INFO, 33, 15,
  1271.                                    ti->ti_sport, ti->ti_dport,
  1272.                                    WV_NETEVENT_TCPIN_SENDCLOSED, WV_NET_RECV, 
  1273.                                    so->so_fd)
  1274. #endif  /* INCLUDE_WVNET */
  1275. #endif
  1276. tp->t_state = TCPS_FIN_WAIT_2;
  1277. }
  1278. break;
  1279.   /*
  1280.  * In CLOSING STATE in addition to the processing for
  1281.  * the ESTABLISHED state if the ACK acknowledges our FIN
  1282.  * then enter the TIME-WAIT state, otherwise ignore
  1283.  * the segment.
  1284.  */
  1285. case TCPS_CLOSING:
  1286. if (ourfinisacked) {
  1287. #ifdef WV_INSTRUMENTATION
  1288. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1289.             WV_NET_PORTIN_EVENT_1 (NET_AUX_EVENT, WV_NET_INFO, 34, 16,
  1290.                                    ti->ti_sport, ti->ti_dport,
  1291.                                    WV_NETEVENT_TCPIN_CLOSEWAIT, WV_NET_RECV, 
  1292.                                    so->so_fd)
  1293. #endif  /* INCLUDE_WVNET */
  1294. #endif
  1295. tp->t_state = TCPS_TIME_WAIT;
  1296. tcp_canceltimers(tp);
  1297. tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  1298. soisdisconnected(so);
  1299. }
  1300. break;
  1301. /*
  1302.  * In LAST_ACK, we may still be waiting for data to drain
  1303.  * and/or to be acked, as well as for the ack of our FIN.
  1304.  * If our FIN is now acknowledged, delete the TCB,
  1305.  * enter the closed state and return.
  1306.  */
  1307. case TCPS_LAST_ACK:
  1308. if (ourfinisacked) {
  1309. tp = tcp_close(tp);
  1310. goto drop;
  1311. }
  1312. break;
  1313. /*
  1314.  * In TIME_WAIT state the only thing that should arrive
  1315.  * is a retransmission of the remote FIN.  Acknowledge
  1316.  * it and restart the finack timer.
  1317.  */
  1318. case TCPS_TIME_WAIT:
  1319. #ifdef WV_INSTRUMENTATION
  1320. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1321.         WV_NET_PORTIN_EVENT_2 (NET_AUX_EVENT, WV_NET_INFO, 37, 19,
  1322.                                ti->ti_sport, ti->ti_dport,
  1323.                                WV_NETEVENT_TCPIN_CLOSE_RESTART, WV_NET_RECV,
  1324.                                so->so_fd, TRUE)
  1325. #endif  /* INCLUDE_WVNET */
  1326. #endif
  1327. tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  1328. goto dropafterack;
  1329. }
  1330. }
  1331. step6:
  1332. /*
  1333.  * Update window information.
  1334.  * Don't look at window if no ACK: TAC's send garbage on first SYN.
  1335.          *
  1336.          * More specifically, update the window when:
  1337.          *  1) The ACK flag is set, and either:
  1338.          *      a) The segment contains new data (snd_wl1 < ti_seq) OR
  1339.          *      b) The segment is a repeat (snd_wl1 == ti_seq).
  1340.          *
  1341.          *  2) In case 1b), one of the following conditions also applies:
  1342.          *      a) The segment acknowledges more data (snd_wl2 < ti_ack) OR
  1343.          *      b) No new data is acknowledged, but the window size increases.
  1344.          *
  1345.          * The wl2 == ti_ack test might be redundant since the received
  1346.          * ACK value can't realistically decrease when snd_wl1 == ti_seq.
  1347.  */
  1348. if ( (tiflags & TH_ACK) &&
  1349.     (SEQ_LT(tp->snd_wl1, ti->ti_seq) ||
  1350.                (tp->snd_wl1 == ti->ti_seq &&
  1351.           (SEQ_LT(tp->snd_wl2, ti->ti_ack) ||
  1352.                   (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))
  1353.                )
  1354.             ))
  1355.             {
  1356. /* keep track of pure window updates */
  1357. if (ti->ti_len == 0 &&
  1358.     tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd)
  1359. tcpstat.tcps_rcvwinupd++;
  1360. tp->snd_wnd = tiwin;
  1361. tp->snd_wl1 = ti->ti_seq;
  1362. tp->snd_wl2 = ti->ti_ack;
  1363. if (tp->snd_wnd > tp->max_sndwnd)
  1364. tp->max_sndwnd = tp->snd_wnd;
  1365. needoutput = 1;
  1366. }
  1367. /*
  1368.  * Process segments with URG.
  1369.  */
  1370. if ((tiflags & TH_URG) && ti->ti_urp &&
  1371.     TCPS_HAVERCVDFIN(tp->t_state) == 0) {
  1372. /*
  1373.  * This is a kludge, but if we receive and accept
  1374.  * random urgent pointers, we'll crash in
  1375.  * soreceive.  It's hard to imagine someone
  1376.  * actually wanting to send this much urgent data.
  1377.  */
  1378. if (ti->ti_urp + so->so_rcv.sb_cc > sb_max) {
  1379. ti->ti_urp = 0; /* XXX */
  1380. tiflags &= ~TH_URG; /* XXX */
  1381. goto dodata; /* XXX */
  1382. }
  1383. /*
  1384.  * If this segment advances the known urgent pointer,
  1385.  * then mark the data stream.  This should not happen
  1386.  * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since
  1387.  * a FIN has been received from the remote side. 
  1388.  * In these states we ignore the URG.
  1389.  *
  1390.  * According to RFC961 (Assigned Protocols),
  1391.  * the urgent pointer points to the last octet
  1392.  * of urgent data.  We continue, however,
  1393.  * to consider it to indicate the first octet
  1394.  * of data past the urgent section as the original 
  1395.  * spec states (in one of two places).
  1396.  */
  1397. if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) {
  1398. tp->rcv_up = ti->ti_seq + ti->ti_urp;
  1399. so->so_oobmark = so->so_rcv.sb_cc +
  1400.     (tp->rcv_up - tp->rcv_nxt) - 1;
  1401. if (so->so_oobmark == 0)
  1402. so->so_state |= SS_RCVATMARK;
  1403. sohasoutofband(so);
  1404. tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
  1405. }
  1406. /*
  1407.  * Remove out of band data so doesn't get presented to user.
  1408.  * This can happen independent of advancing the URG pointer,
  1409.  * but if two URG's are pending at once, some out-of-band
  1410.  * data may creep in... ick.
  1411.  */
  1412. if (ti->ti_urp <= ti->ti_len &&
  1413.      (so->so_options & SO_OOBINLINE) == 0)
  1414. tcp_pulloutofband(so, ti, m);
  1415. } else
  1416. /*
  1417.  * If no out of band data is expected,
  1418.  * pull receive urgent pointer along
  1419.  * with the receive window.
  1420.  */
  1421. if (SEQ_GT(tp->rcv_nxt, tp->rcv_up))
  1422. tp->rcv_up = tp->rcv_nxt;
  1423. dodata: /* XXX */
  1424. /*
  1425.  * Process the segment text, merging it into the TCP sequencing queue,
  1426.  * and arranging for acknowledgment of receipt if necessary.
  1427.  * This process logically involves adjusting tp->rcv_wnd as data
  1428.  * is presented to the user (this happens in tcp_usrreq.c,
  1429.  * case PRU_RCVD).  If a FIN has already been received on this
  1430.  * connection then we just ignore the text.
  1431.  */
  1432. if ((ti->ti_len || (tiflags&TH_FIN)) &&
  1433.     TCPS_HAVERCVDFIN(tp->t_state) == 0) {
  1434. TCP_REASS(tp, ti, m, so, tiflags);
  1435. } else {
  1436. m_freem(m);
  1437. tiflags &= ~TH_FIN;
  1438. }
  1439. /*
  1440.  * If FIN is received ACK the FIN and let the user know
  1441.  * that the connection is closing.
  1442.  */
  1443. if (tiflags & TH_FIN) {
  1444. if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
  1445. socantrcvmore(so);
  1446. tp->t_flags |= TF_ACKNOW;
  1447. tp->rcv_nxt++;
  1448. }
  1449. switch (tp->t_state) {
  1450.   /*
  1451.  * In ESTABLISHED state
  1452.  * enter the CLOSE_WAIT state.
  1453.  */
  1454. case TCPS_SYN_RECEIVED:
  1455.                     break;          /* avoid SYN+FIN death */
  1456. case TCPS_ESTABLISHED:
  1457. #ifdef WV_INSTRUMENTATION
  1458. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1459.         WV_NET_PORTIN_EVENT_1 (NET_AUX_EVENT, WV_NET_INFO, 35, 17,
  1460.                                ti->ti_sport, ti->ti_dport,
  1461.                                WV_NETEVENT_TCPIN_RECVCLOSED, WV_NET_RECV,
  1462.                                so->so_fd)
  1463. #endif  /* INCLUDE_WVNET */
  1464. #endif
  1465. tp->t_state = TCPS_CLOSE_WAIT;
  1466. break;
  1467.   /*
  1468.  * If still in FIN_WAIT_1 STATE FIN has not been acked so
  1469.  * enter the CLOSING state.
  1470.  */
  1471. case TCPS_FIN_WAIT_1:
  1472. #ifdef WV_INSTRUMENTATION
  1473. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1474.             WV_NET_PORTIN_EVENT_1 (NET_AUX_EVENT, WV_NET_INFO, 36, 18,
  1475.                                    ti->ti_sport, ti->ti_dport,
  1476.                                    WV_NETEVENT_TCPIN_CLOSING, WV_NET_RECV,
  1477.                                    so->so_fd)
  1478. #endif  /* INCLUDE_WVNET */
  1479. #endif
  1480. tp->t_state = TCPS_CLOSING;
  1481. break;
  1482.   /*
  1483.  * In FIN_WAIT_2 state enter the TIME_WAIT state,
  1484.  * starting the time-wait timer, turning off the other 
  1485.  * standard timers.
  1486.  */
  1487. case TCPS_FIN_WAIT_2:
  1488. #ifdef WV_INSTRUMENTATION
  1489. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1490.             WV_NET_PORTIN_EVENT_1 (NET_AUX_EVENT, WV_NET_INFO, 34, 16,
  1491.                                    ti->ti_sport, ti->ti_dport,
  1492.                                    WV_NETEVENT_TCPIN_CLOSEWAIT, WV_NET_RECV,
  1493.                                    so->so_fd)
  1494. #endif  /* INCLUDE_WVNET */
  1495. #endif
  1496. tp->t_state = TCPS_TIME_WAIT;
  1497. tcp_canceltimers(tp);
  1498. tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  1499. soisdisconnected(so);
  1500. break;
  1501. /*
  1502.  * In TIME_WAIT state restart the 2 MSL time_wait timer.
  1503.  */
  1504. case TCPS_TIME_WAIT:
  1505. #ifdef WV_INSTRUMENTATION
  1506. #ifdef INCLUDE_WVNET    /* WV_NET_INFO event */
  1507.         WV_NET_PORTIN_EVENT_2 (NET_AUX_EVENT, WV_NET_INFO, 37, 19,
  1508.                                ti->ti_sport, ti->ti_dport,
  1509.                                WV_NETEVENT_TCPIN_CLOSE_RESTART, WV_NET_RECV,
  1510.                                so->so_fd, FALSE)
  1511. #endif  /* INCLUDE_WVNET */
  1512. #endif
  1513. tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  1514. break;
  1515. }
  1516. }
  1517. if (so->so_options & SO_DEBUG)
  1518. (*tcpTraceRtn)(TA_INPUT, ostate, tp, &tcp_saveti, 0);
  1519. /*
  1520.  * Return any desired output.
  1521.  */
  1522. if (needoutput || (tp->t_flags & TF_ACKNOW))
  1523. (void) tcp_output(tp);
  1524. return;
  1525. dropafterack:
  1526. /*
  1527.  * Generate an ACK dropping incoming segment if it occupies
  1528.  * sequence space, where the ACK reflects our state.
  1529.  */
  1530. if (tiflags & TH_RST)
  1531. goto drop;
  1532. m_freem(m);
  1533. tp->t_flags |= TF_ACKNOW;
  1534. (void) tcp_output(tp);
  1535. return;
  1536. dropwithreset:
  1537. /*
  1538.  * Generate a RST, dropping incoming segment.
  1539.  * Make ACK acceptable to originator of segment.
  1540.  * Don't bother to respond if destination was broadcast/multicast.
  1541.  */
  1542. if ((tiflags & TH_RST) || m->m_flags & (M_BCAST|M_MCAST) ||
  1543.     IN_MULTICAST(ntohl(ti->ti_dst.s_addr)))
  1544. goto drop;
  1545. if (tiflags & TH_ACK)
  1546. tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST);
  1547. else {
  1548. if (tiflags & TH_SYN)
  1549. ti->ti_len++;
  1550. tcp_respond(tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0,
  1551.     TH_RST|TH_ACK);
  1552. }
  1553.         /* MIB-II Count # of Resets Sent */
  1554. #ifdef VIRTUAL_STACK
  1555.          /* 
  1556.           * (Former) tcpOutRsts global renamed for virtual stacks to prevent
  1557.           * name conflict with existing structure element in m2TcpLib.c file.
  1558.           */
  1559.          tcpOutResets++;
  1560. #else
  1561.          tcpOutRsts++;
  1562. #endif
  1563. /* destroy temporarily created socket */
  1564. if (dropsocket)
  1565. (void) soabort(so);
  1566. return;
  1567. drop:
  1568. /*
  1569.  * Drop space held by incoming segment and return.
  1570.  */
  1571. if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
  1572. (*tcpTraceRtn)(TA_DROP, ostate, tp, &tcp_saveti, 0);
  1573. m_freem(m);
  1574. /* destroy temporarily created socket */
  1575. if (dropsocket)
  1576. (void) soabort(so);
  1577. return;
  1578. }
  1579. void
  1580. tcp_dooptions(tp, cp, cnt, ti, ts_present, ts_val, ts_ecr)
  1581. struct tcpcb *tp;
  1582. u_char *cp;
  1583. int cnt;
  1584. struct tcpiphdr *ti;
  1585. int *ts_present;
  1586. u_long *ts_val, *ts_ecr;
  1587. {
  1588. u_short mss = 0;
  1589. int opt, optlen;
  1590. for (; cnt > 0; cnt -= optlen, cp += optlen) {
  1591. opt = cp[0];
  1592. if (opt == TCPOPT_EOL)
  1593. break;
  1594. if (opt == TCPOPT_NOP)
  1595. optlen = 1;
  1596. else {
  1597. optlen = cp[1];
  1598. if (optlen <= 0)
  1599. break;
  1600. }
  1601. switch (opt) {
  1602. default:
  1603. continue;
  1604. case TCPOPT_MAXSEG:
  1605. if (optlen != TCPOLEN_MAXSEG)
  1606. continue;
  1607. if (!(ti->ti_flags & TH_SYN))
  1608. continue;
  1609. bcopy((char *) cp + 2, (char *) &mss, sizeof(mss));
  1610. NTOHS(mss);
  1611. (void) tcp_mss(tp, mss); /* sets t_maxseg */
  1612. break;
  1613. case TCPOPT_WINDOW:
  1614. if (optlen != TCPOLEN_WINDOW)
  1615. continue;
  1616. if (!(ti->ti_flags & TH_SYN))
  1617. continue;
  1618. tp->t_flags |= TF_RCVD_SCALE;
  1619. tp->requested_s_scale = min(cp[2], TCP_MAX_WINSHIFT);
  1620. break;
  1621. case TCPOPT_TIMESTAMP:
  1622. if (optlen != TCPOLEN_TIMESTAMP)
  1623. continue;
  1624. *ts_present = 1;
  1625. bcopy((char *)cp + 2, (char *) ts_val, sizeof(*ts_val));
  1626. NTOHL(*ts_val);
  1627. bcopy((char *)cp + 6, (char *) ts_ecr, sizeof(*ts_ecr));
  1628. NTOHL(*ts_ecr);
  1629. /* 
  1630.  * A timestamp received in a SYN makes
  1631.  * it ok to send timestamp requests and replies.
  1632.  */
  1633. if (ti->ti_flags & TH_SYN) {
  1634. tp->t_flags |= TF_RCVD_TSTMP;
  1635. tp->ts_recent = *ts_val;
  1636. tp->ts_recent_age = tcp_now;
  1637. }
  1638. break;
  1639. }
  1640. }
  1641.         /*
  1642.          * Set peer's MSS to default if option not included. The path MTU
  1643.          * discovery processing for TCP uses this value as a ceiling to
  1644.          * avoid sending larger segments than a peer can handle.
  1645.          */
  1646.         if ( (ti->ti_flags & TH_SYN) && !mss)
  1647.             {
  1648.             if (tp->t_inpcb->inp_route.ro_rt)
  1649.                 (tp->t_inpcb->inp_route.ro_rt)->rt_rmx.rmx_mss = tcp_mssdflt;
  1650.             }
  1651. }
  1652. /*
  1653.  * Pull out of band byte out of a segment so
  1654.  * it doesn't appear in the user's data queue.
  1655.  * It is still reflected in the segment length for
  1656.  * sequencing purposes.
  1657.  */
  1658. void
  1659. tcp_pulloutofband(so, ti, m)
  1660. struct socket *so;
  1661. struct tcpiphdr *ti;
  1662. register struct mbuf *m;
  1663. {
  1664. int cnt = ti->ti_urp - 1;
  1665. while (cnt >= 0) {
  1666. if (m->m_len > cnt) {
  1667. char *cp = mtod(m, caddr_t) + cnt;
  1668. struct tcpcb *tp = sototcpcb(so);
  1669. tp->t_iobc = *cp;
  1670. tp->t_oobflags |= TCPOOB_HAVEDATA;
  1671. bcopy(cp+1, cp, (unsigned)(m->m_len - cnt - 1));
  1672. m->m_len--;
  1673. return;
  1674. }
  1675. cnt -= m->m_len;
  1676. m = m->m_next;
  1677. if (m == 0)
  1678. break;
  1679. }
  1680. #ifdef WV_INSTRUMENTATION
  1681. #ifdef INCLUDE_WVNET    /* WV_NET_EMERGENCY event */
  1682.         WV_NET_PORTIN_EVENT_1 (NET_CORE_EVENT, WV_NET_EMERGENCY, 27, 1,
  1683.                                ti->ti_sport, ti->ti_dport,
  1684.                                WV_NETEVENT_TCPOOB_PANIC, WV_NET_RECV,
  1685.                                so->so_fd)
  1686. #endif  /* INCLUDE_WVNET */
  1687. #endif
  1688. panic("tcp_pulloutofband");
  1689. }
  1690. /*
  1691.  * Collect new round-trip time estimate
  1692.  * and update averages and current timeout.
  1693.  */
  1694. void
  1695. tcp_xmit_timer(tp, rtt)
  1696. register struct tcpcb *tp;
  1697. short rtt;
  1698. {
  1699. register short delta;
  1700. tcpstat.tcps_rttupdated++;
  1701. if (tp->t_srtt != 0) {
  1702. /*
  1703.  * srtt is stored as fixed point with 3 bits after the
  1704.  * binary point (i.e., scaled by 8).  The following magic
  1705.  * is equivalent to the smoothing algorithm in rfc793 with
  1706.  * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed
  1707.  * point).  Adjust rtt to origin 0.
  1708.  */
  1709. delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT);
  1710. if ((tp->t_srtt += delta) <= 0)
  1711. tp->t_srtt = 1;
  1712. /*
  1713.  * We accumulate a smoothed rtt variance (actually, a
  1714.  * smoothed mean difference), then set the retransmit
  1715.  * timer to smoothed rtt + 4 times the smoothed variance.
  1716.  * rttvar is stored as fixed point with 2 bits after the
  1717.  * binary point (scaled by 4).  The following is
  1718.  * equivalent to rfc793 smoothing with an alpha of .75
  1719.  * (rttvar = rttvar*3/4 + |delta| / 4).  This replaces
  1720.  * rfc793's wired-in beta.
  1721.  */
  1722. if (delta < 0)
  1723. delta = -delta;
  1724. delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT);
  1725. if ((tp->t_rttvar += delta) <= 0)
  1726. tp->t_rttvar = 1;
  1727. } else {
  1728. /* 
  1729.  * No rtt measurement yet - use the unsmoothed rtt.
  1730.  * Set the variance to half the rtt (so our first
  1731.  * retransmit happens at 3*rtt).
  1732.  */
  1733. tp->t_srtt = rtt << TCP_RTT_SHIFT;
  1734. tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1);
  1735. }
  1736. tp->t_rtt = 0;
  1737. tp->t_rxtshift = 0;
  1738. /*
  1739.  * the retransmit should happen at rtt + 4 * rttvar.
  1740.  * Because of the way we do the smoothing, srtt and rttvar
  1741.  * will each average +1/2 tick of bias.  When we compute
  1742.  * the retransmit timer, we want 1/2 tick of rounding and
  1743.  * 1 extra tick because of +-1/2 tick uncertainty in the
  1744.  * firing of the timer.  The bias will give us exactly the
  1745.  * 1.5 tick we need.  But, because the bias is
  1746.  * statistical, we have to test that we don't drop below
  1747.  * the minimum feasible timer (which is 2 ticks).
  1748.  */
  1749. TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp),
  1750.     tp->t_rttmin, TCPTV_REXMTMAX);
  1751. /*
  1752.  * We received an ack for a packet that wasn't retransmitted;
  1753.  * it is probably safe to discard any error indications we've
  1754.  * received recently.  This isn't quite right, but close enough
  1755.  * for now (a route might have failed after we sent a segment,
  1756.  * and the return path might not be symmetrical).
  1757.  */
  1758. tp->t_softerror = 0;
  1759. }
  1760. /*
  1761.  * Determine a reasonable value for maxseg size.
  1762.  * If the route is known, check route for mtu.
  1763.  * If none, use an mss that can be handled on the outgoing
  1764.  * interface without forcing IP to fragment;
  1765.  * If no route is found, route has no mtu,
  1766.  * or the destination isn't local, use a default, hopefully conservative
  1767.  * size (usually 512 or the default IP max size, but no more than the mtu
  1768.  * of the interface), as we can't discover anything about intervening
  1769.  * gateways or networks.  We also initialize the congestion/slow start
  1770.  * window to be a single segment if the destination isn't local.
  1771.  * While looking at the routing entry, we also initialize other path-dependent
  1772.  * parameters from pre-set or cached values in the routing entry.
  1773.  */
  1774. int
  1775. tcp_mss(tp, offer)
  1776. register struct tcpcb *tp;
  1777. u_int offer;
  1778. {
  1779. struct route *ro;
  1780. register struct rtentry *rt;
  1781. struct ifnet *ifp;
  1782. register int rtt, mss;
  1783. u_long bufsize;
  1784. struct inpcb *inp;
  1785. struct socket *so;
  1786. inp = tp->t_inpcb;
  1787. ro = &inp->inp_route;
  1788. if ((rt = ro->ro_rt) == (struct rtentry *)0) {
  1789. /* No route yet, so try to acquire one */
  1790. if (inp->inp_faddr.s_addr != INADDR_ANY) {
  1791. ro->ro_dst.sa_family = AF_INET;
  1792. ro->ro_dst.sa_len = sizeof(ro->ro_dst);
  1793. ((struct sockaddr_in *) &ro->ro_dst)->sin_addr =
  1794. inp->inp_faddr;
  1795. TOS_SET (&ro->ro_dst, inp->inp_ip.ip_tos);
  1796. rtalloc(ro);
  1797. }
  1798. if ((rt = ro->ro_rt) == (struct rtentry *)0)
  1799. return (tcp_mssdflt);
  1800. }
  1801. ifp = rt->rt_ifp;
  1802. so = inp->inp_socket;
  1803. /*
  1804.  * While we're here, check if there's an initial rtt
  1805.  * or rttvar.  Convert from the route-table units
  1806.  * to scaled multiples of the slow timeout timer.
  1807.  */
  1808. if (tp->t_srtt == 0 && (rtt = rt->rt_rmx.rmx_rtt)) {
  1809. /*
  1810.  * XXX the lock bit for MTU indicates that the value
  1811.  * is also a minimum value; this is subject to time.
  1812.  */
  1813. if (rt->rt_rmx.rmx_locks & RTV_RTT)
  1814. tp->t_rttmin = rtt / (RTM_RTTUNIT / PR_SLOWHZ);
  1815. tp->t_srtt = rtt / (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTT_SCALE));
  1816. if (rt->rt_rmx.rmx_rttvar)
  1817. tp->t_rttvar = rt->rt_rmx.rmx_rttvar /
  1818.     (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTTVAR_SCALE));
  1819. else
  1820. /* default variation is +- 1 rtt */
  1821. tp->t_rttvar =
  1822.     tp->t_srtt * TCP_RTTVAR_SCALE / TCP_RTT_SCALE;
  1823. TCPT_RANGESET(tp->t_rxtcur,
  1824.     ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1,
  1825.     tp->t_rttmin, TCPTV_REXMTMAX);
  1826. }
  1827. /*
  1828.  * if there's an mtu associated with the route, use it
  1829.  */
  1830. if (rt->rt_rmx.rmx_mtu)
  1831. mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr);
  1832. else
  1833. {
  1834. mss = ifp->if_mtu - sizeof(struct tcpiphdr);
  1835. if (!in_localaddr(inp->inp_faddr))
  1836. mss = min(mss, tcp_mssdflt);
  1837. }
  1838. /*
  1839.  * The current mss, t_maxseg, is initialized to the default value.
  1840.  * If we compute a smaller value, reduce the current mss.
  1841.  * If we compute a larger value, return it for use in sending
  1842.  * a max seg size option, but don't store it for use
  1843.  * unless we received an offer at least that large from peer.
  1844.  * However, do not accept offers under 32 bytes.
  1845.  */
  1846. if (offer)
  1847.             {
  1848.             rt->rt_rmx.rmx_mss = offer;    /* Save peer's MSS for path MTU. */
  1849. mss = min(mss, offer);
  1850.             }
  1851. mss = max(mss, 32); /* sanity */
  1852.         /*
  1853.          * Save the maximum allowable segment size (based on mss and mtu
  1854.          * values only) when processing MSS option from peer.
  1855.          */
  1856.         if (offer)
  1857.             tp->t_maxsize = mss;
  1858. if (mss < tp->t_maxseg || offer != 0) {
  1859. /*
  1860.  * If there's a pipesize, change the socket buffer
  1861.  * to that size.  Make the socket buffers an integral
  1862.  * number of mss units; if the mss is larger than
  1863.  * the socket buffer, decrease the mss.
  1864.  */
  1865. if ((bufsize = rt->rt_rmx.rmx_sendpipe) == 0)
  1866. bufsize = so->so_snd.sb_hiwat;
  1867. if (bufsize < mss)
  1868. mss = bufsize;
  1869.                 /*
  1870.                  * Record maximum segment size after adjusting
  1871.                  * for the send buffer size.
  1872.                  */
  1873. tp->t_maxseg = mss;
  1874. if ((bufsize = rt->rt_rmx.rmx_recvpipe) == 0)
  1875. bufsize = so->so_rcv.sb_hiwat;
  1876. }
  1877. tp->snd_cwnd = mss;
  1878. if (rt->rt_rmx.rmx_ssthresh) {
  1879. /*
  1880.  * There's some sort of gateway or interface
  1881.  * buffer limit on the path.  Use this to set
  1882.  * the slow start threshhold, but set the
  1883.  * threshold to no less than 2*mss.
  1884.  */
  1885. tp->snd_ssthresh = max(2 * mss, rt->rt_rmx.rmx_ssthresh);
  1886. }
  1887. return (mss);
  1888. }
  1889. #ifdef TCP_DEBUG /* XXX just for debugging */
  1890. void tcbShow
  1891.     (
  1892.     FAST struct inpcb *pinPcb /* pointer to the pcb control block */
  1893.     )
  1894.     {
  1895.     struct tcpcb * pTcpCb; /* pointer to tcp Control block */
  1896.     pTcpCb = (struct tcpcb *) pinPcb->inp_ppcb;
  1897.     printf ("send unacknowledged: %8un", pTcpCb->snd_una); 
  1898.     printf ("send next: %8un", pTcpCb->snd_nxt); 
  1899.     printf ("send window update seg seqnumber: %8un", pTcpCb->snd_wl1);
  1900.     printf ("send window updata seg ack number: %8un", pTcpCb->snd_wl2); 
  1901.     printf ("send window: %8un", pTcpCb->snd_wnd); 
  1902.     printf ("recv window: %8un", pTcpCb->rcv_wnd);
  1903.     printf ("recv next: %8un", pTcpCb->rcv_nxt);
  1904.     printf ("recv advertised window by other end: %8un", pTcpCb->rcv_adv);
  1905.     printf ("send highest sequence number sent: %8un", pTcpCb->snd_max);
  1906.     printf ("congestion controlled window: %8un", pTcpCb->snd_cwnd);
  1907.     printf ("congestion threshold: %8un", pTcpCb->snd_ssthresh);
  1908.     printf ("largest window peer has offered: %8un", pTcpCb->max_sndwnd);
  1909.     printf ("send scale %8un", pTcpCb->snd_scale) ;
  1910.     printf ("recv scale %8un", pTcpCb->rcv_scale) ;
  1911.     printf ("send pending window scale %8un", pTcpCb->request_r_scale) ;
  1912.     printf ("recv pending window scale %8un", pTcpCb->requested_s_scale) ;
  1913.     
  1914.     }
  1915. #endif /* XXX just for debugging */