lin
2025-04-23 399353eb5dc7e9c1db94cc97c380dc7f66c51a4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*
 * INET        An implementation of the TCP/IP protocol suite for the LINUX
 *        operating system.  INET is implemented using the  BSD Socket
 *        interface as the means of communication with the user level.
 *
 *        Definitions for the TCP protocol.
 *
 * Version:    @(#)tcp.h    1.0.2    04/28/93
 *
 * Author:    Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 *        This program is free software; you can redistribute it and/or
 *        modify it under the terms of the GNU General Public License
 *        as published by the Free Software Foundation; either version
 *        2 of the License, or (at your option) any later version.
 */
#ifndef _UAPI_LINUX_TCP_H
#define _UAPI_LINUX_TCP_H
 
#include <linux/types.h>
#include <asm/byteorder.h>
#include <linux/socket.h>
 
struct tcphdr {
   __be16    source;
   __be16    dest;
   __be32    seq;
   __be32    ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
   __u16    res1:4,
       doff:4,
       fin:1,
       syn:1,
       rst:1,
       psh:1,
       ack:1,
       urg:1,
       ece:1,
       cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
   __u16    doff:4,
       res1:4,
       cwr:1,
       ece:1,
       urg:1,
       ack:1,
       psh:1,
       rst:1,
       syn:1,
       fin:1;
#else
#error    "Adjust your <asm/byteorder.h> defines"
#endif    
   __be16    window;
   __sum16    check;
   __be16    urg_ptr;
};
 
/*
 *    The union cast uses a gcc extension to avoid aliasing problems
 *  (union is compatible to any of its members)
 *  This means this part of the code is -fstrict-aliasing safe now.
 */
union tcp_word_hdr { 
   struct tcphdr hdr;
   __be32           words[5];
}; 
 
#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) 
 
enum { 
   TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000),
   TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000),
   TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000),
   TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000),
   TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000),
   TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000),
   TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000),
   TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000),
   TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000),
   TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000)
}; 
 
/*
 * TCP general constants
 */
#define TCP_MSS_DEFAULT         536U    /* IPv4 (RFC1122, RFC2581) */
#define TCP_MSS_DESIRED        1220U    /* IPv6 (tunneled), EDNS0 (RFC3226) */
 
/* TCP socket options */
#define TCP_NODELAY        1    /* Turn off Nagle's algorithm. */
#define TCP_MAXSEG        2    /* Limit MSS */
#define TCP_CORK        3    /* Never send partially complete segments */
#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    /* Block/reenable quick acks */
#define TCP_CONGESTION        13    /* Congestion control algorithm */
#define TCP_MD5SIG        14    /* TCP MD5 Signature (RFC2385) */
#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
#define TCP_QUEUE_SEQ        21
#define TCP_REPAIR_OPTIONS    22
#define TCP_FASTOPEN        23    /* Enable FastOpen on listeners */
#define TCP_TIMESTAMP        24
#define TCP_NOTSENT_LOWAT    25    /* limit number of unsent bytes in write queue */
#define TCP_CC_INFO        26    /* Get Congestion Control (optional) info */
#define TCP_SAVE_SYN        27    /* Record SYN headers for new connections */
#define TCP_SAVED_SYN        28    /* Get SYN headers recorded for connection */
#define TCP_REPAIR_WINDOW    29    /* Get/set window parameters */
#define TCP_FASTOPEN_CONNECT    30    /* Attempt FastOpen with connect */
 
struct tcp_repair_opt {
   __u32    opt_code;
   __u32    opt_val;
};
 
struct tcp_repair_window {
   __u32    snd_wl1;
   __u32    snd_wnd;
   __u32    max_window;
 
   __u32    rcv_wnd;
   __u32    rcv_wup;
};
 
enum {
   TCP_NO_QUEUE,
   TCP_RECV_QUEUE,
   TCP_SEND_QUEUE,
   TCP_QUEUES_NR,
};
 
/* for TCP_INFO socket option */
#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 */
 
enum tcp_ca_state {
   TCP_CA_Open = 0,
#define TCPF_CA_Open    (1<<TCP_CA_Open)
   TCP_CA_Disorder = 1,
#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
   TCP_CA_CWR = 2,
#define TCPF_CA_CWR    (1<<TCP_CA_CWR)
   TCP_CA_Recovery = 3,
#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
   TCP_CA_Loss = 4
#define TCPF_CA_Loss    (1<<TCP_CA_Loss)
};
 
struct tcp_info {
   __u8    tcpi_state;
   __u8    tcpi_ca_state;
   __u8    tcpi_retransmits;
   __u8    tcpi_probes;
   __u8    tcpi_backoff;
   __u8    tcpi_options;
   __u8    tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
   __u8    tcpi_delivery_rate_app_limited:1;
 
   __u32    tcpi_rto;
   __u32    tcpi_ato;
   __u32    tcpi_snd_mss;
   __u32    tcpi_rcv_mss;
 
   __u32    tcpi_unacked;
   __u32    tcpi_sacked;
   __u32    tcpi_lost;
   __u32    tcpi_retrans;
   __u32    tcpi_fackets;
 
   /* Times. */
   __u32    tcpi_last_data_sent;
   __u32    tcpi_last_ack_sent;     /* Not remembered, sorry. */
   __u32    tcpi_last_data_recv;
   __u32    tcpi_last_ack_recv;
 
   /* Metrics. */
   __u32    tcpi_pmtu;
   __u32    tcpi_rcv_ssthresh;
   __u32    tcpi_rtt;
   __u32    tcpi_rttvar;
   __u32    tcpi_snd_ssthresh;
   __u32    tcpi_snd_cwnd;
   __u32    tcpi_advmss;
   __u32    tcpi_reordering;
 
   __u32    tcpi_rcv_rtt;
   __u32    tcpi_rcv_space;
 
   __u32    tcpi_total_retrans;
 
   __u64    tcpi_pacing_rate;
   __u64    tcpi_max_pacing_rate;
   __u64    tcpi_bytes_acked;    /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
   __u64    tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
   __u32    tcpi_segs_out;         /* RFC4898 tcpEStatsPerfSegsOut */
   __u32    tcpi_segs_in;         /* RFC4898 tcpEStatsPerfSegsIn */
 
   __u32    tcpi_notsent_bytes;
   __u32    tcpi_min_rtt;
   __u32    tcpi_data_segs_in;    /* RFC4898 tcpEStatsDataSegsIn */
   __u32    tcpi_data_segs_out;    /* RFC4898 tcpEStatsDataSegsOut */
 
   __u64   tcpi_delivery_rate;
};
 
/* for TCP_MD5SIG socket option */
#define TCP_MD5SIG_MAXKEYLEN    80
 
struct tcp_md5sig {
   struct __kernel_sockaddr_storage tcpm_addr;    /* address associated */
   __u16    __tcpm_pad1;                /* zero */
   __u16    tcpm_keylen;                /* key length */
   __u32    __tcpm_pad2;                /* zero */
   __u8    tcpm_key[TCP_MD5SIG_MAXKEYLEN];        /* key (binary) */
};
 
#endif /* _UAPI_LINUX_TCP_H */