Lots of changes
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / netinet / tcp.h
1 /*
2  * Copyright (c) 1982, 1986, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *      @(#)tcp.h       8.1 (Berkeley) 6/10/93
30  */
31
32 #ifndef _NETINET_TCP_H
33 #define _NETINET_TCP_H  1
34
35 #include <features.h>
36
37 /*
38  * User-settable options (used with setsockopt).
39  */
40 #ifndef TCP_NODELAY
41 # define TCP_NODELAY            0x01
42 #endif
43 #ifndef TCP_MAXSEG
44 # define TCP_MAXSEG             0x02
45 #endif
46 #ifndef TCP_KEEPALIVE
47 # define TCP_KEEPALIVE          0x08
48 #endif
49 #define TCP_NOTIFY_THRESHOLD    0x10
50 #define TCP_ABORT_THRESHOLD     0x11
51 #define TCP_CONN_NOTIFY_THRESHOLD       0x12
52 #define TCP_CONN_ABORT_THRESHOLD        0x13
53 #define TCP_RECVDSTADDR         0x14
54 #define TCP_INIT_CWND           0x15
55 #define TCP_KEEPALIVE_THRESHOLD 0x16
56 #define TCP_KEEPALIVE_ABORT_THRESHOLD   0x17
57 #define TCP_CORK                0x18
58 #define TCP_ANONPRIVBIND        0x20
59 #define TCP_EXCLBIND            0x21
60
61
62 #ifdef __USE_MISC
63 # include <sys/types.h>
64 # include <sys/socket.h>
65
66 typedef u_int32_t tcp_seq;
67 /*
68  * TCP header.
69  * Per RFC 793, September, 1981.
70  */
71 struct tcphdr
72   {
73     u_int16_t th_sport;         /* source port */
74     u_int16_t th_dport;         /* destination port */
75     tcp_seq th_seq;             /* sequence number */
76     tcp_seq th_ack;             /* acknowledgement number */
77 #  if __BYTE_ORDER == __LITTLE_ENDIAN
78     u_int8_t th_x2:4;           /* (unused) */
79     u_int8_t th_off:4;          /* data offset */
80 #  endif
81 #  if __BYTE_ORDER == __BIG_ENDIAN
82     u_int8_t th_off:4;          /* data offset */
83     u_int8_t th_x2:4;           /* (unused) */
84 #  endif
85     u_int8_t th_flags;
86 #  define TH_FIN        0x01
87 #  define TH_SYN        0x02
88 #  define TH_RST        0x04
89 #  define TH_PUSH       0x08
90 #  define TH_ACK        0x10
91 #  define TH_URG        0x20
92     u_int16_t th_win;           /* window */
93     u_int16_t th_sum;           /* checksum */
94     u_int16_t th_urp;           /* urgent pointer */
95 };
96
97 enum
98 {
99   TCP_ESTABLISHED = 1,
100   TCP_SYN_SENT,
101   TCP_SYN_RECV,
102   TCP_FIN_WAIT1,
103   TCP_FIN_WAIT2,
104   TCP_TIME_WAIT,
105   TCP_CLOSE,
106   TCP_CLOSE_WAIT,
107   TCP_LAST_ACK,
108   TCP_LISTEN,
109   TCP_CLOSING   /* now a valid state */
110 };
111
112 # define TCPOPT_EOL             0
113 # define TCPOPT_NOP             1
114 # define TCPOPT_MAXSEG          2
115 # define TCPOPT_WSCALE          3
116 # define TCPOLEN_MAXSEG         4
117 # define TCPOPT_WINDOW          3
118 # define TCPOLEN_WINDOW         3
119 # define TCPOPT_SACK_PERMITTED  4               /* Experimental */
120 # define TCPOLEN_SACK_PERMITTED 2
121 # define TCPOPT_SACK            5               /* Experimental */
122 # define TCPOPT_TIMESTAMP       8
123 # define TCPOLEN_TIMESTAMP      10
124 # define TCPOLEN_TSTAMP_APPA    (TCPOLEN_TIMESTAMP+2) /* appendix A */
125
126 # define TCPOPT_TSTAMP_HDR      \
127     (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
128
129 /*
130  * Default maximum segment size for TCP.
131  * With an IP MSS of 576, this is 536,
132  * but 512 is probably more convenient.
133  * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)).
134  */
135 # define TCP_MSS        512
136
137 # define TCP_MAXWIN     65535   /* largest value for (unscaled) window */
138
139 # define TCP_MAX_WINSHIFT       14      /* maximum window shift */
140
141 # define SOL_TCP                6       /* TCP level */
142
143
144 # define TCPI_OPT_TIMESTAMPS    1
145 # define TCPI_OPT_SACK          2
146 # define TCPI_OPT_WSCALE        4
147 # define TCPI_OPT_ECN           8
148
149 /* Values for tcpi_state.  */
150 enum tcp_ca_state
151 {
152   TCP_CA_Open = 0,
153   TCP_CA_Disorder = 1,
154   TCP_CA_CWR = 2,
155   TCP_CA_Recovery = 3,
156   TCP_CA_Loss = 4
157 };
158
159 struct tcp_info
160 {
161   u_int8_t      tcpi_state;
162   u_int8_t      tcpi_ca_state;
163   u_int8_t      tcpi_retransmits;
164   u_int8_t      tcpi_probes;
165   u_int8_t      tcpi_backoff;
166   u_int8_t      tcpi_options;
167   u_int8_t      tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
168
169   u_int32_t     tcpi_rto;
170   u_int32_t     tcpi_ato;
171   u_int32_t     tcpi_snd_mss;
172   u_int32_t     tcpi_rcv_mss;
173
174   u_int32_t     tcpi_unacked;
175   u_int32_t     tcpi_sacked;
176   u_int32_t     tcpi_lost;
177   u_int32_t     tcpi_retrans;
178   u_int32_t     tcpi_fackets;
179
180   /* Times. */
181   u_int32_t     tcpi_last_data_sent;
182   u_int32_t     tcpi_last_ack_sent;     /* Not remembered, sorry.  */
183   u_int32_t     tcpi_last_data_recv;
184   u_int32_t     tcpi_last_ack_recv;
185
186   /* Metrics. */
187   u_int32_t     tcpi_pmtu;
188   u_int32_t     tcpi_rcv_ssthresh;
189   u_int32_t     tcpi_rtt;
190   u_int32_t     tcpi_rttvar;
191   u_int32_t     tcpi_snd_ssthresh;
192   u_int32_t     tcpi_snd_cwnd;
193   u_int32_t     tcpi_advmss;
194   u_int32_t     tcpi_reordering;
195
196   u_int32_t     tcpi_rcv_rtt;
197   u_int32_t     tcpi_rcv_space;
198
199   u_int32_t     tcpi_total_retrans;
200 };
201
202
203 /* For TCP_MD5SIG socket option.  */
204 #define TCP_MD5SIG_MAXKEYLEN    80
205
206 struct tcp_md5sig
207 {
208   struct sockaddr_storage tcpm_addr;            /* Address associated.  */
209   u_int16_t     __tcpm_pad1;                    /* Zero.  */
210   u_int16_t     tcpm_keylen;                    /* Key length.  */
211   u_int32_t     __tcpm_pad2;                    /* Zero.  */
212   u_int8_t      tcpm_key[TCP_MD5SIG_MAXKEYLEN]; /* Key (binary).  */
213 };
214
215 #endif /* Misc.  */
216
217 #endif /* netinet/tcp.h */