/*
- * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Computer, Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#include <sys/_types.h>
#include <machine/endian.h>
-#ifndef _POSIX_C_SOURCE
+#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
typedef __uint32_t tcp_seq;
typedef __uint32_t tcp_cc; /* connection count per rfc1644 */
#define TCP_MAX_WINSHIFT 14 /* maximum window shift */
-#define TCP_MAXBURST 4 /* maximum segments in a burst */
-
#define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */
#define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr))
/* max space left for options */
-#endif /* _POSIX_C_SOURCE */
+#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
/*
* User-settable options (used with setsockopt).
*/
-#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
-#ifndef _POSIX_C_SOURCE
-#define TCP_MAXSEG 0x02 /* set maximum segment size */
-#define TCP_NOPUSH 0x04 /* don't push last block of write */
-#define TCP_NOOPT 0x08 /* don't use TCP options */
-#define TCP_KEEPALIVE 0x10 /* idle time used when SO_KEEPALIVE is enabled */
-
-#endif /* _POSIX_C_SOURCE */
+#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
+#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
+#define TCP_MAXSEG 0x02 /* set maximum segment size */
+#define TCP_NOPUSH 0x04 /* don't push last block of write */
+#define TCP_NOOPT 0x08 /* don't use TCP options */
+#define TCP_KEEPALIVE 0x10 /* idle time used when SO_KEEPALIVE is enabled */
+#define TCP_CONNECTIONTIMEOUT 0x20 /* connection timeout */
+#define PERSIST_TIMEOUT 0x40 /* time after which a connection in
+ * persist timeout will terminate.
+ * see draft-ananth-tcpm-persist-02.txt
+ */
+#define TCP_RXT_CONNDROPTIME 0x80 /* time after which tcp retransmissions will be
+ * stopped and the connection will be dropped
+ */
+#define TCP_RXT_FINDROP 0x100 /* when this option is set, drop a connection
+ * after retransmitting the FIN 3 times. It will
+ * prevent holding too many mbufs in socket
+ * buffer queues.
+ */
+#ifdef PRIVATE
+#define TCP_INFO 0x200 /* retrieve tcp_info structure */
+#define TCP_NOTSENT_LOWAT 0x201 /* Low water mark for TCP unsent data */
+#define TCP_MEASURE_SND_BW 0x202 /* Measure sender's bandwidth for this connection */
+#define TCP_MEASURE_BW_BURST 0x203 /* Burst size to use for bandwidth measurement */
+#define TCP_PEER_PID 0x204 /* Lookup pid of the process we're connected to */
+/*
+ * The TCP_INFO socket option is a private API and is subject to change
+ */
+#pragma pack(4)
+
+#define TCPI_OPT_TIMESTAMPS 0x01
+#define TCPI_OPT_SACK 0x02
+#define TCPI_OPT_WSCALE 0x04
+#define TCPI_OPT_ECN 0x08
+
+#define TCPI_FLAG_LOSSRECOVERY 0x01 /* Currently in loss recovery */
+
+struct tcp_info {
+ u_int8_t tcpi_state; /* TCP FSM state. */
+ u_int8_t tcpi_options; /* Options enabled on conn. */
+ u_int8_t tcpi_snd_wscale; /* RFC1323 send shift value. */
+ u_int8_t tcpi_rcv_wscale; /* RFC1323 recv shift value. */
+
+ u_int32_t tcpi_flags; /* extra flags (TCPI_FLAG_xxx) */
+
+ u_int32_t tcpi_rto; /* Retransmission timeout in milliseconds */
+ u_int32_t tcpi_snd_mss; /* Max segment size for send. */
+ u_int32_t tcpi_rcv_mss; /* Max segment size for receive. */
+
+ u_int32_t tcpi_rttcur; /* Most recent value of RTT */
+ u_int32_t tcpi_srtt; /* Smoothed RTT */
+ u_int32_t tcpi_rttvar; /* RTT variance */
+
+ u_int32_t tcpi_snd_ssthresh; /* Slow start threshold. */
+ u_int32_t tcpi_snd_cwnd; /* Send congestion window. */
+
+ u_int32_t tcpi_rcv_space; /* Advertised recv window. */
+
+ u_int32_t tcpi_snd_wnd; /* Advertised send window. */
+ u_int32_t tcpi_snd_nxt; /* Next egress seqno */
+ u_int32_t tcpi_rcv_nxt; /* Next ingress seqno */
+
+ int32_t tcpi_last_outif; /* if_index of interface used to send last */
+ u_int32_t tcpi_snd_sbbytes; /* bytes in snd buffer including data inflight */
+
+ u_int64_t tcpi_txbytes __attribute__((aligned(8)));
+ /* total bytes sent */
+ u_int64_t tcpi_txretransmitbytes __attribute__((aligned(8)));
+ /* total bytes retransmitted */
+ u_int64_t tcpi_txunacked __attribute__((aligned(8)));
+ /* current number of bytes not acknowledged */
+ u_int64_t tcpi_rxbytes __attribute__((aligned(8)));
+ /* total bytes received */
+ u_int64_t tcpi_rxduplicatebytes __attribute__((aligned(8)));
+ /* total duplicate bytes received */
+ u_int64_t tcpi_snd_bw __attribute__((aligned(8))); /* measured send bandwidth in bits/sec */
+};
+
+struct tcp_measure_bw_burst {
+ u_int32_t min_burst_size; /* Minimum number of packets to use */
+ u_int32_t max_burst_size; /* Maximum number of packets to use */
+};
+
+/*
+ * Note that IPv6 link local addresses should have the appropriate scope ID
+ */
+
+struct info_tuple {
+ u_int8_t itpl_proto;
+ union {
+ struct sockaddr _itpl_sa;
+ struct sockaddr_in _itpl_sin;
+ struct sockaddr_in6 _itpl_sin6;
+ } itpl_localaddr;
+ union {
+ struct sockaddr _itpl_sa;
+ struct sockaddr_in _itpl_sin;
+ struct sockaddr_in6 _itpl_sin6;
+ } itpl_remoteaddr;
+};
+
+#define itpl_local_sa itpl_localaddr._itpl_sa
+#define itpl_local_sin itpl_localaddr._itpl_sin
+#define itpl_local_sin6 itpl_localaddr._itpl_sin6
+#define itpl_remote_sa itpl_remoteaddr._itpl_sa
+#define itpl_remote_sin itpl_remoteaddr._itpl_sin
+#define itpl_remote_sin6 itpl_remoteaddr._itpl_sin6
+
+#pragma pack()
+
+#endif /* PRIVATE */
+#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
#endif