iproute2: ss: add support to expose various inet sockopts

This commit adds support to expose the following inet socket options:
-- recverr
-- is_icsk
-- freebind
-- hdrincl
-- mc_loop
-- transparent
-- mc_all
-- nodefrag
-- bind_address_no_port
-- recverr_rfc4884
-- defer_connect
with the option --inet-sockopt. The individual option is only shown
when set.

Signed-off-by: Wei Wang <weiwan@google.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Wei Wang 2020-08-19 14:13:54 -07:00 committed by David Ahern
parent c8eb4b52c1
commit ad34d5fadb
2 changed files with 46 additions and 0 deletions

View File

@ -379,6 +379,9 @@ Display vsock sockets (alias for -f vsock).
.B \-\-xdp
Display XDP sockets (alias for -f xdp).
.TP
.B \-\-inet-sockopt
Display inet socket options.
.TP
.B \-f FAMILY, \-\-family=FAMILY
Display sockets of type FAMILY. Currently the following families are
supported: unix, inet, inet6, link, netlink, vsock, xdp.

View File

@ -114,6 +114,7 @@ static int sctp_ino;
static int show_tipcinfo;
static int show_tos;
static int show_cgroup;
static int show_inet_sockopt;
int oneline;
enum col_id {
@ -3333,6 +3334,41 @@ static int inet_show_sock(struct nlmsghdr *nlh,
out(" cgroup:%s", cg_id_to_path(rta_getattr_u64(tb[INET_DIAG_CGROUP_ID])));
}
if (show_inet_sockopt) {
if (tb[INET_DIAG_SOCKOPT] && RTA_PAYLOAD(tb[INET_DIAG_SOCKOPT]) >=
sizeof(struct inet_diag_sockopt)) {
const struct inet_diag_sockopt *sockopt =
RTA_DATA(tb[INET_DIAG_SOCKOPT]);
if (!oneline)
out("\n\tinet-sockopt: (");
else
out(" inet-sockopt: (");
if (sockopt->recverr)
out(" recverr");
if (sockopt->is_icsk)
out(" is_icsk");
if (sockopt->freebind)
out(" freebind");
if (sockopt->hdrincl)
out(" hdrincl");
if (sockopt->mc_loop)
out(" mc_loop");
if (sockopt->transparent)
out(" transparent");
if (sockopt->mc_all)
out(" mc_all");
if (sockopt->nodefrag)
out(" nodefrag");
if (sockopt->bind_address_no_port)
out(" bind_addr_no_port");
if (sockopt->recverr_rfc4884)
out(" recverr_rfc4884");
if (sockopt->defer_connect)
out(" defer_connect");
out(")");
}
}
if (show_mem || (show_tcpinfo && s->type != IPPROTO_UDP)) {
if (!oneline)
out("\n\t");
@ -5210,6 +5246,7 @@ static void _usage(FILE *dest)
" -K, --kill forcibly close sockets, display what was closed\n"
" -H, --no-header Suppress header line\n"
" -O, --oneline socket's data printed on a single line\n"
" --inet-sockopt show various inet socket options\n"
"\n"
" -A, --query=QUERY, --socket=QUERY\n"
" QUERY := {all|inet|tcp|mptcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink|vsock_stream|vsock_dgram|tipc}[,QUERY]\n"
@ -5299,6 +5336,8 @@ static int scan_state(const char *state)
#define OPT_CGROUP 261
#define OPT_INET_SOCKOPT 262
static const struct option long_opts[] = {
{ "numeric", 0, 0, 'n' },
{ "resolve", 0, 0, 'r' },
@ -5341,6 +5380,7 @@ static const struct option long_opts[] = {
{ "xdp", 0, 0, OPT_XDPSOCK},
{ "mptcp", 0, 0, 'M' },
{ "oneline", 0, 0, 'O' },
{ "inet-sockopt", 0, 0, OPT_INET_SOCKOPT },
{ 0 }
};
@ -5539,6 +5579,9 @@ int main(int argc, char *argv[])
case 'O':
oneline = 1;
break;
case OPT_INET_SOCKOPT:
show_inet_sockopt = 1;
break;
case 'h':
help();
case '?':