Use Linux's network headers in glibc (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 16 Sep 2016 20:38:53 +0000 (16:38 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 19 Sep 2016 15:03:03 +0000 (11:03 -0400)
A bunch of programs use these headers for things like socket options.
We hardly support any of them, but over time we can add those that make
sense to our socket shims.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/bits/in.h [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/errqueue.h [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/netinet/tcp.h [new file with mode: 0644]

diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/bits/in.h b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/bits/in.h
new file mode 100644 (file)
index 0000000..c99933e
--- /dev/null
@@ -0,0 +1,204 @@
+/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* AKAROS: this is the Linux sysdep for bits/in.h */
+
+/* Linux version.  */
+
+#ifndef _NETINET_IN_H
+# error "Never use <bits/in.h> directly; include <netinet/in.h> instead."
+#endif
+
+/* If the application has already included linux/in6.h from a linux-based
+   kernel then we will not define the IPv6 IPPROTO_* defines, in6_addr (nor the
+   defines), sockaddr_in6, or ipv6_mreq.  The ABI used by the linux-kernel and
+   glibc match exactly.  Neither the linux kernel nor glibc should break this
+   ABI without coordination.  */
+#ifdef _UAPI_LINUX_IN6_H
+/* This is not quite the same API since the kernel always defines s6_addr16 and
+   s6_addr32. This is not a violation of POSIX since POSIX says "at least the
+   following member" and that holds true.  */
+# define __USE_KERNEL_IPV6_DEFS
+#endif
+
+/* Options for use with `getsockopt' and `setsockopt' at the IP level.
+   The first word in the comment at the right is the data type used;
+   "bool" means a boolean value stored in an `int'.  */
+#define        IP_OPTIONS      4       /* ip_opts; IP per-packet options.  */
+#define        IP_HDRINCL      3       /* int; Header is included with data.  */
+#define        IP_TOS          1       /* int; IP type of service and precedence.  */
+#define        IP_TTL          2       /* int; IP time to live.  */
+#define        IP_RECVOPTS     6       /* bool; Receive all IP options w/datagram.  */
+/* For BSD compatibility.  */
+#define        IP_RECVRETOPTS  IP_RETOPTS       /* bool; Receive IP options for response.  */
+#define        IP_RETOPTS      7       /* ip_opts; Set/get IP per-packet options.  */
+#define IP_MULTICAST_IF 32     /* in_addr; set/get IP multicast i/f */
+#define IP_MULTICAST_TTL 33    /* u_char; set/get IP multicast ttl */
+#define IP_MULTICAST_LOOP 34   /* i_char; set/get IP multicast loopback */
+#define IP_ADD_MEMBERSHIP 35   /* ip_mreq; add an IP group membership */
+#define IP_DROP_MEMBERSHIP 36  /* ip_mreq; drop an IP group membership */
+#define IP_UNBLOCK_SOURCE 37   /* ip_mreq_source: unblock data from source */
+#define IP_BLOCK_SOURCE 38     /* ip_mreq_source: block data from source */
+#define IP_ADD_SOURCE_MEMBERSHIP 39 /* ip_mreq_source: join source group */
+#define IP_DROP_SOURCE_MEMBERSHIP 40 /* ip_mreq_source: leave source group */
+#define IP_MSFILTER 41
+#if defined __USE_MISC || defined __USE_GNU
+# define MCAST_JOIN_GROUP 42   /* group_req: join any-source group */
+# define MCAST_BLOCK_SOURCE 43 /* group_source_req: block from given group */
+# define MCAST_UNBLOCK_SOURCE 44 /* group_source_req: unblock from given group*/
+# define MCAST_LEAVE_GROUP 45  /* group_req: leave any-source group */
+# define MCAST_JOIN_SOURCE_GROUP 46 /* group_source_req: join source-spec gr */
+# define MCAST_LEAVE_SOURCE_GROUP 47 /* group_source_req: leave source-spec gr*/
+# define MCAST_MSFILTER 48
+# define IP_MULTICAST_ALL 49
+# define IP_UNICAST_IF 50
+
+# define MCAST_EXCLUDE   0
+# define MCAST_INCLUDE   1
+#endif
+
+#define IP_ROUTER_ALERT        5       /* bool */
+#define IP_PKTINFO     8       /* bool */
+#define IP_PKTOPTIONS  9
+#define IP_PMTUDISC    10      /* obsolete name? */
+#define IP_MTU_DISCOVER        10      /* int; see below */
+#define IP_RECVERR     11      /* bool */
+#define IP_RECVTTL     12      /* bool */
+#define IP_RECVTOS     13      /* bool */
+#define IP_MTU         14      /* int */
+#define IP_FREEBIND    15
+#define IP_IPSEC_POLICY 16
+#define IP_XFRM_POLICY 17
+#define IP_PASSSEC     18
+#define IP_TRANSPARENT 19
+#define IP_MULTICAST_ALL 49    /* bool */
+
+/* TProxy original addresses */
+#define IP_ORIGDSTADDR       20
+#define IP_RECVORIGDSTADDR   IP_ORIGDSTADDR
+
+#define IP_MINTTL       21
+
+
+/* IP_MTU_DISCOVER arguments.  */
+#define IP_PMTUDISC_DONT   0   /* Never send DF frames.  */
+#define IP_PMTUDISC_WANT   1   /* Use per route hints.  */
+#define IP_PMTUDISC_DO     2   /* Always DF.  */
+#define IP_PMTUDISC_PROBE  3   /* Ignore dst pmtu.  */
+
+/* To select the IP level.  */
+#define SOL_IP 0
+
+#define IP_DEFAULT_MULTICAST_TTL        1
+#define IP_DEFAULT_MULTICAST_LOOP       1
+#define IP_MAX_MEMBERSHIPS              20
+
+#if defined __USE_MISC || defined __USE_GNU
+/* Structure used to describe IP options for IP_OPTIONS and IP_RETOPTS.
+   The `ip_dst' field is used for the first-hop gateway when using a
+   source route (this gets put into the header proper).  */
+struct ip_opts
+  {
+    struct in_addr ip_dst;     /* First hop; zero without source route.  */
+    char ip_opts[40];          /* Actually variable in size.  */
+  };
+
+/* Like `struct ip_mreq' but including interface specification by index.  */
+struct ip_mreqn
+  {
+    struct in_addr imr_multiaddr;      /* IP multicast address of group */
+    struct in_addr imr_address;                /* local IP address of interface */
+    int        imr_ifindex;                    /* Interface index */
+  };
+
+/* Structure used for IP_PKTINFO.  */
+struct in_pktinfo
+  {
+    int ipi_ifindex;                   /* Interface index  */
+    struct in_addr ipi_spec_dst;       /* Routing destination address  */
+    struct in_addr ipi_addr;           /* Header destination address  */
+  };
+#endif
+
+/* Options for use with `getsockopt' and `setsockopt' at the IPv6 level.
+   The first word in the comment at the right is the data type used;
+   "bool" means a boolean value stored in an `int'.  */
+#define IPV6_ADDRFORM          1
+#define IPV6_2292PKTINFO       2
+#define IPV6_2292HOPOPTS       3
+#define IPV6_2292DSTOPTS       4
+#define IPV6_2292RTHDR         5
+#define IPV6_2292PKTOPTIONS    6
+#define IPV6_CHECKSUM          7
+#define IPV6_2292HOPLIMIT      8
+
+#define SCM_SRCRT              IPV6_RXSRCRT
+
+#define IPV6_NEXTHOP           9
+#define IPV6_AUTHHDR           10
+#define IPV6_UNICAST_HOPS      16
+#define IPV6_MULTICAST_IF      17
+#define IPV6_MULTICAST_HOPS    18
+#define IPV6_MULTICAST_LOOP    19
+#define IPV6_JOIN_GROUP                20
+#define IPV6_LEAVE_GROUP       21
+#define IPV6_ROUTER_ALERT      22
+#define IPV6_MTU_DISCOVER      23
+#define IPV6_MTU               24
+#define IPV6_RECVERR           25
+#define IPV6_V6ONLY            26
+#define IPV6_JOIN_ANYCAST      27
+#define IPV6_LEAVE_ANYCAST     28
+#define IPV6_IPSEC_POLICY      34
+#define IPV6_XFRM_POLICY       35
+
+#define IPV6_RECVPKTINFO       49
+#define IPV6_PKTINFO           50
+#define IPV6_RECVHOPLIMIT      51
+#define IPV6_HOPLIMIT          52
+#define IPV6_RECVHOPOPTS       53
+#define IPV6_HOPOPTS           54
+#define IPV6_RTHDRDSTOPTS      55
+#define IPV6_RECVRTHDR         56
+#define IPV6_RTHDR             57
+#define IPV6_RECVDSTOPTS       58
+#define IPV6_DSTOPTS           59
+
+#define IPV6_RECVTCLASS                66
+#define IPV6_TCLASS            67
+
+/* Obsolete synonyms for the above.  */
+#define IPV6_ADD_MEMBERSHIP    IPV6_JOIN_GROUP
+#define IPV6_DROP_MEMBERSHIP   IPV6_LEAVE_GROUP
+#define IPV6_RXHOPOPTS         IPV6_HOPOPTS
+#define IPV6_RXDSTOPTS         IPV6_DSTOPTS
+
+/* IPV6_MTU_DISCOVER values.  */
+#define IPV6_PMTUDISC_DONT     0       /* Never send DF frames.  */
+#define IPV6_PMTUDISC_WANT     1       /* Use per route hints.  */
+#define IPV6_PMTUDISC_DO       2       /* Always DF.  */
+#define IPV6_PMTUDISC_PROBE    3       /* Ignore dst pmtu.  */
+
+/* Socket level values for IPv6.  */
+#define SOL_IPV6        41
+#define SOL_ICMPV6      58
+
+/* Routing header options for IPv6.  */
+#define IPV6_RTHDR_LOOSE       0       /* Hop doesn't need to be neighbour. */
+#define IPV6_RTHDR_STRICT      1       /* Hop must be a neighbour.  */
+
+#define IPV6_RTHDR_TYPE_0      0       /* IPv6 Routing header type 0.  */
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/errqueue.h b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/errqueue.h
new file mode 100644 (file)
index 0000000..2a0d2b5
--- /dev/null
@@ -0,0 +1,47 @@
+/* Copyright (C) 2000-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* AKAROS note: this was not in bits/ in the other sysdeps. */
+
+/* Linux version.  */
+
+#ifndef _BITS_ERRQUEUE_H
+#define _BITS_ERRQUEUE_H  1
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+struct sock_extended_err
+  {
+    u_int32_t ee_errno;
+    u_int8_t ee_origin;
+    u_int8_t ee_type;
+    u_int8_t ee_code;
+    u_int8_t ee_pad;
+    u_int32_t ee_info;
+    u_int32_t ee_data;
+  };
+
+#define SO_EE_ORIGIN_NONE  0
+#define SO_EE_ORIGIN_LOCAL 1
+#define SO_EE_ORIGIN_ICMP  2
+#define SO_EE_ORIGIN_ICMP6 3
+
+#define SO_EE_OFFENDER(see)    \
+  ((struct sockaddr *)(((struct sock_extended_err)(see))+1))
+
+#endif /* bits/errqueue.h */
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/netinet/tcp.h b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/netinet/tcp.h
new file mode 100644 (file)
index 0000000..af10e3e
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)tcp.h       8.1 (Berkeley) 6/10/93
+ */
+
+/* AKAROS: this is the gnu/sysdeps version of tcp.h, unmodified.  We don't list
+ * gnu in the Implies file, so until we do, we'd get the generic tcp.h instead
+ * of this one. */
+
+#ifndef _NETINET_TCP_H
+#define _NETINET_TCP_H 1
+
+#include <features.h>
+
+/*
+ * User-settable options (used with setsockopt).
+ */
+#define        TCP_NODELAY              1  /* Don't delay send to coalesce packets  */
+#define        TCP_MAXSEG               2  /* Set maximum segment size  */
+#define TCP_CORK                3  /* Control sending of partial frames  */
+#define TCP_KEEPIDLE            4  /* Start keeplives after this period */
+#define TCP_KEEPINTVL           5  /* Interval between keepalives */
+#define TCP_KEEPCNT             6  /* Number of keepalives before death */
+#define TCP_SYNCNT              7  /* Number of SYN retransmits */
+#define TCP_LINGER2             8  /* Life time of orphaned FIN-WAIT-2 state */
+#define TCP_DEFER_ACCEPT        9  /* Wake up listener only when data arrive */
+#define TCP_WINDOW_CLAMP        10 /* Bound advertised window */
+#define TCP_INFO                11 /* Information about this connection. */
+#define        TCP_QUICKACK             12 /* Bock/reenable quick ACKs.  */
+#define TCP_CONGESTION          13 /* Congestion control algorithm.  */
+#define TCP_MD5SIG              14 /* TCP MD5 Signature (RFC2385) */
+#define TCP_COOKIE_TRANSACTIONS         15 /* TCP Cookie Transactions */
+#define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/
+#define TCP_THIN_DUPACK                 17 /* Fast retrans. after 1 dupack */
+#define TCP_USER_TIMEOUT        18 /* How long for loss retry before timeout */
+#define TCP_REPAIR              19 /* TCP sock is under repair right now */
+#define TCP_REPAIR_QUEUE        20 /* Set TCP queue to repair */
+#define TCP_QUEUE_SEQ           21 /* Set sequence number of repaired queue. */
+#define TCP_REPAIR_OPTIONS      22 /* Repair TCP connection options */
+#define TCP_FASTOPEN            23 /* Enable FastOpen on listeners */
+#define TCP_TIMESTAMP           24 /* TCP time stamp */
+
+#ifdef __USE_MISC
+# include <sys/types.h>
+# include <sys/socket.h>
+
+typedef        u_int32_t tcp_seq;
+/*
+ * TCP header.
+ * Per RFC 793, September, 1981.
+ */
+struct tcphdr
+  {
+    __extension__ union
+    {
+      struct
+      {
+       u_int16_t th_sport;             /* source port */
+       u_int16_t th_dport;             /* destination port */
+       tcp_seq th_seq;         /* sequence number */
+       tcp_seq th_ack;         /* acknowledgement number */
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+       u_int8_t th_x2:4;               /* (unused) */
+       u_int8_t th_off:4;              /* data offset */
+# endif
+# if __BYTE_ORDER == __BIG_ENDIAN
+       u_int8_t th_off:4;              /* data offset */
+       u_int8_t th_x2:4;               /* (unused) */
+# endif
+       u_int8_t th_flags;
+# define TH_FIN        0x01
+# define TH_SYN        0x02
+# define TH_RST        0x04
+# define TH_PUSH       0x08
+# define TH_ACK        0x10
+# define TH_URG        0x20
+       u_int16_t th_win;               /* window */
+       u_int16_t th_sum;               /* checksum */
+       u_int16_t th_urp;               /* urgent pointer */
+      };
+      struct
+      {
+       u_int16_t source;
+       u_int16_t dest;
+       u_int32_t seq;
+       u_int32_t ack_seq;
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+       u_int16_t res1:4;
+       u_int16_t doff:4;
+       u_int16_t fin:1;
+       u_int16_t syn:1;
+       u_int16_t rst:1;
+       u_int16_t psh:1;
+       u_int16_t ack:1;
+       u_int16_t urg:1;
+       u_int16_t res2:2;
+# elif __BYTE_ORDER == __BIG_ENDIAN
+       u_int16_t doff:4;
+       u_int16_t res1:4;
+       u_int16_t res2:2;
+       u_int16_t urg:1;
+       u_int16_t ack:1;
+       u_int16_t psh:1;
+       u_int16_t rst:1;
+       u_int16_t syn:1;
+       u_int16_t fin:1;
+# else
+#  error "Adjust your <bits/endian.h> defines"
+# endif
+       u_int16_t window;
+       u_int16_t check;
+       u_int16_t urg_ptr;
+      };
+    };
+};
+
+enum
+{
+  TCP_ESTABLISHED = 1,
+  TCP_SYN_SENT,
+  TCP_SYN_RECV,
+  TCP_FIN_WAIT1,
+  TCP_FIN_WAIT2,
+  TCP_TIME_WAIT,
+  TCP_CLOSE,
+  TCP_CLOSE_WAIT,
+  TCP_LAST_ACK,
+  TCP_LISTEN,
+  TCP_CLOSING   /* now a valid state */
+};
+
+# define TCPOPT_EOL            0
+# define TCPOPT_NOP            1
+# define TCPOPT_MAXSEG         2
+# define TCPOLEN_MAXSEG                4
+# define TCPOPT_WINDOW         3
+# define TCPOLEN_WINDOW                3
+# define TCPOPT_SACK_PERMITTED 4               /* Experimental */
+# define TCPOLEN_SACK_PERMITTED        2
+# define TCPOPT_SACK           5               /* Experimental */
+# define TCPOPT_TIMESTAMP      8
+# define TCPOLEN_TIMESTAMP     10
+# define TCPOLEN_TSTAMP_APPA   (TCPOLEN_TIMESTAMP+2) /* appendix A */
+
+# define TCPOPT_TSTAMP_HDR     \
+    (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
+
+/*
+ * Default maximum segment size for TCP.
+ * With an IP MSS of 576, this is 536,
+ * but 512 is probably more convenient.
+ * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)).
+ */
+# define TCP_MSS       512
+
+# define TCP_MAXWIN    65535   /* largest value for (unscaled) window */
+
+# define TCP_MAX_WINSHIFT      14      /* maximum window shift */
+
+# define SOL_TCP               6       /* TCP level */
+
+
+# define TCPI_OPT_TIMESTAMPS   1
+# define TCPI_OPT_SACK         2
+# define TCPI_OPT_WSCALE       4
+# define TCPI_OPT_ECN          8  /* ECN was negociated at TCP session init */
+# define TCPI_OPT_ECN_SEEN     16 /* we received at least one packet with ECT */
+# define TCPI_OPT_SYN_DATA     32 /* SYN-ACK acked data in SYN sent or rcvd */
+
+/* Values for tcpi_state.  */
+enum tcp_ca_state
+{
+  TCP_CA_Open = 0,
+  TCP_CA_Disorder = 1,
+  TCP_CA_CWR = 2,
+  TCP_CA_Recovery = 3,
+  TCP_CA_Loss = 4
+};
+
+struct tcp_info
+{
+  u_int8_t     tcpi_state;
+  u_int8_t     tcpi_ca_state;
+  u_int8_t     tcpi_retransmits;
+  u_int8_t     tcpi_probes;
+  u_int8_t     tcpi_backoff;
+  u_int8_t     tcpi_options;
+  u_int8_t     tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
+
+  u_int32_t    tcpi_rto;
+  u_int32_t    tcpi_ato;
+  u_int32_t    tcpi_snd_mss;
+  u_int32_t    tcpi_rcv_mss;
+
+  u_int32_t    tcpi_unacked;
+  u_int32_t    tcpi_sacked;
+  u_int32_t    tcpi_lost;
+  u_int32_t    tcpi_retrans;
+  u_int32_t    tcpi_fackets;
+
+  /* Times. */
+  u_int32_t    tcpi_last_data_sent;
+  u_int32_t    tcpi_last_ack_sent;     /* Not remembered, sorry.  */
+  u_int32_t    tcpi_last_data_recv;
+  u_int32_t    tcpi_last_ack_recv;
+
+  /* Metrics. */
+  u_int32_t    tcpi_pmtu;
+  u_int32_t    tcpi_rcv_ssthresh;
+  u_int32_t    tcpi_rtt;
+  u_int32_t    tcpi_rttvar;
+  u_int32_t    tcpi_snd_ssthresh;
+  u_int32_t    tcpi_snd_cwnd;
+  u_int32_t    tcpi_advmss;
+  u_int32_t    tcpi_reordering;
+
+  u_int32_t    tcpi_rcv_rtt;
+  u_int32_t    tcpi_rcv_space;
+
+  u_int32_t    tcpi_total_retrans;
+};
+
+
+/* For TCP_MD5SIG socket option.  */
+#define TCP_MD5SIG_MAXKEYLEN   80
+
+struct tcp_md5sig
+{
+  struct sockaddr_storage tcpm_addr;           /* Address associated.  */
+  u_int16_t    __tcpm_pad1;                    /* Zero.  */
+  u_int16_t    tcpm_keylen;                    /* Key length.  */
+  u_int32_t    __tcpm_pad2;                    /* Zero.  */
+  u_int8_t     tcpm_key[TCP_MD5SIG_MAXKEYLEN]; /* Key (binary).  */
+};
+
+/* For socket repair options.  */
+struct tcp_repair_opt
+{
+  u_int32_t    opt_code;
+  u_int32_t    opt_val;
+};
+
+/* Queue to repair, for TCP_REPAIR_QUEUE.  */
+enum
+{
+  TCP_NO_QUEUE,
+  TCP_RECV_QUEUE,
+  TCP_SEND_QUEUE,
+  TCP_QUEUES_NR,
+};
+
+/* For cookie transactions socket options.  */
+#define TCP_COOKIE_MIN         8               /*  64-bits */
+#define TCP_COOKIE_MAX         16              /* 128-bits */
+#define TCP_COOKIE_PAIR_SIZE   (2*TCP_COOKIE_MAX)
+
+/* Flags for both getsockopt and setsockopt */
+#define TCP_COOKIE_IN_ALWAYS   (1 << 0)        /* Discard SYN without cookie */
+#define TCP_COOKIE_OUT_NEVER   (1 << 1)        /* Prohibit outgoing cookies,
+                                                * supercedes everything. */
+
+/* Flags for getsockopt */
+#define TCP_S_DATA_IN          (1 << 2)        /* Was data received? */
+#define TCP_S_DATA_OUT         (1 << 3)        /* Was data sent? */
+
+#define TCP_MSS_DEFAULT                 536U   /* IPv4 (RFC1122, RFC2581) */
+#define TCP_MSS_DESIRED                1220U   /* IPv6 (tunneled), EDNS0 (RFC3226) */
+
+struct tcp_cookie_transactions
+{
+  u_int16_t    tcpct_flags;
+  u_int8_t     __tcpct_pad1;
+  u_int8_t     tcpct_cookie_desired;
+  u_int16_t    tcpct_s_data_desired;
+  u_int16_t    tcpct_used;
+  u_int8_t     tcpct_value[TCP_MSS_DEFAULT];
+};
+
+#endif /* Misc.  */
+
+#endif /* netinet/tcp.h */