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