ss: do not bindly dump two families

ss currently dumps IPv4 sockets, then IPv6 sockets from the kernel,
even if -4 or -6 option was given. Filtering in user space then has to
drop all sockets of wrong family. Such a waste of time...

Before :

$ time ss -tn -4 | wc -l
251659

real	0m1.241s
user	0m0.423s
sys	0m0.806s

After:

$ time ss -tn -4 | wc -l
251672

real	0m0.779s
user	0m0.412s
sys	0m0.386s

Signed-off-by: Eric Dumazet <edumazet@google.com>
This commit is contained in:
Eric Dumazet 2015-05-29 05:37:49 -07:00 committed by Stephen Hemminger
parent 22588a0e65
commit 518af1e0b1
1 changed files with 3 additions and 1 deletions

View File

@ -2199,6 +2199,8 @@ static int inet_show_netlink(struct filter *f, FILE *dump_fp, int protocol)
return -1;
rth.dump = MAGIC_SEQ;
rth.dump_fp = dump_fp;
if (preferred_family == PF_INET6)
family = PF_INET6;
again:
if ((err = sockdiag_send(family, rth.fd, protocol, f)))
@ -2211,7 +2213,7 @@ again:
}
goto Exit;
}
if (family == PF_INET) {
if (family == PF_INET && preferred_family != PF_INET) {
family = PF_INET6;
goto again;
}