hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
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
232
233
234
235
236
237
238
239
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _UAPI_INET_DIAG_H_
#define _UAPI_INET_DIAG_H_
 
#include <linux/types.h>
 
/* Just some random number */
#define TCPDIAG_GETSOCK 18
#define DCCPDIAG_GETSOCK 19
 
#define INET_DIAG_GETSOCK_MAX 24
 
/* Socket identity */
struct inet_diag_sockid {
   __be16    idiag_sport;
   __be16    idiag_dport;
   __be32    idiag_src[4];
   __be32    idiag_dst[4];
   __u32    idiag_if;
   __u32    idiag_cookie[2];
#define INET_DIAG_NOCOOKIE (~0U)
};
 
/* Request structure */
 
struct inet_diag_req {
   __u8    idiag_family;        /* Family of addresses. */
   __u8    idiag_src_len;
   __u8    idiag_dst_len;
   __u8    idiag_ext;        /* Query extended information */
 
   struct inet_diag_sockid id;
 
   __u32    idiag_states;        /* States to dump */
   __u32    idiag_dbs;        /* Tables to dump (NI) */
};
 
struct inet_diag_req_v2 {
   __u8    sdiag_family;
   __u8    sdiag_protocol;
   __u8    idiag_ext;
   __u8    pad;
   __u32    idiag_states;
   struct inet_diag_sockid id;
};
 
/*
 * SOCK_RAW sockets require the underlied protocol to be
 * additionally specified so we can use @pad member for
 * this, but we can't rename it because userspace programs
 * still may depend on this name. Instead lets use another
 * structure definition as an alias for struct
 * @inet_diag_req_v2.
 */
struct inet_diag_req_raw {
   __u8    sdiag_family;
   __u8    sdiag_protocol;
   __u8    idiag_ext;
   __u8    sdiag_raw_protocol;
   __u32    idiag_states;
   struct inet_diag_sockid id;
};
 
enum {
   INET_DIAG_REQ_NONE,
   INET_DIAG_REQ_BYTECODE,
   INET_DIAG_REQ_SK_BPF_STORAGES,
   INET_DIAG_REQ_PROTOCOL,
   __INET_DIAG_REQ_MAX,
};
 
#define INET_DIAG_REQ_MAX (__INET_DIAG_REQ_MAX - 1)
 
/* Bytecode is sequence of 4 byte commands followed by variable arguments.
 * All the commands identified by "code" are conditional jumps forward:
 * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be
 * length of the command and its arguments.
 */
 
struct inet_diag_bc_op {
   unsigned char    code;
   unsigned char    yes;
   unsigned short    no;
};
 
enum {
   INET_DIAG_BC_NOP,
   INET_DIAG_BC_JMP,
   INET_DIAG_BC_S_GE,
   INET_DIAG_BC_S_LE,
   INET_DIAG_BC_D_GE,
   INET_DIAG_BC_D_LE,
   INET_DIAG_BC_AUTO,
   INET_DIAG_BC_S_COND,
   INET_DIAG_BC_D_COND,
   INET_DIAG_BC_DEV_COND,   /* u32 ifindex */
   INET_DIAG_BC_MARK_COND,
   INET_DIAG_BC_S_EQ,
   INET_DIAG_BC_D_EQ,
   INET_DIAG_BC_CGROUP_COND,   /* u64 cgroup v2 ID */
};
 
struct inet_diag_hostcond {
   __u8    family;
   __u8    prefix_len;
   int    port;
   __be32    addr[0];
};
 
struct inet_diag_markcond {
   __u32 mark;
   __u32 mask;
};
 
/* Base info structure. It contains socket identity (addrs/ports/cookie)
 * and, alas, the information shown by netstat. */
struct inet_diag_msg {
   __u8    idiag_family;
   __u8    idiag_state;
   __u8    idiag_timer;
   __u8    idiag_retrans;
 
   struct inet_diag_sockid id;
 
