Home | History | Annotate | Download | only in misc
      1 /*
      2  * ss.c		"sockstat", socket statistics
      3  *
      4  *		This program is free software; you can redistribute it and/or
      5  *		modify it under the terms of the GNU General Public License
      6  *		as published by the Free Software Foundation; either version
      7  *		2 of the License, or (at your option) any later version.
      8  *
      9  * Authors:	Alexey Kuznetsov, <kuznet (at) ms2.inr.ac.ru>
     10  */
     11 
     12 #include <stdio.h>
     13 #include <stdlib.h>
     14 #include <unistd.h>
     15 #include <syslog.h>
     16 #include <fcntl.h>
     17 #include <sys/ioctl.h>
     18 #include <sys/socket.h>
     19 #include <sys/uio.h>
     20 #include <netinet/in.h>
     21 #include <string.h>
     22 #include <errno.h>
     23 #include <netdb.h>
     24 #include <arpa/inet.h>
     25 #include <dirent.h>
     26 #include <fnmatch.h>
     27 #include <getopt.h>
     28 #include <stdbool.h>
     29 #include <limits.h>
     30 
     31 #include "utils.h"
     32 #include "rt_names.h"
     33 #include "ll_map.h"
     34 #include "libnetlink.h"
     35 #include "namespace.h"
     36 #include "SNAPSHOT.h"
     37 
     38 #include <linux/tcp.h>
     39 #include <linux/sock_diag.h>
     40 #include <linux/inet_diag.h>
     41 #include <linux/unix_diag.h>
     42 #include <linux/netdevice.h>	/* for MAX_ADDR_LEN */
     43 #include <linux/filter.h>
     44 #include <linux/packet_diag.h>
     45 #include <linux/netlink_diag.h>
     46 #include <linux/sctp.h>
     47 
     48 #define MAGIC_SEQ 123456
     49 
     50 #define DIAG_REQUEST(_req, _r)						    \
     51 	struct {							    \
     52 		struct nlmsghdr nlh;					    \
     53 		_r;							    \
     54 	} _req = {							    \
     55 		.nlh = {						    \
     56 			.nlmsg_type = SOCK_DIAG_BY_FAMILY,		    \
     57 			.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST,\
     58 			.nlmsg_seq = MAGIC_SEQ,				    \
     59 			.nlmsg_len = sizeof(_req),			    \
     60 		},							    \
     61 	}
     62 
     63 #if HAVE_SELINUX
     64 #include <selinux/selinux.h>
     65 #else
     66 /* Stubs for SELinux functions */
     67 static int is_selinux_enabled(void)
     68 {
     69 	return -1;
     70 }
     71 
     72 static int getpidcon(pid_t pid, char **context)
     73 {
     74 	*context = NULL;
     75 	return -1;
     76 }
     77 
     78 static int getfilecon(char *path, char **context)
     79 {
     80 	*context = NULL;
     81 	return -1;
     82 }
     83 
     84 static int security_get_initial_context(char *name,  char **context)
     85 {
     86 	*context = NULL;
     87 	return -1;
     88 }
     89 #endif
     90 
     91 int resolve_services = 1;
     92 int preferred_family = AF_UNSPEC;
     93 int show_options;
     94 int show_details;
     95 int show_users;
     96 int show_mem;
     97 int show_tcpinfo;
     98 int show_bpf;
     99 int show_proc_ctx;
    100 int show_sock_ctx;
    101 int show_header = 1;
    102 int follow_events;
    103 int sctp_ino;
    104 
    105 int netid_width;
    106 int state_width;
    107 int addr_width;
    108 int serv_width;
    109 char *odd_width_pad = "";
    110 
    111 static const char *TCP_PROTO = "tcp";
    112 static const char *SCTP_PROTO = "sctp";
    113 static const char *UDP_PROTO = "udp";
    114 static const char *RAW_PROTO = "raw";
    115 static const char *dg_proto;
    116 
    117 enum {
    118 	TCP_DB,
    119 	DCCP_DB,
    120 	UDP_DB,
    121 	RAW_DB,
    122 	UNIX_DG_DB,
    123 	UNIX_ST_DB,
    124 	UNIX_SQ_DB,
    125 	PACKET_DG_DB,
    126 	PACKET_R_DB,
    127 	NETLINK_DB,
    128 	SCTP_DB,
    129 	MAX_DB
    130 };
    131 
    132 #define PACKET_DBM ((1<<PACKET_DG_DB)|(1<<PACKET_R_DB))
    133 #define UNIX_DBM ((1<<UNIX_DG_DB)|(1<<UNIX_ST_DB)|(1<<UNIX_SQ_DB))
    134 #define ALL_DB ((1<<MAX_DB)-1)
    135 #define INET_L4_DBM ((1<<TCP_DB)|(1<<UDP_DB)|(1<<DCCP_DB)|(1<<SCTP_DB))
    136 #define INET_DBM (INET_L4_DBM | (1<<RAW_DB))
    137 
    138 enum {
    139 	SS_UNKNOWN,
    140 	SS_ESTABLISHED,
    141 	SS_SYN_SENT,
    142 	SS_SYN_RECV,
    143 	SS_FIN_WAIT1,
    144 	SS_FIN_WAIT2,
    145 	SS_TIME_WAIT,
    146 	SS_CLOSE,
    147 	SS_CLOSE_WAIT,
    148 	SS_LAST_ACK,
    149 	SS_LISTEN,
    150 	SS_CLOSING,
    151 	SS_MAX
    152 };
    153 
    154 enum {
    155 	SCTP_STATE_CLOSED		= 0,
    156 	SCTP_STATE_COOKIE_WAIT		= 1,
    157 	SCTP_STATE_COOKIE_ECHOED	= 2,
    158 	SCTP_STATE_ESTABLISHED		= 3,
    159 	SCTP_STATE_SHUTDOWN_PENDING	= 4,
    160 	SCTP_STATE_SHUTDOWN_SENT	= 5,
    161 	SCTP_STATE_SHUTDOWN_RECEIVED	= 6,
    162 	SCTP_STATE_SHUTDOWN_ACK_SENT	= 7,
    163 };
    164 
    165 #define SS_ALL ((1 << SS_MAX) - 1)
    166 #define SS_CONN (SS_ALL & ~((1<<SS_LISTEN)|(1<<SS_CLOSE)|(1<<SS_TIME_WAIT)|(1<<SS_SYN_RECV)))
    167 
    168 #include "ssfilter.h"
    169 
    170 struct filter {
    171 	int dbs;
    172 	int states;
    173 	int families;
    174 	struct ssfilter *f;
    175 	bool kill;
    176 };
    177 
    178 static const struct filter default_dbs[MAX_DB] = {
    179 	[TCP_DB] = {
    180 		.states   = SS_CONN,
    181 		.families = (1 << AF_INET) | (1 << AF_INET6),
    182 	},
    183 	[DCCP_DB] = {
    184 		.states   = SS_CONN,
    185 		.families = (1 << AF_INET) | (1 << AF_INET6),
    186 	},
    187 	[UDP_DB] = {
    188 		.states   = (1 << SS_ESTABLISHED),
    189 		.families = (1 << AF_INET) | (1 << AF_INET6),
    190 	},
    191 	[RAW_DB] = {
    192 		.states   = (1 << SS_ESTABLISHED),
    193 		.families = (1 << AF_INET) | (1 << AF_INET6),
    194 	},
    195 	[UNIX_DG_DB] = {
    196 		.states   = (1 << SS_CLOSE),
    197 		.families = (1 << AF_UNIX),
    198 	},
    199 	[UNIX_ST_DB] = {
    200 		.states   = SS_CONN,
    201 		.families = (1 << AF_UNIX),
    202 	},
    203 	[UNIX_SQ_DB] = {
    204 		.states   = SS_CONN,
    205 		.families = (1 << AF_UNIX),
    206 	},
    207 	[PACKET_DG_DB] = {
    208 		.states   = (1 << SS_CLOSE),
    209 		.families = (1 << AF_PACKET),
    210 	},
    211 	[PACKET_R_DB] = {
    212 		.states   = (1 << SS_CLOSE),
    213 		.families = (1 << AF_PACKET),
    214 	},
    215 	[NETLINK_DB] = {
    216 		.states   = (1 << SS_CLOSE),
    217 		.families = (1 << AF_NETLINK),
    218 	},
    219 	[SCTP_DB] = {
    220 		.states   = SS_CONN,
    221 		.families = (1 << AF_INET) | (1 << AF_INET6),
    222 	},
    223 };
    224 
    225 static const struct filter default_afs[AF_MAX] = {
    226 	[AF_INET] = {
    227 		.dbs    = INET_DBM,
    228 		.states = SS_CONN,
    229 	},
    230 	[AF_INET6] = {
    231 		.dbs    = INET_DBM,
    232 		.states = SS_CONN,
    233 	},
    234 	[AF_UNIX] = {
    235 		.dbs    = UNIX_DBM,
    236 		.states = SS_CONN,
    237 	},
    238 	[AF_PACKET] = {
    239 		.dbs    = PACKET_DBM,
    240 		.states = (1 << SS_CLOSE),
    241 	},
    242 	[AF_NETLINK] = {
    243 		.dbs    = (1 << NETLINK_DB),
    244 		.states = (1 << SS_CLOSE),
    245 	},
    246 };
    247 
    248 static int do_default = 1;
    249 static struct filter current_filter;
    250 
    251 static void filter_db_set(struct filter *f, int db)
    252 {
    253 	f->states   |= default_dbs[db].states;
    254 	f->dbs	    |= 1 << db;
    255 	do_default   = 0;
    256 }
    257 
    258 static void filter_af_set(struct filter *f, int af)
    259 {
    260 	f->states	   |= default_afs[af].states;
    261 	f->families	   |= 1 << af;
    262 	do_default	    = 0;
    263 	preferred_family    = af;
    264 }
    265 
    266 static int filter_af_get(struct filter *f, int af)
    267 {
    268 	return f->families & (1 << af);
    269 }
    270 
    271 static void filter_default_dbs(struct filter *f)
    272 {
    273 	filter_db_set(f, UDP_DB);
    274 	filter_db_set(f, DCCP_DB);
    275 	filter_db_set(f, TCP_DB);
    276 	filter_db_set(f, RAW_DB);
    277 	filter_db_set(f, UNIX_ST_DB);
    278 	filter_db_set(f, UNIX_DG_DB);
    279 	filter_db_set(f, UNIX_SQ_DB);
    280 	filter_db_set(f, PACKET_R_DB);
    281 	filter_db_set(f, PACKET_DG_DB);
    282 	filter_db_set(f, NETLINK_DB);
    283 	filter_db_set(f, SCTP_DB);
    284 }
    285 
    286 static void filter_states_set(struct filter *f, int states)
    287 {
    288 	if (states)
    289 		f->states = states;
    290 }
    291 
    292 static void filter_merge_defaults(struct filter *f)
    293 {
    294 	int db;
    295 	int af;
    296 
    297 	for (db = 0; db < MAX_DB; db++) {
    298 		if (!(f->dbs & (1 << db)))
    299 			continue;
    300 
    301 		if (!(default_dbs[db].families & f->families))
    302 			f->families |= default_dbs[db].families;
    303 	}
    304 	for (af = 0; af < AF_MAX; af++) {
    305 		if (!(f->families & (1 << af)))
    306 			continue;
    307 
    308 		if (!(default_afs[af].dbs & f->dbs))
    309 			f->dbs |= default_afs[af].dbs;
    310 	}
    311 }
    312 
    313 static FILE *generic_proc_open(const char *env, const char *name)
    314 {
    315 	const char *p = getenv(env);
    316 	char store[128];
    317 
    318 	if (!p) {
    319 		p = getenv("PROC_ROOT") ? : "/proc";
    320 		snprintf(store, sizeof(store)-1, "%s/%s", p, name);
    321 		p = store;
    322 	}
    323 
    324 	return fopen(p, "r");
    325 }
    326 #define net_tcp_open()		generic_proc_open("PROC_NET_TCP", "net/tcp")
    327 #define net_tcp6_open()		generic_proc_open("PROC_NET_TCP6", "net/tcp6")
    328 #define net_udp_open()		generic_proc_open("PROC_NET_UDP", "net/udp")
    329 #define net_udp6_open()		generic_proc_open("PROC_NET_UDP6", "net/udp6")
    330 #define net_raw_open()		generic_proc_open("PROC_NET_RAW", "net/raw")
    331 #define net_raw6_open()		generic_proc_open("PROC_NET_RAW6", "net/raw6")
    332 #define net_unix_open()		generic_proc_open("PROC_NET_UNIX", "net/unix")
    333 #define net_packet_open()	generic_proc_open("PROC_NET_PACKET", \
    334 							"net/packet")
    335 #define net_netlink_open()	generic_proc_open("PROC_NET_NETLINK", \
    336 							"net/netlink")
    337 #define slabinfo_open()		generic_proc_open("PROC_SLABINFO", "slabinfo")
    338 #define net_sockstat_open()	generic_proc_open("PROC_NET_SOCKSTAT", \
    339 							"net/sockstat")
    340 #define net_sockstat6_open()	generic_proc_open("PROC_NET_SOCKSTAT6", \
    341 							"net/sockstat6")
    342 #define net_snmp_open()		generic_proc_open("PROC_NET_SNMP", "net/snmp")
    343 #define ephemeral_ports_open()	generic_proc_open("PROC_IP_LOCAL_PORT_RANGE", \
    344 					"sys/net/ipv4/ip_local_port_range")
    345 
    346 struct user_ent {
    347 	struct user_ent	*next;
    348 	unsigned int	ino;
    349 	int		pid;
    350 	int		fd;
    351 	char		*process;
    352 	char		*process_ctx;
    353 	char		*socket_ctx;
    354 };
    355 
    356 #define USER_ENT_HASH_SIZE	256
    357 struct user_ent *user_ent_hash[USER_ENT_HASH_SIZE];
    358 
    359 static int user_ent_hashfn(unsigned int ino)
    360 {
    361 	int val = (ino >> 24) ^ (ino >> 16) ^ (ino >> 8) ^ ino;
    362 
    363 	return val & (USER_ENT_HASH_SIZE - 1);
    364 }
    365 
    366 static void user_ent_add(unsigned int ino, char *process,
    367 					int pid, int fd,
    368 					char *proc_ctx,
    369 					char *sock_ctx)
    370 {
    371 	struct user_ent *p, **pp;
    372 
    373 	p = malloc(sizeof(struct user_ent));
    374 	if (!p) {
    375 		fprintf(stderr, "ss: failed to malloc buffer\n");
    376 		abort();
    377 	}
    378 	p->next = NULL;
    379 	p->ino = ino;
    380 	p->pid = pid;
    381 	p->fd = fd;
    382 	p->process = strdup(process);
    383 	p->process_ctx = strdup(proc_ctx);
    384 	p->socket_ctx = strdup(sock_ctx);
    385 
    386 	pp = &user_ent_hash[user_ent_hashfn(ino)];
    387 	p->next = *pp;
    388 	*pp = p;
    389 }
    390 
    391 static void user_ent_destroy(void)
    392 {
    393 	struct user_ent *p, *p_next;
    394 	int cnt = 0;
    395 
    396 	while (cnt != USER_ENT_HASH_SIZE) {
    397 		p = user_ent_hash[cnt];
    398 		while (p) {
    399 			free(p->process);
    400 			free(p->process_ctx);
    401 			free(p->socket_ctx);
    402 			p_next = p->next;
    403 			free(p);
    404 			p = p_next;
    405 		}
    406 		cnt++;
    407 	}
    408 }
    409 
    410 static void user_ent_hash_build(void)
    411 {
    412 	const char *root = getenv("PROC_ROOT") ? : "/proc/";
    413 	struct dirent *d;
    414 	char name[1024];
    415 	int nameoff;
    416 	DIR *dir;
    417 	char *pid_context;
    418 	char *sock_context;
    419 	const char *no_ctx = "unavailable";
    420 	static int user_ent_hash_build_init;
    421 
    422 	/* If show_users & show_proc_ctx set only do this once */
    423 	if (user_ent_hash_build_init != 0)
    424 		return;
    425 
    426 	user_ent_hash_build_init = 1;
    427 
    428 	strlcpy(name, root, sizeof(name));
    429 
    430 	if (strlen(name) == 0 || name[strlen(name)-1] != '/')
    431 		strcat(name, "/");
    432 
    433 	nameoff = strlen(name);
    434 
    435 	dir = opendir(name);
    436 	if (!dir)
    437 		return;
    438 
    439 	while ((d = readdir(dir)) != NULL) {
    440 		struct dirent *d1;
    441 		char process[16];
    442 		char *p;
    443 		int pid, pos;
    444 		DIR *dir1;
    445 		char crap;
    446 
    447 		if (sscanf(d->d_name, "%d%c", &pid, &crap) != 1)
    448 			continue;
    449 
    450 		if (getpidcon(pid, &pid_context) != 0)
    451 			pid_context = strdup(no_ctx);
    452 
    453 		snprintf(name + nameoff, sizeof(name) - nameoff, "%d/fd/", pid);
    454 		pos = strlen(name);
    455 		if ((dir1 = opendir(name)) == NULL) {
    456 			free(pid_context);
    457 			continue;
    458 		}
    459 
    460 		process[0] = '\0';
    461 		p = process;
    462 
    463 		while ((d1 = readdir(dir1)) != NULL) {
    464 			const char *pattern = "socket:[";
    465 			unsigned int ino;
    466 			char lnk[64];
    467 			int fd;
    468 			ssize_t link_len;
    469 			char tmp[1024];
    470 
    471 			if (sscanf(d1->d_name, "%d%c", &fd, &crap) != 1)
    472 				continue;
    473 
    474 			snprintf(name+pos, sizeof(name) - pos, "%d", fd);
    475 
    476 			link_len = readlink(name, lnk, sizeof(lnk)-1);
    477 			if (link_len == -1)
    478 				continue;
    479 			lnk[link_len] = '\0';
    480 
    481 			if (strncmp(lnk, pattern, strlen(pattern)))
    482 				continue;
    483 
    484 			sscanf(lnk, "socket:[%u]", &ino);
    485 
    486 			snprintf(tmp, sizeof(tmp), "%s/%d/fd/%s",
    487 					root, pid, d1->d_name);
    488 
    489 			if (getfilecon(tmp, &sock_context) <= 0)
    490 				sock_context = strdup(no_ctx);
    491 
    492 			if (*p == '\0') {
    493 				FILE *fp;
    494 
    495 				snprintf(tmp, sizeof(tmp), "%s/%d/stat",
    496 					root, pid);
    497 				if ((fp = fopen(tmp, "r")) != NULL) {
    498 					if (fscanf(fp, "%*d (%[^)])", p) < 1)
    499 						; /* ignore */
    500 					fclose(fp);
    501 				}
    502 			}
    503 			user_ent_add(ino, p, pid, fd,
    504 					pid_context, sock_context);
    505 			free(sock_context);
    506 		}
    507 		free(pid_context);
    508 		closedir(dir1);
    509 	}
    510 	closedir(dir);
    511 }
    512 
    513 enum entry_types {
    514 	USERS,
    515 	PROC_CTX,
    516 	PROC_SOCK_CTX
    517 };
    518 
    519 #define ENTRY_BUF_SIZE 512
    520 static int find_entry(unsigned int ino, char **buf, int type)
    521 {
    522 	struct user_ent *p;
    523 	int cnt = 0;
    524 	char *ptr;
    525 	char *new_buf;
    526 	int len, new_buf_len;
    527 	int buf_used = 0;
    528 	int buf_len = 0;
    529 
    530 	if (!ino)
    531 		return 0;
    532 
    533 	p = user_ent_hash[user_ent_hashfn(ino)];
    534 	ptr = *buf = NULL;
    535 	while (p) {
    536 		if (p->ino != ino)
    537 			goto next;
    538 
    539 		while (1) {
    540 			ptr = *buf + buf_used;
    541 			switch (type) {
    542 			case USERS:
    543 				len = snprintf(ptr, buf_len - buf_used,
    544 					"(\"%s\",pid=%d,fd=%d),",
    545 					p->process, p->pid, p->fd);
    546 				break;
    547 			case PROC_CTX:
    548 				len = snprintf(ptr, buf_len - buf_used,
    549 					"(\"%s\",pid=%d,proc_ctx=%s,fd=%d),",
    550 					p->process, p->pid,
    551 					p->process_ctx, p->fd);
    552 				break;
    553 			case PROC_SOCK_CTX:
    554 				len = snprintf(ptr, buf_len - buf_used,
    555 					"(\"%s\",pid=%d,proc_ctx=%s,fd=%d,sock_ctx=%s),",
    556 					p->process, p->pid,
    557 					p->process_ctx, p->fd,
    558 					p->socket_ctx);
    559 				break;
    560 			default:
    561 				fprintf(stderr, "ss: invalid type: %d\n", type);
    562 				abort();
    563 			}
    564 
    565 			if (len < 0 || len >= buf_len - buf_used) {
    566 				new_buf_len = buf_len + ENTRY_BUF_SIZE;
    567 				new_buf = realloc(*buf, new_buf_len);
    568 				if (!new_buf) {
    569 					fprintf(stderr, "ss: failed to malloc buffer\n");
    570 					abort();
    571 				}
    572 				*buf = new_buf;
    573 				buf_len = new_buf_len;
    574 				continue;
    575 			} else {
    576 				buf_used += len;
    577 				break;
    578 			}
    579 		}
    580 		cnt++;
    581 next:
    582 		p = p->next;
    583 	}
    584 	if (buf_used) {
    585 		ptr = *buf + buf_used;
    586 		ptr[-1] = '\0';
    587 	}
    588 	return cnt;
    589 }
    590 
    591 /* Get stats from slab */
    592 
    593 struct slabstat {
    594 	int socks;
    595 	int tcp_ports;
    596 	int tcp_tws;
    597 	int tcp_syns;
    598 	int skbs;
    599 };
    600 
    601 static struct slabstat slabstat;
    602 
    603 static int get_slabstat(struct slabstat *s)
    604 {
    605 	char buf[256];
    606 	FILE *fp;
    607 	int cnt;
    608 	static int slabstat_valid;
    609 	static const char * const slabstat_ids[] = {
    610 		"sock",
    611 		"tcp_bind_bucket",
    612 		"tcp_tw_bucket",
    613 		"tcp_open_request",
    614 		"skbuff_head_cache",
    615 	};
    616 
    617 	if (slabstat_valid)
    618 		return 0;
    619 
    620 	memset(s, 0, sizeof(*s));
    621 
    622 	fp = slabinfo_open();
    623 	if (!fp)
    624 		return -1;
    625 
    626 	cnt = sizeof(*s)/sizeof(int);
    627 
    628 	if (!fgets(buf, sizeof(buf), fp)) {
    629 		fclose(fp);
    630 		return -1;
    631 	}
    632 	while (fgets(buf, sizeof(buf), fp) != NULL) {
    633 		int i;
    634 
    635 		for (i = 0; i < ARRAY_SIZE(slabstat_ids); i++) {
    636 			if (memcmp(buf, slabstat_ids[i], strlen(slabstat_ids[i])) == 0) {
    637 				sscanf(buf, "%*s%d", ((int *)s) + i);
    638 				cnt--;
    639 				break;
    640 			}
    641 		}
    642 		if (cnt <= 0)
    643 			break;
    644 	}
    645 
    646 	slabstat_valid = 1;
    647 
    648 	fclose(fp);
    649 	return 0;
    650 }
    651 
    652 static unsigned long long cookie_sk_get(const uint32_t *cookie)
    653 {
    654 	return (((unsigned long long)cookie[1] << 31) << 1) | cookie[0];
    655 }
    656 
    657 static const char *sctp_sstate_name[] = {
    658 	[SCTP_STATE_CLOSED] = "CLOSED",
    659 	[SCTP_STATE_COOKIE_WAIT] = "COOKIE_WAIT",
    660 	[SCTP_STATE_COOKIE_ECHOED] = "COOKIE_ECHOED",
    661 	[SCTP_STATE_ESTABLISHED] = "ESTAB",
    662 	[SCTP_STATE_SHUTDOWN_PENDING] = "SHUTDOWN_PENDING",
    663 	[SCTP_STATE_SHUTDOWN_SENT] = "SHUTDOWN_SENT",
    664 	[SCTP_STATE_SHUTDOWN_RECEIVED] = "SHUTDOWN_RECEIVED",
    665 	[SCTP_STATE_SHUTDOWN_ACK_SENT] = "ACK_SENT",
    666 };
    667 
    668 struct sockstat {
    669 	struct sockstat	   *next;
    670 	unsigned int	    type;
    671 	uint16_t	    prot;
    672 	uint16_t	    raw_prot;
    673 	inet_prefix	    local;
    674 	inet_prefix	    remote;
    675 	int		    lport;
    676 	int		    rport;
    677 	int		    state;
    678 	int		    rq, wq;
    679 	unsigned int ino;
    680 	unsigned int uid;
    681 	int		    refcnt;
    682 	unsigned int	    iface;
    683 	unsigned long long  sk;
    684 	char *name;
    685 	char *peer_name;
    686 	__u32		    mark;
    687 };
    688 
    689 struct dctcpstat {
    690 	unsigned int	ce_state;
    691 	unsigned int	alpha;
    692 	unsigned int	ab_ecn;
    693 	unsigned int	ab_tot;
    694 	bool		enabled;
    695 };
    696 
    697 struct tcpstat {
    698 	struct sockstat	    ss;
    699 	unsigned int	    timer;
    700 	unsigned int	    timeout;
    701 	int		    probes;
    702 	char		    cong_alg[16];
    703 	double		    rto, ato, rtt, rttvar;
    704 	int		    qack, ssthresh, backoff;
    705 	double		    send_bps;
    706 	int		    snd_wscale;
    707 	int		    rcv_wscale;
    708 	int		    mss;
    709 	int		    rcv_mss;
    710 	int		    advmss;
    711 	unsigned int	    cwnd;
    712 	unsigned int	    lastsnd;
    713 	unsigned int	    lastrcv;
    714 	unsigned int	    lastack;
    715 	double		    pacing_rate;
    716 	double		    pacing_rate_max;
    717 	double		    delivery_rate;
    718 	unsigned long long  bytes_acked;
    719 	unsigned long long  bytes_received;
    720 	unsigned int	    segs_out;
    721 	unsigned int	    segs_in;
    722 	unsigned int	    data_segs_out;
    723 	unsigned int	    data_segs_in;
    724 	unsigned int	    unacked;
    725 	unsigned int	    retrans;
    726 	unsigned int	    retrans_total;
    727 	unsigned int	    lost;
    728 	unsigned int	    sacked;
    729 	unsigned int	    fackets;
    730 	unsigned int	    reordering;
    731 	unsigned int	    not_sent;
    732 	double		    rcv_rtt;
    733 	double		    min_rtt;
    734 	int		    rcv_space;
    735 	unsigned long long  busy_time;
    736 	unsigned long long  rwnd_limited;
    737 	unsigned long long  sndbuf_limited;
    738 	bool		    has_ts_opt;
    739 	bool		    has_sack_opt;
    740 	bool		    has_ecn_opt;
    741 	bool		    has_ecnseen_opt;
    742 	bool		    has_fastopen_opt;
    743 	bool		    has_wscale_opt;
    744 	bool		    app_limited;
    745 	struct dctcpstat    *dctcp;
    746 	struct tcp_bbr_info *bbr_info;
    747 };
    748 
    749 /* SCTP assocs share the same inode number with their parent endpoint. So if we
    750  * have seen the inode number before, it must be an assoc instead of the next
    751  * endpoint. */
    752 static bool is_sctp_assoc(struct sockstat *s, const char *sock_name)
    753 {
    754 	if (strcmp(sock_name, "sctp"))
    755 		return false;
    756 	if (!sctp_ino || sctp_ino != s->ino)
    757 		return false;
    758 	return true;
    759 }
    760 
    761 static const char *unix_netid_name(int type)
    762 {
    763 	switch (type) {
    764 	case SOCK_STREAM:
    765 		return "u_str";
    766 	case SOCK_SEQPACKET:
    767 		return "u_seq";
    768 	case SOCK_DGRAM:
    769 	default:
    770 		return "u_dgr";
    771 	}
    772 }
    773 
    774 static const char *proto_name(int protocol)
    775 {
    776 	switch (protocol) {
    777 	case 0:
    778 		return "raw";
    779 	case IPPROTO_UDP:
    780 		return "udp";
    781 	case IPPROTO_TCP:
    782 		return "tcp";
    783 	case IPPROTO_SCTP:
    784 		return "sctp";
    785 	case IPPROTO_DCCP:
    786 		return "dccp";
    787 	case IPPROTO_ICMPV6:
    788 		return "icmp6";
    789 	}
    790 
    791 	return "???";
    792 }
    793 
    794 static void sock_state_print(struct sockstat *s)
    795 {
    796 	const char *sock_name;
    797 	static const char * const sstate_name[] = {
    798 		"UNKNOWN",
    799 		[SS_ESTABLISHED] = "ESTAB",
    800 		[SS_SYN_SENT] = "SYN-SENT",
    801 		[SS_SYN_RECV] = "SYN-RECV",
    802 		[SS_FIN_WAIT1] = "FIN-WAIT-1",
    803 		[SS_FIN_WAIT2] = "FIN-WAIT-2",
    804 		[SS_TIME_WAIT] = "TIME-WAIT",
    805 		[SS_CLOSE] = "UNCONN",
    806 		[SS_CLOSE_WAIT] = "CLOSE-WAIT",
    807 		[SS_LAST_ACK] = "LAST-ACK",
    808 		[SS_LISTEN] =	"LISTEN",
    809 		[SS_CLOSING] = "CLOSING",
    810 	};
    811 
    812 	switch (s->local.family) {
    813 	case AF_UNIX:
    814 		sock_name = unix_netid_name(s->type);
    815 		break;
    816 	case AF_INET:
    817 	case AF_INET6:
    818 		sock_name = proto_name(s->type);
    819 		break;
    820 	case AF_PACKET:
    821 		sock_name = s->type == SOCK_RAW ? "p_raw" : "p_dgr";
    822 		break;
    823 	case AF_NETLINK:
    824 		sock_name = "nl";
    825 		break;
    826 	default:
    827 		sock_name = "unknown";
    828 	}
    829 
    830 	if (netid_width)
    831 		printf("%-*s ", netid_width,
    832 		       is_sctp_assoc(s, sock_name) ? "" : sock_name);
    833 	if (state_width) {
    834 		if (is_sctp_assoc(s, sock_name))
    835 			printf("`- %-*s ", state_width - 3,
    836 			       sctp_sstate_name[s->state]);
    837 		else
    838 			printf("%-*s ", state_width, sstate_name[s->state]);
    839 	}
    840 
    841 	printf("%-6d %-6d %s", s->rq, s->wq, odd_width_pad);
    842 }
    843 
    844 static void sock_details_print(struct sockstat *s)
    845 {
    846 	if (s->uid)
    847 		printf(" uid:%u", s->uid);
    848 
    849 	printf(" ino:%u", s->ino);
    850 	printf(" sk:%llx", s->sk);
    851 
    852 	if (s->mark)
    853 		printf(" fwmark:0x%x", s->mark);
    854 }
    855 
    856 static void sock_addr_print_width(int addr_len, const char *addr, char *delim,
    857 		int port_len, const char *port, const char *ifname)
    858 {
    859 	if (ifname) {
    860 		printf("%*s%%%s%s%-*s ", addr_len, addr, ifname, delim,
    861 				port_len, port);
    862 	} else {
    863 		printf("%*s%s%-*s ", addr_len, addr, delim, port_len, port);
    864 	}
    865 }
    866 
    867 static void sock_addr_print(const char *addr, char *delim, const char *port,
    868 		const char *ifname)
    869 {
    870 	sock_addr_print_width(addr_width, addr, delim, serv_width, port, ifname);
    871 }
    872 
    873 static const char *print_ms_timer(unsigned int timeout)
    874 {
    875 	static char buf[64];
    876 	int secs, msecs, minutes;
    877 
    878 	secs = timeout/1000;
    879 	minutes = secs/60;
    880 	secs = secs%60;
    881 	msecs = timeout%1000;
    882 	buf[0] = 0;
    883 	if (minutes) {
    884 		msecs = 0;
    885 		snprintf(buf, sizeof(buf)-16, "%dmin", minutes);
    886 		if (minutes > 9)
    887 			secs = 0;
    888 	}
    889 	if (secs) {
    890 		if (secs > 9)
    891 			msecs = 0;
    892 		sprintf(buf+strlen(buf), "%d%s", secs, msecs ? "." : "sec");
    893 	}
    894 	if (msecs)
    895 		sprintf(buf+strlen(buf), "%03dms", msecs);
    896 	return buf;
    897 }
    898 
    899 struct scache {
    900 	struct scache *next;
    901 	int port;
    902 	char *name;
    903 	const char *proto;
    904 };
    905 
    906 struct scache *rlist;
    907 
    908 static void init_service_resolver(void)
    909 {
    910 	char buf[128];
    911 	FILE *fp = popen("/usr/sbin/rpcinfo -p 2>/dev/null", "r");
    912 
    913 	if (!fp)
    914 		return;
    915 
    916 	if (!fgets(buf, sizeof(buf), fp)) {
    917 		pclose(fp);
    918 		return;
    919 	}
    920 	while (fgets(buf, sizeof(buf), fp) != NULL) {
    921 		unsigned int progn, port;
    922 		char proto[128], prog[128] = "rpc.";
    923 		struct scache *c;
    924 
    925 		if (sscanf(buf, "%u %*d %s %u %s",
    926 			   &progn, proto, &port, prog+4) != 4)
    927 			continue;
    928 
    929 		if (!(c = malloc(sizeof(*c))))
    930 			continue;
    931 
    932 		c->port = port;
    933 		c->name = strdup(prog);
    934 		if (strcmp(proto, TCP_PROTO) == 0)
    935 			c->proto = TCP_PROTO;
    936 		else if (strcmp(proto, UDP_PROTO) == 0)
    937 			c->proto = UDP_PROTO;
    938 		else if (strcmp(proto, SCTP_PROTO) == 0)
    939 			c->proto = SCTP_PROTO;
    940 		else
    941 			c->proto = NULL;
    942 		c->next = rlist;
    943 		rlist = c;
    944 	}
    945 	pclose(fp);
    946 }
    947 
    948 /* Even do not try default linux ephemeral port ranges:
    949  * default /etc/services contains so much of useless crap
    950  * wouldbe "allocated" to this area that resolution
    951  * is really harmful. I shrug each time when seeing
    952  * "socks" or "cfinger" in dumps.
    953  */
    954 static int is_ephemeral(int port)
    955 {
    956 	static int min = 0, max;
    957 
    958 	if (!min) {
    959 		FILE *f = ephemeral_ports_open();
    960 
    961 		if (!f || fscanf(f, "%d %d", &min, &max) < 2) {
    962 			min = 1024;
    963 			max = 4999;
    964 		}
    965 		if (f)
    966 			fclose(f);
    967 	}
    968 	return port >= min && port <= max;
    969 }
    970 
    971 
    972 static const char *__resolve_service(int port)
    973 {
    974 	struct scache *c;
    975 
    976 	for (c = rlist; c; c = c->next) {
    977 		if (c->port == port && c->proto == dg_proto)
    978 			return c->name;
    979 	}
    980 
    981 	if (!is_ephemeral(port)) {
    982 		static int notfirst;
    983 		struct servent *se;
    984 
    985 		if (!notfirst) {
    986 			setservent(1);
    987 			notfirst = 1;
    988 		}
    989 		se = getservbyport(htons(port), dg_proto);
    990 		if (se)
    991 			return se->s_name;
    992 	}
    993 
    994 	return NULL;
    995 }
    996 
    997 #define SCACHE_BUCKETS 1024
    998 static struct scache *cache_htab[SCACHE_BUCKETS];
    999 
   1000 static const char *resolve_service(int port)
   1001 {
   1002 	static char buf[128];
   1003 	struct scache *c;
   1004 	const char *res;
   1005 	int hash;
   1006 
   1007 	if (port == 0) {
   1008 		buf[0] = '*';
   1009 		buf[1] = 0;
   1010 		return buf;
   1011 	}
   1012 
   1013 	if (!resolve_services)
   1014 		goto do_numeric;
   1015 
   1016 	if (dg_proto == RAW_PROTO)
   1017 		return inet_proto_n2a(port, buf, sizeof(buf));
   1018 
   1019 
   1020 	hash = (port^(((unsigned long)dg_proto)>>2)) % SCACHE_BUCKETS;
   1021 
   1022 	for (c = cache_htab[hash]; c; c = c->next) {
   1023 		if (c->port == port && c->proto == dg_proto)
   1024 			goto do_cache;
   1025 	}
   1026 
   1027 	c = malloc(sizeof(*c));
   1028 	if (!c)
   1029 		goto do_numeric;
   1030 	res = __resolve_service(port);
   1031 	c->port = port;
   1032 	c->name = res ? strdup(res) : NULL;
   1033 	c->proto = dg_proto;
   1034 	c->next = cache_htab[hash];
   1035 	cache_htab[hash] = c;
   1036 
   1037 do_cache:
   1038 	if (c->name)
   1039 		return c->name;
   1040 
   1041 do_numeric:
   1042 	sprintf(buf, "%u", port);
   1043 	return buf;
   1044 }
   1045 
   1046 static void inet_addr_print(const inet_prefix *a, int port,
   1047 			    unsigned int ifindex, bool v6only)
   1048 {
   1049 	char buf[1024];
   1050 	const char *ap = buf;
   1051 	int est_len = addr_width;
   1052 	const char *ifname = NULL;
   1053 
   1054 	if (a->family == AF_INET) {
   1055 		ap = format_host(AF_INET, 4, a->data);
   1056 	} else {
   1057 		if (!v6only &&
   1058 		    !memcmp(a->data, &in6addr_any, sizeof(in6addr_any))) {
   1059 			buf[0] = '*';
   1060 			buf[1] = 0;
   1061 		} else {
   1062 			ap = format_host(a->family, 16, a->data);
   1063 
   1064 			/* Numeric IPv6 addresses should be bracketed */
   1065 			if (strchr(ap, ':')) {
   1066 				snprintf(buf, sizeof(buf),
   1067 					 "[%s]", ap);
   1068 				ap = buf;
   1069 			}
   1070 
   1071 			est_len = strlen(ap);
   1072 			if (est_len <= addr_width)
   1073 				est_len = addr_width;
   1074 			else
   1075 				est_len = addr_width + ((est_len-addr_width+3)/4)*4;
   1076 		}
   1077 	}
   1078 
   1079 	if (ifindex) {
   1080 		ifname   = ll_index_to_name(ifindex);
   1081 		est_len -= strlen(ifname) + 1;  /* +1 for percent char */
   1082 		if (est_len < 0)
   1083 			est_len = 0;
   1084 	}
   1085 
   1086 	sock_addr_print_width(est_len, ap, ":", serv_width, resolve_service(port),
   1087 			ifname);
   1088 }
   1089 
   1090 struct aafilter {
   1091 	inet_prefix	addr;
   1092 	int		port;
   1093 	unsigned int	iface;
   1094 	__u32		mark;
   1095 	__u32		mask;
   1096 	struct aafilter *next;
   1097 };
   1098 
   1099 static int inet2_addr_match(const inet_prefix *a, const inet_prefix *p,
   1100 			    int plen)
   1101 {
   1102 	if (!inet_addr_match(a, p, plen))
   1103 		return 0;
   1104 
   1105 	/* Cursed "v4 mapped" addresses: v4 mapped socket matches
   1106 	 * pure IPv4 rule, but v4-mapped rule selects only v4-mapped
   1107 	 * sockets. Fair? */
   1108 	if (p->family == AF_INET && a->family == AF_INET6) {
   1109 		if (a->data[0] == 0 && a->data[1] == 0 &&
   1110 		    a->data[2] == htonl(0xffff)) {
   1111 			inet_prefix tmp = *a;
   1112 
   1113 			tmp.data[0] = a->data[3];
   1114 			return inet_addr_match(&tmp, p, plen);
   1115 		}
   1116 	}
   1117 	return 1;
   1118 }
   1119 
   1120 static int unix_match(const inet_prefix *a, const inet_prefix *p)
   1121 {
   1122 	char *addr, *pattern;
   1123 
   1124 	memcpy(&addr, a->data, sizeof(addr));
   1125 	memcpy(&pattern, p->data, sizeof(pattern));
   1126 	if (pattern == NULL)
   1127 		return 1;
   1128 	if (addr == NULL)
   1129 		addr = "";
   1130 	return !fnmatch(pattern, addr, 0);
   1131 }
   1132 
   1133 static int run_ssfilter(struct ssfilter *f, struct sockstat *s)
   1134 {
   1135 	switch (f->type) {
   1136 		case SSF_S_AUTO:
   1137 	{
   1138 		if (s->local.family == AF_UNIX) {
   1139 			char *p;
   1140 
   1141 			memcpy(&p, s->local.data, sizeof(p));
   1142 			return p == NULL || (p[0] == '@' && strlen(p) == 6 &&
   1143 					     strspn(p+1, "0123456789abcdef") == 5);
   1144 		}
   1145 		if (s->local.family == AF_PACKET)
   1146 			return s->lport == 0 && s->local.data[0] == 0;
   1147 		if (s->local.family == AF_NETLINK)
   1148 			return s->lport < 0;
   1149 
   1150 		return is_ephemeral(s->lport);
   1151 	}
   1152 		case SSF_DCOND:
   1153 	{
   1154 		struct aafilter *a = (void *)f->pred;
   1155 
   1156 		if (a->addr.family == AF_UNIX)
   1157 			return unix_match(&s->remote, &a->addr);
   1158 		if (a->port != -1 && a->port != s->rport)
   1159 			return 0;
   1160 		if (a->addr.bitlen) {
   1161 			do {
   1162 				if (!inet2_addr_match(&s->remote, &a->addr, a->addr.bitlen))
   1163 					return 1;
   1164 			} while ((a = a->next) != NULL);
   1165 			return 0;
   1166 		}
   1167 		return 1;
   1168 	}
   1169 		case SSF_SCOND:
   1170 	{
   1171 		struct aafilter *a = (void *)f->pred;
   1172 
   1173 		if (a->addr.family == AF_UNIX)
   1174 			return unix_match(&s->local, &a->addr);
   1175 		if (a->port != -1 && a->port != s->lport)
   1176 			return 0;
   1177 		if (a->addr.bitlen) {
   1178 			do {
   1179 				if (!inet2_addr_match(&s->local, &a->addr, a->addr.bitlen))
   1180 					return 1;
   1181 			} while ((a = a->next) != NULL);
   1182 			return 0;
   1183 		}
   1184 		return 1;
   1185 	}
   1186 		case SSF_D_GE:
   1187 	{
   1188 		struct aafilter *a = (void *)f->pred;
   1189 
   1190 		return s->rport >= a->port;
   1191 	}
   1192 		case SSF_D_LE:
   1193 	{
   1194 		struct aafilter *a = (void *)f->pred;
   1195 
   1196 		return s->rport <= a->port;
   1197 	}
   1198 		case SSF_S_GE:
   1199 	{
   1200 		struct aafilter *a = (void *)f->pred;
   1201 
   1202 		return s->lport >= a->port;
   1203 	}
   1204 		case SSF_S_LE:
   1205 	{
   1206 		struct aafilter *a = (void *)f->pred;
   1207 
   1208 		return s->lport <= a->port;
   1209 	}
   1210 		case SSF_DEVCOND:
   1211 	{
   1212 		struct aafilter *a = (void *)f->pred;
   1213 
   1214 		return s->iface == a->iface;
   1215 	}
   1216 		case SSF_MARKMASK:
   1217 	{
   1218 		struct aafilter *a = (void *)f->pred;
   1219 
   1220 		return (s->mark & a->mask) == a->mark;
   1221 	}
   1222 		/* Yup. It is recursion. Sorry. */
   1223 		case SSF_AND:
   1224 		return run_ssfilter(f->pred, s) && run_ssfilter(f->post, s);
   1225 		case SSF_OR:
   1226 		return run_ssfilter(f->pred, s) || run_ssfilter(f->post, s);
   1227 		case SSF_NOT:
   1228 		return !run_ssfilter(f->pred, s);
   1229 		default:
   1230 		abort();
   1231 	}
   1232 }
   1233 
   1234 /* Relocate external jumps by reloc. */
   1235 static void ssfilter_patch(char *a, int len, int reloc)
   1236 {
   1237 	while (len > 0) {
   1238 		struct inet_diag_bc_op *op = (struct inet_diag_bc_op *)a;
   1239 
   1240 		if (op->no == len+4)
   1241 			op->no += reloc;
   1242 		len -= op->yes;
   1243 		a += op->yes;
   1244 	}
   1245 	if (len < 0)
   1246 		abort();
   1247 }
   1248 
   1249 static int ssfilter_bytecompile(struct ssfilter *f, char **bytecode)
   1250 {
   1251 	switch (f->type) {
   1252 		case SSF_S_AUTO:
   1253 	{
   1254 		if (!(*bytecode = malloc(4))) abort();
   1255 		((struct inet_diag_bc_op *)*bytecode)[0] = (struct inet_diag_bc_op){ INET_DIAG_BC_AUTO, 4, 8 };
   1256 		return 4;
   1257 	}
   1258 		case SSF_DCOND:
   1259 		case SSF_SCOND:
   1260 	{
   1261 		struct aafilter *a = (void *)f->pred;
   1262 		struct aafilter *b;
   1263 		char *ptr;
   1264 		int  code = (f->type == SSF_DCOND ? INET_DIAG_BC_D_COND : INET_DIAG_BC_S_COND);
   1265 		int len = 0;
   1266 
   1267 		for (b = a; b; b = b->next) {
   1268 			len += 4 + sizeof(struct inet_diag_hostcond);
   1269 			if (a->addr.family == AF_INET6)
   1270 				len += 16;
   1271 			else
   1272 				len += 4;
   1273 			if (b->next)
   1274 				len += 4;
   1275 		}
   1276 		if (!(ptr = malloc(len))) abort();
   1277 		*bytecode = ptr;
   1278 		for (b = a; b; b = b->next) {
   1279 			struct inet_diag_bc_op *op = (struct inet_diag_bc_op *)ptr;
   1280 			int alen = (a->addr.family == AF_INET6 ? 16 : 4);
   1281 			int oplen = alen + 4 + sizeof(struct inet_diag_hostcond);
   1282 			struct inet_diag_hostcond *cond = (struct inet_diag_hostcond *)(ptr+4);
   1283 
   1284 			*op = (struct inet_diag_bc_op){ code, oplen, oplen+4 };
   1285 			cond->family = a->addr.family;
   1286 			cond->port = a->port;
   1287 			cond->prefix_len = a->addr.bitlen;
   1288 			memcpy(cond->addr, a->addr.data, alen);
   1289 			ptr += oplen;
   1290 			if (b->next) {
   1291 				op = (struct inet_diag_bc_op *)ptr;
   1292 				*op = (struct inet_diag_bc_op){ INET_DIAG_BC_JMP, 4, len - (ptr-*bytecode)};
   1293 				ptr += 4;
   1294 			}
   1295 		}
   1296 		return ptr - *bytecode;
   1297 	}
   1298 		case SSF_D_GE:
   1299 	{
   1300 		struct aafilter *x = (void *)f->pred;
   1301 
   1302 		if (!(*bytecode = malloc(8))) abort();
   1303 		((struct inet_diag_bc_op *)*bytecode)[0] = (struct inet_diag_bc_op){ INET_DIAG_BC_D_GE, 8, 12 };
   1304 		((struct inet_diag_bc_op *)*bytecode)[1] = (struct inet_diag_bc_op){ 0, 0, x->port };
   1305 		return 8;
   1306 	}
   1307 		case SSF_D_LE:
   1308 	{
   1309 		struct aafilter *x = (void *)f->pred;
   1310 
   1311 		if (!(*bytecode = malloc(8))) abort();
   1312 		((struct inet_diag_bc_op *)*bytecode)[0] = (struct inet_diag_bc_op){ INET_DIAG_BC_D_LE, 8, 12 };
   1313 		((struct inet_diag_bc_op *)*bytecode)[1] = (struct inet_diag_bc_op){ 0, 0, x->port };
   1314 		return 8;
   1315 	}
   1316 		case SSF_S_GE:
   1317 	{
   1318 		struct aafilter *x = (void *)f->pred;
   1319 
   1320 		if (!(*bytecode = malloc(8))) abort();
   1321 		((struct inet_diag_bc_op *)*bytecode)[0] = (struct inet_diag_bc_op){ INET_DIAG_BC_S_GE, 8, 12 };
   1322 		((struct inet_diag_bc_op *)*bytecode)[1] = (struct inet_diag_bc_op){ 0, 0, x->port };
   1323 		return 8;
   1324 	}
   1325 		case SSF_S_LE:
   1326 	{
   1327 		struct aafilter *x = (void *)f->pred;
   1328 
   1329 		if (!(*bytecode = malloc(8))) abort();
   1330 		((struct inet_diag_bc_op *)*bytecode)[0] = (struct inet_diag_bc_op){ INET_DIAG_BC_S_LE, 8, 12 };
   1331 		((struct inet_diag_bc_op *)*bytecode)[1] = (struct inet_diag_bc_op){ 0, 0, x->port };
   1332 		return 8;
   1333 	}
   1334 
   1335 		case SSF_AND:
   1336 	{
   1337 		char *a1 = NULL, *a2 = NULL, *a;
   1338 		int l1, l2;
   1339 
   1340 		l1 = ssfilter_bytecompile(f->pred, &a1);
   1341 		l2 = ssfilter_bytecompile(f->post, &a2);
   1342 		if (!l1 || !l2) {
   1343 			free(a1);
   1344 			free(a2);
   1345 			return 0;
   1346 		}
   1347 		if (!(a = malloc(l1+l2))) abort();
   1348 		memcpy(a, a1, l1);
   1349 		memcpy(a+l1, a2, l2);
   1350 		free(a1); free(a2);
   1351 		ssfilter_patch(a, l1, l2);
   1352 		*bytecode = a;
   1353 		return l1+l2;
   1354 	}
   1355 		case SSF_OR:
   1356 	{
   1357 		char *a1 = NULL, *a2 = NULL, *a;
   1358 		int l1, l2;
   1359 
   1360 		l1 = ssfilter_bytecompile(f->pred, &a1);
   1361 		l2 = ssfilter_bytecompile(f->post, &a2);
   1362 		if (!l1 || !l2) {
   1363 			free(a1);
   1364 			free(a2);
   1365 			return 0;
   1366 		}
   1367 		if (!(a = malloc(l1+l2+4))) abort();
   1368 		memcpy(a, a1, l1);
   1369 		memcpy(a+l1+4, a2, l2);
   1370 		free(a1); free(a2);
   1371 		*(struct inet_diag_bc_op *)(a+l1) = (struct inet_diag_bc_op){ INET_DIAG_BC_JMP, 4, l2+4 };
   1372 		*bytecode = a;
   1373 		return l1+l2+4;
   1374 	}
   1375 		case SSF_NOT:
   1376 	{
   1377 		char *a1 = NULL, *a;
   1378 		int l1;
   1379 
   1380 		l1 = ssfilter_bytecompile(f->pred, &a1);
   1381 		if (!l1) {
   1382 			free(a1);
   1383 			return 0;
   1384 		}
   1385 		if (!(a = malloc(l1+4))) abort();
   1386 		memcpy(a, a1, l1);
   1387 		free(a1);
   1388 		*(struct inet_diag_bc_op *)(a+l1) = (struct inet_diag_bc_op){ INET_DIAG_BC_JMP, 4, 8 };
   1389 		*bytecode = a;
   1390 		return l1+4;
   1391 	}
   1392 		case SSF_DEVCOND:
   1393 	{
   1394 		/* bytecompile for SSF_DEVCOND not supported yet */
   1395 		return 0;
   1396 	}
   1397 		case SSF_MARKMASK:
   1398 	{
   1399 		struct aafilter *a = (void *)f->pred;
   1400 		struct instr {
   1401 			struct inet_diag_bc_op op;
   1402 			struct inet_diag_markcond cond;
   1403 		};
   1404 		int inslen = sizeof(struct instr);
   1405 
   1406 		if (!(*bytecode = malloc(inslen))) abort();
   1407 		((struct instr *)*bytecode)[0] = (struct instr) {
   1408 			{ INET_DIAG_BC_MARK_COND, inslen, inslen + 4 },
   1409 			{ a->mark, a->mask},
   1410 		};
   1411 
   1412 		return inslen;
   1413 	}
   1414 		default:
   1415 		abort();
   1416 	}
   1417 }
   1418 
   1419 static int remember_he(struct aafilter *a, struct hostent *he)
   1420 {
   1421 	char **ptr = he->h_addr_list;
   1422 	int cnt = 0;
   1423 	int len;
   1424 
   1425 	if (he->h_addrtype == AF_INET)
   1426 		len = 4;
   1427 	else if (he->h_addrtype == AF_INET6)
   1428 		len = 16;
   1429 	else
   1430 		return 0;
   1431 
   1432 	while (*ptr) {
   1433 		struct aafilter *b = a;
   1434 
   1435 		if (a->addr.bitlen) {
   1436 			if ((b = malloc(sizeof(*b))) == NULL)
   1437 				return cnt;
   1438 			*b = *a;
   1439 			a->next = b;
   1440 		}
   1441 		memcpy(b->addr.data, *ptr, len);
   1442 		b->addr.bytelen = len;
   1443 		b->addr.bitlen = len*8;
   1444 		b->addr.family = he->h_addrtype;
   1445 		ptr++;
   1446 		cnt++;
   1447 	}
   1448 	return cnt;
   1449 }
   1450 
   1451 static int get_dns_host(struct aafilter *a, const char *addr, int fam)
   1452 {
   1453 	static int notfirst;
   1454 	int cnt = 0;
   1455 	struct hostent *he;
   1456 
   1457 	a->addr.bitlen = 0;
   1458 	if (!notfirst) {
   1459 		sethostent(1);
   1460 		notfirst = 1;
   1461 	}
   1462 	he = gethostbyname2(addr, fam == AF_UNSPEC ? AF_INET : fam);
   1463 	if (he)
   1464 		cnt = remember_he(a, he);
   1465 	if (fam == AF_UNSPEC) {
   1466 		he = gethostbyname2(addr, AF_INET6);
   1467 		if (he)
   1468 			cnt += remember_he(a, he);
   1469 	}
   1470 	return !cnt;
   1471 }
   1472 
   1473 static int xll_initted;
   1474 
   1475 static void xll_init(void)
   1476 {
   1477 	struct rtnl_handle rth;
   1478 
   1479 	if (rtnl_open(&rth, 0) < 0)
   1480 		exit(1);
   1481 
   1482 	ll_init_map(&rth);
   1483 	rtnl_close(&rth);
   1484 	xll_initted = 1;
   1485 }
   1486 
   1487 static const char *xll_index_to_name(int index)
   1488 {
   1489 	if (!xll_initted)
   1490 		xll_init();
   1491 	return ll_index_to_name(index);
   1492 }
   1493 
   1494 static int xll_name_to_index(const char *dev)
   1495 {
   1496 	if (!xll_initted)
   1497 		xll_init();
   1498 	return ll_name_to_index(dev);
   1499 }
   1500 
   1501 void *parse_devcond(char *name)
   1502 {
   1503 	struct aafilter a = { .iface = 0 };
   1504 	struct aafilter *res;
   1505 
   1506 	a.iface = xll_name_to_index(name);
   1507 	if (a.iface == 0) {
   1508 		char *end;
   1509 		unsigned long n;
   1510 
   1511 		n = strtoul(name, &end, 0);
   1512 		if (!end || end == name || *end || n > UINT_MAX)
   1513 			return NULL;
   1514 
   1515 		a.iface = n;
   1516 	}
   1517 
   1518 	res = malloc(sizeof(*res));
   1519 	*res = a;
   1520 
   1521 	return res;
   1522 }
   1523 
   1524 void *parse_hostcond(char *addr, bool is_port)
   1525 {
   1526 	char *port = NULL;
   1527 	struct aafilter a = { .port = -1 };
   1528 	struct aafilter *res;
   1529 	int fam = preferred_family;
   1530 	struct filter *f = &current_filter;
   1531 
   1532 	if (fam == AF_UNIX || strncmp(addr, "unix:", 5) == 0) {
   1533 		char *p;
   1534 
   1535 		a.addr.family = AF_UNIX;
   1536 		if (strncmp(addr, "unix:", 5) == 0)
   1537 			addr += 5;
   1538 		p = strdup(addr);
   1539 		a.addr.bitlen = 8*strlen(p);
   1540 		memcpy(a.addr.data, &p, sizeof(p));
   1541 		fam = AF_UNIX;
   1542 		goto out;
   1543 	}
   1544 
   1545 	if (fam == AF_PACKET || strncmp(addr, "link:", 5) == 0) {
   1546 		a.addr.family = AF_PACKET;
   1547 		a.addr.bitlen = 0;
   1548 		if (strncmp(addr, "link:", 5) == 0)
   1549 			addr += 5;
   1550 		port = strchr(addr, ':');
   1551 		if (port) {
   1552 			*port = 0;
   1553 			if (port[1] && strcmp(port+1, "*")) {
   1554 				if (get_integer(&a.port, port+1, 0)) {
   1555 					if ((a.port = xll_name_to_index(port+1)) <= 0)
   1556 						return NULL;
   1557 				}
   1558 			}
   1559 		}
   1560 		if (addr[0] && strcmp(addr, "*")) {
   1561 			unsigned short tmp;
   1562 
   1563 			a.addr.bitlen = 32;
   1564 			if (ll_proto_a2n(&tmp, addr))
   1565 				return NULL;
   1566 			a.addr.data[0] = ntohs(tmp);
   1567 		}
   1568 		fam = AF_PACKET;
   1569 		goto out;
   1570 	}
   1571 
   1572 	if (fam == AF_NETLINK || strncmp(addr, "netlink:", 8) == 0) {
   1573 		a.addr.family = AF_NETLINK;
   1574 		a.addr.bitlen = 0;
   1575 		if (strncmp(addr, "netlink:", 8) == 0)
   1576 			addr += 8;
   1577 		port = strchr(addr, ':');
   1578 		if (port) {
   1579 			*port = 0;
   1580 			if (port[1] && strcmp(port+1, "*")) {
   1581 				if (get_integer(&a.port, port+1, 0)) {
   1582 					if (strcmp(port+1, "kernel") == 0)
   1583 						a.port = 0;
   1584 					else
   1585 						return NULL;
   1586 				}
   1587 			}
   1588 		}
   1589 		if (addr[0] && strcmp(addr, "*")) {
   1590 			a.addr.bitlen = 32;
   1591 			if (nl_proto_a2n(&a.addr.data[0], addr) == -1)
   1592 				return NULL;
   1593 		}
   1594 		fam = AF_NETLINK;
   1595 		goto out;
   1596 	}
   1597 
   1598 	if (fam == AF_INET || !strncmp(addr, "inet:", 5)) {
   1599 		fam = AF_INET;
   1600 		if (!strncmp(addr, "inet:", 5))
   1601 			addr += 5;
   1602 	} else if (fam == AF_INET6 || !strncmp(addr, "inet6:", 6)) {
   1603 		fam = AF_INET6;
   1604 		if (!strncmp(addr, "inet6:", 6))
   1605 			addr += 6;
   1606 	}
   1607 
   1608 	/* URL-like literal [] */
   1609 	if (addr[0] == '[') {
   1610 		addr++;
   1611 		if ((port = strchr(addr, ']')) == NULL)
   1612 			return NULL;
   1613 		*port++ = 0;
   1614 	} else if (addr[0] == '*') {
   1615 		port = addr+1;
   1616 	} else {
   1617 		port = strrchr(strchr(addr, '/') ? : addr, ':');
   1618 	}
   1619 
   1620 	if (is_port)
   1621 		port = addr;
   1622 
   1623 	if (port && *port) {
   1624 		if (*port == ':')
   1625 			*port++ = 0;
   1626 
   1627 		if (*port && *port != '*') {
   1628 			if (get_integer(&a.port, port, 0)) {
   1629 				struct servent *se1 = NULL;
   1630 				struct servent *se2 = NULL;
   1631 
   1632 				if (current_filter.dbs&(1<<UDP_DB))
   1633 					se1 = getservbyname(port, UDP_PROTO);
   1634 				if (current_filter.dbs&(1<<TCP_DB))
   1635 					se2 = getservbyname(port, TCP_PROTO);
   1636 				if (se1 && se2 && se1->s_port != se2->s_port) {
   1637 					fprintf(stderr, "Error: ambiguous port \"%s\".\n", port);
   1638 					return NULL;
   1639 				}
   1640 				if (!se1)
   1641 					se1 = se2;
   1642 				if (se1) {
   1643 					a.port = ntohs(se1->s_port);
   1644 				} else {
   1645 					struct scache *s;
   1646 
   1647 					for (s = rlist; s; s = s->next) {
   1648 						if ((s->proto == UDP_PROTO &&
   1649 						     (current_filter.dbs&(1<<UDP_DB))) ||
   1650 						    (s->proto == TCP_PROTO &&
   1651 						     (current_filter.dbs&(1<<TCP_DB)))) {
   1652 							if (s->name && strcmp(s->name, port) == 0) {
   1653 								if (a.port > 0 && a.port != s->port) {
   1654 									fprintf(stderr, "Error: ambiguous port \"%s\".\n", port);
   1655 									return NULL;
   1656 								}
   1657 								a.port = s->port;
   1658 							}
   1659 						}
   1660 					}
   1661 					if (a.port <= 0) {
   1662 						fprintf(stderr, "Error: \"%s\" does not look like a port.\n", port);
   1663 						return NULL;
   1664 					}
   1665 				}
   1666 			}
   1667 		}
   1668 	}
   1669 	if (!is_port && *addr && *addr != '*') {
   1670 		if (get_prefix_1(&a.addr, addr, fam)) {
   1671 			if (get_dns_host(&a, addr, fam)) {
   1672 				fprintf(stderr, "Error: an inet prefix is expected rather than \"%s\".\n", addr);
   1673 				return NULL;
   1674 			}
   1675 		}
   1676 	}
   1677 
   1678 out:
   1679 	if (fam != AF_UNSPEC) {
   1680 		int states = f->states;
   1681 		f->families = 0;
   1682 		filter_af_set(f, fam);
   1683 		filter_states_set(f, states);
   1684 	}
   1685 
   1686 	res = malloc(sizeof(*res));
   1687 	if (res)
   1688 		memcpy(res, &a, sizeof(a));
   1689 	return res;
   1690 }
   1691 
   1692 void *parse_markmask(const char *markmask)
   1693 {
   1694 	struct aafilter a, *res;
   1695 
   1696 	if (strchr(markmask, '/')) {
   1697 		if (sscanf(markmask, "%i/%i", &a.mark, &a.mask) != 2)
   1698 			return NULL;
   1699 	} else {
   1700 		a.mask = 0xffffffff;
   1701 		if (sscanf(markmask, "%i", &a.mark) != 1)
   1702 			return NULL;
   1703 	}
   1704 
   1705 	res = malloc(sizeof(*res));
   1706 	if (res)
   1707 		memcpy(res, &a, sizeof(a));
   1708 	return res;
   1709 }
   1710 
   1711 static void proc_ctx_print(struct sockstat *s)
   1712 {
   1713 	char *buf;
   1714 
   1715 	if (show_proc_ctx || show_sock_ctx) {
   1716 		if (find_entry(s->ino, &buf,
   1717 				(show_proc_ctx & show_sock_ctx) ?
   1718 				PROC_SOCK_CTX : PROC_CTX) > 0) {
   1719 			printf(" users:(%s)", buf);
   1720 			free(buf);
   1721 		}
   1722 	} else if (show_users) {
   1723 		if (find_entry(s->ino, &buf, USERS) > 0) {
   1724 			printf(" users:(%s)", buf);
   1725 			free(buf);
   1726 		}
   1727 	}
   1728 }
   1729 
   1730 static void inet_stats_print(struct sockstat *s, bool v6only)
   1731 {
   1732 	sock_state_print(s);
   1733 
   1734 	inet_addr_print(&s->local, s->lport, s->iface, v6only);
   1735 	inet_addr_print(&s->remote, s->rport, 0, v6only);
   1736 
   1737 	proc_ctx_print(s);
   1738 }
   1739 
   1740 static int proc_parse_inet_addr(char *loc, char *rem, int family, struct
   1741 		sockstat * s)
   1742 {
   1743 	s->local.family = s->remote.family = family;
   1744 	if (family == AF_INET) {
   1745 		sscanf(loc, "%x:%x", s->local.data, (unsigned *)&s->lport);
   1746 		sscanf(rem, "%x:%x", s->remote.data, (unsigned *)&s->rport);
   1747 		s->local.bytelen = s->remote.bytelen = 4;
   1748 		return 0;
   1749 	} else {
   1750 		sscanf(loc, "%08x%08x%08x%08x:%x",
   1751 		       s->local.data,
   1752 		       s->local.data + 1,
   1753 		       s->local.data + 2,
   1754 		       s->local.data + 3,
   1755 		       &s->lport);
   1756 		sscanf(rem, "%08x%08x%08x%08x:%x",
   1757 		       s->remote.data,
   1758 		       s->remote.data + 1,
   1759 		       s->remote.data + 2,
   1760 		       s->remote.data + 3,
   1761 		       &s->rport);
   1762 		s->local.bytelen = s->remote.bytelen = 16;
   1763 		return 0;
   1764 	}
   1765 	return -1;
   1766 }
   1767 
   1768 static int proc_inet_split_line(char *line, char **loc, char **rem, char **data)
   1769 {
   1770 	char *p;
   1771 
   1772 	if ((p = strchr(line, ':')) == NULL)
   1773 		return -1;
   1774 
   1775 	*loc = p+2;
   1776 	if ((p = strchr(*loc, ':')) == NULL)
   1777 		return -1;
   1778 
   1779 	p[5] = 0;
   1780 	*rem = p+6;
   1781 	if ((p = strchr(*rem, ':')) == NULL)
   1782 		return -1;
   1783 
   1784 	p[5] = 0;
   1785 	*data = p+6;
   1786 	return 0;
   1787 }
   1788 
   1789 static char *sprint_bw(char *buf, double bw)
   1790 {
   1791 	if (bw > 1000000.)
   1792 		sprintf(buf, "%.1fM", bw / 1000000.);
   1793 	else if (bw > 1000.)
   1794 		sprintf(buf, "%.1fK", bw / 1000.);
   1795 	else
   1796 		sprintf(buf, "%g", bw);
   1797 
   1798 	return buf;
   1799 }
   1800 
   1801 static void sctp_stats_print(struct sctp_info *s)
   1802 {
   1803 	if (s->sctpi_tag)
   1804 		printf(" tag:%x", s->sctpi_tag);
   1805 	if (s->sctpi_state)
   1806 		printf(" state:%s", sctp_sstate_name[s->sctpi_state]);
   1807 	if (s->sctpi_rwnd)
   1808 		printf(" rwnd:%d", s->sctpi_rwnd);
   1809 	if (s->sctpi_unackdata)
   1810 		printf(" unackdata:%d", s->sctpi_unackdata);
   1811 	if (s->sctpi_penddata)
   1812 		printf(" penddata:%d", s->sctpi_penddata);
   1813 	if (s->sctpi_instrms)
   1814 		printf(" instrms:%d", s->sctpi_instrms);
   1815 	if (s->sctpi_outstrms)
   1816 		printf(" outstrms:%d", s->sctpi_outstrms);
   1817 	if (s->sctpi_inqueue)
   1818 		printf(" inqueue:%d", s->sctpi_inqueue);
   1819 	if (s->sctpi_outqueue)
   1820 		printf(" outqueue:%d", s->sctpi_outqueue);
   1821 	if (s->sctpi_overall_error)
   1822 		printf(" overerr:%d", s->sctpi_overall_error);
   1823 	if (s->sctpi_max_burst)
   1824 		printf(" maxburst:%d", s->sctpi_max_burst);
   1825 	if (s->sctpi_maxseg)
   1826 		printf(" maxseg:%d", s->sctpi_maxseg);
   1827 	if (s->sctpi_peer_rwnd)
   1828 		printf(" prwnd:%d", s->sctpi_peer_rwnd);
   1829 	if (s->sctpi_peer_tag)
   1830 		printf(" ptag:%x", s->sctpi_peer_tag);
   1831 	if (s->sctpi_peer_capable)
   1832 		printf(" pcapable:%d", s->sctpi_peer_capable);
   1833 	if (s->sctpi_peer_sack)
   1834 		printf(" psack:%d", s->sctpi_peer_sack);
   1835 	if (s->sctpi_s_autoclose)
   1836 		printf(" autoclose:%d", s->sctpi_s_autoclose);
   1837 	if (s->sctpi_s_adaptation_ind)
   1838 		printf(" adapind:%d", s->sctpi_s_adaptation_ind);
   1839 	if (s->sctpi_s_pd_point)
   1840 		printf(" pdpoint:%d", s->sctpi_s_pd_point);
   1841 	if (s->sctpi_s_nodelay)
   1842 		printf(" nodealy:%d", s->sctpi_s_nodelay);
   1843 	if (s->sctpi_s_disable_fragments)
   1844 		printf(" nofrag:%d", s->sctpi_s_disable_fragments);
   1845 	if (s->sctpi_s_v4mapped)
   1846 		printf(" v4mapped:%d", s->sctpi_s_v4mapped);
   1847 	if (s->sctpi_s_frag_interleave)
   1848 		printf(" fraginl:%d", s->sctpi_s_frag_interleave);
   1849 }
   1850 
   1851 static void tcp_stats_print(struct tcpstat *s)
   1852 {
   1853 	char b1[64];
   1854 
   1855 	if (s->has_ts_opt)
   1856 		printf(" ts");
   1857 	if (s->has_sack_opt)
   1858 		printf(" sack");
   1859 	if (s->has_ecn_opt)
   1860 		printf(" ecn");
   1861 	if (s->has_ecnseen_opt)
   1862 		printf(" ecnseen");
   1863 	if (s->has_fastopen_opt)
   1864 		printf(" fastopen");
   1865 	if (s->cong_alg[0])
   1866 		printf(" %s", s->cong_alg);
   1867 	if (s->has_wscale_opt)
   1868 		printf(" wscale:%d,%d", s->snd_wscale, s->rcv_wscale);
   1869 	if (s->rto)
   1870 		printf(" rto:%g", s->rto);
   1871 	if (s->backoff)
   1872 		printf(" backoff:%u", s->backoff);
   1873 	if (s->rtt)
   1874 		printf(" rtt:%g/%g", s->rtt, s->rttvar);
   1875 	if (s->ato)
   1876 		printf(" ato:%g", s->ato);
   1877 
   1878 	if (s->qack)
   1879 		printf(" qack:%d", s->qack);
   1880 	if (s->qack & 1)
   1881 		printf(" bidir");
   1882 
   1883 	if (s->mss)
   1884 		printf(" mss:%d", s->mss);
   1885 	if (s->rcv_mss)
   1886 		printf(" rcvmss:%d", s->rcv_mss);
   1887 	if (s->advmss)
   1888 		printf(" advmss:%d", s->advmss);
   1889 	if (s->cwnd)
   1890 		printf(" cwnd:%u", s->cwnd);
   1891 	if (s->ssthresh)
   1892 		printf(" ssthresh:%d", s->ssthresh);
   1893 
   1894 	if (s->bytes_acked)
   1895 		printf(" bytes_acked:%llu", s->bytes_acked);
   1896 	if (s->bytes_received)
   1897 		printf(" bytes_received:%llu", s->bytes_received);
   1898 	if (s->segs_out)
   1899 		printf(" segs_out:%u", s->segs_out);
   1900 	if (s->segs_in)
   1901 		printf(" segs_in:%u", s->segs_in);
   1902 	if (s->data_segs_out)
   1903 		printf(" data_segs_out:%u", s->data_segs_out);
   1904 	if (s->data_segs_in)
   1905 		printf(" data_segs_in:%u", s->data_segs_in);
   1906 
   1907 	if (s->dctcp && s->dctcp->enabled) {
   1908 		struct dctcpstat *dctcp = s->dctcp;
   1909 
   1910 		printf(" dctcp:(ce_state:%u,alpha:%u,ab_ecn:%u,ab_tot:%u)",
   1911 				dctcp->ce_state, dctcp->alpha, dctcp->ab_ecn,
   1912 				dctcp->ab_tot);
   1913 	} else if (s->dctcp) {
   1914 		printf(" dctcp:fallback_mode");
   1915 	}
   1916 
   1917 	if (s->bbr_info) {
   1918 		__u64 bw;
   1919 
   1920 		bw = s->bbr_info->bbr_bw_hi;
   1921 		bw <<= 32;
   1922 		bw |= s->bbr_info->bbr_bw_lo;
   1923 
   1924 		printf(" bbr:(bw:%sbps,mrtt:%g",
   1925 		       sprint_bw(b1, bw * 8.0),
   1926 		       (double)s->bbr_info->bbr_min_rtt / 1000.0);
   1927 		if (s->bbr_info->bbr_pacing_gain)
   1928 			printf(",pacing_gain:%g",
   1929 			       (double)s->bbr_info->bbr_pacing_gain / 256.0);
   1930 		if (s->bbr_info->bbr_cwnd_gain)
   1931 			printf(",cwnd_gain:%g",
   1932 			       (double)s->bbr_info->bbr_cwnd_gain / 256.0);
   1933 		printf(")");
   1934 	}
   1935 
   1936 	if (s->send_bps)
   1937 		printf(" send %sbps", sprint_bw(b1, s->send_bps));
   1938 	if (s->lastsnd)
   1939 		printf(" lastsnd:%u", s->lastsnd);
   1940 	if (s->lastrcv)
   1941 		printf(" lastrcv:%u", s->lastrcv);
   1942 	if (s->lastack)
   1943 		printf(" lastack:%u", s->lastack);
   1944 
   1945 	if (s->pacing_rate) {
   1946 		printf(" pacing_rate %sbps", sprint_bw(b1, s->pacing_rate));
   1947 		if (s->pacing_rate_max)
   1948 				printf("/%sbps", sprint_bw(b1,
   1949 							s->pacing_rate_max));
   1950 	}
   1951 
   1952 	if (s->delivery_rate)
   1953 		printf(" delivery_rate %sbps", sprint_bw(b1, s->delivery_rate));
   1954 	if (s->app_limited)
   1955 		printf(" app_limited");
   1956 
   1957 	if (s->busy_time) {
   1958 		printf(" busy:%llums", s->busy_time / 1000);
   1959 		if (s->rwnd_limited)
   1960 			printf(" rwnd_limited:%llums(%.1f%%)",
   1961 			       s->rwnd_limited / 1000,
   1962 			       100.0 * s->rwnd_limited / s->busy_time);
   1963 		if (s->sndbuf_limited)
   1964 			printf(" sndbuf_limited:%llums(%.1f%%)",
   1965 			       s->sndbuf_limited / 1000,
   1966 			       100.0 * s->sndbuf_limited / s->busy_time);
   1967 	}
   1968 
   1969 	if (s->unacked)
   1970 		printf(" unacked:%u", s->unacked);
   1971 	if (s->retrans || s->retrans_total)
   1972 		printf(" retrans:%u/%u", s->retrans, s->retrans_total);
   1973 	if (s->lost)
   1974 		printf(" lost:%u", s->lost);
   1975 	if (s->sacked && s->ss.state != SS_LISTEN)
   1976 		printf(" sacked:%u", s->sacked);
   1977 	if (s->fackets)
   1978 		printf(" fackets:%u", s->fackets);
   1979 	if (s->reordering != 3)
   1980 		printf(" reordering:%d", s->reordering);
   1981 	if (s->rcv_rtt)
   1982 		printf(" rcv_rtt:%g", s->rcv_rtt);
   1983 	if (s->rcv_space)
   1984 		printf(" rcv_space:%d", s->rcv_space);
   1985 	if (s->not_sent)
   1986 		printf(" notsent:%u", s->not_sent);
   1987 	if (s->min_rtt)
   1988 		printf(" minrtt:%g", s->min_rtt);
   1989 }
   1990 
   1991 static void tcp_timer_print(struct tcpstat *s)
   1992 {
   1993 	static const char * const tmr_name[] = {
   1994 		"off",
   1995 		"on",
   1996 		"keepalive",
   1997 		"timewait",
   1998 		"persist",
   1999 		"unknown"
   2000 	};
   2001 
   2002 	if (s->timer) {
   2003 		if (s->timer > 4)
   2004 			s->timer = 5;
   2005 		printf(" timer:(%s,%s,%d)",
   2006 				tmr_name[s->timer],
   2007 				print_ms_timer(s->timeout),
   2008 				s->retrans);
   2009 	}
   2010 }
   2011 
   2012 static void sctp_timer_print(struct tcpstat *s)
   2013 {
   2014 	if (s->timer)
   2015 		printf(" timer:(T3_RTX,%s,%d)",
   2016 		       print_ms_timer(s->timeout), s->retrans);
   2017 }
   2018 
   2019 static int tcp_show_line(char *line, const struct filter *f, int family)
   2020 {
   2021 	int rto = 0, ato = 0;
   2022 	struct tcpstat s = {};
   2023 	char *loc, *rem, *data;
   2024 	char opt[256];
   2025 	int n;
   2026 	int hz = get_user_hz();
   2027 
   2028 	if (proc_inet_split_line(line, &loc, &rem, &data))
   2029 		return -1;
   2030 
   2031 	int state = (data[1] >= 'A') ? (data[1] - 'A' + 10) : (data[1] - '0');
   2032 
   2033 	if (!(f->states & (1 << state)))
   2034 		return 0;
   2035 
   2036 	proc_parse_inet_addr(loc, rem, family, &s.ss);
   2037 
   2038 	if (f->f && run_ssfilter(f->f, &s.ss) == 0)
   2039 		return 0;
   2040 
   2041 	opt[0] = 0;
   2042 	n = sscanf(data, "%x %x:%x %x:%x %x %d %d %u %d %llx %d %d %d %u %d %[^\n]\n",
   2043 		   &s.ss.state, &s.ss.wq, &s.ss.rq,
   2044 		   &s.timer, &s.timeout, &s.retrans, &s.ss.uid, &s.probes,
   2045 		   &s.ss.ino, &s.ss.refcnt, &s.ss.sk, &rto, &ato, &s.qack, &s.cwnd,
   2046 		   &s.ssthresh, opt);
   2047 
   2048 	if (n < 17)
   2049 		opt[0] = 0;
   2050 
   2051 	if (n < 12) {
   2052 		rto = 0;
   2053 		s.cwnd = 2;
   2054 		s.ssthresh = -1;
   2055 		ato = s.qack = 0;
   2056 	}
   2057 
   2058 	s.retrans   = s.timer != 1 ? s.probes : s.retrans;
   2059 	s.timeout   = (s.timeout * 1000 + hz - 1) / hz;
   2060 	s.ato	    = (double)ato / hz;
   2061 	s.qack	   /= 2;
   2062 	s.rto	    = (double)rto;
   2063 	s.ssthresh  = s.ssthresh == -1 ? 0 : s.ssthresh;
   2064 	s.rto	    = s.rto != 3 * hz  ? s.rto / hz : 0;
   2065 	s.ss.type   = IPPROTO_TCP;
   2066 
   2067 	inet_stats_print(&s.ss, false);
   2068 
   2069 	if (show_options)
   2070 		tcp_timer_print(&s);
   2071 
   2072 	if (show_details) {
   2073 		sock_details_print(&s.ss);
   2074 		if (opt[0])
   2075 			printf(" opt:\"%s\"", opt);
   2076 	}
   2077 
   2078 	if (show_tcpinfo)
   2079 		tcp_stats_print(&s);
   2080 
   2081 	printf("\n");
   2082 	return 0;
   2083 }
   2084 
   2085 static int generic_record_read(FILE *fp,
   2086 			       int (*worker)(char*, const struct filter *, int),
   2087 			       const struct filter *f, int fam)
   2088 {
   2089 	char line[256];
   2090 
   2091 	/* skip header */
   2092 	if (fgets(line, sizeof(line), fp) == NULL)
   2093 		goto outerr;
   2094 
   2095 	while (fgets(line, sizeof(line), fp) != NULL) {
   2096 		int n = strlen(line);
   2097 
   2098 		if (n == 0 || line[n-1] != '\n') {
   2099 			errno = -EINVAL;
   2100 			return -1;
   2101 		}
   2102 		line[n-1] = 0;
   2103 
   2104 		if (worker(line, f, fam) < 0)
   2105 			return 0;
   2106 	}
   2107 outerr:
   2108 
   2109 	return ferror(fp) ? -1 : 0;
   2110 }
   2111 
   2112 static void print_skmeminfo(struct rtattr *tb[], int attrtype)
   2113 {
   2114 	const __u32 *skmeminfo;
   2115 
   2116 	if (!tb[attrtype]) {
   2117 		if (attrtype == INET_DIAG_SKMEMINFO) {
   2118 			if (!tb[INET_DIAG_MEMINFO])
   2119 				return;
   2120 
   2121 			const struct inet_diag_meminfo *minfo =
   2122 				RTA_DATA(tb[INET_DIAG_MEMINFO]);
   2123 
   2124 			printf(" mem:(r%u,w%u,f%u,t%u)",
   2125 					minfo->idiag_rmem,
   2126 					minfo->idiag_wmem,
   2127 					minfo->idiag_fmem,
   2128 					minfo->idiag_tmem);
   2129 		}
   2130 		return;
   2131 	}
   2132 
   2133 	skmeminfo = RTA_DATA(tb[attrtype]);
   2134 
   2135 	printf(" skmem:(r%u,rb%u,t%u,tb%u,f%u,w%u,o%u",
   2136 	       skmeminfo[SK_MEMINFO_RMEM_ALLOC],
   2137 	       skmeminfo[SK_MEMINFO_RCVBUF],
   2138 	       skmeminfo[SK_MEMINFO_WMEM_ALLOC],
   2139 	       skmeminfo[SK_MEMINFO_SNDBUF],
   2140 	       skmeminfo[SK_MEMINFO_FWD_ALLOC],
   2141 	       skmeminfo[SK_MEMINFO_WMEM_QUEUED],
   2142 	       skmeminfo[SK_MEMINFO_OPTMEM]);
   2143 
   2144 	if (RTA_PAYLOAD(tb[attrtype]) >=
   2145 		(SK_MEMINFO_BACKLOG + 1) * sizeof(__u32))
   2146 		printf(",bl%u", skmeminfo[SK_MEMINFO_BACKLOG]);
   2147 
   2148 	if (RTA_PAYLOAD(tb[attrtype]) >=
   2149 		(SK_MEMINFO_DROPS + 1) * sizeof(__u32))
   2150 		printf(",d%u", skmeminfo[SK_MEMINFO_DROPS]);
   2151 
   2152 	printf(")");
   2153 }
   2154 
   2155 static void print_md5sig(struct tcp_diag_md5sig *sig)
   2156 {
   2157 	printf("%s/%d=",
   2158 	       format_host(sig->tcpm_family,
   2159 			   sig->tcpm_family == AF_INET6 ? 16 : 4,
   2160 			   &sig->tcpm_addr),
   2161 	       sig->tcpm_prefixlen);
   2162 	print_escape_buf(sig->tcpm_key, sig->tcpm_keylen, " ,");
   2163 }
   2164 
   2165 #define TCPI_HAS_OPT(info, opt) !!(info->tcpi_options & (opt))
   2166 
   2167 static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r,
   2168 		struct rtattr *tb[])
   2169 {
   2170 	double rtt = 0;
   2171 	struct tcpstat s = {};
   2172 
   2173 	s.ss.state = r->idiag_state;
   2174 
   2175 	print_skmeminfo(tb, INET_DIAG_SKMEMINFO);
   2176 
   2177 	if (tb[INET_DIAG_INFO]) {
   2178 		struct tcp_info *info;
   2179 		int len = RTA_PAYLOAD(tb[INET_DIAG_INFO]);
   2180 
   2181 		/* workaround for older kernels with less fields */
   2182 		if (len < sizeof(*info)) {
   2183 			info = alloca(sizeof(*info));
   2184 			memcpy(info, RTA_DATA(tb[INET_DIAG_INFO]), len);
   2185 			memset((char *)info + len, 0, sizeof(*info) - len);
   2186 		} else
   2187 			info = RTA_DATA(tb[INET_DIAG_INFO]);
   2188 
   2189 		if (show_options) {
   2190 			s.has_ts_opt	   = TCPI_HAS_OPT(info, TCPI_OPT_TIMESTAMPS);
   2191 			s.has_sack_opt	   = TCPI_HAS_OPT(info, TCPI_OPT_SACK);
   2192 			s.has_ecn_opt	   = TCPI_HAS_OPT(info, TCPI_OPT_ECN);
   2193 			s.has_ecnseen_opt  = TCPI_HAS_OPT(info, TCPI_OPT_ECN_SEEN);
   2194 			s.has_fastopen_opt = TCPI_HAS_OPT(info, TCPI_OPT_SYN_DATA);
   2195 		}
   2196 
   2197 		if (tb[INET_DIAG_CONG])
   2198 			strncpy(s.cong_alg,
   2199 				rta_getattr_str(tb[INET_DIAG_CONG]),
   2200 				sizeof(s.cong_alg) - 1);
   2201 
   2202 		if (TCPI_HAS_OPT(info, TCPI_OPT_WSCALE)) {
   2203 			s.has_wscale_opt  = true;
   2204 			s.snd_wscale	  = info->tcpi_snd_wscale;
   2205 			s.rcv_wscale	  = info->tcpi_rcv_wscale;
   2206 		}
   2207 
   2208 		if (info->tcpi_rto && info->tcpi_rto != 3000000)
   2209 			s.rto = (double)info->tcpi_rto / 1000;
   2210 
   2211 		s.backoff	 = info->tcpi_backoff;
   2212 		s.rtt		 = (double)info->tcpi_rtt / 1000;
   2213 		s.rttvar	 = (double)info->tcpi_rttvar / 1000;
   2214 		s.ato		 = (double)info->tcpi_ato / 1000;
   2215 		s.mss		 = info->tcpi_snd_mss;
   2216 		s.rcv_mss	 = info->tcpi_rcv_mss;
   2217 		s.advmss	 = info->tcpi_advmss;
   2218 		s.rcv_space	 = info->tcpi_rcv_space;
   2219 		s.rcv_rtt	 = (double)info->tcpi_rcv_rtt / 1000;
   2220 		s.lastsnd	 = info->tcpi_last_data_sent;
   2221 		s.lastrcv	 = info->tcpi_last_data_recv;
   2222 		s.lastack	 = info->tcpi_last_ack_recv;
   2223 		s.unacked	 = info->tcpi_unacked;
   2224 		s.retrans	 = info->tcpi_retrans;
   2225 		s.retrans_total  = info->tcpi_total_retrans;
   2226 		s.lost		 = info->tcpi_lost;
   2227 		s.sacked	 = info->tcpi_sacked;
   2228 		s.fackets	 = info->tcpi_fackets;
   2229 		s.reordering	 = info->tcpi_reordering;
   2230 		s.rcv_space	 = info->tcpi_rcv_space;
   2231 		s.cwnd		 = info->tcpi_snd_cwnd;
   2232 
   2233 		if (info->tcpi_snd_ssthresh < 0xFFFF)
   2234 			s.ssthresh = info->tcpi_snd_ssthresh;
   2235 
   2236 		rtt = (double) info->tcpi_rtt;
   2237 		if (tb[INET_DIAG_VEGASINFO]) {
   2238 			const struct tcpvegas_info *vinfo
   2239 				= RTA_DATA(tb[INET_DIAG_VEGASINFO]);
   2240 
   2241 			if (vinfo->tcpv_enabled &&
   2242 					vinfo->tcpv_rtt && vinfo->tcpv_rtt != 0x7fffffff)
   2243 				rtt =  vinfo->tcpv_rtt;
   2244 		}
   2245 
   2246 		if (tb[INET_DIAG_DCTCPINFO]) {
   2247 			struct dctcpstat *dctcp = malloc(sizeof(struct
   2248 						dctcpstat));
   2249 
   2250 			const struct tcp_dctcp_info *dinfo
   2251 				= RTA_DATA(tb[INET_DIAG_DCTCPINFO]);
   2252 
   2253 			dctcp->enabled	= !!dinfo->dctcp_enabled;
   2254 			dctcp->ce_state = dinfo->dctcp_ce_state;
   2255 			dctcp->alpha	= dinfo->dctcp_alpha;
   2256 			dctcp->ab_ecn	= dinfo->dctcp_ab_ecn;
   2257 			dctcp->ab_tot	= dinfo->dctcp_ab_tot;
   2258 			s.dctcp		= dctcp;
   2259 		}
   2260 
   2261 		if (tb[INET_DIAG_BBRINFO]) {
   2262 			const void *bbr_info = RTA_DATA(tb[INET_DIAG_BBRINFO]);
   2263 			int len = min(RTA_PAYLOAD(tb[INET_DIAG_BBRINFO]),
   2264 				      sizeof(*s.bbr_info));
   2265 
   2266 			s.bbr_info = calloc(1, sizeof(*s.bbr_info));
   2267 			if (s.bbr_info && bbr_info)
   2268 				memcpy(s.bbr_info, bbr_info, len);
   2269 		}
   2270 
   2271 		if (rtt > 0 && info->tcpi_snd_mss && info->tcpi_snd_cwnd) {
   2272 			s.send_bps = (double) info->tcpi_snd_cwnd *
   2273 				(double)info->tcpi_snd_mss * 8000000. / rtt;
   2274 		}
   2275 
   2276 		if (info->tcpi_pacing_rate &&
   2277 				info->tcpi_pacing_rate != ~0ULL) {
   2278 			s.pacing_rate = info->tcpi_pacing_rate * 8.;
   2279 
   2280 			if (info->tcpi_max_pacing_rate &&
   2281 					info->tcpi_max_pacing_rate != ~0ULL)
   2282 				s.pacing_rate_max = info->tcpi_max_pacing_rate * 8.;
   2283 		}
   2284 		s.bytes_acked = info->tcpi_bytes_acked;
   2285 		s.bytes_received = info->tcpi_bytes_received;
   2286 		s.segs_out = info->tcpi_segs_out;
   2287 		s.segs_in = info->tcpi_segs_in;
   2288 		s.data_segs_out = info->tcpi_data_segs_out;
   2289 		s.data_segs_in = info->tcpi_data_segs_in;
   2290 		s.not_sent = info->tcpi_notsent_bytes;
   2291 		if (info->tcpi_min_rtt && info->tcpi_min_rtt != ~0U)
   2292 			s.min_rtt = (double) info->tcpi_min_rtt / 1000;
   2293 		s.delivery_rate = info->tcpi_delivery_rate * 8.;
   2294 		s.app_limited = info->tcpi_delivery_rate_app_limited;
   2295 		s.busy_time = info->tcpi_busy_time;
   2296 		s.rwnd_limited = info->tcpi_rwnd_limited;
   2297 		s.sndbuf_limited = info->tcpi_sndbuf_limited;
   2298 		tcp_stats_print(&s);
   2299 		free(s.dctcp);
   2300 		free(s.bbr_info);
   2301 	}
   2302 	if (tb[INET_DIAG_MD5SIG]) {
   2303 		struct tcp_diag_md5sig *sig = RTA_DATA(tb[INET_DIAG_MD5SIG]);
   2304 		int len = RTA_PAYLOAD(tb[INET_DIAG_MD5SIG]);
   2305 
   2306 		printf(" md5keys:");
   2307 		print_md5sig(sig++);
   2308 		for (len -= sizeof(*sig); len > 0; len -= sizeof(*sig)) {
   2309 			printf(",");
   2310 			print_md5sig(sig++);
   2311 		}
   2312 	}
   2313 }
   2314 
   2315 static const char *format_host_sa(struct sockaddr_storage *sa)
   2316 {
   2317 	union {
   2318 		struct sockaddr_in sin;
   2319 		struct sockaddr_in6 sin6;
   2320 	} *saddr = (void *)sa;
   2321 
   2322 	switch (sa->ss_family) {
   2323 	case AF_INET:
   2324 		return format_host(AF_INET, 4, &saddr->sin.sin_addr);
   2325 	case AF_INET6:
   2326 		return format_host(AF_INET6, 16, &saddr->sin6.sin6_addr);
   2327 	default:
   2328 		return "";
   2329 	}
   2330 }
   2331 
   2332 static void sctp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r,
   2333 		struct rtattr *tb[])
   2334 {
   2335 	struct sockaddr_storage *sa;
   2336 	int len;
   2337 
   2338 	print_skmeminfo(tb, INET_DIAG_SKMEMINFO);
   2339 
   2340 	if (tb[INET_DIAG_LOCALS]) {
   2341 		len = RTA_PAYLOAD(tb[INET_DIAG_LOCALS]);
   2342 		sa = RTA_DATA(tb[INET_DIAG_LOCALS]);
   2343 
   2344 		printf("locals:%s", format_host_sa(sa));
   2345 		for (sa++, len -= sizeof(*sa); len > 0; sa++, len -= sizeof(*sa))
   2346 			printf(",%s", format_host_sa(sa));
   2347 
   2348 	}
   2349 	if (tb[INET_DIAG_PEERS]) {
   2350 		len = RTA_PAYLOAD(tb[INET_DIAG_PEERS]);
   2351 		sa = RTA_DATA(tb[INET_DIAG_PEERS]);
   2352 
   2353 		printf(" peers:%s", format_host_sa(sa));
   2354 		for (sa++, len -= sizeof(*sa); len > 0; sa++, len -= sizeof(*sa))
   2355 			printf(",%s", format_host_sa(sa));
   2356 	}
   2357 	if (tb[INET_DIAG_INFO]) {
   2358 		struct sctp_info *info;
   2359 		len = RTA_PAYLOAD(tb[INET_DIAG_INFO]);
   2360 
   2361 		/* workaround for older kernels with less fields */
   2362 		if (len < sizeof(*info)) {
   2363 			info = alloca(sizeof(*info));
   2364 			memcpy(info, RTA_DATA(tb[INET_DIAG_INFO]), len);
   2365 			memset((char *)info + len, 0, sizeof(*info) - len);
   2366 		} else
   2367 			info = RTA_DATA(tb[INET_DIAG_INFO]);
   2368 
   2369 		sctp_stats_print(info);
   2370 	}
   2371 }
   2372 
   2373 static void parse_diag_msg(struct nlmsghdr *nlh, struct sockstat *s)
   2374 {
   2375 	struct rtattr *tb[INET_DIAG_MAX+1];
   2376 	struct inet_diag_msg *r = NLMSG_DATA(nlh);
   2377 
   2378 	parse_rtattr(tb, INET_DIAG_MAX, (struct rtattr *)(r+1),
   2379 		     nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
   2380 
   2381 	s->state	= r->idiag_state;
   2382 	s->local.family	= s->remote.family = r->idiag_family;
   2383 	s->lport	= ntohs(r->id.idiag_sport);
   2384 	s->rport	= ntohs(r->id.idiag_dport);
   2385 	s->wq		= r->idiag_wqueue;
   2386 	s->rq		= r->idiag_rqueue;
   2387 	s->ino		= r->idiag_inode;
   2388 	s->uid		= r->idiag_uid;
   2389 	s->iface	= r->id.idiag_if;
   2390 	s->sk		= cookie_sk_get(&r->id.idiag_cookie[0]);
   2391 
   2392 	s->mark = 0;
   2393 	if (tb[INET_DIAG_MARK])
   2394 		s->mark = rta_getattr_u32(tb[INET_DIAG_MARK]);
   2395 	if (tb[INET_DIAG_PROTOCOL])
   2396 		s->raw_prot = rta_getattr_u8(tb[INET_DIAG_PROTOCOL]);
   2397 	else
   2398 		s->raw_prot = 0;
   2399 
   2400 	if (s->local.family == AF_INET)
   2401 		s->local.bytelen = s->remote.bytelen = 4;
   2402 	else
   2403 		s->local.bytelen = s->remote.bytelen = 16;
   2404 
   2405 	memcpy(s->local.data, r->id.idiag_src, s->local.bytelen);
   2406 	memcpy(s->remote.data, r->id.idiag_dst, s->local.bytelen);
   2407 }
   2408 
   2409 static int inet_show_sock(struct nlmsghdr *nlh,
   2410 			  struct sockstat *s)
   2411 {
   2412 	struct rtattr *tb[INET_DIAG_MAX+1];
   2413 	struct inet_diag_msg *r = NLMSG_DATA(nlh);
   2414 	unsigned char v6only = 0;
   2415 
   2416 	parse_rtattr(tb, INET_DIAG_MAX, (struct rtattr *)(r+1),
   2417 		     nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
   2418 
   2419 	if (tb[INET_DIAG_PROTOCOL])
   2420 		s->type = rta_getattr_u8(tb[INET_DIAG_PROTOCOL]);
   2421 
   2422 	if (s->local.family == AF_INET6 && tb[INET_DIAG_SKV6ONLY])
   2423 		v6only = rta_getattr_u8(tb[INET_DIAG_SKV6ONLY]);
   2424 
   2425 	inet_stats_print(s, v6only);
   2426 
   2427 	if (show_options) {
   2428 		struct tcpstat t = {};
   2429 
   2430 		t.timer = r->idiag_timer;
   2431 		t.timeout = r->idiag_expires;
   2432 		t.retrans = r->idiag_retrans;
   2433 		if (s->type == IPPROTO_SCTP)
   2434 			sctp_timer_print(&t);
   2435 		else
   2436 			tcp_timer_print(&t);
   2437 	}
   2438 
   2439 	if (show_details) {
   2440 		sock_details_print(s);
   2441 		if (s->local.family == AF_INET6 && tb[INET_DIAG_SKV6ONLY])
   2442 			printf(" v6only:%u", v6only);
   2443 
   2444 		if (tb[INET_DIAG_SHUTDOWN]) {
   2445 			unsigned char mask;
   2446 
   2447 			mask = rta_getattr_u8(tb[INET_DIAG_SHUTDOWN]);
   2448 			printf(" %c-%c", mask & 1 ? '-' : '<', mask & 2 ? '-' : '>');
   2449 		}
   2450 	}
   2451 
   2452 	if (show_mem || (show_tcpinfo && s->type != IPPROTO_UDP)) {
   2453 		printf("\n\t");
   2454 		if (s->type == IPPROTO_SCTP)
   2455 			sctp_show_info(nlh, r, tb);
   2456 		else
   2457 			tcp_show_info(nlh, r, tb);
   2458 	}
   2459 	sctp_ino = s->ino;
   2460 
   2461 	printf("\n");
   2462 	return 0;
   2463 }
   2464 
   2465 static int tcpdiag_send(int fd, int protocol, struct filter *f)
   2466 {
   2467 	struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
   2468 	struct {
   2469 		struct nlmsghdr nlh;
   2470 		struct inet_diag_req r;
   2471 	} req = {
   2472 		.nlh.nlmsg_len = sizeof(req),
   2473 		.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST,
   2474 		.nlh.nlmsg_seq = MAGIC_SEQ,
   2475 		.r.idiag_family = AF_INET,
   2476 		.r.idiag_states = f->states,
   2477 	};
   2478 	char    *bc = NULL;
   2479 	int	bclen;
   2480 	struct msghdr msg;
   2481 	struct rtattr rta;
   2482 	struct iovec iov[3];
   2483 	int iovlen = 1;
   2484 
   2485 	if (protocol == IPPROTO_UDP)
   2486 		return -1;
   2487 
   2488 	if (protocol == IPPROTO_TCP)
   2489 		req.nlh.nlmsg_type = TCPDIAG_GETSOCK;
   2490 	else
   2491 		req.nlh.nlmsg_type = DCCPDIAG_GETSOCK;
   2492 	if (show_mem) {
   2493 		req.r.idiag_ext |= (1<<(INET_DIAG_MEMINFO-1));
   2494 		req.r.idiag_ext |= (1<<(INET_DIAG_SKMEMINFO-1));
   2495 	}
   2496 
   2497 	if (show_tcpinfo) {
   2498 		req.r.idiag_ext |= (1<<(INET_DIAG_INFO-1));
   2499 		req.r.idiag_ext |= (1<<(INET_DIAG_VEGASINFO-1));
   2500 		req.r.idiag_ext |= (1<<(INET_DIAG_CONG-1));
   2501 	}
   2502 
   2503 	iov[0] = (struct iovec){
   2504 		.iov_base = &req,
   2505 		.iov_len = sizeof(req)
   2506 	};
   2507 	if (f->f) {
   2508 		bclen = ssfilter_bytecompile(f->f, &bc);
   2509 		if (bclen) {
   2510 			rta.rta_type = INET_DIAG_REQ_BYTECODE;
   2511 			rta.rta_len = RTA_LENGTH(bclen);
   2512 			iov[1] = (struct iovec){ &rta, sizeof(rta) };
   2513 			iov[2] = (struct iovec){ bc, bclen };
   2514 			req.nlh.nlmsg_len += RTA_LENGTH(bclen);
   2515 			iovlen = 3;
   2516 		}
   2517 	}
   2518 
   2519 	msg = (struct msghdr) {
   2520 		.msg_name = (void *)&nladdr,
   2521 		.msg_namelen = sizeof(nladdr),
   2522 		.msg_iov = iov,
   2523 		.msg_iovlen = iovlen,
   2524 	};
   2525 
   2526 	if (sendmsg(fd, &msg, 0) < 0) {
   2527 		close(fd);
   2528 		return -1;
   2529 	}
   2530 
   2531 	return 0;
   2532 }
   2533 
   2534 static int sockdiag_send(int family, int fd, int protocol, struct filter *f)
   2535 {
   2536 	struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
   2537 	DIAG_REQUEST(req, struct inet_diag_req_v2 r);
   2538 	char    *bc = NULL;
   2539 	int	bclen;
   2540 	struct msghdr msg;
   2541 	struct rtattr rta;
   2542 	struct iovec iov[3];
   2543 	int iovlen = 1;
   2544 
   2545 	if (family == PF_UNSPEC)
   2546 		return tcpdiag_send(fd, protocol, f);
   2547 
   2548 	memset(&req.r, 0, sizeof(req.r));
   2549 	req.r.sdiag_family = family;
   2550 	req.r.sdiag_protocol = protocol;
   2551 	req.r.idiag_states = f->states;
   2552 	if (show_mem) {
   2553 		req.r.idiag_ext |= (1<<(INET_DIAG_MEMINFO-1));
   2554 		req.r.idiag_ext |= (1<<(INET_DIAG_SKMEMINFO-1));
   2555 	}
   2556 
   2557 	if (show_tcpinfo) {
   2558 		req.r.idiag_ext |= (1<<(INET_DIAG_INFO-1));
   2559 		req.r.idiag_ext |= (1<<(INET_DIAG_VEGASINFO-1));
   2560 		req.r.idiag_ext |= (1<<(INET_DIAG_CONG-1));
   2561 	}
   2562 
   2563 	iov[0] = (struct iovec){
   2564 		.iov_base = &req,
   2565 		.iov_len = sizeof(req)
   2566 	};
   2567 	if (f->f) {
   2568 		bclen = ssfilter_bytecompile(f->f, &bc);
   2569 		if (bclen) {
   2570 			rta.rta_type = INET_DIAG_REQ_BYTECODE;
   2571 			rta.rta_len = RTA_LENGTH(bclen);
   2572 			iov[1] = (struct iovec){ &rta, sizeof(rta) };
   2573 			iov[2] = (struct iovec){ bc, bclen };
   2574 			req.nlh.nlmsg_len += RTA_LENGTH(bclen);
   2575 			iovlen = 3;
   2576 		}
   2577 	}
   2578 
   2579 	msg = (struct msghdr) {
   2580 		.msg_name = (void *)&nladdr,
   2581 		.msg_namelen = sizeof(nladdr),
   2582 		.msg_iov = iov,
   2583 		.msg_iovlen = iovlen,
   2584 	};
   2585 
   2586 	if (sendmsg(fd, &msg, 0) < 0) {
   2587 		close(fd);
   2588 		return -1;
   2589 	}
   2590 
   2591 	return 0;
   2592 }
   2593 
   2594 struct inet_diag_arg {
   2595 	struct filter *f;
   2596 	int protocol;
   2597 	struct rtnl_handle *rth;
   2598 };
   2599 
   2600 static int kill_inet_sock(struct nlmsghdr *h, void *arg, struct sockstat *s)
   2601 {
   2602 	struct inet_diag_msg *d = NLMSG_DATA(h);
   2603 	struct inet_diag_arg *diag_arg = arg;
   2604 	struct rtnl_handle *rth = diag_arg->rth;
   2605 
   2606 	DIAG_REQUEST(req, struct inet_diag_req_v2 r);
   2607 
   2608 	req.nlh.nlmsg_type = SOCK_DESTROY;
   2609 	req.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
   2610 	req.nlh.nlmsg_seq = ++rth->seq;
   2611 	req.r.sdiag_family = d->idiag_family;
   2612 	req.r.sdiag_protocol = diag_arg->protocol;
   2613 	req.r.id = d->id;
   2614 
   2615 	if (diag_arg->protocol == IPPROTO_RAW) {
   2616 		struct inet_diag_req_raw *raw = (void *)&req.r;
   2617 
   2618 		BUILD_BUG_ON(sizeof(req.r) != sizeof(*raw));
   2619 		raw->sdiag_raw_protocol = s->raw_prot;
   2620 	}
   2621 
   2622 	return rtnl_talk(rth, &req.nlh, NULL, 0);
   2623 }
   2624 
   2625 static int show_one_inet_sock(const struct sockaddr_nl *addr,
   2626 		struct nlmsghdr *h, void *arg)
   2627 {
   2628 	int err;
   2629 	struct inet_diag_arg *diag_arg = arg;
   2630 	struct inet_diag_msg *r = NLMSG_DATA(h);
   2631 	struct sockstat s = {};
   2632 
   2633 	if (!(diag_arg->f->families & (1 << r->idiag_family)))
   2634 		return 0;
   2635 
   2636 	parse_diag_msg(h, &s);
   2637 	s.type = diag_arg->protocol;
   2638 
   2639 	if (diag_arg->f->f && run_ssfilter(diag_arg->f->f, &s) == 0)
   2640 		return 0;
   2641 
   2642 	if (diag_arg->f->kill && kill_inet_sock(h, arg, &s) != 0) {
   2643 		if (errno == EOPNOTSUPP || errno == ENOENT) {
   2644 			/* Socket can't be closed, or is already closed. */
   2645 			return 0;
   2646 		} else {
   2647 			perror("SOCK_DESTROY answers");
   2648 			return -1;
   2649 		}
   2650 	}
   2651 
   2652 	err = inet_show_sock(h, &s);
   2653 	if (err < 0)
   2654 		return err;
   2655 
   2656 	return 0;
   2657 }
   2658 
   2659 static int inet_show_netlink(struct filter *f, FILE *dump_fp, int protocol)
   2660 {
   2661 	int err = 0;
   2662 	struct rtnl_handle rth, rth2;
   2663 	int family = PF_INET;
   2664 	struct inet_diag_arg arg = { .f = f, .protocol = protocol };
   2665 
   2666 	if (rtnl_open_byproto(&rth, 0, NETLINK_SOCK_DIAG))
   2667 		return -1;
   2668 
   2669 	if (f->kill) {
   2670 		if (rtnl_open_byproto(&rth2, 0, NETLINK_SOCK_DIAG)) {
   2671 			rtnl_close(&rth);
   2672 			return -1;
   2673 		}
   2674 		arg.rth = &rth2;
   2675 	}
   2676 
   2677 	rth.dump = MAGIC_SEQ;
   2678 	rth.dump_fp = dump_fp;
   2679 	if (preferred_family == PF_INET6)
   2680 		family = PF_INET6;
   2681 
   2682 again:
   2683 	if ((err = sockdiag_send(family, rth.fd, protocol, f)))
   2684 		goto Exit;
   2685 
   2686 	if ((err = rtnl_dump_filter(&rth, show_one_inet_sock, &arg))) {
   2687 		if (family != PF_UNSPEC) {
   2688 			family = PF_UNSPEC;
   2689 			goto again;
   2690 		}
   2691 		goto Exit;
   2692 	}
   2693 	if (family == PF_INET && preferred_family != PF_INET) {
   2694 		family = PF_INET6;
   2695 		goto again;
   2696 	}
   2697 
   2698 Exit:
   2699 	rtnl_close(&rth);
   2700 	if (arg.rth)
   2701 		rtnl_close(arg.rth);
   2702 	return err;
   2703 }
   2704 
   2705 static int tcp_show_netlink_file(struct filter *f)
   2706 {
   2707 	FILE	*fp;
   2708 	char	buf[16384];
   2709 	int	err = -1;
   2710 
   2711 	if ((fp = fopen(getenv("TCPDIAG_FILE"), "r")) == NULL) {
   2712 		perror("fopen($TCPDIAG_FILE)");
   2713 		return err;
   2714 	}
   2715 
   2716 	while (1) {
   2717 		int status, err2;
   2718 		struct nlmsghdr *h = (struct nlmsghdr *)buf;
   2719 		struct sockstat s = {};
   2720 
   2721 		status = fread(buf, 1, sizeof(*h), fp);
   2722 		if (status < 0) {
   2723 			perror("Reading header from $TCPDIAG_FILE");
   2724 			break;
   2725 		}
   2726 		if (status != sizeof(*h)) {
   2727 			perror("Unexpected EOF reading $TCPDIAG_FILE");
   2728 			break;
   2729 		}
   2730 
   2731 		status = fread(h+1, 1, NLMSG_ALIGN(h->nlmsg_len-sizeof(*h)), fp);
   2732 
   2733 		if (status < 0) {
   2734 			perror("Reading $TCPDIAG_FILE");
   2735 			break;
   2736 		}
   2737 		if (status + sizeof(*h) < h->nlmsg_len) {
   2738 			perror("Unexpected EOF reading $TCPDIAG_FILE");
   2739 			break;
   2740 		}
   2741 
   2742 		/* The only legal exit point */
   2743 		if (h->nlmsg_type == NLMSG_DONE) {
   2744 			err = 0;
   2745 			break;
   2746 		}
   2747 
   2748 		if (h->nlmsg_type == NLMSG_ERROR) {
   2749 			struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(h);
   2750 
   2751 			if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) {
   2752 				fprintf(stderr, "ERROR truncated\n");
   2753 			} else {
   2754 				errno = -err->error;
   2755 				perror("TCPDIAG answered");
   2756 			}
   2757 			break;
   2758 		}
   2759 
   2760 		parse_diag_msg(h, &s);
   2761 		s.type = IPPROTO_TCP;
   2762 
   2763 		if (f && f->f && run_ssfilter(f->f, &s) == 0)
   2764 			continue;
   2765 
   2766 		err2 = inet_show_sock(h, &s);
   2767 		if (err2 < 0) {
   2768 			err = err2;
   2769 			break;
   2770 		}
   2771 	}
   2772 
   2773 	fclose(fp);
   2774 	return err;
   2775 }
   2776 
   2777 static int tcp_show(struct filter *f)
   2778 {
   2779 	FILE *fp = NULL;
   2780 	char *buf = NULL;
   2781 	int bufsize = 64*1024;
   2782 
   2783 	if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
   2784 		return 0;
   2785 
   2786 	dg_proto = TCP_PROTO;
   2787 
   2788 	if (getenv("TCPDIAG_FILE"))
   2789 		return tcp_show_netlink_file(f);
   2790 
   2791 	if (!getenv("PROC_NET_TCP") && !getenv("PROC_ROOT")
   2792 	    && inet_show_netlink(f, NULL, IPPROTO_TCP) == 0)
   2793 		return 0;
   2794 
   2795 	/* Sigh... We have to parse /proc/net/tcp... */
   2796 
   2797 
   2798 	/* Estimate amount of sockets and try to allocate
   2799 	 * huge buffer to read all the table at one read.
   2800 	 * Limit it by 16MB though. The assumption is: as soon as
   2801 	 * kernel was able to hold information about N connections,
   2802 	 * it is able to give us some memory for snapshot.
   2803 	 */
   2804 	if (1) {
   2805 		get_slabstat(&slabstat);
   2806 
   2807 		int guess = slabstat.socks+slabstat.tcp_syns;
   2808 
   2809 		if (f->states&(1<<SS_TIME_WAIT))
   2810 			guess += slabstat.tcp_tws;
   2811 		if (guess > (16*1024*1024)/128)
   2812 			guess = (16*1024*1024)/128;
   2813 		guess *= 128;
   2814 		if (guess > bufsize)
   2815 			bufsize = guess;
   2816 	}
   2817 	while (bufsize >= 64*1024) {
   2818 		if ((buf = malloc(bufsize)) != NULL)
   2819 			break;
   2820 		bufsize /= 2;
   2821 	}
   2822 	if (buf == NULL) {
   2823 		errno = ENOMEM;
   2824 		return -1;
   2825 	}
   2826 
   2827 	if (f->families & (1<<AF_INET)) {
   2828 		if ((fp = net_tcp_open()) == NULL)
   2829 			goto outerr;
   2830 
   2831 		setbuffer(fp, buf, bufsize);
   2832 		if (generic_record_read(fp, tcp_show_line, f, AF_INET))
   2833 			goto outerr;
   2834 		fclose(fp);
   2835 	}
   2836 
   2837 	if ((f->families & (1<<AF_INET6)) &&
   2838 	    (fp = net_tcp6_open()) != NULL) {
   2839 		setbuffer(fp, buf, bufsize);
   2840 		if (generic_record_read(fp, tcp_show_line, f, AF_INET6))
   2841 			goto outerr;
   2842 		fclose(fp);
   2843 	}
   2844 
   2845 	free(buf);
   2846 	return 0;
   2847 
   2848 outerr:
   2849 	do {
   2850 		int saved_errno = errno;
   2851 
   2852 		free(buf);
   2853 		if (fp)
   2854 			fclose(fp);
   2855 		errno = saved_errno;
   2856 		return -1;
   2857 	} while (0);
   2858 }
   2859 
   2860 static int dccp_show(struct filter *f)
   2861 {
   2862 	if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
   2863 		return 0;
   2864 
   2865 	if (!getenv("PROC_NET_DCCP") && !getenv("PROC_ROOT")
   2866 	    && inet_show_netlink(f, NULL, IPPROTO_DCCP) == 0)
   2867 		return 0;
   2868 
   2869 	return 0;
   2870 }
   2871 
   2872 static int sctp_show(struct filter *f)
   2873 {
   2874 	if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
   2875 		return 0;
   2876 
   2877 	if (!getenv("PROC_NET_SCTP") && !getenv("PROC_ROOT")
   2878 	    && inet_show_netlink(f, NULL, IPPROTO_SCTP) == 0)
   2879 		return 0;
   2880 
   2881 	return 0;
   2882 }
   2883 
   2884 static int dgram_show_line(char *line, const struct filter *f, int family)
   2885 {
   2886 	struct sockstat s = {};
   2887 	char *loc, *rem, *data;
   2888 	char opt[256];
   2889 	int n;
   2890 
   2891 	if (proc_inet_split_line(line, &loc, &rem, &data))
   2892 		return -1;
   2893 
   2894 	int state = (data[1] >= 'A') ? (data[1] - 'A' + 10) : (data[1] - '0');
   2895 
   2896 	if (!(f->states & (1 << state)))
   2897 		return 0;
   2898 
   2899 	proc_parse_inet_addr(loc, rem, family, &s);
   2900 
   2901 	if (f->f && run_ssfilter(f->f, &s) == 0)
   2902 		return 0;
   2903 
   2904 	opt[0] = 0;
   2905 	n = sscanf(data, "%x %x:%x %*x:%*x %*x %d %*d %u %d %llx %[^\n]\n",
   2906 	       &s.state, &s.wq, &s.rq,
   2907 	       &s.uid, &s.ino,
   2908 	       &s.refcnt, &s.sk, opt);
   2909 
   2910 	if (n < 9)
   2911 		opt[0] = 0;
   2912 
   2913 	s.type = dg_proto == UDP_PROTO ? IPPROTO_UDP : 0;
   2914 	inet_stats_print(&s, false);
   2915 
   2916 	if (show_details && opt[0])
   2917 		printf(" opt:\"%s\"", opt);
   2918 
   2919 	printf("\n");
   2920 	return 0;
   2921 }
   2922 
   2923 static int udp_show(struct filter *f)
   2924 {
   2925 	FILE *fp = NULL;
   2926 
   2927 	if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
   2928 		return 0;
   2929 
   2930 	dg_proto = UDP_PROTO;
   2931 
   2932 	if (!getenv("PROC_NET_UDP") && !getenv("PROC_ROOT")
   2933 	    && inet_show_netlink(f, NULL, IPPROTO_UDP) == 0)
   2934 		return 0;
   2935 
   2936 	if (f->families&(1<<AF_INET)) {
   2937 		if ((fp = net_udp_open()) == NULL)
   2938 			goto outerr;
   2939 		if (generic_record_read(fp, dgram_show_line, f, AF_INET))
   2940 			goto outerr;
   2941 		fclose(fp);
   2942 	}
   2943 
   2944 	if ((f->families&(1<<AF_INET6)) &&
   2945 	    (fp = net_udp6_open()) != NULL) {
   2946 		if (generic_record_read(fp, dgram_show_line, f, AF_INET6))
   2947 			goto outerr;
   2948 		fclose(fp);
   2949 	}
   2950 	return 0;
   2951 
   2952 outerr:
   2953 	do {
   2954 		int saved_errno = errno;
   2955 
   2956 		if (fp)
   2957 			fclose(fp);
   2958 		errno = saved_errno;
   2959 		return -1;
   2960 	} while (0);
   2961 }
   2962 
   2963 static int raw_show(struct filter *f)
   2964 {
   2965 	FILE *fp = NULL;
   2966 
   2967 	if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
   2968 		return 0;
   2969 
   2970 	dg_proto = RAW_PROTO;
   2971 
   2972 	if (!getenv("PROC_NET_RAW") && !getenv("PROC_ROOT") &&
   2973 	    inet_show_netlink(f, NULL, IPPROTO_RAW) == 0)
   2974 		return 0;
   2975 
   2976 	if (f->families&(1<<AF_INET)) {
   2977 		if ((fp = net_raw_open()) == NULL)
   2978 			goto outerr;
   2979 		if (generic_record_read(fp, dgram_show_line, f, AF_INET))
   2980 			goto outerr;
   2981 		fclose(fp);
   2982 	}
   2983 
   2984 	if ((f->families&(1<<AF_INET6)) &&
   2985 	    (fp = net_raw6_open()) != NULL) {
   2986 		if (generic_record_read(fp, dgram_show_line, f, AF_INET6))
   2987 			goto outerr;
   2988 		fclose(fp);
   2989 	}
   2990 	return 0;
   2991 
   2992 outerr:
   2993 	do {
   2994 		int saved_errno = errno;
   2995 
   2996 		if (fp)
   2997 			fclose(fp);
   2998 		errno = saved_errno;
   2999 		return -1;
   3000 	} while (0);
   3001 }
   3002 
   3003 #define MAX_UNIX_REMEMBER (1024*1024/sizeof(struct sockstat))
   3004 
   3005 static void unix_list_drop_first(struct sockstat **list)
   3006 {
   3007 	struct sockstat *s = *list;
   3008 
   3009 	(*list) = (*list)->next;
   3010 	free(s->name);
   3011 	free(s);
   3012 }
   3013 
   3014 static bool unix_type_skip(struct sockstat *s, struct filter *f)
   3015 {
   3016 	if (s->type == SOCK_STREAM && !(f->dbs&(1<<UNIX_ST_DB)))
   3017 		return true;
   3018 	if (s->type == SOCK_DGRAM && !(f->dbs&(1<<UNIX_DG_DB)))
   3019 		return true;
   3020 	if (s->type == SOCK_SEQPACKET && !(f->dbs&(1<<UNIX_SQ_DB)))
   3021 		return true;
   3022 	return false;
   3023 }
   3024 
   3025 static void unix_stats_print(struct sockstat *s, struct filter *f)
   3026 {
   3027 	char port_name[30] = {};
   3028 
   3029 	sock_state_print(s);
   3030 
   3031 	sock_addr_print(s->name ?: "*", " ",
   3032 			int_to_str(s->lport, port_name), NULL);
   3033 	sock_addr_print(s->peer_name ?: "*", " ",
   3034 			int_to_str(s->rport, port_name), NULL);
   3035 
   3036 	proc_ctx_print(s);
   3037 }
   3038 
   3039 static int unix_show_sock(const struct sockaddr_nl *addr, struct nlmsghdr *nlh,
   3040 		void *arg)
   3041 {
   3042 	struct filter *f = (struct filter *)arg;
   3043 	struct unix_diag_msg *r = NLMSG_DATA(nlh);
   3044 	struct rtattr *tb[UNIX_DIAG_MAX+1];
   3045 	char name[128];
   3046 	struct sockstat stat = { .name = "*", .peer_name = "*" };
   3047 
   3048 	parse_rtattr(tb, UNIX_DIAG_MAX, (struct rtattr *)(r+1),
   3049 		     nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
   3050 
   3051 	stat.type  = r->udiag_type;
   3052 	stat.state = r->udiag_state;
   3053 	stat.ino   = stat.lport = r->udiag_ino;
   3054 	stat.local.family = stat.remote.family = AF_UNIX;
   3055 
   3056 	if (unix_type_skip(&stat, f))
   3057 		return 0;
   3058 
   3059 	if (tb[UNIX_DIAG_RQLEN]) {
   3060 		struct unix_diag_rqlen *rql = RTA_DATA(tb[UNIX_DIAG_RQLEN]);
   3061 
   3062 		stat.rq = rql->udiag_rqueue;
   3063 		stat.wq = rql->udiag_wqueue;
   3064 	}
   3065 	if (tb[UNIX_DIAG_NAME]) {
   3066 		int len = RTA_PAYLOAD(tb[UNIX_DIAG_NAME]);
   3067 
   3068 		memcpy(name, RTA_DATA(tb[UNIX_DIAG_NAME]), len);
   3069 		name[len] = '\0';
   3070 		if (name[0] == '\0') {
   3071 			int i;
   3072 			for (i = 0; i < len; i++)
   3073 				if (name[i] == '\0')
   3074 					name[i] = '@';
   3075 		}
   3076 		stat.name = &name[0];
   3077 		memcpy(stat.local.data, &stat.name, sizeof(stat.name));
   3078 	}
   3079 	if (tb[UNIX_DIAG_PEER])
   3080 		stat.rport = rta_getattr_u32(tb[UNIX_DIAG_PEER]);
   3081 
   3082 	if (f->f && run_ssfilter(f->f, &stat) == 0)
   3083 		return 0;
   3084 
   3085 	unix_stats_print(&stat, f);
   3086 
   3087 	if (show_mem)
   3088 		print_skmeminfo(tb, UNIX_DIAG_MEMINFO);
   3089 	if (show_details) {
   3090 		if (tb[UNIX_DIAG_SHUTDOWN]) {
   3091 			unsigned char mask;
   3092 
   3093 			mask = rta_getattr_u8(tb[UNIX_DIAG_SHUTDOWN]);
   3094 			printf(" %c-%c", mask & 1 ? '-' : '<', mask & 2 ? '-' : '>');
   3095 		}
   3096 	}
   3097 	printf("\n");
   3098 
   3099 	return 0;
   3100 }
   3101 
   3102 static int handle_netlink_request(struct filter *f, struct nlmsghdr *req,
   3103 		size_t size, rtnl_filter_t show_one_sock)
   3104 {
   3105 	int ret = -1;
   3106 	struct rtnl_handle rth;
   3107 
   3108 	if (rtnl_open_byproto(&rth, 0, NETLINK_SOCK_DIAG))
   3109 		return -1;
   3110 
   3111 	rth.dump = MAGIC_SEQ;
   3112 
   3113 	if (rtnl_send(&rth, req, size) < 0)
   3114 		goto Exit;
   3115 
   3116 	if (rtnl_dump_filter(&rth, show_one_sock, f))
   3117 		goto Exit;
   3118 
   3119 	ret = 0;
   3120 Exit:
   3121 	rtnl_close(&rth);
   3122 	return ret;
   3123 }
   3124 
   3125 static int unix_show_netlink(struct filter *f)
   3126 {
   3127 	DIAG_REQUEST(req, struct unix_diag_req r);
   3128 
   3129 	req.r.sdiag_family = AF_UNIX;
   3130 	req.r.udiag_states = f->states;
   3131 	req.r.udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER | UDIAG_SHOW_RQLEN;
   3132 	if (show_mem)
   3133 		req.r.udiag_show |= UDIAG_SHOW_MEMINFO;
   3134 
   3135 	return handle_netlink_request(f, &req.nlh, sizeof(req), unix_show_sock);
   3136 }
   3137 
   3138 static int unix_show(struct filter *f)
   3139 {
   3140 	FILE *fp;
   3141 	char buf[256];
   3142 	char name[128];
   3143 	int  newformat = 0;
   3144 	int  cnt;
   3145 	struct sockstat *list = NULL;
   3146 	const int unix_state_map[] = { SS_CLOSE, SS_SYN_SENT,
   3147 				       SS_ESTABLISHED, SS_CLOSING };
   3148 
   3149 	if (!filter_af_get(f, AF_UNIX))
   3150 		return 0;
   3151 
   3152 	if (!getenv("PROC_NET_UNIX") && !getenv("PROC_ROOT")
   3153 	    && unix_show_netlink(f) == 0)
   3154 		return 0;
   3155 
   3156 	if ((fp = net_unix_open()) == NULL)
   3157 		return -1;
   3158 	if (!fgets(buf, sizeof(buf), fp)) {
   3159 		fclose(fp);
   3160 		return -1;
   3161 	}
   3162 
   3163 	if (memcmp(buf, "Peer", 4) == 0)
   3164 		newformat = 1;
   3165 	cnt = 0;
   3166 
   3167 	while (fgets(buf, sizeof(buf), fp)) {
   3168 		struct sockstat *u, **insp;
   3169 		int flags;
   3170 
   3171 		if (!(u = calloc(1, sizeof(*u))))
   3172 			break;
   3173 
   3174 		if (sscanf(buf, "%x: %x %x %x %x %x %d %s",
   3175 			   &u->rport, &u->rq, &u->wq, &flags, &u->type,
   3176 			   &u->state, &u->ino, name) < 8)
   3177 			name[0] = 0;
   3178 
   3179 		u->lport = u->ino;
   3180 		u->local.family = u->remote.family = AF_UNIX;
   3181 
   3182 		if (flags & (1 << 16)) {
   3183 			u->state = SS_LISTEN;
   3184 		} else if (u->state > 0 &&
   3185 			   u->state <= ARRAY_SIZE(unix_state_map)) {
   3186 			u->state = unix_state_map[u->state-1];
   3187 			if (u->type == SOCK_DGRAM && u->state == SS_CLOSE && u->rport)
   3188 				u->state = SS_ESTABLISHED;
   3189 		}
   3190 		if (unix_type_skip(u, f) ||
   3191 		    !(f->states & (1 << u->state))) {
   3192 			free(u);
   3193 			continue;
   3194 		}
   3195 
   3196 		if (!newformat) {
   3197 			u->rport = 0;
   3198 			u->rq = 0;
   3199 			u->wq = 0;
   3200 		}
   3201 
   3202 		if (name[0]) {
   3203 			u->name = strdup(name);
   3204 			if (!u->name) {
   3205 				free(u);
   3206 				break;
   3207 			}
   3208 		}
   3209 
   3210 		if (u->rport) {
   3211 			struct sockstat *p;
   3212 
   3213 			for (p = list; p; p = p->next) {
   3214 				if (u->rport == p->lport)
   3215 					break;
   3216 			}
   3217 			if (!p)
   3218 				u->peer_name = "?";
   3219 			else
   3220 				u->peer_name = p->name ? : "*";
   3221 		}
   3222 
   3223 		if (f->f) {
   3224 			struct sockstat st = {
   3225 				.local.family = AF_UNIX,
   3226 				.remote.family = AF_UNIX,
   3227 			};
   3228 
   3229 			memcpy(st.local.data, &u->name, sizeof(u->name));
   3230 			if (strcmp(u->peer_name, "*"))
   3231 				memcpy(st.remote.data, &u->peer_name,
   3232 				       sizeof(u->peer_name));
   3233 			if (run_ssfilter(f->f, &st) == 0) {
   3234 				free(u->name);
   3235 				free(u);
   3236 				continue;
   3237 			}
   3238 		}
   3239 
   3240 		insp = &list;
   3241 		while (*insp) {
   3242 			if (u->type < (*insp)->type ||
   3243 			    (u->type == (*insp)->type &&
   3244 			     u->ino < (*insp)->ino))
   3245 				break;
   3246 			insp = &(*insp)->next;
   3247 		}
   3248 		u->next = *insp;
   3249 		*insp = u;
   3250 
   3251 		if (++cnt > MAX_UNIX_REMEMBER) {
   3252 			while (list) {
   3253 				unix_stats_print(list, f);
   3254 				printf("\n");
   3255 
   3256 				unix_list_drop_first(&list);
   3257 			}
   3258 			cnt = 0;
   3259 		}
   3260 	}
   3261 	fclose(fp);
   3262 	while (list) {
   3263 		unix_stats_print(list, f);
   3264 		printf("\n");
   3265 
   3266 		unix_list_drop_first(&list);
   3267 	}
   3268 
   3269 	return 0;
   3270 }
   3271 
   3272 static int packet_stats_print(struct sockstat *s, const struct filter *f)
   3273 {
   3274 	const char *addr, *port;
   3275 	char ll_name[16];
   3276 
   3277 	s->local.family = s->remote.family = AF_PACKET;
   3278 
   3279 	if (f->f) {
   3280 		s->local.data[0] = s->prot;
   3281 		if (run_ssfilter(f->f, s) == 0)
   3282 			return 1;
   3283 	}
   3284 
   3285 	sock_state_print(s);
   3286 
   3287 	if (s->prot == 3)
   3288 		addr = "*";
   3289 	else
   3290 		addr = ll_proto_n2a(htons(s->prot), ll_name, sizeof(ll_name));
   3291 
   3292 	if (s->iface == 0)
   3293 		port = "*";
   3294 	else
   3295 		port = xll_index_to_name(s->iface);
   3296 
   3297 	sock_addr_print(addr, ":", port, NULL);
   3298 	sock_addr_print("", "*", "", NULL);
   3299 
   3300 	proc_ctx_print(s);
   3301 
   3302 	if (show_details)
   3303 		sock_details_print(s);
   3304 
   3305 	return 0;
   3306 }
   3307 
   3308 static void packet_show_ring(struct packet_diag_ring *ring)
   3309 {
   3310 	printf("blk_size:%d", ring->pdr_block_size);
   3311 	printf(",blk_nr:%d", ring->pdr_block_nr);
   3312 	printf(",frm_size:%d", ring->pdr_frame_size);
   3313 	printf(",frm_nr:%d", ring->pdr_frame_nr);
   3314 	printf(",tmo:%d", ring->pdr_retire_tmo);
   3315 	printf(",features:0x%x", ring->pdr_features);
   3316 }
   3317 
   3318 static int packet_show_sock(const struct sockaddr_nl *addr,
   3319 		struct nlmsghdr *nlh, void *arg)
   3320 {
   3321 	const struct filter *f = arg;
   3322 	struct packet_diag_msg *r = NLMSG_DATA(nlh);
   3323 	struct packet_diag_info *pinfo = NULL;
   3324 	struct packet_diag_ring *ring_rx = NULL, *ring_tx = NULL;
   3325 	struct rtattr *tb[PACKET_DIAG_MAX+1];
   3326 	struct sockstat stat = {};
   3327 	uint32_t fanout = 0;
   3328 	bool has_fanout = false;
   3329 
   3330 	parse_rtattr(tb, PACKET_DIAG_MAX, (struct rtattr *)(r+1),
   3331 		     nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
   3332 
   3333 	/* use /proc/net/packet if all info are not available */
   3334 	if (!tb[PACKET_DIAG_MEMINFO])
   3335 		return -1;
   3336 
   3337 	stat.type   = r->pdiag_type;
   3338 	stat.prot   = r->pdiag_num;
   3339 	stat.ino    = r->pdiag_ino;
   3340 	stat.state  = SS_CLOSE;
   3341 	stat.sk	    = cookie_sk_get(&r->pdiag_cookie[0]);
   3342 
   3343 	if (tb[PACKET_DIAG_MEMINFO]) {
   3344 		__u32 *skmeminfo = RTA_DATA(tb[PACKET_DIAG_MEMINFO]);
   3345 
   3346 		stat.rq = skmeminfo[SK_MEMINFO_RMEM_ALLOC];
   3347 	}
   3348 
   3349 	if (tb[PACKET_DIAG_INFO]) {
   3350 		pinfo = RTA_DATA(tb[PACKET_DIAG_INFO]);
   3351 		stat.lport = stat.iface = pinfo->pdi_index;
   3352 	}
   3353 
   3354 	if (tb[PACKET_DIAG_UID])
   3355 		stat.uid = rta_getattr_u32(tb[PACKET_DIAG_UID]);
   3356 
   3357 	if (tb[PACKET_DIAG_RX_RING])
   3358 		ring_rx = RTA_DATA(tb[PACKET_DIAG_RX_RING]);
   3359 
   3360 	if (tb[PACKET_DIAG_TX_RING])
   3361 		ring_tx = RTA_DATA(tb[PACKET_DIAG_TX_RING]);
   3362 
   3363 	if (tb[PACKET_DIAG_FANOUT]) {
   3364 		has_fanout = true;
   3365 		fanout = rta_getattr_u32(tb[PACKET_DIAG_FANOUT]);
   3366 	}
   3367 
   3368 	if (packet_stats_print(&stat, f))
   3369 		return 0;
   3370 
   3371 	if (show_details) {
   3372 		if (pinfo) {
   3373 			printf("\n\tver:%d", pinfo->pdi_version);
   3374 			printf(" cpy_thresh:%d", pinfo->pdi_copy_thresh);
   3375 			printf(" flags( ");
   3376 			if (pinfo->pdi_flags & PDI_RUNNING)
   3377 				printf("running");
   3378 			if (pinfo->pdi_flags & PDI_AUXDATA)
   3379 				printf(" auxdata");
   3380 			if (pinfo->pdi_flags & PDI_ORIGDEV)
   3381 				printf(" origdev");
   3382 			if (pinfo->pdi_flags & PDI_VNETHDR)
   3383 				printf(" vnethdr");
   3384 			if (pinfo->pdi_flags & PDI_LOSS)
   3385 				printf(" loss");
   3386 			if (!pinfo->pdi_flags)
   3387 				printf("0");
   3388 			printf(" )");
   3389 		}
   3390 		if (ring_rx) {
   3391 			printf("\n\tring_rx(");
   3392 			packet_show_ring(ring_rx);
   3393 			printf(")");
   3394 		}
   3395 		if (ring_tx) {
   3396 			printf("\n\tring_tx(");
   3397 			packet_show_ring(ring_tx);
   3398 			printf(")");
   3399 		}
   3400 		if (has_fanout) {
   3401 			uint16_t type = (fanout >> 16) & 0xffff;
   3402 
   3403 			printf("\n\tfanout(");
   3404 			printf("id:%d,", fanout & 0xffff);
   3405 			printf("type:");
   3406 
   3407 			if (type == 0)
   3408 				printf("hash");
   3409 			else if (type == 1)
   3410 				printf("lb");
   3411 			else if (type == 2)
   3412 				printf("cpu");
   3413 			else if (type == 3)
   3414 				printf("roll");
   3415 			else if (type == 4)
   3416 				printf("random");
   3417 			else if (type == 5)
   3418 				printf("qm");
   3419 			else
   3420 				printf("0x%x", type);
   3421 
   3422 			printf(")");
   3423 		}
   3424 	}
   3425 
   3426 	if (show_bpf && tb[PACKET_DIAG_FILTER]) {
   3427 		struct sock_filter *fil =
   3428 		       RTA_DATA(tb[PACKET_DIAG_FILTER]);
   3429 		int num = RTA_PAYLOAD(tb[PACKET_DIAG_FILTER]) /
   3430 			  sizeof(struct sock_filter);
   3431 
   3432 		printf("\n\tbpf filter (%d): ", num);
   3433 		while (num) {
   3434 			printf(" 0x%02x %u %u %u,",
   3435 			      fil->code, fil->jt, fil->jf, fil->k);
   3436 			num--;
   3437 			fil++;
   3438 		}
   3439 	}
   3440 	printf("\n");
   3441 	return 0;
   3442 }
   3443 
   3444 static int packet_show_netlink(struct filter *f)
   3445 {
   3446 	DIAG_REQUEST(req, struct packet_diag_req r);
   3447 
   3448 	req.r.sdiag_family = AF_PACKET;
   3449 	req.r.pdiag_show = PACKET_SHOW_INFO | PACKET_SHOW_MEMINFO |
   3450 		PACKET_SHOW_FILTER | PACKET_SHOW_RING_CFG | PACKET_SHOW_FANOUT;
   3451 
   3452 	return handle_netlink_request(f, &req.nlh, sizeof(req), packet_show_sock);
   3453 }
   3454 
   3455 static int packet_show_line(char *buf, const struct filter *f, int fam)
   3456 {
   3457 	unsigned long long sk;
   3458 	struct sockstat stat = {};
   3459 	int type, prot, iface, state, rq, uid, ino;
   3460 
   3461 	sscanf(buf, "%llx %*d %d %x %d %d %u %u %u",
   3462 			&sk,
   3463 			&type, &prot, &iface, &state,
   3464 			&rq, &uid, &ino);
   3465 
   3466 	if (stat.type == SOCK_RAW && !(f->dbs&(1<<PACKET_R_DB)))
   3467 		return 0;
   3468 	if (stat.type == SOCK_DGRAM && !(f->dbs&(1<<PACKET_DG_DB)))
   3469 		return 0;
   3470 
   3471 	stat.type  = type;
   3472 	stat.prot  = prot;
   3473 	stat.lport = stat.iface = iface;
   3474 	stat.state = state;
   3475 	stat.rq    = rq;
   3476 	stat.uid   = uid;
   3477 	stat.ino   = ino;
   3478 	stat.state = SS_CLOSE;
   3479 
   3480 	if (packet_stats_print(&stat, f))
   3481 		return 0;
   3482 
   3483 	printf("\n");
   3484 	return 0;
   3485 }
   3486 
   3487 static int packet_show(struct filter *f)
   3488 {
   3489 	FILE *fp;
   3490 	int rc = 0;
   3491 
   3492 	if (!filter_af_get(f, AF_PACKET) || !(f->states & (1 << SS_CLOSE)))
   3493 		return 0;
   3494 
   3495 	if (!getenv("PROC_NET_PACKET") && !getenv("PROC_ROOT") &&
   3496 			packet_show_netlink(f) == 0)
   3497 		return 0;
   3498 
   3499 	if ((fp = net_packet_open()) == NULL)
   3500 		return -1;
   3501 	if (generic_record_read(fp, packet_show_line, f, AF_PACKET))
   3502 		rc = -1;
   3503 
   3504 	fclose(fp);
   3505 	return rc;
   3506 }
   3507 
   3508 static int netlink_show_one(struct filter *f,
   3509 				int prot, int pid, unsigned int groups,
   3510 				int state, int dst_pid, unsigned int dst_group,
   3511 				int rq, int wq,
   3512 				unsigned long long sk, unsigned long long cb)
   3513 {
   3514 	struct sockstat st = {
   3515 		.state		= SS_CLOSE,
   3516 		.rq		= rq,
   3517 		.wq		= wq,
   3518 		.local.family	= AF_NETLINK,
   3519 		.remote.family	= AF_NETLINK,
   3520 	};
   3521 
   3522 	SPRINT_BUF(prot_buf) = {};
   3523 	const char *prot_name;
   3524 	char procname[64] = {};
   3525 
   3526 	if (f->f) {
   3527 		st.rport = -1;
   3528 		st.lport = pid;
   3529 		st.local.data[0] = prot;
   3530 		if (run_ssfilter(f->f, &st) == 0)
   3531 			return 1;
   3532 	}
   3533 
   3534 	sock_state_print(&st);
   3535 
   3536 	if (resolve_services)
   3537 		prot_name = nl_proto_n2a(prot, prot_buf, sizeof(prot_buf));
   3538 	else
   3539 		prot_name = int_to_str(prot, prot_buf);
   3540 
   3541 	if (pid == -1) {
   3542 		procname[0] = '*';
   3543 	} else if (resolve_services) {
   3544 		int done = 0;
   3545 
   3546 		if (!pid) {
   3547 			done = 1;
   3548 			strncpy(procname, "kernel", 6);
   3549 		} else if (pid > 0) {
   3550 			FILE *fp;
   3551 
   3552 			snprintf(procname, sizeof(procname), "%s/%d/stat",
   3553 				getenv("PROC_ROOT") ? : "/proc", pid);
   3554 			if ((fp = fopen(procname, "r")) != NULL) {
   3555 				if (fscanf(fp, "%*d (%[^)])", procname) == 1) {
   3556 					snprintf(procname+strlen(procname),
   3557 						sizeof(procname)-strlen(procname),
   3558 						"/%d", pid);
   3559 					done = 1;
   3560 				}
   3561 				fclose(fp);
   3562 			}
   3563 		}
   3564 		if (!done)
   3565 			int_to_str(pid, procname);
   3566 	} else {
   3567 		int_to_str(pid, procname);
   3568 	}
   3569 
   3570 	sock_addr_print(prot_name, ":", procname, NULL);
   3571 
   3572 	if (state == NETLINK_CONNECTED) {
   3573 		char dst_group_buf[30];
   3574 		char dst_pid_buf[30];
   3575 
   3576 		sock_addr_print(int_to_str(dst_group, dst_group_buf), ":",
   3577 				int_to_str(dst_pid, dst_pid_buf), NULL);
   3578 	} else {
   3579 		sock_addr_print("", "*", "", NULL);
   3580 	}
   3581 
   3582 	char *pid_context = NULL;
   3583 
   3584 	if (show_proc_ctx) {
   3585 		/* The pid value will either be:
   3586 		 *   0 if destination kernel - show kernel initial context.
   3587 		 *   A valid process pid - use getpidcon.
   3588 		 *   A unique value allocated by the kernel or netlink user
   3589 		 *   to the process - show context as "not available".
   3590 		 */
   3591 		if (!pid)
   3592 			security_get_initial_context("kernel", &pid_context);
   3593 		else if (pid > 0)
   3594 			getpidcon(pid, &pid_context);
   3595 
   3596 		printf(" proc_ctx=%s", pid_context ? : "unavailable");
   3597 		free(pid_context);
   3598 	}
   3599 
   3600 	if (show_details) {
   3601 		printf(" sk=%llx cb=%llx groups=0x%08x", sk, cb, groups);
   3602 	}
   3603 	printf("\n");
   3604 
   3605 	return 0;
   3606 }
   3607 
   3608 static int netlink_show_sock(const struct sockaddr_nl *addr,
   3609 		struct nlmsghdr *nlh, void *arg)
   3610 {
   3611 	struct filter *f = (struct filter *)arg;
   3612 	struct netlink_diag_msg *r = NLMSG_DATA(nlh);
   3613 	struct rtattr *tb[NETLINK_DIAG_MAX+1];
   3614 	int rq = 0, wq = 0;
   3615 	unsigned long groups = 0;
   3616 
   3617 	parse_rtattr(tb, NETLINK_DIAG_MAX, (struct rtattr *)(r+1),
   3618 		     nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
   3619 
   3620 	if (tb[NETLINK_DIAG_GROUPS] && RTA_PAYLOAD(tb[NETLINK_DIAG_GROUPS]))
   3621 		groups = *(unsigned long *) RTA_DATA(tb[NETLINK_DIAG_GROUPS]);
   3622 
   3623 	if (tb[NETLINK_DIAG_MEMINFO]) {
   3624 		const __u32 *skmeminfo;
   3625 
   3626 		skmeminfo = RTA_DATA(tb[NETLINK_DIAG_MEMINFO]);
   3627 
   3628 		rq = skmeminfo[SK_MEMINFO_RMEM_ALLOC];
   3629 		wq = skmeminfo[SK_MEMINFO_WMEM_ALLOC];
   3630 	}
   3631 
   3632 	if (netlink_show_one(f, r->ndiag_protocol, r->ndiag_portid, groups,
   3633 			 r->ndiag_state, r->ndiag_dst_portid, r->ndiag_dst_group,
   3634 			 rq, wq, 0, 0)) {
   3635 		return 0;
   3636 	}
   3637 
   3638 	if (show_mem) {
   3639 		printf("\t");
   3640 		print_skmeminfo(tb, NETLINK_DIAG_MEMINFO);
   3641 		printf("\n");
   3642 	}
   3643 
   3644 	return 0;
   3645 }
   3646 
   3647 static int netlink_show_netlink(struct filter *f)
   3648 {
   3649 	DIAG_REQUEST(req, struct netlink_diag_req r);
   3650 
   3651 	req.r.sdiag_family = AF_NETLINK;
   3652 	req.r.sdiag_protocol = NDIAG_PROTO_ALL;
   3653 	req.r.ndiag_show = NDIAG_SHOW_GROUPS | NDIAG_SHOW_MEMINFO;
   3654 
   3655 	return handle_netlink_request(f, &req.nlh, sizeof(req), netlink_show_sock);
   3656 }
   3657 
   3658 static int netlink_show(struct filter *f)
   3659 {
   3660 	FILE *fp;
   3661 	char buf[256];
   3662 	int prot, pid;
   3663 	unsigned int groups;
   3664 	int rq, wq, rc;
   3665 	unsigned long long sk, cb;
   3666 
   3667 	if (!filter_af_get(f, AF_NETLINK) || !(f->states & (1 << SS_CLOSE)))
   3668 		return 0;
   3669 
   3670 	if (!getenv("PROC_NET_NETLINK") && !getenv("PROC_ROOT") &&
   3671 		netlink_show_netlink(f) == 0)
   3672 		return 0;
   3673 
   3674 	if ((fp = net_netlink_open()) == NULL)
   3675 		return -1;
   3676 	if (!fgets(buf, sizeof(buf), fp)) {
   3677 		fclose(fp);
   3678 		return -1;
   3679 	}
   3680 
   3681 	while (fgets(buf, sizeof(buf), fp)) {
   3682 		sscanf(buf, "%llx %d %d %x %d %d %llx %d",
   3683 		       &sk,
   3684 		       &prot, &pid, &groups, &rq, &wq, &cb, &rc);
   3685 
   3686 		netlink_show_one(f, prot, pid, groups, 0, 0, 0, rq, wq, sk, cb);
   3687 	}
   3688 
   3689 	fclose(fp);
   3690 	return 0;
   3691 }
   3692 
   3693 struct sock_diag_msg {
   3694 	__u8 sdiag_family;
   3695 };
   3696 
   3697 static int generic_show_sock(const struct sockaddr_nl *addr,
   3698 		struct nlmsghdr *nlh, void *arg)
   3699 {
   3700 	struct sock_diag_msg *r = NLMSG_DATA(nlh);
   3701 	struct inet_diag_arg inet_arg = { .f = arg, .protocol = IPPROTO_MAX };
   3702 
   3703 	switch (r->sdiag_family) {
   3704 	case AF_INET:
   3705 	case AF_INET6:
   3706 		return show_one_inet_sock(addr, nlh, &inet_arg);
   3707 	case AF_UNIX:
   3708 		return unix_show_sock(addr, nlh, arg);
   3709 	case AF_PACKET:
   3710 		return packet_show_sock(addr, nlh, arg);
   3711 	case AF_NETLINK:
   3712 		return netlink_show_sock(addr, nlh, arg);
   3713 	default:
   3714 		return -1;
   3715 	}
   3716 }
   3717 
   3718 static int handle_follow_request(struct filter *f)
   3719 {
   3720 	int ret = 0;
   3721 	int groups = 0;
   3722 	struct rtnl_handle rth;
   3723 
   3724 	if (f->families & (1 << AF_INET) && f->dbs & (1 << TCP_DB))
   3725 		groups |= 1 << (SKNLGRP_INET_TCP_DESTROY - 1);
   3726 	if (f->families & (1 << AF_INET) && f->dbs & (1 << UDP_DB))
   3727 		groups |= 1 << (SKNLGRP_INET_UDP_DESTROY - 1);
   3728 	if (f->families & (1 << AF_INET6) && f->dbs & (1 << TCP_DB))
   3729 		groups |= 1 << (SKNLGRP_INET6_TCP_DESTROY - 1);
   3730 	if (f->families & (1 << AF_INET6) && f->dbs & (1 << UDP_DB))
   3731 		groups |= 1 << (SKNLGRP_INET6_UDP_DESTROY - 1);
   3732 
   3733 	if (groups == 0)
   3734 		return -1;
   3735 
   3736 	if (rtnl_open_byproto(&rth, groups, NETLINK_SOCK_DIAG))
   3737 		return -1;
   3738 
   3739 	rth.dump = 0;
   3740 	rth.local.nl_pid = 0;
   3741 
   3742 	if (rtnl_dump_filter(&rth, generic_show_sock, f))
   3743 		ret = -1;
   3744 
   3745 	rtnl_close(&rth);
   3746 	return ret;
   3747 }
   3748 
   3749 static int get_snmp_int(char *proto, char *key, int *result)
   3750 {
   3751 	char buf[1024];
   3752 	FILE *fp;
   3753 	int protolen = strlen(proto);
   3754 	int keylen = strlen(key);
   3755 
   3756 	*result = 0;
   3757 
   3758 	if ((fp = net_snmp_open()) == NULL)
   3759 		return -1;
   3760 
   3761 	while (fgets(buf, sizeof(buf), fp) != NULL) {
   3762 		char *p = buf;
   3763 		int  pos = 0;
   3764 
   3765 		if (memcmp(buf, proto, protolen))
   3766 			continue;
   3767 		while ((p = strchr(p, ' ')) != NULL) {
   3768 			pos++;
   3769 			p++;
   3770 			if (memcmp(p, key, keylen) == 0 &&
   3771 			    (p[keylen] == ' ' || p[keylen] == '\n'))
   3772 				break;
   3773 		}
   3774 		if (fgets(buf, sizeof(buf), fp) == NULL)
   3775 			break;
   3776 		if (memcmp(buf, proto, protolen))
   3777 			break;
   3778 		p = buf;
   3779 		while ((p = strchr(p, ' ')) != NULL) {
   3780 			p++;
   3781 			if (--pos == 0) {
   3782 				sscanf(p, "%d", result);
   3783 				fclose(fp);
   3784 				return 0;
   3785 			}
   3786 		}
   3787 	}
   3788 
   3789 	fclose(fp);
   3790 	errno = ESRCH;
   3791 	return -1;
   3792 }
   3793 
   3794 
   3795 /* Get stats from sockstat */
   3796 
   3797 struct ssummary {
   3798 	int socks;
   3799 	int tcp_mem;
   3800 	int tcp_total;
   3801 	int tcp_orphans;
   3802 	int tcp_tws;
   3803 	int tcp4_hashed;
   3804 	int udp4;
   3805 	int raw4;
   3806 	int frag4;
   3807 	int frag4_mem;
   3808 	int tcp6_hashed;
   3809 	int udp6;
   3810 	int raw6;
   3811 	int frag6;
   3812 	int frag6_mem;
   3813 };
   3814 
   3815 static void get_sockstat_line(char *line, struct ssummary *s)
   3816 {
   3817 	char id[256], rem[256];
   3818 
   3819 	if (sscanf(line, "%[^ ] %[^\n]\n", id, rem) != 2)
   3820 		return;
   3821 
   3822 	if (strcmp(id, "sockets:") == 0)
   3823 		sscanf(rem, "%*s%d", &s->socks);
   3824 	else if (strcmp(id, "UDP:") == 0)
   3825 		sscanf(rem, "%*s%d", &s->udp4);
   3826 	else if (strcmp(id, "UDP6:") == 0)
   3827 		sscanf(rem, "%*s%d", &s->udp6);
   3828 	else if (strcmp(id, "RAW:") == 0)
   3829 		sscanf(rem, "%*s%d", &s->raw4);
   3830 	else if (strcmp(id, "RAW6:") == 0)
   3831 		sscanf(rem, "%*s%d", &s->raw6);
   3832 	else if (strcmp(id, "TCP6:") == 0)
   3833 		sscanf(rem, "%*s%d", &s->tcp6_hashed);
   3834 	else if (strcmp(id, "FRAG:") == 0)
   3835 		sscanf(rem, "%*s%d%*s%d", &s->frag4, &s->frag4_mem);
   3836 	else if (strcmp(id, "FRAG6:") == 0)
   3837 		sscanf(rem, "%*s%d%*s%d", &s->frag6, &s->frag6_mem);
   3838 	else if (strcmp(id, "TCP:") == 0)
   3839 		sscanf(rem, "%*s%d%*s%d%*s%d%*s%d%*s%d",
   3840 		       &s->tcp4_hashed,
   3841 		       &s->tcp_orphans, &s->tcp_tws, &s->tcp_total, &s->tcp_mem);
   3842 }
   3843 
   3844 static int get_sockstat(struct ssummary *s)
   3845 {
   3846 	char buf[256];
   3847 	FILE *fp;
   3848 
   3849 	memset(s, 0, sizeof(*s));
   3850 
   3851 	if ((fp = net_sockstat_open()) == NULL)
   3852 		return -1;
   3853 	while (fgets(buf, sizeof(buf), fp) != NULL)
   3854 		get_sockstat_line(buf, s);
   3855 	fclose(fp);
   3856 
   3857 	if ((fp = net_sockstat6_open()) == NULL)
   3858 		return 0;
   3859 	while (fgets(buf, sizeof(buf), fp) != NULL)
   3860 		get_sockstat_line(buf, s);
   3861 	fclose(fp);
   3862 
   3863 	return 0;
   3864 }
   3865 
   3866 static int print_summary(void)
   3867 {
   3868 	struct ssummary s;
   3869 	int tcp_estab;
   3870 
   3871 	if (get_sockstat(&s) < 0)
   3872 		perror("ss: get_sockstat");
   3873 	if (get_snmp_int("Tcp:", "CurrEstab", &tcp_estab) < 0)
   3874 		perror("ss: get_snmpstat");
   3875 
   3876 	get_slabstat(&slabstat);
   3877 
   3878 	printf("Total: %d (kernel %d)\n", s.socks, slabstat.socks);
   3879 
   3880 	printf("TCP:   %d (estab %d, closed %d, orphaned %d, synrecv %d, timewait %d/%d), ports %d\n",
   3881 	       s.tcp_total + slabstat.tcp_syns + s.tcp_tws,
   3882 	       tcp_estab,
   3883 	       s.tcp_total - (s.tcp4_hashed+s.tcp6_hashed-s.tcp_tws),
   3884 	       s.tcp_orphans,
   3885 	       slabstat.tcp_syns,
   3886 	       s.tcp_tws, slabstat.tcp_tws,
   3887 	       slabstat.tcp_ports
   3888 	       );
   3889 
   3890 	printf("\n");
   3891 	printf("Transport Total     IP        IPv6\n");
   3892 	printf("*	  %-9d %-9s %-9s\n", slabstat.socks, "-", "-");
   3893 	printf("RAW	  %-9d %-9d %-9d\n", s.raw4+s.raw6, s.raw4, s.raw6);
   3894 	printf("UDP	  %-9d %-9d %-9d\n", s.udp4+s.udp6, s.udp4, s.udp6);
   3895 	printf("TCP	  %-9d %-9d %-9d\n", s.tcp4_hashed+s.tcp6_hashed, s.tcp4_hashed, s.tcp6_hashed);
   3896 	printf("INET	  %-9d %-9d %-9d\n",
   3897 	       s.raw4+s.udp4+s.tcp4_hashed+
   3898 	       s.raw6+s.udp6+s.tcp6_hashed,
   3899 	       s.raw4+s.udp4+s.tcp4_hashed,
   3900 	       s.raw6+s.udp6+s.tcp6_hashed);
   3901 	printf("FRAG	  %-9d %-9d %-9d\n", s.frag4+s.frag6, s.frag4, s.frag6);
   3902 
   3903 	printf("\n");
   3904 
   3905 	return 0;
   3906 }
   3907 
   3908 static void _usage(FILE *dest)
   3909 {
   3910 	fprintf(dest,
   3911 "Usage: ss [ OPTIONS ]\n"
   3912 "       ss [ OPTIONS ] [ FILTER ]\n"
   3913 "   -h, --help          this message\n"
   3914 "   -V, --version       output version information\n"
   3915 "   -n, --numeric       don't resolve service names\n"
   3916 "   -r, --resolve       resolve host names\n"
   3917 "   -a, --all           display all sockets\n"
   3918 "   -l, --listening     display listening sockets\n"
   3919 "   -o, --options       show timer information\n"
   3920 "   -e, --extended      show detailed socket information\n"
   3921 "   -m, --memory        show socket memory usage\n"
   3922 "   -p, --processes     show process using socket\n"
   3923 "   -i, --info          show internal TCP information\n"
   3924 "   -s, --summary       show socket usage summary\n"
   3925 "   -b, --bpf           show bpf filter socket information\n"
   3926 "   -E, --events        continually display sockets as they are destroyed\n"
   3927 "   -Z, --context       display process SELinux security contexts\n"
   3928 "   -z, --contexts      display process and socket SELinux security contexts\n"
   3929 "   -N, --net           switch to the specified network namespace name\n"
   3930 "\n"
   3931 "   -4, --ipv4          display only IP version 4 sockets\n"
   3932 "   -6, --ipv6          display only IP version 6 sockets\n"
   3933 "   -0, --packet        display PACKET sockets\n"
   3934 "   -t, --tcp           display only TCP sockets\n"
   3935 "   -S, --sctp          display only SCTP sockets\n"
   3936 "   -u, --udp           display only UDP sockets\n"
   3937 "   -d, --dccp          display only DCCP sockets\n"
   3938 "   -w, --raw           display only RAW sockets\n"
   3939 "   -x, --unix          display only Unix domain sockets\n"
   3940 "   -f, --family=FAMILY display sockets of type FAMILY\n"
   3941 "       FAMILY := {inet|inet6|link|unix|netlink|help}\n"
   3942 "\n"
   3943 "   -K, --kill          forcibly close sockets, display what was closed\n"
   3944 "   -H, --no-header     Suppress header line\n"
   3945 "\n"
   3946 "   -A, --query=QUERY, --socket=QUERY\n"
   3947 "       QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink}[,QUERY]\n"
   3948 "\n"
   3949 "   -D, --diag=FILE     Dump raw information about TCP sockets to FILE\n"
   3950 "   -F, --filter=FILE   read filter information from FILE\n"
   3951 "       FILTER := [ state STATE-FILTER ] [ EXPRESSION ]\n"
   3952 "       STATE-FILTER := {all|connected|synchronized|bucket|big|TCP-STATES}\n"
   3953 "         TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listening|closing}\n"
   3954 "          connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}\n"
   3955 "       synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}\n"
   3956 "             bucket := {syn-recv|time-wait}\n"
   3957 "                big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listening|closing}\n"
   3958 		);
   3959 }
   3960 
   3961 static void help(void) __attribute__((noreturn));
   3962 static void help(void)
   3963 {
   3964 	_usage(stdout);
   3965 	exit(0);
   3966 }
   3967 
   3968 static void usage(void) __attribute__((noreturn));
   3969 static void usage(void)
   3970 {
   3971 	_usage(stderr);
   3972 	exit(-1);
   3973 }
   3974 
   3975 
   3976 static int scan_state(const char *state)
   3977 {
   3978 	static const char * const sstate_namel[] = {
   3979 		"UNKNOWN",
   3980 		[SS_ESTABLISHED] = "established",
   3981 		[SS_SYN_SENT] = "syn-sent",
   3982 		[SS_SYN_RECV] = "syn-recv",
   3983 		[SS_FIN_WAIT1] = "fin-wait-1",
   3984 		[SS_FIN_WAIT2] = "fin-wait-2",
   3985 		[SS_TIME_WAIT] = "time-wait",
   3986 		[SS_CLOSE] = "unconnected",
   3987 		[SS_CLOSE_WAIT] = "close-wait",
   3988 		[SS_LAST_ACK] = "last-ack",
   3989 		[SS_LISTEN] =	"listening",
   3990 		[SS_CLOSING] = "closing",
   3991 	};
   3992 	int i;
   3993 
   3994 	if (strcasecmp(state, "close") == 0 ||
   3995 	    strcasecmp(state, "closed") == 0)
   3996 		return (1<<SS_CLOSE);
   3997 	if (strcasecmp(state, "syn-rcv") == 0)
   3998 		return (1<<SS_SYN_RECV);
   3999 	if (strcasecmp(state, "established") == 0)
   4000 		return (1<<SS_ESTABLISHED);
   4001 	if (strcasecmp(state, "all") == 0)
   4002 		return SS_ALL;
   4003 	if (strcasecmp(state, "connected") == 0)
   4004 		return SS_ALL & ~((1<<SS_CLOSE)|(1<<SS_LISTEN));
   4005 	if (strcasecmp(state, "synchronized") == 0)
   4006 		return SS_ALL & ~((1<<SS_CLOSE)|(1<<SS_LISTEN)|(1<<SS_SYN_SENT));
   4007 	if (strcasecmp(state, "bucket") == 0)
   4008 		return (1<<SS_SYN_RECV)|(1<<SS_TIME_WAIT);
   4009 	if (strcasecmp(state, "big") == 0)
   4010 		return SS_ALL & ~((1<<SS_SYN_RECV)|(1<<SS_TIME_WAIT));
   4011 	for (i = 0; i < SS_MAX; i++) {
   4012 		if (strcasecmp(state, sstate_namel[i]) == 0)
   4013 			return (1<<i);
   4014 	}
   4015 
   4016 	fprintf(stderr, "ss: wrong state name: %s\n", state);
   4017 	exit(-1);
   4018 }
   4019 
   4020 static const struct option long_opts[] = {
   4021 	{ "numeric", 0, 0, 'n' },
   4022 	{ "resolve", 0, 0, 'r' },
   4023 	{ "options", 0, 0, 'o' },
   4024 	{ "extended", 0, 0, 'e' },
   4025 	{ "memory", 0, 0, 'm' },
   4026 	{ "info", 0, 0, 'i' },
   4027 	{ "processes", 0, 0, 'p' },
   4028 	{ "bpf", 0, 0, 'b' },
   4029 	{ "events", 0, 0, 'E' },
   4030 	{ "dccp", 0, 0, 'd' },
   4031 	{ "tcp", 0, 0, 't' },
   4032 	{ "sctp", 0, 0, 'S' },
   4033 	{ "udp", 0, 0, 'u' },
   4034 	{ "raw", 0, 0, 'w' },
   4035 	{ "unix", 0, 0, 'x' },
   4036 	{ "all", 0, 0, 'a' },
   4037 	{ "listening", 0, 0, 'l' },
   4038 	{ "ipv4", 0, 0, '4' },
   4039 	{ "ipv6", 0, 0, '6' },
   4040 	{ "packet", 0, 0, '0' },
   4041 	{ "family", 1, 0, 'f' },
   4042 	{ "socket", 1, 0, 'A' },
   4043 	{ "query", 1, 0, 'A' },
   4044 	{ "summary", 0, 0, 's' },
   4045 	{ "diag", 1, 0, 'D' },
   4046 	{ "filter", 1, 0, 'F' },
   4047 	{ "version", 0, 0, 'V' },
   4048 	{ "help", 0, 0, 'h' },
   4049 	{ "context", 0, 0, 'Z' },
   4050 	{ "contexts", 0, 0, 'z' },
   4051 	{ "net", 1, 0, 'N' },
   4052 	{ "kill", 0, 0, 'K' },
   4053 	{ "no-header", 0, 0, 'H' },
   4054 	{ 0 }
   4055 
   4056 };
   4057 
   4058 int main(int argc, char *argv[])
   4059 {
   4060 	int saw_states = 0;
   4061 	int saw_query = 0;
   4062 	int do_summary = 0;
   4063 	const char *dump_tcpdiag = NULL;
   4064 	FILE *filter_fp = NULL;
   4065 	int ch;
   4066 	int state_filter = 0;
   4067 	int addrp_width, screen_width = 80;
   4068 
   4069 	while ((ch = getopt_long(argc, argv,
   4070 				 "dhaletuwxnro460spbEf:miA:D:F:vVzZN:KHS",
   4071 				 long_opts, NULL)) != EOF) {
   4072 		switch (ch) {
   4073 		case 'n':
   4074 			resolve_services = 0;
   4075 			break;
   4076 		case 'r':
   4077 			resolve_hosts = 1;
   4078 			break;
   4079 		case 'o':
   4080 			show_options = 1;
   4081 			break;
   4082 		case 'e':
   4083 			show_options = 1;
   4084 			show_details++;
   4085 			break;
   4086 		case 'm':
   4087 			show_mem = 1;
   4088 			break;
   4089 		case 'i':
   4090 			show_tcpinfo = 1;
   4091 			break;
   4092 		case 'p':
   4093 			show_users++;
   4094 			user_ent_hash_build();
   4095 			break;
   4096 		case 'b':
   4097 			show_options = 1;
   4098 			show_bpf++;
   4099 			break;
   4100 		case 'E':
   4101 			follow_events = 1;
   4102 			break;
   4103 		case 'd':
   4104 			filter_db_set(&current_filter, DCCP_DB);
   4105 			break;
   4106 		case 't':
   4107 			filter_db_set(&current_filter, TCP_DB);
   4108 			break;
   4109 		case 'S':
   4110 			filter_db_set(&current_filter, SCTP_DB);
   4111 			break;
   4112 		case 'u':
   4113 			filter_db_set(&current_filter, UDP_DB);
   4114 			break;
   4115 		case 'w':
   4116 			filter_db_set(&current_filter, RAW_DB);
   4117 			break;
   4118 		case 'x':
   4119 			filter_af_set(&current_filter, AF_UNIX);
   4120 			break;
   4121 		case 'a':
   4122 			state_filter = SS_ALL;
   4123 			break;
   4124 		case 'l':
   4125 			state_filter = (1 << SS_LISTEN) | (1 << SS_CLOSE);
   4126 			break;
   4127 		case '4':
   4128 			filter_af_set(&current_filter, AF_INET);
   4129 			break;
   4130 		case '6':
   4131 			filter_af_set(&current_filter, AF_INET6);
   4132 			break;
   4133 		case '0':
   4134 			filter_af_set(&current_filter, AF_PACKET);
   4135 			break;
   4136 		case 'f':
   4137 			if (strcmp(optarg, "inet") == 0)
   4138 				filter_af_set(&current_filter, AF_INET);
   4139 			else if (strcmp(optarg, "inet6") == 0)
   4140 				filter_af_set(&current_filter, AF_INET6);
   4141 			else if (strcmp(optarg, "link") == 0)
   4142 				filter_af_set(&current_filter, AF_PACKET);
   4143 			else if (strcmp(optarg, "unix") == 0)
   4144 				filter_af_set(&current_filter, AF_UNIX);
   4145 			else if (strcmp(optarg, "netlink") == 0)
   4146 				filter_af_set(&current_filter, AF_NETLINK);
   4147 			else if (strcmp(optarg, "help") == 0)
   4148 				help();
   4149 			else {
   4150 				fprintf(stderr, "ss: \"%s\" is invalid family\n",
   4151 						optarg);
   4152 				usage();
   4153 			}
   4154 			break;
   4155 		case 'A':
   4156 		{
   4157 			char *p, *p1;
   4158 
   4159 			if (!saw_query) {
   4160 				current_filter.dbs = 0;
   4161 				state_filter = state_filter ?
   4162 					       state_filter : SS_CONN;
   4163 				saw_query = 1;
   4164 				do_default = 0;
   4165 			}
   4166 			p = p1 = optarg;
   4167 			do {
   4168 				if ((p1 = strchr(p, ',')) != NULL)
   4169 					*p1 = 0;
   4170 				if (strcmp(p, "all") == 0) {
   4171 					filter_default_dbs(&current_filter);
   4172 				} else if (strcmp(p, "inet") == 0) {
   4173 					filter_db_set(&current_filter, UDP_DB);
   4174 					filter_db_set(&current_filter, DCCP_DB);
   4175 					filter_db_set(&current_filter, TCP_DB);
   4176 					filter_db_set(&current_filter, SCTP_DB);
   4177 					filter_db_set(&current_filter, RAW_DB);
   4178 				} else if (strcmp(p, "udp") == 0) {
   4179 					filter_db_set(&current_filter, UDP_DB);
   4180 				} else if (strcmp(p, "dccp") == 0) {
   4181 					filter_db_set(&current_filter, DCCP_DB);
   4182 				} else if (strcmp(p, "tcp") == 0) {
   4183 					filter_db_set(&current_filter, TCP_DB);
   4184 				} else if (strcmp(p, "sctp") == 0) {
   4185 					filter_db_set(&current_filter, SCTP_DB);
   4186 				} else if (strcmp(p, "raw") == 0) {
   4187 					filter_db_set(&current_filter, RAW_DB);
   4188 				} else if (strcmp(p, "unix") == 0) {
   4189 					filter_db_set(&current_filter, UNIX_ST_DB);
   4190 					filter_db_set(&current_filter, UNIX_DG_DB);
   4191 					filter_db_set(&current_filter, UNIX_SQ_DB);
   4192 				} else if (strcasecmp(p, "unix_stream") == 0 ||
   4193 					   strcmp(p, "u_str") == 0) {
   4194 					filter_db_set(&current_filter, UNIX_ST_DB);
   4195 				} else if (strcasecmp(p, "unix_dgram") == 0 ||
   4196 					   strcmp(p, "u_dgr") == 0) {
   4197 					filter_db_set(&current_filter, UNIX_DG_DB);
   4198 				} else if (strcasecmp(p, "unix_seqpacket") == 0 ||
   4199 					   strcmp(p, "u_seq") == 0) {
   4200 					filter_db_set(&current_filter, UNIX_SQ_DB);
   4201 				} else if (strcmp(p, "packet") == 0) {
   4202 					filter_db_set(&current_filter, PACKET_R_DB);
   4203 					filter_db_set(&current_filter, PACKET_DG_DB);
   4204 				} else if (strcmp(p, "packet_raw") == 0 ||
   4205 					   strcmp(p, "p_raw") == 0) {
   4206 					filter_db_set(&current_filter, PACKET_R_DB);
   4207 				} else if (strcmp(p, "packet_dgram") == 0 ||
   4208 					   strcmp(p, "p_dgr") == 0) {
   4209 					filter_db_set(&current_filter, PACKET_DG_DB);
   4210 				} else if (strcmp(p, "netlink") == 0) {
   4211 					filter_db_set(&current_filter, NETLINK_DB);
   4212 				} else {
   4213 					fprintf(stderr, "ss: \"%s\" is illegal socket table id\n", p);
   4214 					usage();
   4215 				}
   4216 				p = p1 + 1;
   4217 			} while (p1);
   4218 			break;
   4219 		}
   4220 		case 's':
   4221 			do_summary = 1;
   4222 			break;
   4223 		case 'D':
   4224 			dump_tcpdiag = optarg;
   4225 			break;
   4226 		case 'F':
   4227 			if (filter_fp) {
   4228 				fprintf(stderr, "More than one filter file\n");
   4229 				exit(-1);
   4230 			}
   4231 			if (optarg[0] == '-')
   4232 				filter_fp = stdin;
   4233 			else
   4234 				filter_fp = fopen(optarg, "r");
   4235 			if (!filter_fp) {
   4236 				perror("fopen filter file");
   4237 				exit(-1);
   4238 			}
   4239 			break;
   4240 		case 'v':
   4241 		case 'V':
   4242 			printf("ss utility, iproute2-ss%s\n", SNAPSHOT);
   4243 			exit(0);
   4244 		case 'z':
   4245 			show_sock_ctx++;
   4246 			/* fall through */
   4247 		case 'Z':
   4248 			if (is_selinux_enabled() <= 0) {
   4249 				fprintf(stderr, "ss: SELinux is not enabled.\n");
   4250 				exit(1);
   4251 			}
   4252 			show_proc_ctx++;
   4253 			user_ent_hash_build();
   4254 			break;
   4255 		case 'N':
   4256 			if (netns_switch(optarg))
   4257 				exit(1);
   4258 			break;
   4259 		case 'K':
   4260 			current_filter.kill = 1;
   4261 			break;
   4262 		case 'H':
   4263 			show_header = 0;
   4264 			break;
   4265 		case 'h':
   4266 			help();
   4267 		case '?':
   4268 		default:
   4269 			usage();
   4270 		}
   4271 	}
   4272 
   4273 	argc -= optind;
   4274 	argv += optind;
   4275 
   4276 	if (do_summary) {
   4277 		print_summary();
   4278 		if (do_default && argc == 0)
   4279 			exit(0);
   4280 	}
   4281 
   4282 	while (argc > 0) {
   4283 		if (strcmp(*argv, "state") == 0) {
   4284 			NEXT_ARG();
   4285 			if (!saw_states)
   4286 				state_filter = 0;
   4287 			state_filter |= scan_state(*argv);
   4288 			saw_states = 1;
   4289 		} else if (strcmp(*argv, "exclude") == 0 ||
   4290 			   strcmp(*argv, "excl") == 0) {
   4291 			NEXT_ARG();
   4292 			if (!saw_states)
   4293 				state_filter = SS_ALL;
   4294 			state_filter &= ~scan_state(*argv);
   4295 			saw_states = 1;
   4296 		} else {
   4297 			break;
   4298 		}
   4299 		argc--; argv++;
   4300 	}
   4301 
   4302 	if (do_default) {
   4303 		state_filter = state_filter ? state_filter : SS_CONN;
   4304 		filter_default_dbs(&current_filter);
   4305 	}
   4306 
   4307 	filter_states_set(&current_filter, state_filter);
   4308 	filter_merge_defaults(&current_filter);
   4309 
   4310 	if (resolve_services && resolve_hosts &&
   4311 	    (current_filter.dbs & (UNIX_DBM|INET_L4_DBM)))
   4312 		init_service_resolver();
   4313 
   4314 	if (current_filter.dbs == 0) {
   4315 		fprintf(stderr, "ss: no socket tables to show with such filter.\n");
   4316 		exit(0);
   4317 	}
   4318 	if (current_filter.families == 0) {
   4319 		fprintf(stderr, "ss: no families to show with such filter.\n");
   4320 		exit(0);
   4321 	}
   4322 	if (current_filter.states == 0) {
   4323 		fprintf(stderr, "ss: no socket states to show with such filter.\n");
   4324 		exit(0);
   4325 	}
   4326 
   4327 	if (dump_tcpdiag) {
   4328 		FILE *dump_fp = stdout;
   4329 
   4330 		if (!(current_filter.dbs & (1<<TCP_DB))) {
   4331 			fprintf(stderr, "ss: tcpdiag dump requested and no tcp in filter.\n");
   4332 			exit(0);
   4333 		}
   4334 		if (dump_tcpdiag[0] != '-') {
   4335 			dump_fp = fopen(dump_tcpdiag, "w");
   4336 			if (!dump_tcpdiag) {
   4337 				perror("fopen dump file");
   4338 				exit(-1);
   4339 			}
   4340 		}
   4341 		inet_show_netlink(&current_filter, dump_fp, IPPROTO_TCP);
   4342 		fflush(dump_fp);
   4343 		exit(0);
   4344 	}
   4345 
   4346 	if (ssfilter_parse(&current_filter.f, argc, argv, filter_fp))
   4347 		usage();
   4348 
   4349 	netid_width = 0;
   4350 	if (current_filter.dbs&(current_filter.dbs-1))
   4351 		netid_width = 5;
   4352 
   4353 	state_width = 0;
   4354 	if (current_filter.states&(current_filter.states-1))
   4355 		state_width = 10;
   4356 
   4357 	if (isatty(STDOUT_FILENO)) {
   4358 		struct winsize w;
   4359 
   4360 		if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1) {
   4361 			if (w.ws_col > 0)
   4362 				screen_width = w.ws_col;
   4363 		}
   4364 	}
   4365 
   4366 	addrp_width = screen_width;
   4367 	if (netid_width)
   4368 		addrp_width -= netid_width + 1;
   4369 	if (state_width)
   4370 		addrp_width -= state_width + 1;
   4371 	addrp_width -= 14;
   4372 
   4373 	if (addrp_width&1) {
   4374 		if (netid_width)
   4375 			netid_width++;
   4376 		else if (state_width)
   4377 			state_width++;
   4378 		else
   4379 			odd_width_pad = " ";
   4380 	}
   4381 
   4382 	addrp_width /= 2;
   4383 	addrp_width--;
   4384 
   4385 	serv_width = resolve_services ? 7 : 5;
   4386 
   4387 	if (addrp_width < 15+serv_width+1)
   4388 		addrp_width = 15+serv_width+1;
   4389 
   4390 	addr_width = addrp_width - serv_width - 1;
   4391 
   4392 	if (show_header) {
   4393 		if (netid_width)
   4394 			printf("%-*s ", netid_width, "Netid");
   4395 		if (state_width)
   4396 			printf("%-*s ", state_width, "State");
   4397 		printf("%-6s %-6s %s", "Recv-Q", "Send-Q", odd_width_pad);
   4398 	}
   4399 
   4400 	/* Make enough space for the local/remote port field */
   4401 	addr_width -= 13;
   4402 	serv_width += 13;
   4403 
   4404 	if (show_header) {
   4405 		printf("%*s:%-*s %*s:%-*s\n",
   4406 		       addr_width, "Local Address", serv_width, "Port",
   4407 		       addr_width, "Peer Address", serv_width, "Port");
   4408 	}
   4409 
   4410 	fflush(stdout);
   4411 
   4412 	if (follow_events)
   4413 		exit(handle_follow_request(&current_filter));
   4414 
   4415 	if (current_filter.dbs & (1<<NETLINK_DB))
   4416 		netlink_show(&current_filter);
   4417 	if (current_filter.dbs & PACKET_DBM)
   4418 		packet_show(&current_filter);
   4419 	if (current_filter.dbs & UNIX_DBM)
   4420 		unix_show(&current_filter);
   4421 	if (current_filter.dbs & (1<<RAW_DB))
   4422 		raw_show(&current_filter);
   4423 	if (current_filter.dbs & (1<<UDP_DB))
   4424 		udp_show(&current_filter);
   4425 	if (current_filter.dbs & (1<<TCP_DB))
   4426 		tcp_show(&current_filter);
   4427 	if (current_filter.dbs & (1<<DCCP_DB))
   4428 		dccp_show(&current_filter);
   4429 	if (current_filter.dbs & (1<<SCTP_DB))
   4430 		sctp_show(&current_filter);
   4431 
   4432 	if (show_users || show_proc_ctx || show_sock_ctx)
   4433 		user_ent_destroy();
   4434 
   4435 	return 0;
   4436 }
   4437