1  /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2  #ifndef _UAPI_INET_DIAG_H_
3  #define _UAPI_INET_DIAG_H_
4  
5  #include <linux/types.h>
6  
7  /* Just some random number */
8  #define TCPDIAG_GETSOCK 18
9  #define DCCPDIAG_GETSOCK 19
10  
11  #define INET_DIAG_GETSOCK_MAX 24
12  
13  /* Socket identity */
14  struct inet_diag_sockid {
15  	__be16	idiag_sport;
16  	__be16	idiag_dport;
17  	__be32	idiag_src[4];
18  	__be32	idiag_dst[4];
19  	__u32	idiag_if;
20  	__u32	idiag_cookie[2];
21  #define INET_DIAG_NOCOOKIE (~0U)
22  };
23  
24  /* Request structure */
25  
26  struct inet_diag_req {
27  	__u8	idiag_family;		/* Family of addresses. */
28  	__u8	idiag_src_len;
29  	__u8	idiag_dst_len;
30  	__u8	idiag_ext;		/* Query extended information */
31  
32  	struct inet_diag_sockid id;
33  
34  	__u32	idiag_states;		/* States to dump */
35  	__u32	idiag_dbs;		/* Tables to dump (NI) */
36  };
37  
38  struct inet_diag_req_v2 {
39  	__u8	sdiag_family;
40  	__u8	sdiag_protocol;
41  	__u8	idiag_ext;
42  	__u8	pad;
43  	__u32	idiag_states;
44  	struct inet_diag_sockid id;
45  };
46  
47  /*
48   * SOCK_RAW sockets require the underlied protocol to be
49   * additionally specified so we can use @pad member for
50   * this, but we can't rename it because userspace programs
51   * still may depend on this name. Instead lets use another
52   * structure definition as an alias for struct
53   * @inet_diag_req_v2.
54   */
55  struct inet_diag_req_raw {
56  	__u8	sdiag_family;
57  	__u8	sdiag_protocol;
58  	__u8	idiag_ext;
59  	__u8	sdiag_raw_protocol;
60  	__u32	idiag_states;
61  	struct inet_diag_sockid id;
62  };
63  
64  enum {
65  	INET_DIAG_REQ_NONE,
66  	INET_DIAG_REQ_BYTECODE,
67  	INET_DIAG_REQ_SK_BPF_STORAGES,
68  	INET_DIAG_REQ_PROTOCOL,
69  	__INET_DIAG_REQ_MAX,
70  };
71  
72  #define INET_DIAG_REQ_MAX (__INET_DIAG_REQ_MAX - 1)
73  
74  /* Bytecode is sequence of 4 byte commands followed by variable arguments.
75   * All the commands identified by "code" are conditional jumps forward:
76   * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be
77   * length of the command and its arguments.
78   */
79  
80  struct inet_diag_bc_op {
81  	unsigned char	code;
82  	unsigned char	yes;
83  	unsigned short	no;
84  };
85  
86  enum {
87  	INET_DIAG_BC_NOP,
88  	INET_DIAG_BC_JMP,
89  	INET_DIAG_BC_S_GE,
90  	INET_DIAG_BC_S_LE,
91  	INET_DIAG_BC_D_GE,
92  	INET_DIAG_BC_D_LE,
93  	INET_DIAG_BC_AUTO,
94  	INET_DIAG_BC_S_COND,
95  	INET_DIAG_BC_D_COND,
96  	INET_DIAG_BC_DEV_COND,   /* u32 ifindex */
97  	INET_DIAG_BC_MARK_COND,
98  	INET_DIAG_BC_S_EQ,
99  	INET_DIAG_BC_D_EQ,
100  	INET_DIAG_BC_CGROUP_COND,   /* u64 cgroup v2 ID */
101  };
102  
103  struct inet_diag_hostcond {
104  	__u8	family;
105  	__u8	prefix_len;
106  	int	port;
107  	__be32	addr[];
108  };
109  
110  struct inet_diag_markcond {
111  	__u32 mark;
112  	__u32 mask;
113  };
114  
115  /* Base info structure. It contains socket identity (addrs/ports/cookie)
116   * and, alas, the information shown by netstat. */
117  struct inet_diag_msg {
118  	__u8	idiag_family;
119  	__u8	idiag_state;
120  	__u8	idiag_timer;
121  	__u8	idiag_retrans;
122  
123  	struct inet_diag_sockid id;
124  
125  	__u32	idiag_expires;
126  	__u32	idiag_rqueue;
127  	__u32	idiag_wqueue;
128  	__u32	idiag_uid;
129  	__u32	idiag_inode;
130  };
131  
132  /* Extensions */
133  
134  enum {
135  	INET_DIAG_NONE,
136  	INET_DIAG_MEMINFO,
137  	INET_DIAG_INFO,
138  	INET_DIAG_VEGASINFO,
139  	INET_DIAG_CONG,
140  	INET_DIAG_TOS,
141  	INET_DIAG_TCLASS,
142  	INET_DIAG_SKMEMINFO,
143  	INET_DIAG_SHUTDOWN,
144  
145  	/*
146  	 * Next extensions cannot be requested in struct inet_diag_req_v2:
147  	 * its field idiag_ext has only 8 bits.
148  	 */
149  
150  	INET_DIAG_DCTCPINFO,	/* request as INET_DIAG_VEGASINFO */
151  	INET_DIAG_PROTOCOL,	/* response attribute only */
152  	INET_DIAG_SKV6ONLY,
153  	INET_DIAG_LOCALS,
154  	INET_DIAG_PEERS,
155  	INET_DIAG_PAD,
156  	INET_DIAG_MARK,		/* only with CAP_NET_ADMIN */
157  	INET_DIAG_BBRINFO,	/* request as INET_DIAG_VEGASINFO */
158  	INET_DIAG_CLASS_ID,	/* request as INET_DIAG_TCLASS */
159  	INET_DIAG_MD5SIG,
160  	INET_DIAG_ULP_INFO,
161  	INET_DIAG_SK_BPF_STORAGES,
162  	INET_DIAG_CGROUP_ID,
163  	INET_DIAG_SOCKOPT,
164  	__INET_DIAG_MAX,
165  };
166  
167  #define INET_DIAG_MAX (__INET_DIAG_MAX - 1)
168  
169  enum {
170  	INET_ULP_INFO_UNSPEC,
171  	INET_ULP_INFO_NAME,
172  	INET_ULP_INFO_TLS,
173  	INET_ULP_INFO_MPTCP,
174  	__INET_ULP_INFO_MAX,
175  };
176  #define INET_ULP_INFO_MAX (__INET_ULP_INFO_MAX - 1)
177  
178  /* INET_DIAG_MEM */
179  
180  struct inet_diag_meminfo {
181  	__u32	idiag_rmem;
182  	__u32	idiag_wmem;
183  	__u32	idiag_fmem;
184  	__u32	idiag_tmem;
185  };
186  
187  /* INET_DIAG_SOCKOPT */
188  
189  struct inet_diag_sockopt {
190  	__u8	recverr:1,
191  		is_icsk:1,
192  		freebind:1,
193  		hdrincl:1,
194  		mc_loop:1,
195  		transparent:1,
196  		mc_all:1,
197  		nodefrag:1;
198  	__u8	bind_address_no_port:1,
199  		recverr_rfc4884:1,
200  		defer_connect:1,
201  		unused:5;
202  };
203  
204  /* INET_DIAG_VEGASINFO */
205  
206  struct tcpvegas_info {
207  	__u32	tcpv_enabled;
208  	__u32	tcpv_rttcnt;
209  	__u32	tcpv_rtt;
210  	__u32	tcpv_minrtt;
211  };
212  
213  /* INET_DIAG_DCTCPINFO */
214  
215  struct tcp_dctcp_info {
216  	__u16	dctcp_enabled;
217  	__u16	dctcp_ce_state;
218  	__u32	dctcp_alpha;
219  	__u32	dctcp_ab_ecn;
220  	__u32	dctcp_ab_tot;
221  };
222  
223  /* INET_DIAG_BBRINFO */
224  
225  struct tcp_bbr_info {
226  	/* u64 bw: max-filtered BW (app throughput) estimate in Byte per sec: */
227  	__u32	bbr_bw_lo;		/* lower 32 bits of bw */
228  	__u32	bbr_bw_hi;		/* upper 32 bits of bw */
229  	__u32	bbr_min_rtt;		/* min-filtered RTT in uSec */
230  	__u32	bbr_pacing_gain;	/* pacing gain shifted left 8 bits */
231  	__u32	bbr_cwnd_gain;		/* cwnd gain shifted left 8 bits */
232  };
233  
234  union tcp_cc_info {
235  	struct tcpvegas_info	vegas;
236  	struct tcp_dctcp_info	dctcp;
237  	struct tcp_bbr_info	bbr;
238  };
239  #endif /* _UAPI_INET_DIAG_H_ */
240