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_MAX, 69 }; 70 71 #define INET_DIAG_REQ_MAX (__INET_DIAG_REQ_MAX - 1) 72 73 /* Bytecode is sequence of 4 byte commands followed by variable arguments. 74 * All the commands identified by "code" are conditional jumps forward: 75 * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be 76 * length of the command and its arguments. 77 */ 78 79 struct inet_diag_bc_op { 80 unsigned char code; 81 unsigned char yes; 82 unsigned short no; 83 }; 84 85 enum { 86 INET_DIAG_BC_NOP, 87 INET_DIAG_BC_JMP, 88 INET_DIAG_BC_S_GE, 89 INET_DIAG_BC_S_LE, 90 INET_DIAG_BC_D_GE, 91 INET_DIAG_BC_D_LE, 92 INET_DIAG_BC_AUTO, 93 INET_DIAG_BC_S_COND, 94 INET_DIAG_BC_D_COND, 95 INET_DIAG_BC_DEV_COND, /* u32 ifindex */ 96 INET_DIAG_BC_MARK_COND, 97 INET_DIAG_BC_S_EQ, 98 INET_DIAG_BC_D_EQ, 99 }; 100 101 struct inet_diag_hostcond { 102 __u8 family; 103 __u8 prefix_len; 104 int port; 105 __be32 addr[0]; 106 }; 107 108 struct inet_diag_markcond { 109 __u32 mark; 110 __u32 mask; 111 }; 112 113 /* Base info structure. It contains socket identity (addrs/ports/cookie) 114 * and, alas, the information shown by netstat. */ 115 struct inet_diag_msg { 116 __u8 idiag_family; 117 __u8 idiag_state; 118 __u8 idiag_timer; 119 __u8 idiag_retrans; 120 121 struct inet_diag_sockid id; 122 123 __u32 idiag_expires; 124 __u32 idiag_rqueue; 125 __u32 idiag_wqueue; 126 __u32 idiag_uid; 127 __u32 idiag_inode; 128 }; 129 130 /* Extensions */ 131 132 enum { 133 INET_DIAG_NONE, 134 INET_DIAG_MEMINFO, 135 INET_DIAG_INFO, 136 INET_DIAG_VEGASINFO, 137 INET_DIAG_CONG, 138 INET_DIAG_TOS, 139 INET_DIAG_TCLASS, 140 INET_DIAG_SKMEMINFO, 141 INET_DIAG_SHUTDOWN, 142 143 /* 144 * Next extenstions cannot be requested in struct inet_diag_req_v2: 145 * its field idiag_ext has only 8 bits. 146 */ 147 148 INET_DIAG_DCTCPINFO, /* request as INET_DIAG_VEGASINFO */ 149 INET_DIAG_PROTOCOL, /* response attribute only */ 150 INET_DIAG_SKV6ONLY, 151 INET_DIAG_LOCALS, 152 INET_DIAG_PEERS, 153 INET_DIAG_PAD, 154 INET_DIAG_MARK, /* only with CAP_NET_ADMIN */ 155 INET_DIAG_BBRINFO, /* request as INET_DIAG_VEGASINFO */ 156 INET_DIAG_CLASS_ID, /* request as INET_DIAG_TCLASS */ 157 INET_DIAG_MD5SIG, 158 INET_DIAG_ULP_INFO, 159 INET_DIAG_SK_BPF_STORAGES, 160 __INET_DIAG_MAX, 161 }; 162 163 #define INET_DIAG_MAX (__INET_DIAG_MAX - 1) 164 165 enum { 166 INET_ULP_INFO_UNSPEC, 167 INET_ULP_INFO_NAME, 168 INET_ULP_INFO_TLS, 169 INET_ULP_INFO_MPTCP, 170 __INET_ULP_INFO_MAX, 171 }; 172 #define INET_ULP_INFO_MAX (__INET_ULP_INFO_MAX - 1) 173 174 /* INET_DIAG_MEM */ 175 176 struct inet_diag_meminfo { 177 __u32 idiag_rmem; 178 __u32 idiag_wmem; 179 __u32 idiag_fmem; 180 __u32 idiag_tmem; 181 }; 182 183 /* INET_DIAG_VEGASINFO */ 184 185 struct tcpvegas_info { 186 __u32 tcpv_enabled; 187 __u32 tcpv_rttcnt; 188 __u32 tcpv_rtt; 189 __u32 tcpv_minrtt; 190 }; 191 192 /* INET_DIAG_DCTCPINFO */ 193 194 struct tcp_dctcp_info { 195 __u16 dctcp_enabled; 196 __u16 dctcp_ce_state; 197 __u32 dctcp_alpha; 198 __u32 dctcp_ab_ecn; 199 __u32 dctcp_ab_tot; 200 }; 201 202 /* INET_DIAG_BBRINFO */ 203 204 struct tcp_bbr_info { 205 /* u64 bw: max-filtered BW (app throughput) estimate in Byte per sec: */ 206 __u32 bbr_bw_lo; /* lower 32 bits of bw */ 207 __u32 bbr_bw_hi; /* upper 32 bits of bw */ 208 __u32 bbr_min_rtt; /* min-filtered RTT in uSec */ 209 __u32 bbr_pacing_gain; /* pacing gain shifted left 8 bits */ 210 __u32 bbr_cwnd_gain; /* cwnd gain shifted left 8 bits */ 211 }; 212 213 union tcp_cc_info { 214 struct tcpvegas_info vegas; 215 struct tcp_dctcp_info dctcp; 216 struct tcp_bbr_info bbr; 217 }; 218 #endif /* _UAPI_INET_DIAG_H_ */ 219