*
* @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@
*/
* 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 <sys/appleapiopts.h>
+#include <netinet/tcp_timer.h>
+#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 */
#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 */
*/
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 */
/* 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
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 */
};
/*
#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,
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).
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;
};
#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 }, \
{ "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);
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));
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_ */