|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986 Regents of the University of California. ! 3: * 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_var.h 7.10 (Berkeley) 6/28/90 ! 34: */ ! 35: ! 36: /* ! 37: * Kernel variables for tcp. ! 38: */ ! 39: ! 40: /* ! 41: * Tcp control block, one per tcp; fields: ! 42: */ ! 43: struct tcpcb { ! 44: struct tcpiphdr *seg_next; /* sequencing queue */ ! 45: struct tcpiphdr *seg_prev; ! 46: short t_state; /* state of this connection */ ! 47: short t_timer[TCPT_NTIMERS]; /* tcp timers */ ! 48: short t_rxtshift; /* log(2) of rexmt exp. backoff */ ! 49: short t_rxtcur; /* current retransmit value */ ! 50: short t_dupacks; /* consecutive dup acks recd */ ! 51: u_short t_maxseg; /* maximum segment size */ ! 52: char t_force; /* 1 if forcing out a byte */ ! 53: u_char t_flags; ! 54: #define TF_ACKNOW 0x01 /* ack peer immediately */ ! 55: #define TF_DELACK 0x02 /* ack, but try to delay it */ ! 56: #define TF_NODELAY 0x04 /* don't delay packets to coalesce */ ! 57: #define TF_NOOPT 0x08 /* don't use tcp options */ ! 58: #define TF_SENTFIN 0x10 /* have sent FIN */ ! 59: struct tcpiphdr *t_template; /* skeletal packet for transmit */ ! 60: struct inpcb *t_inpcb; /* back pointer to internet pcb */ ! 61: /* ! 62: * The following fields are used as in the protocol specification. ! 63: * See RFC783, Dec. 1981, page 21. ! 64: */ ! 65: /* send sequence variables */ ! 66: tcp_seq snd_una; /* send unacknowledged */ ! 67: tcp_seq snd_nxt; /* send next */ ! 68: tcp_seq snd_up; /* send urgent pointer */ ! 69: tcp_seq snd_wl1; /* window update seg seq number */ ! 70: tcp_seq snd_wl2; /* window update seg ack number */ ! 71: tcp_seq iss; /* initial send sequence number */ ! 72: u_short snd_wnd; /* send window */ ! 73: /* receive sequence variables */ ! 74: u_short rcv_wnd; /* receive window */ ! 75: tcp_seq rcv_nxt; /* receive next */ ! 76: tcp_seq rcv_up; /* receive urgent pointer */ ! 77: tcp_seq irs; /* initial receive sequence number */ ! 78: /* ! 79: * Additional variables for this implementation. ! 80: */ ! 81: /* receive variables */ ! 82: tcp_seq rcv_adv; /* advertised window */ ! 83: /* retransmit variables */ ! 84: tcp_seq snd_max; /* highest sequence number sent; ! 85: * used to recognize retransmits ! 86: */ ! 87: /* congestion control (for slow start, source quench, retransmit after loss) */ ! 88: u_short snd_cwnd; /* congestion-controlled window */ ! 89: u_short snd_ssthresh; /* snd_cwnd size threshhold for ! 90: * for slow start exponential to ! 91: * linear switch ! 92: */ ! 93: /* ! 94: * transmit timing stuff. See below for scale of srtt and rttvar. ! 95: * "Variance" is actually smoothed difference. ! 96: */ ! 97: short t_idle; /* inactivity time */ ! 98: short t_rtt; /* round trip time */ ! 99: tcp_seq t_rtseq; /* sequence number being timed */ ! 100: short t_srtt; /* smoothed round-trip time */ ! 101: short t_rttvar; /* variance in round-trip time */ ! 102: u_short t_rttmin; /* minimum rtt allowed */ ! 103: u_short max_sndwnd; /* largest window peer has offered */ ! 104: ! 105: /* out-of-band data */ ! 106: char t_oobflags; /* have some */ ! 107: char t_iobc; /* input character */ ! 108: #define TCPOOB_HAVEDATA 0x01 ! 109: #define TCPOOB_HADDATA 0x02 ! 110: short t_softerror; /* possible error not yet reported */ ! 111: }; ! 112: ! 113: #define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb) ! 114: #define sototcpcb(so) (intotcpcb(sotoinpcb(so))) ! 115: ! 116: /* ! 117: * The smoothed round-trip time and estimated variance ! 118: * are stored as fixed point numbers scaled by the values below. ! 119: * For convenience, these scales are also used in smoothing the average ! 120: * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed). ! 121: * With these scales, srtt has 3 bits to the right of the binary point, ! 122: * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the ! 123: * binary point, and is smoothed with an ALPHA of 0.75. ! 124: */ ! 125: #define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */ ! 126: #define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */ ! 127: #define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */ ! 128: #define TCP_RTTVAR_SHIFT 2 /* multiplier for rttvar; 2 bits */ ! 129: ! 130: /* ! 131: * The initial retransmission should happen at rtt + 4 * rttvar. ! 132: * Because of the way we do the smoothing, srtt and rttvar ! 133: * will each average +1/2 tick of bias. When we compute ! 134: * the retransmit timer, we want 1/2 tick of rounding and ! 135: * 1 extra tick because of +-1/2 tick uncertainty in the ! 136: * firing of the timer. The bias will give us exactly the ! 137: * 1.5 tick we need. But, because the bias is ! 138: * statistical, we have to test that we don't drop below ! 139: * the minimum feasible timer (which is 2 ticks). ! 140: * This macro assumes that the value of TCP_RTTVAR_SCALE ! 141: * is the same as the multiplier for rttvar. ! 142: */ ! 143: #define TCP_REXMTVAL(tp) \ ! 144: (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) ! 145: ! 146: /* XXX ! 147: * We want to avoid doing m_pullup on incoming packets but that ! 148: * means avoiding dtom on the tcp reassembly code. That in turn means ! 149: * keeping an mbuf pointer in the reassembly queue (since we might ! 150: * have a cluster). As a quick hack, the source & destination ! 151: * port numbers (which are no longer needed once we've located the ! 152: * tcpcb) are overlayed with an mbuf pointer. ! 153: */ ! 154: #define REASS_MBUF(ti) (*(struct mbuf **)&((ti)->ti_t)) ! 155: ! 156: /* ! 157: * TCP statistics. ! 158: * Many of these should be kept per connection, ! 159: * but that's inconvenient at the moment. ! 160: */ ! 161: struct tcpstat { ! 162: u_long tcps_connattempt; /* connections initiated */ ! 163: u_long tcps_accepts; /* connections accepted */ ! 164: u_long tcps_connects; /* connections established */ ! 165: u_long tcps_drops; /* connections dropped */ ! 166: u_long tcps_conndrops; /* embryonic connections dropped */ ! 167: u_long tcps_closed; /* conn. closed (includes drops) */ ! 168: u_long tcps_segstimed; /* segs where we tried to get rtt */ ! 169: u_long tcps_rttupdated; /* times we succeeded */ ! 170: u_long tcps_delack; /* delayed acks sent */ ! 171: u_long tcps_timeoutdrop; /* conn. dropped in rxmt timeout */ ! 172: u_long tcps_rexmttimeo; /* retransmit timeouts */ ! 173: u_long tcps_persisttimeo; /* persist timeouts */ ! 174: u_long tcps_keeptimeo; /* keepalive timeouts */ ! 175: u_long tcps_keepprobe; /* keepalive probes sent */ ! 176: u_long tcps_keepdrops; /* connections dropped in keepalive */ ! 177: ! 178: u_long tcps_sndtotal; /* total packets sent */ ! 179: u_long tcps_sndpack; /* data packets sent */ ! 180: u_long tcps_sndbyte; /* data bytes sent */ ! 181: u_long tcps_sndrexmitpack; /* data packets retransmitted */ ! 182: u_long tcps_sndrexmitbyte; /* data bytes retransmitted */ ! 183: u_long tcps_sndacks; /* ack-only packets sent */ ! 184: u_long tcps_sndprobe; /* window probes sent */ ! 185: u_long tcps_sndurg; /* packets sent with URG only */ ! 186: u_long tcps_sndwinup; /* window update-only packets sent */ ! 187: u_long tcps_sndctrl; /* control (SYN|FIN|RST) packets sent */ ! 188: ! 189: u_long tcps_rcvtotal; /* total packets received */ ! 190: u_long tcps_rcvpack; /* packets received in sequence */ ! 191: u_long tcps_rcvbyte; /* bytes received in sequence */ ! 192: u_long tcps_rcvbadsum; /* packets received with ccksum errs */ ! 193: u_long tcps_rcvbadoff; /* packets received with bad offset */ ! 194: u_long tcps_rcvshort; /* packets received too short */ ! 195: u_long tcps_rcvduppack; /* duplicate-only packets received */ ! 196: u_long tcps_rcvdupbyte; /* duplicate-only bytes received */ ! 197: u_long tcps_rcvpartduppack; /* packets with some duplicate data */ ! 198: u_long tcps_rcvpartdupbyte; /* dup. bytes in part-dup. packets */ ! 199: u_long tcps_rcvoopack; /* out-of-order packets received */ ! 200: u_long tcps_rcvoobyte; /* out-of-order bytes received */ ! 201: u_long tcps_rcvpackafterwin; /* packets with data after window */ ! 202: u_long tcps_rcvbyteafterwin; /* bytes rcvd after window */ ! 203: u_long tcps_rcvafterclose; /* packets rcvd after "close" */ ! 204: u_long tcps_rcvwinprobe; /* rcvd window probe packets */ ! 205: u_long tcps_rcvdupack; /* rcvd duplicate acks */ ! 206: u_long tcps_rcvacktoomuch; /* rcvd acks for unsent data */ ! 207: u_long tcps_rcvackpack; /* rcvd ack packets */ ! 208: u_long tcps_rcvackbyte; /* bytes acked by rcvd acks */ ! 209: u_long tcps_rcvwinupd; /* rcvd window update packets */ ! 210: }; ! 211: ! 212: #ifdef KERNEL ! 213: struct inpcb tcb; /* head of queue of active tcpcb's */ ! 214: struct tcpstat tcpstat; /* tcp statistics */ ! 215: struct tcpiphdr *tcp_template(); ! 216: struct tcpcb *tcp_close(), *tcp_drop(); ! 217: struct tcpcb *tcp_timers(), *tcp_disconnect(), *tcp_usrclosed(); ! 218: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.