]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet/tcp_var.h
xnu-792.6.56.tar.gz
[apple/xnu.git] / bsd / netinet / tcp_var.h
index 5c1742366789e8178d0d88f7998d0ed21356462a..885ac163308d3def592d646db7a1fc47b0aae23a 100644 (file)
@@ -3,19 +3,20 @@
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
  *
  * @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.
+ * 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.
  * 
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * 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,
  * 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@
  */
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
 #ifndef _NETINET_TCP_VAR_H_
 #define _NETINET_TCP_VAR_H_
 #include <sys/appleapiopts.h>
 #ifndef _NETINET_TCP_VAR_H_
 #define _NETINET_TCP_VAR_H_
 #include <sys/appleapiopts.h>
+#include <sys/queue.h>
+#include <netinet/in_pcb.h>
 #include <netinet/tcp_timer.h>
 #include <netinet/tcp_timer.h>
-#ifdef __APPLE_API_PRIVATE
+
+#ifdef KERNEL_PRIVATE
 
 #define N_TIME_WAIT_SLOTS   128                /* must be power of 2 */
 
 
 #define N_TIME_WAIT_SLOTS   128                /* must be power of 2 */
 
@@ -75,6 +79,8 @@ struct tseg_qent {
        struct  mbuf    *tqe_m;         /* mbuf contains packet */
 };
 LIST_HEAD(tsegqe_head, tseg_qent);
        struct  mbuf    *tqe_m;         /* mbuf contains packet */
 };
 LIST_HEAD(tsegqe_head, tseg_qent);
+extern int     tcp_reass_maxseg;
+extern int     tcp_reass_qsize;
 #ifdef MALLOC_DECLARE
 MALLOC_DECLARE(M_TSEGQ);
 #endif
 #ifdef MALLOC_DECLARE
 MALLOC_DECLARE(M_TSEGQ);
 #endif
@@ -86,14 +92,6 @@ struct tcptemp {
 
 #define tcp6cb         tcpcb  /* for KAME src sync over BSD*'s */
 
 
 #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
-#endif
-
 /*
  * Tcp control block, one per tcp; fields:
  * Organized for 16 byte cacheline efficiency.
 /*
  * Tcp control block, one per tcp; fields:
  * Organized for 16 byte cacheline efficiency.
@@ -127,6 +125,7 @@ struct tcpcb {
 #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_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 */
 
 
        int     t_force;                /* 1 if forcing out a byte */
 
@@ -188,11 +187,22 @@ struct tcpcb {
 /* RFC 1644 variables */
        tcp_cc  cc_send;                /* send connection count */
        tcp_cc  cc_recv;                /* receive connection count */
 /* 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 */
+       tcp_seq snd_recover;    /* for use in NewReno 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 */
 /* 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) */
+       int     t_lastchain;            /* amount of packets chained last time around */
+
+/* 3529618 MSS overload prevention */
+       u_long  rcv_reset;
+       u_long  rcv_pps;
+       u_long  rcv_byps;
+       tcp_seq snd_high;               /* for use in NewReno Fast Recovery */
+       tcp_seq snd_high_prev;  /* snd_high prior to retransmit */
+
 };
 
 /*
 };
 
 /*
@@ -268,9 +278,115 @@ 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)
 #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
+/*
+ * Jaguar compatible TCP control block, for xtcpcb
+ * Does not have the old fields
+ */
+struct otcpcb {
+#else
+struct tseg_qent;
+LIST_HEAD(tsegqe_head, tseg_qent);
+
+struct tcpcb {
+#endif /* KERNEL_PRIVATE */
+       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 */
+};
+
 /*
  * TCP statistics.
  * Many of these should be kept per connection,
 /*
  * TCP statistics.
  * Many of these should be kept per connection,
@@ -341,22 +457,27 @@ struct    tcpstat {
        u_long  tcps_mturesent;         /* resends due to MTU discovery */
        u_long  tcps_listendrop;        /* listen queue overflows */
 };
        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).
  * Evil hack: declare only if in_pcb.h and sys/socketvar.h have been
  * included.  Not all of our clients do.
  */
 
 /*
  * TCB structure exported to user-land via sysctl(3).
  * Evil hack: declare only if in_pcb.h and sys/socketvar.h have been
  * included.  Not all of our clients do.
  */
-#if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_)
 struct xtcpcb {
        size_t  xt_len;
 struct xtcpcb {
        size_t  xt_len;
+#ifdef KERNEL_PRIVATE
+       struct  inpcb_compat    xt_inp;
+#else
        struct  inpcb   xt_inp;
        struct  inpcb   xt_inp;
-       struct  tcpcb   xt_tp;
+#endif
+#ifdef KERNEL_PRIVATE
+       struct  otcpcb  xt_tp;
+#else
+       struct  tcpcb   xt_tp;
+#endif
        struct  xsocket xt_socket;
        u_quad_t        xt_alignment_hack;
 };
        struct  xsocket xt_socket;
        u_quad_t        xt_alignment_hack;
 };
-#endif
 
 /*
  * Names for TCP sysctl objects
 
 /*
  * Names for TCP sysctl objects
@@ -376,6 +497,7 @@ struct      xtcpcb {
 #define        TCPCTL_V6MSSDFLT        13      /* MSS default for IPv6 */
 #define        TCPCTL_MAXID            14
 
 #define        TCPCTL_V6MSSDFLT        13      /* MSS default for IPv6 */
 #define        TCPCTL_MAXID            14
 
