| #ifndef _TCP_DIAG_H_ | 
 | #define _TCP_DIAG_H_ 1 | 
 |  | 
 | /* Just some random number */ | 
 | #define TCPDIAG_GETSOCK 18 | 
 |  | 
 | /* Socket identity */ | 
 | struct tcpdiag_sockid | 
 | { | 
 | 	__u16	tcpdiag_sport; | 
 | 	__u16	tcpdiag_dport; | 
 | 	__u32	tcpdiag_src[4]; | 
 | 	__u32	tcpdiag_dst[4]; | 
 | 	__u32	tcpdiag_if; | 
 | 	__u32	tcpdiag_cookie[2]; | 
 | #define TCPDIAG_NOCOOKIE (~0U) | 
 | }; | 
 |  | 
 | /* Request structure */ | 
 |  | 
 | struct tcpdiagreq | 
 | { | 
 | 	__u8	tcpdiag_family;		/* Family of addresses. */ | 
 | 	__u8	tcpdiag_src_len; | 
 | 	__u8	tcpdiag_dst_len; | 
 | 	__u8	tcpdiag_ext;		/* Query extended information */ | 
 |  | 
 | 	struct tcpdiag_sockid id; | 
 |  | 
 | 	__u32	tcpdiag_states;		/* States to dump */ | 
 | 	__u32	tcpdiag_dbs;		/* Tables to dump (NI) */ | 
 | }; | 
 |  | 
 | enum | 
 | { | 
 | 	TCPDIAG_REQ_NONE, | 
 | 	TCPDIAG_REQ_BYTECODE, | 
 | }; | 
 |  | 
 | #define TCPDIAG_REQ_MAX TCPDIAG_REQ_BYTECODE | 
 |  | 
 | /* 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 tcpdiag_bc_op | 
 | { | 
 | 	unsigned char	code; | 
 | 	unsigned char	yes; | 
 | 	unsigned short	no; | 
 | }; | 
 |  | 
 | enum | 
 | { | 
 | 	TCPDIAG_BC_NOP, | 
 | 	TCPDIAG_BC_JMP, | 
 | 	TCPDIAG_BC_S_GE, | 
 | 	TCPDIAG_BC_S_LE, | 
 | 	TCPDIAG_BC_D_GE, | 
 | 	TCPDIAG_BC_D_LE, | 
 | 	TCPDIAG_BC_AUTO, | 
 | 	TCPDIAG_BC_S_COND, | 
 | 	TCPDIAG_BC_D_COND, | 
 | }; | 
 |  | 
 | struct tcpdiag_hostcond | 
 | { | 
 | 	__u8	family; | 
 | 	__u8	prefix_len; | 
 | 	int	port; | 
 | 	__u32	addr[0]; | 
 | }; | 
 |  | 
 | /* Base info structure. It contains socket identity (addrs/ports/cookie) | 
 |  * and, alas, the information shown by netstat. */ | 
 | struct tcpdiagmsg | 
 | { | 
 | 	__u8	tcpdiag_family; | 
 | 	__u8	tcpdiag_state; | 
 | 	__u8	tcpdiag_timer; | 
 | 	__u8	tcpdiag_retrans; | 
 |  | 
 | 	struct tcpdiag_sockid id; | 
 |  | 
 | 	__u32	tcpdiag_expires; | 
 | 	__u32	tcpdiag_rqueue; | 
 | 	__u32	tcpdiag_wqueue; | 
 | 	__u32	tcpdiag_uid; | 
 | 	__u32	tcpdiag_inode; | 
 | }; | 
 |  | 
 | /* Extensions */ | 
 |  | 
 | enum | 
 | { | 
 | 	TCPDIAG_NONE, | 
 | 	TCPDIAG_MEMINFO, | 
 | 	TCPDIAG_INFO, | 
 | 	TCPDIAG_VEGASINFO, | 
 | 	TCPDIAG_CONG, | 
 | }; | 
 |  | 
 | #define TCPDIAG_MAX TCPDIAG_CONG | 
 |  | 
 |  | 
 | /* TCPDIAG_MEM */ | 
 |  | 
 | struct tcpdiag_meminfo | 
 | { | 
 | 	__u32	tcpdiag_rmem; | 
 | 	__u32	tcpdiag_wmem; | 
 | 	__u32	tcpdiag_fmem; | 
 | 	__u32	tcpdiag_tmem; | 
 | }; | 
 |  | 
 | /* TCPDIAG_VEGASINFO */ | 
 |  | 
 | struct tcpvegas_info { | 
 | 	__u32	tcpv_enabled; | 
 | 	__u32	tcpv_rttcnt; | 
 | 	__u32	tcpv_rtt; | 
 | 	__u32	tcpv_minrtt; | 
 | }; | 
 |  | 
 | #endif /* _TCP_DIAG_H_ */ |