Skip to content

Commit

Permalink
Fix for "net -s" option to show IPv6 addresses on Linux 3.13 and later
Browse files Browse the repository at this point in the history
Currently, the "net -s" option fails to show IPv6 addresses and ports
for the SOURCE-PORT and DESTINATION-PORT columns on Linux 3.13 and later
kernels, which have kernel commit efe4208f47f907 ("ipv6: make lookups
simpler and faster").  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

Reported-by: Buland Kumar Singh <bsingh@redhat.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
  • Loading branch information
lian-bo authored and k-hagio committed Feb 15, 2023
1 parent 9253b40 commit c64a827
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 5 deletions.
3 changes: 3 additions & 0 deletions defs.h
Expand Up @@ -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 */
Expand Down
20 changes: 15 additions & 5 deletions net.c
Expand Up @@ -199,6 +199,9 @@ net_init(void)
MEMBER_OFFSET_INIT(sock_common_skc_family,
"sock_common", "skc_family");
MEMBER_OFFSET_INIT(sock_sk_type, "sock", "sk_type");
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");
/*
* struct inet_sock {
* struct sock sk;
Expand Down Expand Up @@ -1104,12 +1107,19 @@ get_sock_info(ulong sock, char *buf)
break;

case SOCK_V2:
if (INVALID_MEMBER(ipv6_pinfo_rcv_saddr) ||
INVALID_MEMBER(ipv6_pinfo_daddr))
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);
} 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);
} else {
sprintf(&buf[strlen(buf)], "%s", "(cannot get IPv6 addresses)");
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))
Expand Down
3 changes: 3 additions & 0 deletions symbols.c
Expand Up @@ -9818,8 +9818,11 @@ dump_offset_table(char *spec, ulong makestruct)

fprintf(fp, " sock_sk_type: %ld\n",
OFFSET(sock_sk_type));
fprintf(fp, " sock_sk_common: %ld\n", OFFSET(sock_sk_common));
fprintf(fp, " sock_common_skc_family: %ld\n",
OFFSET(sock_common_skc_family));
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",
Expand Down

0 comments on commit c64a827

Please sign in to comment.