+#ifdef KERNEL_PRIVATE
 #define TCPCTL_NAMES { \
        { 0, 0 }, \
        { "rfc1323", CTLTYPE_INT }, \
 #define TCPCTL_NAMES { \
        { 0, 0 }, \
        { "rfc1323", CTLTYPE_INT }, \
@@ -393,67 +515,72 @@ struct    xtcpcb {
        { "v6mssdflt", CTLTYPE_INT }, \
 }
 
        { "v6mssdflt", CTLTYPE_INT }, \
 }
 
-#ifdef __APPLE_API_PRIVATE
-#ifdef KERNEL
 #ifdef SYSCTL_DECL
 SYSCTL_DECL(_net_inet_tcp);
 #ifdef SYSCTL_DECL
 SYSCTL_DECL(_net_inet_tcp);
-#endif
+#endif /* SYSCTL_DECL */
 
 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 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_delack_enabled;
+extern int tcp_minmss;
+extern int tcp_minmssoverload;
 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;
 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
+#endif /* __APPLE__ */
 
 
 
 
-void    tcp_canceltimers __P((struct tcpcb *));
+void    tcp_canceltimers(struct tcpcb *);
 struct tcpcb *
 struct tcpcb *
-        tcp_close __P((struct tcpcb *));
-void    tcp_ctlinput __P((int, struct sockaddr *, void *));
-int     tcp_ctloutput __P((struct socket *, struct sockopt *));
+        tcp_close(struct tcpcb *);
+void    tcp_ctlinput(int, struct sockaddr *, void *);
+int     tcp_ctloutput(struct socket *, struct sockopt *);
 struct tcpcb *
 struct tcpcb *
-        tcp_drop __P((struct tcpcb *, int));
-void    tcp_drain __P((void));
-void    tcp_fasttimo __P((void));
+        tcp_drop(struct tcpcb *, int);
+void    tcp_drain(void);
+void    tcp_fasttimo(void);
 struct rmxp_tao *
 struct rmxp_tao *
-        tcp_gettaocache __P((struct inpcb *));
-void    tcp_init __P((void));
-void    tcp_input __P((struct mbuf *, int));
-void    tcp_mss __P((struct tcpcb *, int));
-int     tcp_mssopt __P((struct tcpcb *));
-void    tcp_drop_syn_sent __P((struct inpcb *, int));
-void    tcp_mtudisc __P((struct inpcb *, int));
+        tcp_gettaocache(struct inpcb *);
+void    tcp_init(void);
+void    tcp_input(struct mbuf *, int);
+void    tcp_mss(struct tcpcb *, int);
+int     tcp_mssopt(struct tcpcb *);
+void    tcp_drop_syn_sent(struct inpcb *, int);
+void    tcp_mtudisc(struct inpcb *, int);
 struct tcpcb *
 struct tcpcb *
-        tcp_newtcpcb __P((struct inpcb *));
-int     tcp_output __P((struct tcpcb *));
-void    tcp_quench __P((struct inpcb *, int));
-void    tcp_respond __P((struct tcpcb *, void *,
-           struct tcphdr *, struct mbuf *, tcp_seq, tcp_seq, int));
+        tcp_newtcpcb(struct inpcb *);
+int     tcp_output(struct tcpcb *);
+void    tcp_quench(struct inpcb *, int);
+void    tcp_respond(struct tcpcb *, void *,
+           struct tcphdr *, struct mbuf *, tcp_seq, tcp_seq, int);
 struct rtentry *
 struct rtentry *
-        tcp_rtlookup __P((struct inpcb *));
-void    tcp_setpersist __P((struct tcpcb *));
-void    tcp_slowtimo __P((void));
+        tcp_rtlookup(struct inpcb *);
+void    tcp_setpersist(struct tcpcb *);
+void    tcp_slowtimo(void);
 struct tcptemp *
 struct tcptemp *
-        tcp_maketemplate __P((struct tcpcb *));
-void    tcp_fillheaders __P((struct tcpcb *, void *, void *));
+        tcp_maketemplate(struct tcpcb *);
+void    tcp_fillheaders(struct tcpcb *, void *, void *);
 struct tcpcb *
 struct tcpcb *
-        tcp_timers __P((struct tcpcb *, int));
-void    tcp_trace __P((int, int, struct tcpcb *, void *, struct tcphdr *,
-                       int));
+        tcp_timers(struct tcpcb *, int);
+void    tcp_trace(int, int, struct tcpcb *, void *, struct tcphdr *, int);
+int     tcp_lock (struct socket *, int, int);
+int     tcp_unlock (struct socket *, int, int);
+#ifdef _KERN_LOCKS_H_
+lck_mtx_t *     tcp_getlock (struct socket *, int);
+#else
+void *  tcp_getlock (struct socket *, int);
+#endif
+
 
 extern struct pr_usrreqs tcp_usrreqs;
 extern u_long tcp_sendspace;
 extern u_long tcp_recvspace;
 
 extern struct pr_usrreqs tcp_usrreqs;
 extern u_long tcp_sendspace;
 extern u_long tcp_recvspace;
-tcp_seq tcp_new_isn __P((struct tcpcb *));
+tcp_seq tcp_new_isn(struct tcpcb *);
 
 
-#endif /* KERNEL */
-#endif /* __APPLE_API_PRIVATE */
+#endif /* KERNEL_RPIVATE */
 
 #endif /* _NETINET_TCP_VAR_H_ */
 
 #endif /* _NETINET_TCP_VAR_H_ */