[Crash-utility] [PATCH] Fix for "net -s" option to show an IPv6 address
lijiang
lijiang at redhat.com
Tue Feb 14 09:20:42 UTC 2023
On Tue, Feb 14, 2023 at 3:46 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab at nec.com>
wrote:
> On 2023/02/09 21:15, Lianbo Jiang wrote:
> > Currently, the "net -s" command fails to show an IPv6 address. For
> > example:
> >
> > crash> net -s
> > PID: 305524 TASK: ffff9bc449895580 CPU: 6 COMMAND: "sshd"
> > FD SOCKET SOCK FAMILY:TYPE SOURCE-PORT
> DESTINATION-PORT
> > 3 ffff9bc446e9a680 ffff9bc4455b5940 UNIX:DGRAM
> > 4 ffff9bc446e9c600 ffff9bc3b2b24e00 INET6:STREAM
> >
> > With the patch:
> > crash> net -s
> > PID: 305524 TASK: ffff9bc449895580 CPU: 6 COMMAND: "sshd"
> > FD SOCKET SOCK FAMILY:TYPE SOURCE-PORT
> DESTINATION-PORT
> > 3 ffff9bc446e9a680 ffff9bc4455b5940 UNIX:DGRAM
> > 4 ffff9bc446e9c600 ffff9bc3b2b24e00 INET6:STREAM
> xxxx:xx:x:xxxx:xxxx:xxxx:xxxx:xxxx-22
> yyyy:yy:y:yyyy:yyyy:yyyy:yyyy:yyyy-44870
> >
> > Let's support displaying the IPv6 address and port in the SOURCE-PORT
> > and DESTINATION-PORT colums.
> >
> > Reported-by: Buland Kumar Singh <bsingh at redhat.com>
> > Signed-off-by: Lianbo Jiang <lijiang at redhat.com>
>
> Good catch, I didn't know "net -s" could print IPv6 addresses...
>
> Is this the corresponding kernel patch?
>
>
Yes. Actually there are two related kernel commits:
[1] 1da177e4c3f4 ("Linux-2.6.12-rc2")
[2] efe4208f47f9 ("ipv6: make lookups simpler and faster") v3.13-rc1
Can you help to add this to the patch log? I forgot to add them.
commit efe4208f47f907b86f528788da711e8ab9dea44d
> Author: Eric Dumazet <edumazet at google.com>
> Date: Thu Oct 3 15:42:29 2013 -0700
>
> ipv6: make lookups simpler and faster
>
> > ---
> > defs.h | 3 +++
> > net.c | 40 ++++++++++++++++++++++++++++------------
> > symbols.c | 6 ++++++
> > 3 files changed, 37 insertions(+), 12 deletions(-)
> >
> > diff --git a/defs.h b/defs.h
> > index 33a823b7b67c..db20056dc3ed 100644
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -2204,6 +2204,9 @@ struct offset_table { /* stash
> of commonly-used offsets */
> > long maple_range_64_slot;
> > long maple_metadata_end;
> > long maple_metadata_gap;
> > + long sock_sk_common;
> > + long sock_common_skc_v6_daddr;
> > + long sock_common_skc_v6_rcv_saddr;
> > };
> >
> > struct size_table { /* stash of commonly-used sizes */
> > diff --git a/net.c b/net.c
> > index 7c9c8bd9c98d..7af299d0774d 100644
> > --- a/net.c
> > +++ b/net.c
> > @@ -198,6 +198,9 @@ net_init(void)
> > */
> > MEMBER_OFFSET_INIT(sock_common_skc_family,
> > "sock_common", "skc_family");
> > + MEMBER_OFFSET_INIT(sock_sk_common, "sock",
> "__sk_common");
> > + MEMBER_OFFSET_INIT(sock_common_skc_v6_daddr,
> "sock_common", "skc_v6_daddr");
> > + MEMBER_OFFSET_INIT(sock_common_skc_v6_rcv_saddr,
> "sock_common", "skc_v6_rcv_saddr");
> > MEMBER_OFFSET_INIT(sock_sk_type, "sock",
> "sk_type");
> > /*
> > * struct inet_sock {
> > @@ -1104,19 +1107,32 @@ get_sock_info(ulong sock, char *buf)
> > break;
> >
> > case SOCK_V2:
> > - if (INVALID_MEMBER(ipv6_pinfo_rcv_saddr) ||
> > - INVALID_MEMBER(ipv6_pinfo_daddr))
> > - break;
> > -
> > - ipv6_rcv_saddr = ipv6_pinfo + OFFSET(ipv6_pinfo_rcv_saddr);
> > - ipv6_daddr = ipv6_pinfo + OFFSET(ipv6_pinfo_daddr);
> > -
> > - if (!readmem(ipv6_rcv_saddr, KVADDR, u6_addr16_src,
> SIZE(in6_addr),
> > - "ipv6_rcv_saddr buffer", QUIET|RETURN_ON_ERROR))
> > - break;
> > - if (!readmem(ipv6_daddr, KVADDR, u6_addr16_dest,
> SIZE(in6_addr),
> > - "ipv6_daddr buffer", QUIET|RETURN_ON_ERROR))
> > + if (VALID_MEMBER(ipv6_pinfo_rcv_saddr) &&
> > + VALID_MEMBER(ipv6_pinfo_daddr)) {
> > + ipv6_rcv_saddr = ipv6_pinfo +
> OFFSET(ipv6_pinfo_rcv_saddr);
> > + ipv6_daddr = ipv6_pinfo + OFFSET(ipv6_pinfo_daddr);
> > +
> > + if (!readmem(ipv6_rcv_saddr, KVADDR,
> u6_addr16_src, SIZE(in6_addr),
> > + "ipv6_rcv_saddr buffer",
> QUIET|RETURN_ON_ERROR))
> > + break;
> > + if (!readmem(ipv6_daddr, KVADDR, u6_addr16_dest,
> SIZE(in6_addr),
> > + "ipv6_daddr buffer",
> QUIET|RETURN_ON_ERROR))
> > + break;
> > + } else if (VALID_MEMBER(sock_sk_common) &&
> VALID_MEMBER(sock_common_skc_v6_daddr) &&
> > +
> VALID_MEMBER(sock_common_skc_v6_rcv_saddr)) {
> > + ipv6_rcv_saddr = sock + OFFSET(sock_sk_common) +
> OFFSET(sock_common_skc_v6_rcv_saddr);
> > + ipv6_daddr = sock + OFFSET(sock_sk_common) +
> OFFSET(sock_common_skc_v6_daddr);
> > +
> > + if (!readmem(ipv6_rcv_saddr, KVADDR,
> u6_addr16_src, SIZE(in6_addr),
> > + "ipv6_rcv_saddr buffer",
> QUIET|RETURN_ON_ERROR))
> > + break;
> > + if (!readmem(ipv6_daddr, KVADDR, u6_addr16_dest,
> SIZE(in6_addr),
> > + "ipv6_daddr buffer",
> QUIET|RETURN_ON_ERROR))
> > + break;
> > + } else {
> > + error(INFO, "Invalid member...\n");
>
> This message is unusual and vague, and the output looks not good:
> (I forced to print this.)
>
> crash> net -s 1
> PID: 1 TASK: ffff9c6b8159c8c0 CPU: 11 COMMAND: "systemd"
> FD SOCKET SOCK FAMILY:TYPE SOURCE-PORT
> DESTINATION-PORT
> ...
> 41 ffff9c79974b70c0 ffff9c79afcfb700 INET:DGRAM 0.0.0.0-111 0.0.0.0-0
> 42 ffff9c79974b1e40 ffff9c7a6f4347c0 net: Invalid member...
> INET6:STREAM
> 43 ffff9c79974b1340 ffff9c7a6f43e780 net: Invalid member...
> INET6:DGRAM
> 44 ffff9c79974b3180 ffff9c767da66780 UNIX:SEQPACKET
> ...
>
> How about this?
>
>
Looks good.
> } else {
> - error(INFO, "Invalid member...\n");
> + sprintf(&buf[strlen(buf)], "%s", "(cannot get IPv6
> addresses)");
> break;
>
> 41 ffff9c79974b70c0 ffff9c79afcfb700 INET:DGRAM 0.0.0.0-111 0.0.0.0-0
> 42 ffff9c79974b1e40 ffff9c7a6f4347c0 INET6:STREAM (cannot get IPv6
> addresses)
> 43 ffff9c79974b1340 ffff9c7a6f43e780 INET6:DGRAM (cannot get IPv6
> addresses)
> 44 ffff9c79974b3180 ffff9c767da66780 UNIX:SEQPACKET
>
> Otherwise, looks good, although I would like to tweak some indents
> a bit.
>
>
The Ipv6 address is a very long string, I tried adjusting the indent, but
it still doesn't look good.
Thanks.
Lianbo
Thanks,
> Kazu
>
> > break;
> > + }
> >
> > sprintf(&buf[strlen(buf)], "%*s ", BITS32() ? 22 : 12,
> > dump_in6_addr_port(u6_addr16_src, sport, buf2,
> &len));
> > diff --git a/symbols.c b/symbols.c
> > index e38df8aad0f5..d622de722ebd 100644
> > --- a/symbols.c
> > +++ b/symbols.c
> > @@ -9820,6 +9820,12 @@ dump_offset_table(char *spec, ulong makestruct)
> > OFFSET(sock_sk_type));
> > fprintf(fp, " sock_common_skc_family: %ld\n",
> > OFFSET(sock_common_skc_family));
> > + fprintf(fp, " sock_sk_common: %ld\n",
> > + OFFSET(sock_sk_common));
> > + fprintf(fp, " sock_common_skc_v6_daddr: %ld\n",
> > + OFFSET(sock_common_skc_v6_daddr));
> > + fprintf(fp, " sock_common_skc_v6_rcv_saddr: %ld\n",
> > + OFFSET(sock_common_skc_v6_rcv_saddr));
> > fprintf(fp, " socket_alloc_vfs_inode: %ld\n",
> > OFFSET(socket_alloc_vfs_inode));
> > fprintf(fp, " inet_sock_inet: %ld\n",
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/crash-utility/attachments/20230214/92ef4f77/attachment-0001.htm>
More information about the Crash-utility
mailing list