Re: [PATCH 4/6] cifs: display the endpoint IP details in DebugData

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jun 12, 2023 at 1:29 PM Shyam Prasad N <nspmangalore@xxxxxxxxx> wrote:
>
> 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

Attached the patch now. :)

-- 
Regards,
Shyam

Attachment: 0004-cifs-display-the-endpoint-IP-details-in-DebugData.patch
Description: Binary data


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux