On Sun, Jun 11, 2023 at 1:32 PM Shyam Prasad N <nspmangalore@xxxxxxxxx> wrote: > > On Fri, Jun 9, 2023 at 11:32 PM Enzo Matsumiya <ematsumiya@xxxxxxx> wrote: > > > > Hi Shyam, > > > > On 06/09, Shyam Prasad N wrote: > > >With multichannel, it is useful to know the src port details > > >for each channel. This change will print the ip addr and > > >port details for both the socket dest and src endpoints. > > > > > >Signed-off-by: Shyam Prasad N <sprasad@xxxxxxxxxxxxx> > > >--- > > > fs/smb/client/cifs_debug.c | 46 ++++++++++++++++++++++++++++++++++++++ > > > 1 file changed, 46 insertions(+) > > > > > >diff --git a/fs/smb/client/cifs_debug.c b/fs/smb/client/cifs_debug.c > > >index 17c884724590..d5fd3681f56e 100644 > > >--- a/fs/smb/client/cifs_debug.c > > >+++ b/fs/smb/client/cifs_debug.c > > >@@ -12,6 +12,7 @@ > > > #include <linux/module.h> > > > #include <linux/proc_fs.h> > > > #include <linux/uaccess.h> > > >+#include <net/inet_sock.h> > > > #include "cifspdu.h" > > > #include "cifsglob.h" > > > #include "cifsproto.h" > > >@@ -146,6 +147,30 @@ cifs_dump_channel(struct seq_file *m, int i, struct cifs_chan *chan) > > > in_flight(server), > > > atomic_read(&server->in_send), > > > atomic_read(&server->num_waiters)); > > >+ > > >+#ifndef CONFIG_CIFS_SMB_DIRECT > > >+ if (server->ssocket) { > > >+ if (server->dstaddr.ss_family == AF_INET6) { > > >+ struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr; > > >+ struct sock *sk = server->ssocket->sk; > > >+ struct inet_sock *inet = inet_sk(server->ssocket->sk); > > >+ seq_printf(m, "\n\t\tIPv6 Dest: [%pI6]:%d Src: [%pI6]:%d", > > >+ &ipv6->sin6_addr, > > >+ ntohs(ipv6->sin6_port), > > >+ &sk->sk_v6_rcv_saddr.s6_addr32, > > >+ ntohs(inet->inet_sport)); > > >+ } else { > > >+ struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr; > > >+ struct inet_sock *inet = inet_sk(server->ssocket->sk); > > >+ seq_printf(m, "\n\t\tIPv4 Dest: %pI4:%d Src: %pI4:%d", > > >+ &ipv4->sin_addr, > > >+ ntohs(ipv4->sin_port), > > >+ &inet->inet_saddr, > > >+ ntohs(inet->inet_sport)); > > >+ } > > >+ } > > >+#endif > > >+ > > > } > > > > > > static void > > >@@ -351,6 +376,27 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) > > > atomic_read(&server->smbd_conn->mr_ready_count), > > > atomic_read(&server->smbd_conn->mr_used_count)); > > > skip_rdma: > > >+#else > > >+ if (server->ssocket) { > > >+ if (server->dstaddr.ss_family == AF_INET6) { > > >+ struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr; > > >+ struct sock *sk = server->ssocket->sk; > > >+ struct inet_sock *inet = inet_sk(server->ssocket->sk); > > >+ seq_printf(m, "\nIPv6 Dest: [%pI6]:%d Src: [%pI6]:%d", > > >+ &ipv6->sin6_addr, > > >+ ntohs(ipv6->sin6_port), > > >+ &sk->sk_v6_rcv_saddr.s6_addr32, > > >+ ntohs(inet->inet_sport)); > > >+ } else { > > >+ struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr; > > >+ struct inet_sock *inet = inet_sk(server->ssocket->sk); > > >+ seq_printf(m, "\nIPv4 Dest: %pI4:%d Src: %pI4:%d", > > >+ &ipv4->sin_addr, > > >+ ntohs(ipv4->sin_port), > > >+ &inet->inet_saddr, > > >+ ntohs(inet->inet_sport)); > > >+ } > > >+ } > > > #endif > > > seq_printf(m, "\nNumber of credits: %d,%d,%d Dialect 0x%x", > > > server->credits, > > > > You could save a lot of lines by using the generic formats for IP > > addresses (Documentation/printk-formats.txt, look for "IPv4/IPv6 > > addresses (generic, with port, flowinfo, scope)"). > > > > e.g. using %pISpc will give you: > > 1.2.3.4:12345 for IPv4 or [1:2:3:4:5:6:7:8]:12345 for IPv6, just by > > passing &server->dstaddr (without any casts), and you don't have to > > check address family every time as well. > > > > And to properly get the source IP being used by the socket there's > > kernel_getpeername(). > > > > e.g.: > > { > > ... > > struct sockaddr src; > > int addrlen; > > > > addrlen = kernel_getpeername(server->ssocket, &src); > > if (addrlen != sizeof(struct sockaddr_in) && addrlen != sizeof(struct sockaddr_in6)) > > continue; // skip or "return addrlen < 0 ? addrlen : -EAFNOSUPPORT;" > > ... > > seq_print(m, "IP: src=%pISpc, dest=%pISpc", &server->dstaddr, &src); > > ... > > } > > > > > > Cheers, > > > > Enzo > > Hi Enzo, > > Thanks for the review. Very good points. > Let me test out with these changes. > > -- > Regards, > Shyam Hi Enzo, Attached the updated patch. Please review. I had to use kernel_getsockname to get socket source details, not kernel_getpeername. Here's what the new output looks like: IP addr: dst: 192.168.10.1:445, src: 192.168.10.12:57966 -- Regards, Shyam