   __u32    idiag_expires;
   __u32    idiag_rqueue;
   __u32    idiag_wqueue;
   __u32    idiag_uid;
   __u32    idiag_inode;
};
 
/* Extensions */
 
enum {
   INET_DIAG_NONE,
   INET_DIAG_MEMINFO,
   INET_DIAG_INFO,
   INET_DIAG_VEGASINFO,
   INET_DIAG_CONG,
   INET_DIAG_TOS,
   INET_DIAG_TCLASS,
   INET_DIAG_SKMEMINFO,
   INET_DIAG_SHUTDOWN,
 
   /*
    * Next extenstions cannot be requested in struct inet_diag_req_v2:
    * its field idiag_ext has only 8 bits.
    */
 
   INET_DIAG_DCTCPINFO,    /* request as INET_DIAG_VEGASINFO */
   INET_DIAG_PROTOCOL,    /* response attribute only */
   INET_DIAG_SKV6ONLY,
   INET_DIAG_LOCALS,
   INET_DIAG_PEERS,
   INET_DIAG_PAD,
   INET_DIAG_MARK,        /* only with CAP_NET_ADMIN */
   INET_DIAG_BBRINFO,    /* request as INET_DIAG_VEGASINFO */
   INET_DIAG_CLASS_ID,    /* request as INET_DIAG_TCLASS */
   INET_DIAG_MD5SIG,
   INET_DIAG_ULP_INFO,
   INET_DIAG_SK_BPF_STORAGES,
   INET_DIAG_CGROUP_ID,
   INET_DIAG_SOCKOPT,
   __INET_DIAG_MAX,
};
 
#define INET_DIAG_MAX (__INET_DIAG_MAX - 1)
 
enum {
   INET_ULP_INFO_UNSPEC,
   INET_ULP_INFO_NAME,
   INET_ULP_INFO_TLS,
   INET_ULP_INFO_MPTCP,
   __INET_ULP_INFO_MAX,
};
#define INET_ULP_INFO_MAX (__INET_ULP_INFO_MAX - 1)
 
/* INET_DIAG_MEM */
 
struct inet_diag_meminfo {
   __u32    idiag_rmem;
   __u32    idiag_wmem;
   __u32    idiag_fmem;
   __u32    idiag_tmem;
};
 
/* INET_DIAG_SOCKOPT */
 
struct inet_diag_sockopt {
   __u8    recverr:1,
       is_icsk:1,
       freebind:1,
       hdrincl:1,
       mc_loop:1,
       transparent:1,
       mc_all:1,
       nodefrag:1;
   __u8    bind_address_no_port:1,
       recverr_rfc4884:1,
       defer_connect:1,
       unused:5;
};
 
/* INET_DIAG_VEGASINFO */
 
struct tcpvegas_info {
   __u32    tcpv_enabled;
   __u32    tcpv_rttcnt;
   __u32    tcpv_rtt;
   __u32    tcpv_minrtt;
};
 
/* INET_DIAG_DCTCPINFO */
 
struct tcp_dctcp_info {
   __u16    dctcp_enabled;
   __u16    dctcp_ce_state;
   __u32    dctcp_alpha;
   __u32    dctcp_ab_ecn;
   __u32    dctcp_ab_tot;
};
 
/* INET_DIAG_BBRINFO */
 
struct tcp_bbr_info {
   /* u64 bw: max-filtered BW (app throughput) estimate in Byte per sec: */
   __u32    bbr_bw_lo;        /* lower 32 bits of bw */
   __u32    bbr_bw_hi;        /* upper 32 bits of bw */
   __u32    bbr_min_rtt;        /* min-filtered RTT in uSec */
   __u32    bbr_pacing_gain;    /* pacing gain shifted left 8 bits */
   __u32    bbr_cwnd_gain;        /* cwnd gain shifted left 8 bits */
};
 
union tcp_cc_info {
   struct tcpvegas_info    vegas;
   struct tcp_dctcp_info    dctcp;
   struct tcp_bbr_info    bbr;
};
#endif /* _UAPI_INET_DIAG_H_ */