On Tue, Jun 13, 2017 at 10:13:24PM +0800, JingPiao Chen wrote: > * linux/smc_diag.h: New file. > * Makefile.am (EXTRA_DIST): Add linux/smc_diag.h. > * netlink_sock_diag.c: Include <linux/smc_diag.h>, > "xlat/smc_diag_extended_flags.h" and "xlat/smc_states.h". > (decode_smc_diag_req, decode_smc_diag_msg): New functions. > (diag_decoders): Add AF_SMC. > * xlat/smc_diag_extended_flags.in: New file. > * xlat/smc_states.in: Likewise. > --- > Makefile.am | 1 + > linux/smc_diag.h | 40 +++++++++++++++++++++++ > netlink_sock_diag.c | 70 > +++++++++++++++++++++++++++++++++++++++++ > xlat/smc_diag_extended_flags.in | 2 ++ > xlat/smc_states.in | 12 +++++++ > 5 files changed, 125 insertions(+) > create mode 100644 linux/smc_diag.h > create mode 100644 xlat/smc_diag_extended_flags.in > create mode 100644 xlat/smc_states.in > > diff --git a/Makefile.am b/Makefile.am > index 75a9828..e22d480 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -681,6 +681,7 @@ EXTRA_DIST = \ > linux/sh64/syscallent.h \ > linux/sh64/userent.h \ > linux/signalent.h \ > + linux/smc_diag.h \ > linux/sock_diag.h \ > linux/sparc/arch_getrval2.c \ > linux/sparc/arch_regs.c \ > diff --git a/linux/smc_diag.h b/linux/smc_diag.h > new file mode 100644 > index 0000000..b7401b8 > --- /dev/null > +++ b/linux/smc_diag.h > @@ -0,0 +1,40 @@ > +#ifndef STRACE_LINUX_SMC_DIAG_H > +#define STRACE_LINUX_SMC_DIAG_H > + > +#include <linux/inet_diag.h> > + > +/* Request structure */ > +struct smc_diag_req { > + uint8_t diag_family; > + uint8_t pad[2]; > + uint8_t diag_ext; /* Query extended information */ > + struct inet_diag_sockid id; > +}; > + > +/* Base info structure. It contains socket identity (addrs/ports/cookie) > based > + * on the internal clcsock, and more SMC-related socket data > + */
I don't think these lengthy comments are relevant for strace. > +struct smc_diag_msg { > + uint8_t diag_family; > + uint8_t diag_state; > + uint8_t diag_fallback; > + uint8_t diag_shutdown; > + struct inet_diag_sockid id; > + > + uint32_t diag_uid; > + uint64_t diag_inode; > +}; > + > +/* Extensions */ > + > +enum { > + SMC_DIAG_NONE, > + SMC_DIAG_CONNINFO, > + SMC_DIAG_LGRINFO, > + SMC_DIAG_SHUTDOWN, > + __SMC_DIAG_MAX, > +}; > + > +#define SMC_DIAG_MAX (__SMC_DIAG_MAX - 1) I don't think we need either __SMC_DIAG_MAX or SMC_DIAG_MAX. > + > +#endif /* !STRACE_LINUX_SMC_DIAG_H */ > diff --git a/netlink_sock_diag.c b/netlink_sock_diag.c > index 7467d1a..e42b75a 100644 > --- a/netlink_sock_diag.c > +++ b/netlink_sock_diag.c > @@ -35,6 +35,9 @@ > #include <linux/netlink.h> > #include <linux/netlink_diag.h> > #include <linux/packet_diag.h> > +#ifdef AF_SMC > +# include <linux/smc_diag.h> > +#endif > #include <linux/unix_diag.h> > > #include "xlat/inet_diag_extended_flags.h" > @@ -47,6 +50,11 @@ > > #include "xlat/packet_diag_show.h" > > +#ifdef AF_SMC > +# include "xlat/smc_diag_extended_flags.h" > +# include "xlat/smc_states.h" > +#endif > + > #include "xlat/unix_diag_show.h" > > static void > @@ -331,12 +339,74 @@ decode_inet_diag_msg(struct tcb *const tcp, > return true; > } > > +#ifdef AF_SMC > +static bool > +decode_smc_diag_req(struct tcb *const tcp, > + const struct nlmsghdr *const nlmsghdr, > + const kernel_ulong_t addr, > + const kernel_ulong_t len) > +{ > + struct smc_diag_req req; > + > + if (len < sizeof(req) || umove(tcp, addr, &req)) > + return false; > + > + tprints("{diag_family="); > + printxval(addrfams, req.diag_family, "AF_???"); > + tprints(", diag_ext="); > + printflags(smc_diag_extended_flags, req.diag_ext, > + "1<<(SMC_DIAG_\?\?\?-1)"); > + tprints(", id="); > + /* > + * AF_SMC protocol family socket handler > + * keeping the AF_INET sock address. > + */ > + print_inet_diag_sockid(&req.id, AF_INET); Is it correct? Does the kernel treat smc_diag_req.id as AF_INET, AF_INET6, or something else? > + tprints("}"); > + > + return true; > +} > + > +static bool > +decode_smc_diag_msg(struct tcb *const tcp, > + const struct nlmsghdr *const nlmsghdr, > + const kernel_ulong_t addr, > + const kernel_ulong_t len) > +{ > + struct smc_diag_msg msg; > + > + if (len < sizeof(msg) || umove(tcp, addr, &msg)) > + return false; > + > + tprints("{diag_family="); > + printxval(addrfams, msg.diag_family, "AF_???"); > + tprints(", diag_state="); > + printxval(smc_states, msg.diag_state, "SMC_???"); > + tprintf(", diag_fallback=%" PRIu8 ", diag_shutdown=%" PRIu8, > + msg.diag_fallback, msg.diag_shutdown); > + tprints(", id="); > + /* > + * AF_SMC protocol family socket handler > + * keeping the AF_INET sock address. > + */ > + print_inet_diag_sockid(&msg.id, AF_INET); Likewise, how does the kernel treat smc_diag_msg.id? -- ldv
signature.asc
Description: PGP signature
------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel