Module Name: src Committed By: christos Date: Sun Mar 10 17:08:31 UTC 2024
Modified Files: src/usr.bin/kdump: kdump.c Log Message: decode some {g,s}etsockopt*. To generate a diff of this commit: cvs rdiff -u -r1.142 -r1.143 src/usr.bin/kdump/kdump.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/kdump/kdump.c diff -u src/usr.bin/kdump/kdump.c:1.142 src/usr.bin/kdump/kdump.c:1.143 --- src/usr.bin/kdump/kdump.c:1.142 Sat Feb 10 20:08:57 2024 +++ src/usr.bin/kdump/kdump.c Sun Mar 10 13:08:31 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: kdump.c,v 1.142 2024/02/11 01:08:57 kre Exp $ */ +/* $NetBSD: kdump.c,v 1.143 2024/03/10 17:08:31 christos Exp $ */ /*- * Copyright (c) 1988, 1993 @@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19 #if 0 static char sccsid[] = "@(#)kdump.c 8.4 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: kdump.c,v 1.142 2024/02/11 01:08:57 kre Exp $"); +__RCSID("$NetBSD: kdump.c,v 1.143 2024/03/10 17:08:31 christos Exp $"); #endif #endif /* not lint */ @@ -69,11 +69,16 @@ __RCSID("$NetBSD: kdump.c,v 1.142 2024/0 #include <vis.h> #include <util.h> +#include <netinet/in.h> +#include <netinet/tcp.h> + #include "ktrace.h" #include "setemul.h" #include <sys/syscall.h> +#define CASERETURN(a) case a: return # a + #define TIMESTAMP_NONE 0x0 #define TIMESTAMP_ABSOLUTE 0x1 #define TIMESTAMP_ELAPSED 0x2 @@ -552,23 +557,152 @@ output_long(u_long it, int as_x) static const char * fcntlname(u_long cmd) { -#define FCNTLCASE(a) case a: return # a switch (cmd) { - FCNTLCASE(F_DUPFD); - FCNTLCASE(F_GETFD); - FCNTLCASE(F_SETFD); - FCNTLCASE(F_GETFL); - FCNTLCASE(F_SETFL); - FCNTLCASE(F_GETOWN); - FCNTLCASE(F_SETOWN); - FCNTLCASE(F_GETLK); - FCNTLCASE(F_SETLK); - FCNTLCASE(F_SETLKW); - FCNTLCASE(F_CLOSEM); - FCNTLCASE(F_MAXFD); - FCNTLCASE(F_DUPFD_CLOEXEC); - FCNTLCASE(F_GETNOSIGPIPE); - FCNTLCASE(F_SETNOSIGPIPE); + CASERETURN(F_DUPFD); + CASERETURN(F_GETFD); + CASERETURN(F_SETFD); + CASERETURN(F_GETFL); + CASERETURN(F_SETFL); + CASERETURN(F_GETOWN); + CASERETURN(F_SETOWN); + CASERETURN(F_GETLK); + CASERETURN(F_SETLK); + CASERETURN(F_SETLKW); + CASERETURN(F_CLOSEM); + CASERETURN(F_MAXFD); + CASERETURN(F_DUPFD_CLOEXEC); + CASERETURN(F_GETNOSIGPIPE); + CASERETURN(F_SETNOSIGPIPE); + default: + return NULL; + } +} + +static const char * +sockproto(register_t proto) +{ + switch (proto) { + CASERETURN(IPPROTO_IP); + CASERETURN(IPPROTO_ICMP); + CASERETURN(IPPROTO_IGMP); + CASERETURN(IPPROTO_GGP); +// CASERETURN(IPPROTO_IPV4); + CASERETURN(IPPROTO_IPIP); + CASERETURN(IPPROTO_TCP); + CASERETURN(IPPROTO_EGP); + CASERETURN(IPPROTO_PUP); + CASERETURN(IPPROTO_UDP); + CASERETURN(IPPROTO_IDP); + CASERETURN(IPPROTO_TP); + CASERETURN(IPPROTO_DCCP); + CASERETURN(IPPROTO_IPV6); + CASERETURN(IPPROTO_ROUTING); + CASERETURN(IPPROTO_FRAGMENT); + CASERETURN(IPPROTO_RSVP); + CASERETURN(IPPROTO_GRE); + CASERETURN(IPPROTO_ESP); + CASERETURN(IPPROTO_AH); + CASERETURN(IPPROTO_MOBILE); +// CASERETURN(IPPROTO_IPV6_ICMP); + CASERETURN(IPPROTO_ICMPV6); + CASERETURN(IPPROTO_NONE); + CASERETURN(IPPROTO_DSTOPTS); + CASERETURN(IPPROTO_EON); + CASERETURN(IPPROTO_ETHERIP); + CASERETURN(IPPROTO_ENCAP); + CASERETURN(IPPROTO_PIM); + CASERETURN(IPPROTO_IPCOMP); + CASERETURN(IPPROTO_VRRP); +// CASERETURN(IPPROTO_CARP); + CASERETURN(IPPROTO_L2TP); + CASERETURN(IPPROTO_SCTP); + CASERETURN(IPPROTO_PFSYNC); + CASERETURN(IPPROTO_RAW); + CASERETURN(IPPROTO_MAX); + CASERETURN(IPPROTO_DONE); + CASERETURN(SOL_SOCKET); + default: + return NULL; + } +} + +static const char * +sockoptname(register_t optname) +{ + switch (optname) { + CASERETURN(SO_ACCEPTCONN); + CASERETURN(SO_ACCEPTFILTER); + CASERETURN(SO_BROADCAST); + CASERETURN(SO_DEBUG); + CASERETURN(SO_DONTROUTE); + CASERETURN(SO_ERROR); + CASERETURN(SO_KEEPALIVE); + CASERETURN(SO_LINGER); + CASERETURN(SO_NOHEADER); + CASERETURN(SO_NOSIGPIPE); + CASERETURN(SO_OOBINLINE); + CASERETURN(SO_OVERFLOWED); + CASERETURN(SO_RCVBUF); + CASERETURN(SO_RCVLOWAT); + CASERETURN(SO_RCVTIMEO); + CASERETURN(SO_RERROR); + CASERETURN(SO_REUSEADDR); + CASERETURN(SO_REUSEPORT); + CASERETURN(SO_SNDBUF); + CASERETURN(SO_SNDLOWAT); + CASERETURN(SO_SNDTIMEO); + CASERETURN(SO_TIMESTAMP); + CASERETURN(SO_TYPE); + CASERETURN(SO_USELOOPBACK); + default: + return NULL; + } +} + +static const char * +tcpoptname(register_t optname) +{ + switch (optname) { + CASERETURN(TCP_NODELAY); + CASERETURN(TCP_MAXSEG); + CASERETURN(TCP_MD5SIG); + CASERETURN(TCP_KEEPIDLE); + CASERETURN(TCP_KEEPINTVL); + CASERETURN(TCP_KEEPCNT); + CASERETURN(TCP_KEEPINIT); + CASERETURN(TCP_INFO); + default: + return NULL; + } +} + +static const char * +ipoptname(register_t optname) +{ + switch (optname) { + CASERETURN(IP_OPTIONS); + CASERETURN(IP_HDRINCL); + CASERETURN(IP_TOS); + CASERETURN(IP_TTL); + CASERETURN(IP_RECVOPTS); + CASERETURN(IP_RECVRETOPTS); + CASERETURN(IP_RECVDSTADDR); + CASERETURN(IP_RETOPTS); + CASERETURN(IP_MULTICAST_IF); + CASERETURN(IP_MULTICAST_TTL); + CASERETURN(IP_MULTICAST_LOOP); + CASERETURN(IP_ADD_MEMBERSHIP); + CASERETURN(IP_DROP_MEMBERSHIP); + CASERETURN(IP_PORTALGO); + CASERETURN(IP_PORTRANGE); + CASERETURN(IP_RECVIF); + CASERETURN(IP_ERRORMTU); + CASERETURN(IP_IPSEC_POLICY); + CASERETURN(IP_RECVTTL); + CASERETURN(IP_MINTTL); + CASERETURN(IP_PKTINFO); + CASERETURN(IP_RECVPKTINFO); + CASERETURN(IP_BINDANY); default: return NULL; } @@ -638,25 +772,24 @@ putprot(int pr) static const char * futex_op_name(u_long op) { -#define FUTEXCASE(a) case a: return # a switch (op & FUTEX_CMD_MASK) { - FUTEXCASE(FUTEX_WAIT); - FUTEXCASE(FUTEX_WAKE); - FUTEXCASE(FUTEX_FD); - FUTEXCASE(FUTEX_REQUEUE); - FUTEXCASE(FUTEX_CMP_REQUEUE); - FUTEXCASE(FUTEX_WAKE_OP); - FUTEXCASE(FUTEX_LOCK_PI); - FUTEXCASE(FUTEX_UNLOCK_PI); - FUTEXCASE(FUTEX_TRYLOCK_PI); - FUTEXCASE(FUTEX_WAIT_BITSET); - FUTEXCASE(FUTEX_WAKE_BITSET); - FUTEXCASE(FUTEX_WAIT_REQUEUE_PI); - FUTEXCASE(FUTEX_CMP_REQUEUE_PI); + CASERETURN(FUTEX_WAIT); + CASERETURN(FUTEX_WAKE); + CASERETURN(FUTEX_FD); + CASERETURN(FUTEX_REQUEUE); + CASERETURN(FUTEX_CMP_REQUEUE); + CASERETURN(FUTEX_WAKE_OP); + CASERETURN(FUTEX_LOCK_PI); + CASERETURN(FUTEX_UNLOCK_PI); + CASERETURN(FUTEX_TRYLOCK_PI); + CASERETURN(FUTEX_WAIT_BITSET); + CASERETURN(FUTEX_WAKE_BITSET); + CASERETURN(FUTEX_WAIT_REQUEUE_PI); + CASERETURN(FUTEX_CMP_REQUEUE_PI); default: return NULL; } -#undef FUTEXCASE +#undef CASERETURN } static void @@ -764,6 +897,49 @@ ktrsyscall(struct ktr_syscall *ktr) * Native name is "__futex". * Both have the same op argument. */ + } else if ((strcmp(sys_name, "setsockopt") == 0 || + strcmp(sys_name, "getsockopt") == 0 || + strcmp(sys_name, "getsockopt2") == 0) && argcount >= 3) { + (void)putchar('('); + output_long((long)*ap, !(decimal || small(*ap))); + ap++; + argcount--; + register_t level = *ap; + fprintf(stderr, "level=%jx\n", (intmax_t)level); + if ((cp = sockproto(level)) != NULL) { + (void)printf(",%s", cp); + } else { + output_long((long)*ap, + !(decimal || small(*ap))); + } + ap++; + argcount--; + const char *(*f)(register_t); + switch (level) { + case SOL_SOCKET: + f = sockoptname; + break; + case IPPROTO_IP: + f = ipoptname; + break; + case IPPROTO_TCP: + f = tcpoptname; + break; + default: + f = NULL; + break; + } + + if (f && (cp = (*f)(*ap)) != NULL) + (void)printf(",%s", cp); + else { + (void)putchar(','); + output_long((long)*ap, + !(decimal || small(*ap))); + } + ap++; + argcount--; + c = ','; } else if ((strcmp(sys_name, "futex") == 0 || strcmp(sys_name, "__futex") == 0) && argcount > 2) {