X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0b4e3aa066abc0728aacb4bbeb86f53f9737156e..55e303ae13a4cf49d70f2294092726f2fffb9ef2:/bsd/netinet/tcp_var.h diff --git a/bsd/netinet/tcp_var.h b/bsd/netinet/tcp_var.h index 85e975b06..afd802f61 100644 --- a/bsd/netinet/tcp_var.h +++ b/bsd/netinet/tcp_var.h @@ -3,19 +3,22 @@ * * @APPLE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -52,61 +55,57 @@ * SUCH DAMAGE. * * @(#)tcp_var.h 8.4 (Berkeley) 5/24/95 + * $FreeBSD: src/sys/netinet/tcp_var.h,v 1.56.2.8 2001/08/22 00:59:13 silby Exp $ */ #ifndef _NETINET_TCP_VAR_H_ #define _NETINET_TCP_VAR_H_ +#include +#include +#ifdef __APPLE_API_PRIVATE + #define N_TIME_WAIT_SLOTS 128 /* must be power of 2 */ /* - * Ip (reassembly or sequence) queue structures. - * - * XXX -- The following explains why the ipqe_m field is here, for TCP's use: - * We want to avoid doing m_pullup on incoming packets but that - * means avoiding dtom on the tcp reassembly code. That in turn means - * keeping an mbuf pointer in the reassembly queue (since we might - * have a cluster). As a quick hack, the source & destination - * port numbers (which are no longer needed once we've located the - * tcpcb) are overlayed with an mbuf pointer. + * Kernel variables for tcp. */ -LIST_HEAD(ipqehead, ipqent); -struct ipqent { - LIST_ENTRY(ipqent) ipqe_q; - union { - struct ip *_ip; -#if INET6 - struct ipv6 *_ip6; -#endif - struct tcpiphdr *_tcp; - } _ipqe_u1; - struct mbuf *ipqe_m; /* mbuf contains packet */ - u_int8_t ipqe_mff; /* for IP fragmentation */ + +/* TCP segment queue entry */ +struct tseg_qent { + LIST_ENTRY(tseg_qent) tqe_q; + int tqe_len; /* TCP segment data length */ + struct tcphdr *tqe_th; /* a pointer to tcp header */ + struct mbuf *tqe_m; /* mbuf contains packet */ }; -#define ipqe_ip _ipqe_u1._ip -#if INET6 -#define ipqe_ip6 _ipqe_u1._ip6 +LIST_HEAD(tsegqe_head, tseg_qent); +#ifdef MALLOC_DECLARE +MALLOC_DECLARE(M_TSEGQ); #endif -#define ipqe_tcp _ipqe_u1._tcp + +struct tcptemp { + u_char tt_ipgen[40]; /* the size must be of max ip header, now IPv6 */ + struct tcphdr tt_t; +}; + #define tcp6cb tcpcb /* for KAME src sync over BSD*'s */ +#ifdef __APPLE__ #define TCP_DELACK_BITSET(hash_elem)\ delack_bitmask[((hash_elem) >> 5)] |= 1 << ((hash_elem) & 0x1F) #define DELACK_BITMASK_ON 1 #define DELACK_BITMASK_THRESH 300 - -/* - * Kernel variables for tcp. - */ +#endif /* * Tcp control block, one per tcp; fields: * Organized for 16 byte cacheline efficiency. */ +#if KERNEL struct tcpcb { - struct ipqehead segq; /* sequencing queue */ + struct tsegqe_head t_segq; int t_dupacks; /* consecutive dup acks recd */ - struct tcptemp *t_template; /* skeletal packet for transmit */ + struct tcptemp *unused; /* unused now: was t_template */ int t_timer[TCPT_NTIMERS]; /* tcp timers */ @@ -130,6 +129,10 @@ struct tcpcb { #define TF_RCVD_CC 0x04000 /* a CC was received in SYN */ #define TF_SENDCCNEW 0x08000 /* send CCnew instead of CC in SYN */ #define TF_MORETOCOME 0x10000 /* More data to be appended to sock */ +#define TF_LQ_OVERFLOW 0x20000 /* listen queue overflow */ +#define TF_RXWIN0SENT 0x40000 /* sent a receiver win 0 in response */ +#define TF_SLOWLINK 0x80000 /* route is a on a modem speed link */ + int t_force; /* 1 if forcing out a byte */ tcp_seq snd_una; /* send unacknowledged */ @@ -157,12 +160,12 @@ struct tcpcb { */ u_int t_maxopd; /* mss plus options */ - u_int t_idle; /* inactivity time */ - u_long t_duration; /* connection duration */ - int t_rtt; /* round trip time */ + u_long t_rcvtime; /* inactivity time */ + u_long t_starttime; /* time connection was established */ + int t_rtttime; /* round trip time */ tcp_seq t_rtseq; /* sequence number being timed */ - int t_rxtcur; /* current retransmit value */ + int t_rxtcur; /* current retransmit value (ticks) */ u_int t_maxseg; /* maximum segment size */ int t_srtt; /* smoothed round-trip time */ int t_rttvar; /* variance in round-trip time */ @@ -190,8 +193,123 @@ struct tcpcb { /* RFC 1644 variables */ tcp_cc cc_send; /* send connection count */ tcp_cc cc_recv; /* receive connection count */ - u_long reserved[4]; + tcp_seq snd_recover; /* for use in fast recovery */ +/* experimental */ + u_long snd_cwnd_prev; /* cwnd prior to retransmit */ + u_long snd_ssthresh_prev; /* ssthresh prior to retransmit */ + u_long t_badrxtwin; /* window for retransmit recovery */ + + int t_keepidle; /* keepalive idle timer (override global if > 0) */ }; +#else + +#define tcpcb otcpcb + +#endif + + +/* + * Jaguar compatible TCP control block, for xtcpcb + * Does not have the old fields + */ +struct otcpcb { + struct tsegqe_head t_segq; + int t_dupacks; /* consecutive dup acks recd */ + struct tcptemp *unused; /* unused now: was t_template */ + + int t_timer[TCPT_NTIMERS]; /* tcp timers */ + + struct inpcb *t_inpcb; /* back pointer to internet pcb */ + int t_state; /* state of this connection */ + u_int t_flags; +#define TF_ACKNOW 0x00001 /* ack peer immediately */ +#define TF_DELACK 0x00002 /* ack, but try to delay it */ +#define TF_NODELAY 0x00004 /* don't delay packets to coalesce */ +#define TF_NOOPT 0x00008 /* don't use tcp options */ +#define TF_SENTFIN 0x00010 /* have sent FIN */ +#define TF_REQ_SCALE 0x00020 /* have/will request window scaling */ +#define TF_RCVD_SCALE 0x00040 /* other side has requested scaling */ +#define TF_REQ_TSTMP 0x00080 /* have/will request timestamps */ +#define TF_RCVD_TSTMP 0x00100 /* a timestamp was received in SYN */ +#define TF_SACK_PERMIT 0x00200 /* other side said I could SACK */ +#define TF_NEEDSYN 0x00400 /* send SYN (implicit state) */ +#define TF_NEEDFIN 0x00800 /* send FIN (implicit state) */ +#define TF_NOPUSH 0x01000 /* don't push */ +#define TF_REQ_CC 0x02000 /* have/will request CC */ +#define TF_RCVD_CC 0x04000 /* a CC was received in SYN */ +#define TF_SENDCCNEW 0x08000 /* send CCnew instead of CC in SYN */ +#define TF_MORETOCOME 0x10000 /* More data to be appended to sock */ +#define TF_LQ_OVERFLOW 0x20000 /* listen queue overflow */ +#define TF_RXWIN0SENT 0x40000 /* sent a receiver win 0 in response */ +#define TF_SLOWLINK 0x80000 /* route is a on a modem speed link */ + + int t_force; /* 1 if forcing out a byte */ + + tcp_seq snd_una; /* send unacknowledged */ + tcp_seq snd_max; /* highest sequence number sent; + * used to recognize retransmits + */ + tcp_seq snd_nxt; /* send next */ + tcp_seq snd_up; /* send urgent pointer */ + + tcp_seq snd_wl1; /* window update seg seq number */ + tcp_seq snd_wl2; /* window update seg ack number */ + tcp_seq iss; /* initial send sequence number */ + tcp_seq irs; /* initial receive sequence number */ + + tcp_seq rcv_nxt; /* receive next */ + tcp_seq rcv_adv; /* advertised window */ + u_long rcv_wnd; /* receive window */ + tcp_seq rcv_up; /* receive urgent pointer */ + + u_long snd_wnd; /* send window */ + u_long snd_cwnd; /* congestion-controlled window */ + u_long snd_ssthresh; /* snd_cwnd size threshold for + * for slow start exponential to + * linear switch + */ + u_int t_maxopd; /* mss plus options */ + + u_long t_rcvtime; /* inactivity time */ + u_long t_starttime; /* time connection was established */ + int t_rtttime; /* round trip time */ + tcp_seq t_rtseq; /* sequence number being timed */ + + int t_rxtcur; /* current retransmit value (ticks) */ + u_int t_maxseg; /* maximum segment size */ + int t_srtt; /* smoothed round-trip time */ + int t_rttvar; /* variance in round-trip time */ + + int t_rxtshift; /* log(2) of rexmt exp. backoff */ + u_int t_rttmin; /* minimum rtt allowed */ + u_long t_rttupdated; /* number of times rtt sampled */ + u_long max_sndwnd; /* largest window peer has offered */ + + int t_softerror; /* possible error not yet reported */ +/* out-of-band data */ + char t_oobflags; /* have some */ + char t_iobc; /* input character */ +#define TCPOOB_HAVEDATA 0x01 +#define TCPOOB_HADDATA 0x02 +/* RFC 1323 variables */ + u_char snd_scale; /* window scaling for send window */ + u_char rcv_scale; /* window scaling for recv window */ + u_char request_r_scale; /* pending window scaling */ + u_char requested_s_scale; + u_long ts_recent; /* timestamp echo data */ + + u_long ts_recent_age; /* when last updated */ + tcp_seq last_ack_sent; +/* RFC 1644 variables */ + tcp_cc cc_send; /* send connection count */ + tcp_cc cc_recv; /* receive connection count */ + tcp_seq snd_recover; /* for use in fast recovery */ +/* experimental */ + u_long snd_cwnd_prev; /* cwnd prior to retransmit */ + u_long snd_ssthresh_prev; /* ssthresh prior to retransmit */ + u_long t_badrxtwin; /* window for retransmit recovery */ +}; + /* * Structure to hold TCP options that are only used during segment @@ -209,7 +327,7 @@ struct tcpopt { u_long to_tsecr; tcp_cc to_cc; /* holds CC or CCnew */ tcp_cc to_ccecho; - u_short to_maxseg; + u_short reserved; /* unused now: was to_maxseg */ }; /* @@ -266,7 +384,9 @@ struct rmxp_tao { #define TCP_REXMTVAL(tp) \ max((tp)->t_rttmin, (((tp)->t_srtt >> (TCP_RTT_SHIFT - TCP_DELTA_SHIFT)) \ + (tp)->t_rttvar) >> TCP_DELTA_SHIFT) +#endif /* __APPLE_API_PRIVATE */ +#ifdef __APPLE_API_UNSTABLE /* * TCP statistics. * Many of these should be kept per connection, @@ -337,6 +457,7 @@ struct tcpstat { u_long tcps_mturesent; /* resends due to MTU discovery */ u_long tcps_listendrop; /* listen queue overflows */ }; +#endif /* __APPLE_API_UNSTABLE */ /* * TCB structure exported to user-land via sysctl(3). @@ -347,7 +468,11 @@ struct tcpstat { struct xtcpcb { size_t xt_len; struct inpcb xt_inp; - struct tcpcb xt_tp; +#if KERNEL + struct otcpcb xt_tp; +#else + struct tcpcb xt_tp; +#endif struct xsocket xt_socket; u_quad_t xt_alignment_hack; }; @@ -365,10 +490,11 @@ struct xtcpcb { #define TCPCTL_KEEPINTVL 7 /* interval to send keepalives */ #define TCPCTL_SENDSPACE 8 /* send buffer space */ #define TCPCTL_RECVSPACE 9 /* receive buffer space */ -#define TCPCTL_KEEPINIT 10 /* receive buffer space */ +#define TCPCTL_KEEPINIT 10 /* timeout for establishing syn */ #define TCPCTL_PCBLIST 11 /* list of all outstanding PCBs */ -#define TCPCTL_V6MSSDFLT 12 /* MSS default for IPv6 */ -#define TCPCTL_MAXID 13 +#define TCPCTL_DELACKTIME 12 /* time before sending delayed ACK */ +#define TCPCTL_V6MSSDFLT 13 /* MSS default for IPv6 */ +#define TCPCTL_MAXID 14 #define TCPCTL_NAMES { \ { 0, 0 }, \ @@ -383,9 +509,11 @@ struct xtcpcb { { "recvspace", CTLTYPE_INT }, \ { "keepinit", CTLTYPE_INT }, \ { "pcblist", CTLTYPE_STRUCT }, \ + { "delacktime", CTLTYPE_INT }, \ { "v6mssdflt", CTLTYPE_INT }, \ } +#ifdef __APPLE_API_PRIVATE #ifdef KERNEL #ifdef SYSCTL_DECL SYSCTL_DECL(_net_inet_tcp); @@ -395,18 +523,20 @@ extern struct inpcbhead tcb; /* head of queue of active tcpcb's */ extern struct inpcbinfo tcbinfo; extern struct tcpstat tcpstat; /* tcp statistics */ extern int tcp_mssdflt; /* XXX */ -extern int tcp_v6mssdflt; /* XXX */ -extern u_long tcp_now; /* for RFC 1323 timestamps */ extern int tcp_delack_enabled; +extern int tcp_do_newreno; +extern int ss_fltsz; +extern int ss_fltsz_local; +#ifdef __APPLE__ +extern u_long tcp_now; /* for RFC 1323 timestamps */ +extern int tcp_delack_enabled; +#endif + void tcp_canceltimers __P((struct tcpcb *)); struct tcpcb * tcp_close __P((struct tcpcb *)); void tcp_ctlinput __P((int, struct sockaddr *, void *)); -#if INET6 -struct ip6_hdr; -void tcp6_ctlinput __P((int, struct sockaddr *,void *)); -#endif int tcp_ctloutput __P((struct socket *, struct sockopt *)); struct tcpcb * tcp_drop __P((struct tcpcb *, int)); @@ -414,79 +544,36 @@ void tcp_drain __P((void)); void tcp_fasttimo __P((void)); struct rmxp_tao * tcp_gettaocache __P((struct inpcb *)); -void tcp_init __P((void)); -#if INET6 -void tcp6_init __P((void)); -int tcp6_input __P((struct mbuf **, int *, int)); -#endif /* INET6 */ +void tcp_init __P((void)); void tcp_input __P((struct mbuf *, int)); -#if INET6 -void tcp_mss __P((struct tcpcb *, int, int)); -int tcp_mssopt __P((struct tcpcb *, int)); -#else /* INET6 */ void tcp_mss __P((struct tcpcb *, int)); int tcp_mssopt __P((struct tcpcb *)); -#endif /* INET6 */ - +void tcp_drop_syn_sent __P((struct inpcb *, int)); void tcp_mtudisc __P((struct inpcb *, int)); struct tcpcb * tcp_newtcpcb __P((struct inpcb *)); int tcp_output __P((struct tcpcb *)); void tcp_quench __P((struct inpcb *, int)); -#if INET6 -void tcp_respond __P((struct tcpcb *, void *, struct tcphdr *, - struct mbuf *, tcp_seq, tcp_seq, int, int)); -#else /* INET6 */ -void tcp_respond __P((struct tcpcb *, void *, struct tcphdr *, - struct mbuf *, tcp_seq, tcp_seq, int)); -#endif /* INET6 */ - +void tcp_respond __P((struct tcpcb *, void *, + struct tcphdr *, struct mbuf *, tcp_seq, tcp_seq, int)); struct rtentry * tcp_rtlookup __P((struct inpcb *)); -#if INET6 -struct rtentry * - tcp_rtlookup6 __P((struct inpcb *)); -#endif /* INET6 */ void tcp_setpersist __P((struct tcpcb *)); void tcp_slowtimo __P((void)); struct tcptemp * - tcp_template __P((struct tcpcb *)); + tcp_maketemplate __P((struct tcpcb *)); +void tcp_fillheaders __P((struct tcpcb *, void *, void *)); struct tcpcb * tcp_timers __P((struct tcpcb *, int)); -#if INET6 -void tcp_trace __P((int, int, struct tcpcb *, void *, struct tcphdr *, +void tcp_trace __P((int, int, struct tcpcb *, void *, struct tcphdr *, int)); -#else -void tcp_trace __P((int, int, struct tcpcb *, struct ip *, - struct tcphdr *, int)); -#endif - -#if INET6 -int tcp_reass __P((struct tcpcb *, struct tcphdr *, int, - struct mbuf *, int)); -#else /* INET6 */ -int tcp_reass __P((struct tcpcb *, struct tcphdr *, int, struct mbuf *)); -/* suppress INET6 only args */ -#define tcp_reass(x, y, z, t, i) tcp_reass(x, y, z, t) -#define tcp_mss(x, y, i) tcp_mss(x, y) -#define tcp_mssopt(x, i) tcp_mssopt(x) -#define tcp_respond(x, y, z, m, s1, s2, f, i) tcp_respond(x, y, z, m, s1, \ - s2, f) - -#endif /* INET6 */ extern struct pr_usrreqs tcp_usrreqs; -#if INET6 -extern struct pr_usrreqs tcp6_usrreqs; -#endif /* INET6 */ extern u_long tcp_sendspace; extern u_long tcp_recvspace; -void tcp_rndiss_init __P((void)); -tcp_seq tcp_rndiss_next __P((void)); -u_int16_t tcp_rndiss_encrypt __P((u_int16_t)); - - +tcp_seq tcp_new_isn __P((struct tcpcb *)); #endif /* KERNEL */ +#endif /* __APPLE_API_PRIVATE */ #endif /* _NETINET_TCP_VAR_H_ */